From b32da8747292384893ea07a0a5659b24eb216c10 Mon Sep 17 00:00:00 2001
From: Hans Hagen 
Date: Fri, 17 Jul 2009 13:16:00 +0200
Subject: stable 2009.07.17 13:16
---
 context/data/texworks/TUG/texworks.ini      |    6 +-
 context/data/texworks/texworks-context.rme  |    2 +
 context/data/texworks/texworks-setup.ini    |    4 +-
 fonts/map/luatex/context/demo-font.lum      |   70 +
 metapost/context/base/mp-core.mp            |    2 +-
 scripts/context/lua/mtx-context.lua         |   17 +-
 scripts/context/lua/mtx-convert.lua         |  132 +-
 scripts/context/lua/mtx-grep.lua            |    4 +-
 scripts/context/lua/mtx-texworks.lua        |   96 +
 scripts/context/lua/mtx-tools.lua           |   57 +
 scripts/context/lua/mtx-update.lua          |   27 +-
 scripts/context/lua/mtxrun.lua              |    9 +
 scripts/context/stubs/mswin/mtxrun.lua      |    9 +
 scripts/context/stubs/mswin/mtxworks.cmd    |    1 +
 scripts/context/stubs/unix/mtxrun           |    9 +
 scripts/context/stubs/unix/mtxworks         |    2 +
 tex/context/base/anch-pgr.mkii              |    1 +
 tex/context/base/anch-pgr.mkiv              |  311 +-
 tex/context/base/anch-pos.lua               |    2 +-
 tex/context/base/anch-pos.mkiv              |   14 -
 tex/context/base/anch-snc.tex               |    2 -
 tex/context/base/attr-ini.lua               |  335 +-
 tex/context/base/attr-ini.mkiv              |   24 +-
 tex/context/base/back-ini.lua               |  106 +-
 tex/context/base/back-ini.mkiv              |  746 +---
 tex/context/base/back-pdf.lua               |  489 ++-
 tex/context/base/back-pdf.mkiv              | 3232 +----------------
 tex/context/base/bibl-bib.mkiv              |   29 +
 tex/context/base/bibl-bib.tex               |   29 -
 tex/context/base/buff-ini.lua               |   49 +
 tex/context/base/buff-ini.mkiv              |   35 +
 tex/context/base/buff-ver.mkii              |    2 +-
 tex/context/base/buff-ver.mkiv              |   24 +-
 tex/context/base/catc-ctx.tex               |   43 +
 tex/context/base/catc-sym.tex               |   69 +
 tex/context/base/colo-ext.mkiv              |    2 +-
 tex/context/base/colo-hex.mkii              |   18 +-
 tex/context/base/colo-hex.mkiv              |  109 +-
 tex/context/base/colo-ini.lua               |  278 +-
 tex/context/base/colo-ini.mkiv              |  171 +-
 tex/context/base/cont-log.tex               |   14 +
 tex/context/base/cont-new.mkii              |    3 +
 tex/context/base/cont-new.mkiv              |  101 +-
 tex/context/base/cont-new.tex               |  738 +---
 tex/context/base/context.mkii               |  223 +-
 tex/context/base/context.mkiv               |  184 +-
 tex/context/base/context.tex                |    2 +-
 tex/context/base/core-def.mkii              |    7 +
 tex/context/base/core-def.mkiv              |    2 -
 tex/context/base/core-fil.mkii              |  347 ++
 tex/context/base/core-fil.mkiv              |  317 ++
 tex/context/base/core-fil.tex               |  347 --
 tex/context/base/core-gen.mkii              |  166 +
 tex/context/base/core-gen.mkiv              |  166 +
 tex/context/base/core-gen.tex               |  166 -
 tex/context/base/core-grd.mkii              | 1074 ++++++
 tex/context/base/core-grd.mkiv              | 1074 ++++++
 tex/context/base/core-grd.tex               | 1074 ------
 tex/context/base/core-ini.mkii              |   67 +
 tex/context/base/core-ini.mkiv              |   67 +
 tex/context/base/core-ini.tex               |   67 -
 tex/context/base/core-ins.tex               |  103 -
 tex/context/base/core-job.mkiv              |   41 +-
 tex/context/base/core-lme.tex               |   55 -
 tex/context/base/core-lnt.tex               |  197 --
 tex/context/base/core-mak.tex               |   84 -
 tex/context/base/core-mis.mkii              |   66 +
 tex/context/base/core-mis.mkiv              |  240 +-
 tex/context/base/core-par.mkii              |  300 ++
 tex/context/base/core-par.tex               |  300 --
 tex/context/base/core-spa.lua               |   61 +-
 tex/context/base/core-spa.mkii              |   64 +-
 tex/context/base/core-spa.mkiv              |  410 ++-
 tex/context/base/core-stg.mkii              |   72 +
 tex/context/base/core-stg.tex               |   72 -
 tex/context/base/core-sys.mkiv              |   45 +-
 tex/context/base/core-two.lua               |    8 +
 tex/context/base/core-two.mkiv              |    3 -
 tex/context/base/core-uti.mkii              |   47 +-
 tex/context/base/core-uti.mkiv              |   54 +-
 tex/context/base/core-var.mkii              |  286 ++
 tex/context/base/core-var.mkiv              |  275 ++
 tex/context/base/core-var.tex               |  286 --
 tex/context/base/enco-032.mkii              |   82 +
 tex/context/base/enco-032.tex               |   82 -
 tex/context/base/enco-037.mkii              |  276 ++
 tex/context/base/enco-037.tex               |  276 --
 tex/context/base/enco-acc.mkii              |  139 +
 tex/context/base/enco-acc.tex               |  139 -
 tex/context/base/enco-agr.mkii              |  364 ++
 tex/context/base/enco-agr.tex               |  364 --
 tex/context/base/enco-ans.mkii              |  237 ++
 tex/context/base/enco-ans.tex               |  237 --
 tex/context/base/enco-cas.mkii              |  143 +
 tex/context/base/enco-cas.tex               |  143 -
 tex/context/base/enco-chi.mkii              |  371 ++
 tex/context/base/enco-chi.tex               |  371 --
 tex/context/base/enco-com.mkii              |   37 +
 tex/context/base/enco-com.tex               |   37 -
 tex/context/base/enco-cyr.mkii              | 1037 ++++++
 tex/context/base/enco-cyr.tex               | 1037 ------
 tex/context/base/enco-def.mkii              |  920 +++++
 tex/context/base/enco-def.tex               |  920 -----
 tex/context/base/enco-ec.mkii               |  295 ++
 tex/context/base/enco-ec.tex                |  295 --
 tex/context/base/enco-ecm.mkii              |   33 +
 tex/context/base/enco-ecm.tex               |   33 -
 tex/context/base/enco-el.mkii               |  272 ++
 tex/context/base/enco-el.tex                |  272 --
 tex/context/base/enco-fde.mkii              |  128 +
 tex/context/base/enco-fde.tex               |  128 -
 tex/context/base/enco-ffr.mkii              |   53 +
 tex/context/base/enco-ffr.tex               |   53 -
 tex/context/base/enco-fpl.mkii              |   98 +
 tex/context/base/enco-fpl.tex               |   98 -
 tex/context/base/enco-fro.mkii              |   35 +
 tex/context/base/enco-fro.tex               |   35 -
 tex/context/base/enco-fsl.mkii              |   32 +
 tex/context/base/enco-fsl.tex               |   32 -
 tex/context/base/enco-grk.mkii              |  190 +
 tex/context/base/enco-grk.tex               |  190 -
 tex/context/base/enco-heb.mkii              |   16 +
 tex/context/base/enco-heb.tex               |   16 -
 tex/context/base/enco-ibm.mkii              |    7 +
 tex/context/base/enco-ibm.tex               |    7 -
 tex/context/base/enco-il2.mkii              |  157 +
 tex/context/base/enco-il2.tex               |  157 -
 tex/context/base/enco-ini.mkii              |   12 +-
 tex/context/base/enco-ini.mkiv              |   74 +-
 tex/context/base/enco-lat.mkii              |    7 +
 tex/context/base/enco-lat.tex               |    7 -
 tex/context/base/enco-mis.mkii              |  188 +
 tex/context/base/enco-mis.tex               |  188 -
 tex/context/base/enco-pdf.mkii              |  278 ++
 tex/context/base/enco-pdf.tex               |  278 --
 tex/context/base/enco-pfr.mkii              |  305 ++
 tex/context/base/enco-pfr.tex               |  303 --
 tex/context/base/enco-pol.mkii              |  276 ++
 tex/context/base/enco-pol.tex               |  276 --
 tex/context/base/enco-qx.mkii               |  266 ++
 tex/context/base/enco-qx.tex                |  266 --
 tex/context/base/enco-raw.mkii              |  119 +
 tex/context/base/enco-raw.tex               |  119 -
 tex/context/base/enco-run.mkii              |  149 +
 tex/context/base/enco-run.tex               |  149 -
 tex/context/base/enco-t5.mkii               |  244 ++
 tex/context/base/enco-t5.tex                |  244 --
 tex/context/base/enco-tbo.mkii              |  222 ++
 tex/context/base/enco-tbo.tex               |  222 --
 tex/context/base/enco-uc.mkii               | 1091 ++++++
 tex/context/base/enco-uc.tex                | 1091 ------
 tex/context/base/enco-vis.mkii              |    3 +
 tex/context/base/enco-vis.tex               |    3 -
 tex/context/base/enco-vna.mkii              |  145 +
 tex/context/base/enco-vna.tex               |  145 -
 tex/context/base/enco-win.mkii              |    7 +
 tex/context/base/enco-win.tex               |    7 -
 tex/context/base/enco-x5.mkii               |  218 ++
 tex/context/base/enco-x5.tex                |  218 --
 tex/context/base/filt-bas.mkii              |   63 +
 tex/context/base/filt-bas.tex               |   63 -
 tex/context/base/filt-ini.mkii              |  121 +
 tex/context/base/filt-ini.tex               |  133 -
 tex/context/base/font-arb.mkii              |    5 +
 tex/context/base/font-arb.tex               |    5 -
 tex/context/base/font-bfm.mkii              |  196 ++
 tex/context/base/font-bfm.tex               |  196 --
 tex/context/base/font-chi.mkii              | 1156 +++++++
 tex/context/base/font-chi.tex               | 1156 -------
 tex/context/base/font-chk.lua               |   12 +-
 tex/context/base/font-cid.lua               |    1 +
 tex/context/base/font-col.lua               |    4 +-
 tex/context/base/font-heb.mkii              |    5 +
 tex/context/base/font-heb.tex               |    5 -
 tex/context/base/font-ini.mkii              |   24 +-
 tex/context/base/font-ini.mkiv              |  211 +-
 tex/context/base/font-jap.mkii              |   83 +
 tex/context/base/font-jap.tex               |   83 -
 tex/context/base/font-map.lua               |   95 +-
 tex/context/base/font-mis.lua               |    2 +-
 tex/context/base/font-otf.lua               |  183 +-
 tex/context/base/font-otn.lua               |    4 +-
 tex/context/base/font-run.mkii              |  326 ++
 tex/context/base/font-run.mkiv              |  326 ++
 tex/context/base/font-run.tex               |  326 --
 tex/context/base/font-tfm.lua               |   19 +-
 tex/context/base/font-uni.mkii              |    2 +-
 tex/context/base/font-xtx.mkii              |  357 ++
 tex/context/base/font-xtx.tex               |  357 --
 tex/context/base/grph-fig.mkiv              |  212 +-
 tex/context/base/grph-inc.lua               |   47 +-
 tex/context/base/grph-inc.mkii              |   24 +
 tex/context/base/grph-inc.mkiv              |   77 +-
 tex/context/base/grph-u3d.lua               |   45 +
 tex/context/base/hand-def.mkii              |  577 ++++
 tex/context/base/hand-def.tex               |  577 ----
 tex/context/base/hand-ini.mkii              |   18 +-
 tex/context/base/java-fld.tex               |   27 +-
 tex/context/base/java-ini.lua               |  112 +
 tex/context/base/java-ini.mkiv              |  582 +---
 tex/context/base/java-stp.tex               |   16 +-
 tex/context/base/l-aux.lua                  |   31 +-
 tex/context/base/l-table.lua                |    2 +-
 tex/context/base/l-xml.lua                  |    2 +-
 tex/context/base/lang-ara.mkiv              |  150 +
 tex/context/base/lang-ara.tex               |  150 -
 tex/context/base/lang-chi.mkii              |  305 ++
 tex/context/base/lang-chi.tex               |  305 --
 tex/context/base/lang-cjk.mkiv              |  328 ++
 tex/context/base/lang-cjk.tex               |  328 --
 tex/context/base/lang-ctx.mkii              |   53 +
 tex/context/base/lang-ctx.tex               |   53 -
 tex/context/base/lang-dis.mkii              |   59 +
 tex/context/base/lang-dis.tex               |   59 -
 tex/context/base/lang-ini.mkii              |    2 +-
 tex/context/base/lang-ini.mkiv              |   43 +-
 tex/context/base/lang-ita.tex               |   10 +-
 tex/context/base/lang-jap.mkii              |  234 ++
 tex/context/base/lang-jap.tex               |  234 --
 tex/context/base/lang-lab.mkiv              |  212 +-
 tex/context/base/lang-mis.mkii              |  683 ++++
 tex/context/base/lang-mis.mkiv              |  683 ++++
 tex/context/base/lang-mis.tex               |  683 ----
 tex/context/base/lang-run.mkii              |   36 +
 tex/context/base/lang-run.tex               |   36 -
 tex/context/base/lang-sla.tex               |   22 -
 tex/context/base/lang-spe.mkiv              |  111 -
 tex/context/base/lpdf-ano.lua               |  573 +++
 tex/context/base/lpdf-col.lua               |  150 +
 tex/context/base/lpdf-fld.lua               |  747 ++++
 tex/context/base/lpdf-grp.lua               |   70 +
 tex/context/base/lpdf-ini.lua               |  314 +-
 tex/context/base/lpdf-ini.mkiv              |  243 +-
 tex/context/base/lpdf-mis.lua               |  230 ++
 tex/context/base/lpdf-nod.lua               |   53 +
 tex/context/base/lpdf-ren.lua               |  210 ++
 tex/context/base/lpdf-u3d.lua               |  427 +++
 tex/context/base/lpdf-wid.lua               |  328 ++
 tex/context/base/luat-bas.mkiv              |    1 +
 tex/context/base/luat-cod.mkiv              |    6 +-
 tex/context/base/luat-ini.mkiv              |   28 +-
 tex/context/base/luat-lib.mkiv              |    2 +-
 tex/context/base/lxml-ini.mkiv              |  408 +++
 tex/context/base/lxml-ini.tex               |  408 ---
 tex/context/base/lxml-tab.lua               |    2 +-
 tex/context/base/m-format.tex               |  409 +++
 tex/context/base/math-ams.mkii              |  336 ++
 tex/context/base/math-ams.tex               |  336 --
 tex/context/base/math-cow.mkii              |   31 +
 tex/context/base/math-cow.tex               |   31 -
 tex/context/base/math-def.mkiv              |    2 +-
 tex/context/base/math-eul.mkii              |  277 ++
 tex/context/base/math-eul.tex               |  277 --
 tex/context/base/math-fou.mkii              |  196 ++
 tex/context/base/math-fou.tex               |  196 --
 tex/context/base/math-frc.mkiv              |   12 +-
 tex/context/base/math-ini.mkii              |    4 +-
 tex/context/base/math-inl.mkiv              |   10 +-
 tex/context/base/math-lbr.mkii              |  450 +++
 tex/context/base/math-lbr.tex               |  450 ---
 tex/context/base/math-noa.lua               |   15 +-
 tex/context/base/math-tex.mkii              |  718 ++++
 tex/context/base/math-tex.tex               |  718 ----
 tex/context/base/math-tim.mkii              |  371 ++
 tex/context/base/math-tim.tex               |  371 --
 tex/context/base/math-uni.mkii              |  237 ++
 tex/context/base/math-uni.tex               |  237 --
 tex/context/base/math-vfu.lua               |   54 +-
 tex/context/base/meta-ini.mkii              |   29 +-
 tex/context/base/meta-ini.mkiv              |  318 +-
 tex/context/base/meta-pag.mkii              |  226 ++
 tex/context/base/meta-pag.mkiv              |  223 ++
 tex/context/base/meta-pag.tex               |  226 --
 tex/context/base/meta-pdf.lua               |  214 +-
 tex/context/base/meta-pdf.mkiv              |  702 +---
 tex/context/base/meta-pdh.lua               |   62 +-
 tex/context/base/meta-pdh.mkiv              |  780 +++++
 tex/context/base/metatex.tex                |   44 +-
 tex/context/base/mlib-ctx.lua               |   11 +-
 tex/context/base/mlib-pdf.lua               |   43 +-
 tex/context/base/mlib-pdf.mkiv              |    6 +-
 tex/context/base/mlib-pps.lua               |  360 +-
 tex/context/base/mlib-pps.mkiv              |   18 +-
 tex/context/base/mlib-run.lua               |    2 +-
 tex/context/base/mult-chk.lua               |    2 +-
 tex/context/base/mult-chk.mkii              |    3 +
 tex/context/base/mult-cld.lua               |  174 +
 tex/context/base/mult-cld.mkiv              |   20 +
 tex/context/base/mult-de.tex                |    2 +
 tex/context/base/mult-def.lua               |   13 +
 tex/context/base/mult-en.tex                |    2 +
 tex/context/base/mult-fr.tex                |    2 +
 tex/context/base/mult-his.tex               | 1155 -------
 tex/context/base/mult-ini.lua               |   25 +-
 tex/context/base/mult-ini.mkiv              |    3 +
 tex/context/base/mult-it.tex                |    2 +
 tex/context/base/mult-nl.tex                |    2 +
 tex/context/base/mult-ro.tex                |    2 +
 tex/context/base/mult-sys.tex               |   32 +-
 tex/context/base/node-dum.lua               |   12 +-
 tex/context/base/node-fin.lua               |  249 +-
 tex/context/base/node-fin.mkiv              |   10 +-
 tex/context/base/node-ini.lua               |    5 +-
 tex/context/base/node-inj.lua               |  298 +-
 tex/context/base/node-pro.lua               |   29 +-
 tex/context/base/node-ref.lua               |  496 +++
 tex/context/base/node-res.lua               |   14 +-
 tex/context/base/node-seq.lua               |   18 +-
 tex/context/base/node-shp.lua               |    2 +-
 tex/context/base/node-tex.lua               |   33 +-
 tex/context/base/node-tra.lua               |    4 +-
 tex/context/base/node-tsk.lua               |   16 +-
 tex/context/base/node-tst.lua               |   13 +-
 tex/context/base/pack-bar.mkiv              |   67 +
 tex/context/base/pack-box.mkiv              |   37 +-
 tex/context/base/pack-lyr.mkiv              |  417 +--
 tex/context/base/pack-obj.lua               |    2 +-
 tex/context/base/pack-obj.mkiv              |  168 +-
 tex/context/base/pack-rul.lua               |   55 +-
 tex/context/base/pack-rul.mkii              |   13 +
 tex/context/base/pack-rul.mkiv              |  538 ++-
 tex/context/base/page-app.mkii              |  225 ++
 tex/context/base/page-app.mkiv              |  225 ++
 tex/context/base/page-app.tex               |  225 --
 tex/context/base/page-bck.mkiv              |  198 +-
 tex/context/base/page-flw.mkii              |  107 +
 tex/context/base/page-flw.mkiv              |  107 +
 tex/context/base/page-flw.tex               |  107 -
 tex/context/base/page-imp.mkii              | 1314 +++++++
 tex/context/base/page-imp.mkiv              | 1298 +++++++
 tex/context/base/page-imp.tex               | 1314 -------
 tex/context/base/page-ini.mkiv              |  203 +-
 tex/context/base/page-ins.mkii              |  103 +
 tex/context/base/page-ins.mkiv              |   94 +
 tex/context/base/page-lay.mkii              | 1429 ++++++++
 tex/context/base/page-lay.mkiv              | 1404 ++++++++
 tex/context/base/page-lay.tex               | 1429 --------
 tex/context/base/page-lin.mkiv              |    7 +-
 tex/context/base/page-log.mkii              |  202 ++
 tex/context/base/page-log.tex               |  218 --
 tex/context/base/page-mak.mkii              |  234 ++
 tex/context/base/page-mak.mkiv              |  233 ++
 tex/context/base/page-mak.tex               |  234 --
 tex/context/base/page-mar.mkii              |  867 +++++
 tex/context/base/page-mar.mkiv              |  838 +++++
 tex/context/base/page-mar.tex               |  867 -----
 tex/context/base/page-mis.mkii              |  268 ++
 tex/context/base/page-mis.mkiv              |  266 ++
 tex/context/base/page-mis.tex               |  268 --
 tex/context/base/page-mul.mkii              | 1773 ++++++++++
 tex/context/base/page-mul.mkiv              | 1755 ++++++++++
 tex/context/base/page-mul.tex               | 1773 ----------
 tex/context/base/page-new.tex               |  277 --
 tex/context/base/page-not.mkii              |   72 +
 tex/context/base/page-not.mkiv              |   72 +
 tex/context/base/page-not.tex               |   72 -
 tex/context/base/page-one.mkiv              |   28 +-
 tex/context/base/page-par.mkii              |   58 +
 tex/context/base/page-par.mkiv              |   58 +
 tex/context/base/page-par.tex               |   58 -
 tex/context/base/page-plg.mkii              |  202 ++
 tex/context/base/page-plg.mkiv              |  198 ++
 tex/context/base/page-plg.tex               |  202 --
 tex/context/base/page-run.mkii              |  382 ++
 tex/context/base/page-run.mkiv              |  382 ++
 tex/context/base/page-run.tex               |  382 --
 tex/context/base/page-set.mkii              | 3109 +++++++++++++++++
 tex/context/base/page-set.mkiv              | 3104 +++++++++++++++++
 tex/context/base/page-set.tex               | 2815 ---------------
 tex/context/base/page-sid.mkii              |  931 +++++
 tex/context/base/page-sid.mkiv              |  931 +++++
 tex/context/base/page-sid.tex               |  931 -----
 tex/context/base/page-spr.mkii              |  104 +
 tex/context/base/page-spr.mkiv              |  103 +
 tex/context/base/page-spr.tex               |  104 -
 tex/context/base/page-str.mkii              |  376 ++
 tex/context/base/page-str.mkiv              |  380 ++
 tex/context/base/page-str.tex               |  374 --
 tex/context/base/page-txt.mkiv              |  455 +--
 tex/context/base/pdfr-def.mkii              |  843 +++++
 tex/context/base/pdfr-def.tex               |  843 -----
 tex/context/base/pdfr-ec.mkii               |  145 +
 tex/context/base/pdfr-ec.tex                |  145 -
 tex/context/base/pdfr-il2.mkii              |  233 ++
 tex/context/base/prop-ini.mkiv              |    8 +-
 tex/context/base/prop-lay.mkiv              |  133 +-
 tex/context/base/regi-8859-1.mkii           |  154 +
 tex/context/base/regi-8859-1.tex            |  154 -
 tex/context/base/regi-8859-10.mkii          |  152 +
 tex/context/base/regi-8859-10.tex           |  152 -
 tex/context/base/regi-8859-13.mkii          |  152 +
 tex/context/base/regi-8859-13.tex           |  152 -
 tex/context/base/regi-8859-15.mkii          |  154 +
 tex/context/base/regi-8859-15.tex           |  154 -
 tex/context/base/regi-8859-16.mkii          |  151 +
 tex/context/base/regi-8859-16.tex           |  151 -
 tex/context/base/regi-8859-2.mkii           |  152 +
 tex/context/base/regi-8859-2.tex            |  152 -
 tex/context/base/regi-8859-3.mkii           |  145 +
 tex/context/base/regi-8859-3.tex            |  145 -
 tex/context/base/regi-8859-4.mkii           |  152 +
 tex/context/base/regi-8859-4.tex            |  152 -
 tex/context/base/regi-8859-5.mkii           |  152 +
 tex/context/base/regi-8859-5.tex            |  152 -
 tex/context/base/regi-8859-7.mkii           |  153 +
 tex/context/base/regi-8859-7.tex            |  153 -
 tex/context/base/regi-8859-9.mkii           |  152 +
 tex/context/base/regi-8859-9.tex            |  152 -
 tex/context/base/regi-cp1250.mkii           |  153 +
 tex/context/base/regi-cp1250.tex            |  153 -
 tex/context/base/regi-cp1251.mkii           |  152 +
 tex/context/base/regi-cp1251.tex            |  152 -
 tex/context/base/regi-cp1252.mkii           |  156 +
 tex/context/base/regi-cp1252.tex            |  156 -
 tex/context/base/regi-cp1253.mkii           |  153 +
 tex/context/base/regi-cp1253.tex            |  153 -
 tex/context/base/regi-cp1254.mkii           |  153 +
 tex/context/base/regi-cp1254.tex            |  153 -
 tex/context/base/regi-cp1257.mkii           |  153 +
 tex/context/base/regi-cp1257.tex            |  153 -
 tex/context/base/regi-cyp.mkii              | 1169 +++++++
 tex/context/base/regi-cyp.tex               | 1169 -------
 tex/context/base/regi-cyr.mkii              |  722 ++++
 tex/context/base/regi-cyr.tex               |  722 ----
 tex/context/base/regi-def.mkii              |   21 +
 tex/context/base/regi-def.tex               |   21 -
 tex/context/base/regi-ibm.mkii              |   73 +
 tex/context/base/regi-ibm.tex               |   73 -
 tex/context/base/regi-ini.mkii              |   20 +-
 tex/context/base/regi-mac.mkii              |  147 +
 tex/context/base/regi-mac.tex               |  147 -
 tex/context/base/regi-run.mkii              |   32 -
 tex/context/base/regi-uni.mkii              |   24 +
 tex/context/base/regi-uni.tex               |   24 -
 tex/context/base/regi-utf.mkii              |   51 +
 tex/context/base/regi-utf.tex               |   51 -
 tex/context/base/regi-vis.mkii              |  158 +
 tex/context/base/regi-vis.tex               |  158 -
 tex/context/base/s-pre-11.tex               |  220 ++
 tex/context/base/s-pre-12.tex               |  226 ++
 tex/context/base/s-pre-17.tex               |  399 +++
 tex/context/base/s-pre-18.tex               |  177 +
 tex/context/base/s-pre-19.tex               |    1 +
 tex/context/base/s-pre-26.tex               |  255 ++
 tex/context/base/s-pre-27.tex               |  181 +
 tex/context/base/s-pre-61.tex               |    2 +-
 tex/context/base/s-pre-93.tex               |  210 ++
 tex/context/base/scrn-bar.mkiv              |  398 +++
 tex/context/base/scrn-but.mkiv              |  126 +
 tex/context/base/scrn-fld.mkii              |  165 +
 tex/context/base/scrn-fld.mkiv              | 1061 ++----
 tex/context/base/scrn-int.lua               |  111 +
 tex/context/base/scrn-int.mkii              |  198 +-
 tex/context/base/scrn-int.mkiv              | 2235 +++---------
 tex/context/base/scrn-men.mkiv              |  616 ++++
 tex/context/base/scrn-nav.mkiv              |  363 +-
 tex/context/base/sort-def.mkii              |  450 +++
 tex/context/base/sort-def.tex               |  450 ---
 tex/context/base/sort-ini.lua               |  118 +-
 tex/context/base/sort-ini.mkii              |   12 +-
 tex/context/base/sort-lan.lua               |  157 +-
 tex/context/base/sort-lan.mkii              |  203 ++
 tex/context/base/sort-lan.tex               |  203 --
 tex/context/base/spec-def.mkii              | 1016 ++++++
 tex/context/base/spec-def.tex               | 1016 ------
 tex/context/base/spec-dpm.mkii              |  445 +++
 tex/context/base/spec-dpm.tex               |  445 ---
 tex/context/base/spec-dpx.mkii              |  793 +++++
 tex/context/base/spec-dpx.tex               |  793 -----
 tex/context/base/spec-dvi.mkii              |  118 +
 tex/context/base/spec-dvi.tex               |  118 -
 tex/context/base/spec-fdf.mkii              | 3444 ++++++++++++++++++
 tex/context/base/spec-fdf.tex               | 3446 ------------------
 tex/context/base/spec-ini.mkii              |  559 +++
 tex/context/base/spec-ini.tex               |  591 ----
 tex/context/base/spec-mis.mkii              |  286 ++
 tex/context/base/spec-mis.tex               |  286 --
 tex/context/base/spec-pdf.mkii              |  484 +++
 tex/context/base/spec-pdf.tex               |  484 ---
 tex/context/base/spec-ps.mkii               |  229 ++
 tex/context/base/spec-ps.tex                |  229 --
 tex/context/base/spec-tpd.mkii              | 1334 +++++++
 tex/context/base/spec-tpd.tex               | 1334 -------
 tex/context/base/spec-tr.mkii               |  107 +
 tex/context/base/spec-tr.tex                |  107 -
 tex/context/base/spec-tst.mkii              |  152 +
 tex/context/base/spec-tst.tex               |  152 -
 tex/context/base/spec-var.mkii              |   83 +
 tex/context/base/spec-var.tex               |   83 -
 tex/context/base/spec-win.mkii              |   99 +
 tex/context/base/spec-win.tex               |   99 -
 tex/context/base/spec-xet.mkii              |   66 +
 tex/context/base/spec-xet.tex               |   66 -
 tex/context/base/spec-xtx.mkii              |   87 +
 tex/context/base/spec-xtx.tex               |   87 -
 tex/context/base/spec-yy.mkii               |   90 +
 tex/context/base/spec-yy.tex                |   90 -
 tex/context/base/strc-bkm.lua               |  124 +-
 tex/context/base/strc-def.mkiv              |   14 +-
 tex/context/base/strc-des.mkiv              |   13 +-
 tex/context/base/strc-doc.lua               |  182 +-
 tex/context/base/strc-doc.mkiv              |   80 +-
 tex/context/base/strc-flt.mkiv              |   74 +-
 tex/context/base/strc-itm.mkii              |    8 +
 tex/context/base/strc-itm.mkiv              |   48 +-
 tex/context/base/strc-lnt.mkii              |  197 ++
 tex/context/base/strc-lnt.mkiv              |  193 ++
 tex/context/base/strc-lst.lua               |   15 +-
 tex/context/base/strc-lst.mkiv              |   64 +-
 tex/context/base/strc-mar.lua               |    2 +-
 tex/context/base/strc-mat.mkiv              |   30 +-
 tex/context/base/strc-not.lua               |  102 +-
 tex/context/base/strc-not.mkiv              |  160 +-
 tex/context/base/strc-num.lua               |   39 +-
 tex/context/base/strc-num.mkiv              |   41 +-
 tex/context/base/strc-pag.lua               |   15 +-
 tex/context/base/strc-pag.mkiv              |  172 +-
 tex/context/base/strc-ref.lua               |  421 ++-
 tex/context/base/strc-ref.mkiv              |  916 ++---
 tex/context/base/strc-reg.lua               |  158 +-
 tex/context/base/strc-reg.mkiv              |  192 +-
 tex/context/base/strc-ren.mkiv              |   74 +-
 tex/context/base/strc-sec.mkii              |   19 +
 tex/context/base/strc-sec.mkiv              |   53 +-
 tex/context/base/strc-syn.lua               |   14 +-
 tex/context/base/supp-box.tex               |  172 +-
 tex/context/base/supp-emp.mkii              |  398 +++
 tex/context/base/supp-emp.tex               |  398 ---
 tex/context/base/supp-eps.mkii              |  202 ++
 tex/context/base/supp-eps.tex               |  202 --
 tex/context/base/supp-lan.tex               | 1377 --------
 tex/context/base/supp-mis.mkii              |  710 ++++
 tex/context/base/supp-mis.tex               |  710 ----
 tex/context/base/supp-mpe.mkii              | 1370 ++++++++
 tex/context/base/supp-mpe.tex               | 1370 --------
 tex/context/base/supp-mps.mkii              | 2133 ++++++++++++
 tex/context/base/supp-mps.tex               | 2133 ------------
 tex/context/base/supp-mrk.mkii              |  591 ++++
 tex/context/base/supp-mrk.tex               |  591 ----
 tex/context/base/supp-pat.mkii              |  179 +
 tex/context/base/supp-pat.tex               |  179 -
 tex/context/base/supp-pdf.mkii              | 2187 ++++++++++++
 tex/context/base/supp-pdf.tex               | 2187 ------------
 tex/context/base/supp-ran.mkii              |    2 +-
 tex/context/base/supp-spe.mkii              |  164 +
 tex/context/base/supp-spe.tex               |  164 -
 tex/context/base/supp-tpi.mkii              |  353 ++
 tex/context/base/supp-tpi.tex               |  353 --
 tex/context/base/symb-ini.mkii              |  281 ++
 tex/context/base/symb-ini.mkiv              |  281 ++
 tex/context/base/symb-ini.tex               |  294 --
 tex/context/base/symb-jmn.tex               |    9 +-
 tex/context/base/symb-nav.tex               |   10 +-
 tex/context/base/symb-run.mkii              |   54 +
 tex/context/base/symb-run.mkiv              |   54 +
 tex/context/base/symb-run.tex               |   54 -
 tex/context/base/syst-aux.mkiv              |   89 +-
 tex/context/base/syst-ext.mkii              | 4980 +++++++++++++++++++++++++++
 tex/context/base/syst-ext.tex               | 4978 --------------------------
 tex/context/base/syst-gen.mkii              | 4420 ++++++++++++++++++++++++
 tex/context/base/syst-gen.tex               | 4420 ------------------------
 tex/context/base/syst-ini.tex               |    4 +-
 tex/context/base/syst-lua.lua               |    2 -
 tex/context/base/syst-new.mkii              |  868 +++++
 tex/context/base/syst-new.tex               |  868 -----
 tex/context/base/syst-tex.mkii              |  314 ++
 tex/context/base/syst-tex.tex               |  314 --
 tex/context/base/tabl-ltb.mkii              |  866 +++++
 tex/context/base/tabl-ltb.mkiv              |  866 +++++
 tex/context/base/tabl-ltb.tex               |  856 -----
 tex/context/base/tabl-ntb.mkiv              |    3 +-
 tex/context/base/tabl-nte.mkii              |  107 +
 tex/context/base/tabl-nte.mkiv              |  107 +
 tex/context/base/tabl-nte.tex               |  107 -
 tex/context/base/tabl-pln.mkii              |   91 +
 tex/context/base/tabl-pln.mkiv              |   91 +
 tex/context/base/tabl-pln.tex               |   91 -
 tex/context/base/tabl-tab.mkii              | 2515 ++++++++++++++
 tex/context/base/tabl-tab.mkiv              | 2515 ++++++++++++++
 tex/context/base/tabl-tab.tex               | 2507 --------------
 tex/context/base/tabl-tbl.mkii              | 1439 ++++++++
 tex/context/base/tabl-tbl.mkiv              | 1472 ++++++++
 tex/context/base/tabl-tbl.tex               | 1439 --------
 tex/context/base/tabl-tsp.mkii              |  427 +++
 tex/context/base/tabl-tsp.mkiv              |  427 +++
 tex/context/base/tabl-tsp.tex               |  427 ---
 tex/context/base/task-ini.lua               |   58 +-
 tex/context/base/thrd-ran.mkii              |  168 +
 tex/context/base/thrd-ran.tex               |  168 -
 tex/context/base/thrd-trg.mkii              |  127 +
 tex/context/base/thrd-trg.tex               |  127 -
 tex/context/base/todo-mkii.tex              |    1 -
 tex/context/base/todo-mkiv.tex              |    6 -
 tex/context/base/trac-inf.lua               |    1 +
 tex/context/base/trac-log.lua               |    7 +-
 tex/context/base/trac-tra.lua               |    6 +-
 tex/context/base/trac-vis.mkiv              |   28 +-
 tex/context/base/type-akb.tex               |  253 --
 tex/context/base/type-dis.tex               |  241 --
 tex/context/base/type-enc.tex               | 1182 -------
 tex/context/base/type-exa.tex               |   27 -
 tex/context/base/type-ini.mkii              |    9 +-
 tex/context/base/type-ini.mkiv              |  145 +-
 tex/context/base/type-map.tex               |  197 --
 tex/context/base/type-old.tex               |  320 --
 tex/context/base/type-omg.tex               |  204 --
 tex/context/base/type-one.mkii              | 1185 +++++++
 tex/context/base/type-one.mkiv              |   16 +
 tex/context/base/type-one.tex               | 1171 +------
 tex/context/base/type-otf.mkiv              |  244 +-
 tex/context/base/type-run.mkii              |   51 +
 tex/context/base/type-run.mkiv              |   51 +
 tex/context/base/type-run.tex               |   51 -
 tex/context/base/type-siz.mkii              |   12 +-
 tex/context/base/type-siz.mkiv              |  460 +--
 tex/context/base/type-spe.tex               |   49 -
 tex/context/base/type-syn.tex               |  880 -----
 tex/context/base/type-tmf.mkii              | 1161 +++++++
 tex/context/base/type-tmf.mkiv              |  933 +++++
 tex/context/base/type-tmf.tex               | 1159 +------
 tex/context/base/typo-krn.lua               |    8 +-
 tex/context/base/typo-mir.lua               |    6 +-
 tex/context/base/unic-000.mkii              |  135 +
 tex/context/base/unic-000.tex               |  135 -
 tex/context/base/unic-001.mkii              |  220 ++
 tex/context/base/unic-001.tex               |  220 --
 tex/context/base/unic-002.mkii              |  104 +
 tex/context/base/unic-002.tex               |  104 -
 tex/context/base/unic-003.mkii              |  147 +
 tex/context/base/unic-003.tex               |  147 -
 tex/context/base/unic-004.mkii              |  291 ++
 tex/context/base/unic-004.tex               |  291 --
 tex/context/base/unic-005.mkii              |   50 +
 tex/context/base/unic-005.tex               |   50 -
 tex/context/base/unic-030.mkii              |  113 +
 tex/context/base/unic-030.tex               |  113 -
 tex/context/base/unic-031.mkii              |  283 ++
 tex/context/base/unic-031.tex               |  283 --
 tex/context/base/unic-032.mkii              |  278 ++
 tex/context/base/unic-032.tex               |  278 --
 tex/context/base/unic-033.mkii              |  275 ++
 tex/context/base/unic-033.tex               |  275 --
 tex/context/base/unic-034.mkii              |  274 ++
 tex/context/base/unic-034.tex               |  274 --
 tex/context/base/unic-035.mkii              |   32 +
 tex/context/base/unic-035.tex               |   32 -
 tex/context/base/unic-037.mkii              |  278 ++
 tex/context/base/unic-037.tex               |  278 --
 tex/context/base/unic-039.mkii              |   68 +
 tex/context/base/unic-039.tex               |   68 -
 tex/context/base/unic-251.mkii              |   34 +
 tex/context/base/unic-251.tex               |   34 -
 tex/context/base/unic-cjk.mkii              |   22 +
 tex/context/base/unic-cjk.tex               |   22 -
 tex/context/base/unic-exp.mkii              |   82 +
 tex/context/base/unic-exp.tex               |   82 -
 tex/context/base/unic-ini.mkii              |    6 +-
 tex/context/base/unic-run.mkii              |  130 +
 tex/context/base/unic-run.tex               |  130 -
 tex/context/base/verb-c.mkii                |  484 +++
 tex/context/base/verb-c.tex                 |  484 ---
 tex/context/base/verb-eif.mkii              |  211 ++
 tex/context/base/verb-eif.tex               |  211 --
 tex/context/base/verb-ini.mkii              | 1810 ++++++++++
 tex/context/base/verb-ini.tex               | 1810 ----------
 tex/context/base/verb-js.mkii               |  171 +
 tex/context/base/verb-js.tex                |  171 -
 tex/context/base/verb-jv.mkii               |  222 ++
 tex/context/base/verb-jv.tex                |  222 --
 tex/context/base/verb-mp.mkii               |  364 ++
 tex/context/base/verb-mp.tex                |  364 --
 tex/context/base/verb-pas.mkii              |  266 ++
 tex/context/base/verb-pas.tex               |  266 --
 tex/context/base/verb-pl.mkii               |  547 +++
 tex/context/base/verb-pl.tex                |  547 ---
 tex/context/base/verb-raw.mkii              |    7 +
 tex/context/base/verb-raw.tex               |    7 -
 tex/context/base/verb-sql.mkii              |  230 ++
 tex/context/base/verb-sql.tex               |  230 --
 tex/context/base/verb-tex.mkii              |  294 ++
 tex/context/base/verb-tex.tex               |  294 --
 tex/context/base/verb-xml.mkii              |  441 +++
 tex/context/base/verb-xml.tex               |  441 ---
 tex/context/base/xetx-chr.mkii              | 1167 +++++++
 tex/context/base/xetx-chr.tex               | 1167 -------
 tex/context/base/xetx-cls.mkii              |  378 ++
 tex/context/base/xetx-cls.tex               |  378 --
 tex/context/base/xetx-ini.mkii              |  132 +
 tex/context/base/xetx-ini.tex               |  132 -
 tex/context/base/xetx-utf.mkii              | 1989 +++++++++++
 tex/context/base/xetx-utf.tex               | 1989 -----------
 tex/context/base/xtag-exp.tex               |   65 +-
 tex/context/base/xtag-ext.tex               |   35 +-
 tex/context/base/xtag-hyp.tex               |   22 +-
 tex/context/base/xtag-ini.tex               |   13 +-
 tex/context/base/xtag-pre.tex               |    9 +-
 tex/context/bib/bibl-ams.tex                |   48 +-
 tex/context/bib/t-bib.mkiv                  |    2 -
 tex/context/bib/t-bib.tex                   |    4 +-
 tex/context/interface/cont-cs.xml           |    3 +
 tex/context/interface/cont-de.xml           |    3 +
 tex/context/interface/cont-en.xml           |    3 +
 tex/context/interface/cont-fr.xml           |    3 +
 tex/context/interface/cont-it.xml           |    3 +
 tex/context/interface/cont-nl.xml           |    3 +
 tex/context/interface/cont-pe.xml           |    3 +
 tex/context/interface/cont-ro.xml           |    3 +
 tex/context/interface/keys-cs.xml           |    2 +
 tex/context/interface/keys-de.xml           |    2 +
 tex/context/interface/keys-en.xml           |    2 +
 tex/context/interface/keys-fr.xml           |    2 +
 tex/context/interface/keys-it.xml           |    2 +
 tex/context/interface/keys-nl.xml           |    2 +
 tex/context/interface/keys-pe.xml           |    2 +
 tex/context/interface/keys-ro.xml           |    2 +
 tex/context/sample/demo-cld.cld             |   74 +
 tex/context/sample/sample.tex               |    8 +-
 tex/generic/context/luatex-fonts-merged.lua |  763 ++--
 tex/generic/context/luatex-fonts.lua        |    5 +-
 tex/generic/context/mptopdf.tex             |    8 +-
 tex/generic/context/ppchtex.noc             |    4 +-
 tpm/t-bib.tpm                               |    4 +-
 web2c/context.cnf                           |    4 +-
 723 files changed, 125094 insertions(+), 107982 deletions(-)
 create mode 100644 context/data/texworks/texworks-context.rme
 create mode 100644 fonts/map/luatex/context/demo-font.lum
 create mode 100644 scripts/context/lua/mtx-texworks.lua
 create mode 100644 scripts/context/lua/mtx-tools.lua
 create mode 100644 scripts/context/stubs/mswin/mtxworks.cmd
 create mode 100755 scripts/context/stubs/unix/mtxworks
 create mode 100644 tex/context/base/bibl-bib.mkiv
 delete mode 100644 tex/context/base/bibl-bib.tex
 create mode 100644 tex/context/base/core-fil.mkii
 create mode 100644 tex/context/base/core-fil.mkiv
 delete mode 100644 tex/context/base/core-fil.tex
 create mode 100644 tex/context/base/core-gen.mkii
 create mode 100644 tex/context/base/core-gen.mkiv
 delete mode 100644 tex/context/base/core-gen.tex
 create mode 100644 tex/context/base/core-grd.mkii
 create mode 100644 tex/context/base/core-grd.mkiv
 delete mode 100644 tex/context/base/core-grd.tex
 create mode 100644 tex/context/base/core-ini.mkii
 create mode 100644 tex/context/base/core-ini.mkiv
 delete mode 100644 tex/context/base/core-ini.tex
 delete mode 100644 tex/context/base/core-ins.tex
 delete mode 100644 tex/context/base/core-lme.tex
 delete mode 100644 tex/context/base/core-lnt.tex
 delete mode 100644 tex/context/base/core-mak.tex
 create mode 100644 tex/context/base/core-par.mkii
 delete mode 100644 tex/context/base/core-par.tex
 create mode 100644 tex/context/base/core-stg.mkii
 delete mode 100644 tex/context/base/core-stg.tex
 create mode 100644 tex/context/base/core-var.mkii
 create mode 100644 tex/context/base/core-var.mkiv
 delete mode 100644 tex/context/base/core-var.tex
 create mode 100644 tex/context/base/enco-032.mkii
 delete mode 100644 tex/context/base/enco-032.tex
 create mode 100644 tex/context/base/enco-037.mkii
 delete mode 100644 tex/context/base/enco-037.tex
 create mode 100644 tex/context/base/enco-acc.mkii
 delete mode 100644 tex/context/base/enco-acc.tex
 create mode 100644 tex/context/base/enco-agr.mkii
 delete mode 100644 tex/context/base/enco-agr.tex
 create mode 100644 tex/context/base/enco-ans.mkii
 delete mode 100644 tex/context/base/enco-ans.tex
 create mode 100644 tex/context/base/enco-cas.mkii
 delete mode 100644 tex/context/base/enco-cas.tex
 create mode 100644 tex/context/base/enco-chi.mkii
 delete mode 100644 tex/context/base/enco-chi.tex
 create mode 100644 tex/context/base/enco-com.mkii
 delete mode 100644 tex/context/base/enco-com.tex
 create mode 100644 tex/context/base/enco-cyr.mkii
 delete mode 100644 tex/context/base/enco-cyr.tex
 create mode 100644 tex/context/base/enco-def.mkii
 delete mode 100644 tex/context/base/enco-def.tex
 create mode 100644 tex/context/base/enco-ec.mkii
 delete mode 100644 tex/context/base/enco-ec.tex
 create mode 100644 tex/context/base/enco-ecm.mkii
 delete mode 100644 tex/context/base/enco-ecm.tex
 create mode 100644 tex/context/base/enco-el.mkii
 delete mode 100644 tex/context/base/enco-el.tex
 create mode 100644 tex/context/base/enco-fde.mkii
 delete mode 100644 tex/context/base/enco-fde.tex
 create mode 100644 tex/context/base/enco-ffr.mkii
 delete mode 100644 tex/context/base/enco-ffr.tex
 create mode 100644 tex/context/base/enco-fpl.mkii
 delete mode 100644 tex/context/base/enco-fpl.tex
 create mode 100644 tex/context/base/enco-fro.mkii
 delete mode 100644 tex/context/base/enco-fro.tex
 create mode 100644 tex/context/base/enco-fsl.mkii
 delete mode 100644 tex/context/base/enco-fsl.tex
 create mode 100644 tex/context/base/enco-grk.mkii
 delete mode 100644 tex/context/base/enco-grk.tex
 create mode 100644 tex/context/base/enco-heb.mkii
 delete mode 100644 tex/context/base/enco-heb.tex
 create mode 100644 tex/context/base/enco-ibm.mkii
 delete mode 100644 tex/context/base/enco-ibm.tex
 create mode 100644 tex/context/base/enco-il2.mkii
 delete mode 100644 tex/context/base/enco-il2.tex
 create mode 100644 tex/context/base/enco-lat.mkii
 delete mode 100644 tex/context/base/enco-lat.tex
 create mode 100644 tex/context/base/enco-mis.mkii
 delete mode 100644 tex/context/base/enco-mis.tex
 create mode 100644 tex/context/base/enco-pdf.mkii
 delete mode 100644 tex/context/base/enco-pdf.tex
 create mode 100644 tex/context/base/enco-pfr.mkii
 delete mode 100644 tex/context/base/enco-pfr.tex
 create mode 100644 tex/context/base/enco-pol.mkii
 delete mode 100644 tex/context/base/enco-pol.tex
 create mode 100644 tex/context/base/enco-qx.mkii
 delete mode 100644 tex/context/base/enco-qx.tex
 create mode 100644 tex/context/base/enco-raw.mkii
 delete mode 100644 tex/context/base/enco-raw.tex
 create mode 100644 tex/context/base/enco-run.mkii
 delete mode 100644 tex/context/base/enco-run.tex
 create mode 100644 tex/context/base/enco-t5.mkii
 delete mode 100644 tex/context/base/enco-t5.tex
 create mode 100644 tex/context/base/enco-tbo.mkii
 delete mode 100644 tex/context/base/enco-tbo.tex
 create mode 100644 tex/context/base/enco-uc.mkii
 delete mode 100644 tex/context/base/enco-uc.tex
 create mode 100644 tex/context/base/enco-vis.mkii
 delete mode 100644 tex/context/base/enco-vis.tex
 create mode 100644 tex/context/base/enco-vna.mkii
 delete mode 100644 tex/context/base/enco-vna.tex
 create mode 100644 tex/context/base/enco-win.mkii
 delete mode 100644 tex/context/base/enco-win.tex
 create mode 100644 tex/context/base/enco-x5.mkii
 delete mode 100644 tex/context/base/enco-x5.tex
 create mode 100644 tex/context/base/filt-bas.mkii
 delete mode 100644 tex/context/base/filt-bas.tex
 create mode 100644 tex/context/base/filt-ini.mkii
 delete mode 100644 tex/context/base/filt-ini.tex
 create mode 100644 tex/context/base/font-arb.mkii
 delete mode 100644 tex/context/base/font-arb.tex
 create mode 100644 tex/context/base/font-bfm.mkii
 delete mode 100644 tex/context/base/font-bfm.tex
 create mode 100644 tex/context/base/font-chi.mkii
 delete mode 100644 tex/context/base/font-chi.tex
 create mode 100644 tex/context/base/font-heb.mkii
 delete mode 100644 tex/context/base/font-heb.tex
 create mode 100644 tex/context/base/font-jap.mkii
 delete mode 100644 tex/context/base/font-jap.tex
 create mode 100644 tex/context/base/font-run.mkii
 create mode 100644 tex/context/base/font-run.mkiv
 delete mode 100644 tex/context/base/font-run.tex
 create mode 100644 tex/context/base/font-xtx.mkii
 delete mode 100644 tex/context/base/font-xtx.tex
 create mode 100644 tex/context/base/grph-u3d.lua
 create mode 100644 tex/context/base/hand-def.mkii
 delete mode 100644 tex/context/base/hand-def.tex
 create mode 100644 tex/context/base/java-ini.lua
 create mode 100644 tex/context/base/lang-ara.mkiv
 delete mode 100644 tex/context/base/lang-ara.tex
 create mode 100644 tex/context/base/lang-chi.mkii
 delete mode 100644 tex/context/base/lang-chi.tex
 create mode 100644 tex/context/base/lang-cjk.mkiv
 delete mode 100644 tex/context/base/lang-cjk.tex
 create mode 100644 tex/context/base/lang-ctx.mkii
 delete mode 100644 tex/context/base/lang-ctx.tex
 create mode 100644 tex/context/base/lang-dis.mkii
 delete mode 100644 tex/context/base/lang-dis.tex
 create mode 100644 tex/context/base/lang-jap.mkii
 delete mode 100644 tex/context/base/lang-jap.tex
 create mode 100644 tex/context/base/lang-mis.mkii
 create mode 100644 tex/context/base/lang-mis.mkiv
 delete mode 100644 tex/context/base/lang-mis.tex
 create mode 100644 tex/context/base/lang-run.mkii
 delete mode 100644 tex/context/base/lang-run.tex
 delete mode 100644 tex/context/base/lang-spe.mkiv
 create mode 100644 tex/context/base/lpdf-ano.lua
 create mode 100644 tex/context/base/lpdf-col.lua
 create mode 100644 tex/context/base/lpdf-fld.lua
 create mode 100644 tex/context/base/lpdf-grp.lua
 create mode 100644 tex/context/base/lpdf-mis.lua
 create mode 100644 tex/context/base/lpdf-nod.lua
 create mode 100644 tex/context/base/lpdf-ren.lua
 create mode 100644 tex/context/base/lpdf-u3d.lua
 create mode 100644 tex/context/base/lpdf-wid.lua
 create mode 100644 tex/context/base/lxml-ini.mkiv
 delete mode 100644 tex/context/base/lxml-ini.tex
 create mode 100644 tex/context/base/m-format.tex
 create mode 100644 tex/context/base/math-ams.mkii
 delete mode 100644 tex/context/base/math-ams.tex
 create mode 100644 tex/context/base/math-cow.mkii
 delete mode 100644 tex/context/base/math-cow.tex
 create mode 100644 tex/context/base/math-eul.mkii
 delete mode 100644 tex/context/base/math-eul.tex
 create mode 100644 tex/context/base/math-fou.mkii
 delete mode 100644 tex/context/base/math-fou.tex
 create mode 100644 tex/context/base/math-lbr.mkii
 delete mode 100644 tex/context/base/math-lbr.tex
 create mode 100644 tex/context/base/math-tex.mkii
 delete mode 100644 tex/context/base/math-tex.tex
 create mode 100644 tex/context/base/math-tim.mkii
 delete mode 100644 tex/context/base/math-tim.tex
 create mode 100644 tex/context/base/math-uni.mkii
 delete mode 100644 tex/context/base/math-uni.tex
 create mode 100644 tex/context/base/meta-pag.mkii
 create mode 100644 tex/context/base/meta-pag.mkiv
 delete mode 100644 tex/context/base/meta-pag.tex
 create mode 100644 tex/context/base/meta-pdh.mkiv
 create mode 100644 tex/context/base/mult-cld.lua
 create mode 100644 tex/context/base/mult-cld.mkiv
 delete mode 100644 tex/context/base/mult-his.tex
 create mode 100644 tex/context/base/node-ref.lua
 create mode 100644 tex/context/base/pack-bar.mkiv
 create mode 100644 tex/context/base/page-app.mkii
 create mode 100644 tex/context/base/page-app.mkiv
 delete mode 100644 tex/context/base/page-app.tex
 create mode 100644 tex/context/base/page-flw.mkii
 create mode 100644 tex/context/base/page-flw.mkiv
 delete mode 100644 tex/context/base/page-flw.tex
 create mode 100644 tex/context/base/page-imp.mkii
 create mode 100644 tex/context/base/page-imp.mkiv
 delete mode 100644 tex/context/base/page-imp.tex
 create mode 100644 tex/context/base/page-ins.mkii
 create mode 100644 tex/context/base/page-ins.mkiv
 create mode 100644 tex/context/base/page-lay.mkii
 create mode 100644 tex/context/base/page-lay.mkiv
 delete mode 100644 tex/context/base/page-lay.tex
 create mode 100644 tex/context/base/page-log.mkii
 delete mode 100644 tex/context/base/page-log.tex
 create mode 100644 tex/context/base/page-mak.mkii
 create mode 100644 tex/context/base/page-mak.mkiv
 delete mode 100644 tex/context/base/page-mak.tex
 create mode 100644 tex/context/base/page-mar.mkii
 create mode 100644 tex/context/base/page-mar.mkiv
 delete mode 100644 tex/context/base/page-mar.tex
 create mode 100644 tex/context/base/page-mis.mkii
 create mode 100644 tex/context/base/page-mis.mkiv
 delete mode 100644 tex/context/base/page-mis.tex
 create mode 100644 tex/context/base/page-mul.mkii
 create mode 100644 tex/context/base/page-mul.mkiv
 delete mode 100644 tex/context/base/page-mul.tex
 delete mode 100644 tex/context/base/page-new.tex
 create mode 100644 tex/context/base/page-not.mkii
 create mode 100644 tex/context/base/page-not.mkiv
 delete mode 100644 tex/context/base/page-not.tex
 create mode 100644 tex/context/base/page-par.mkii
 create mode 100644 tex/context/base/page-par.mkiv
 delete mode 100644 tex/context/base/page-par.tex
 create mode 100644 tex/context/base/page-plg.mkii
 create mode 100644 tex/context/base/page-plg.mkiv
 delete mode 100644 tex/context/base/page-plg.tex
 create mode 100644 tex/context/base/page-run.mkii
 create mode 100644 tex/context/base/page-run.mkiv
 delete mode 100644 tex/context/base/page-run.tex
 create mode 100644 tex/context/base/page-set.mkii
 create mode 100644 tex/context/base/page-set.mkiv
 delete mode 100644 tex/context/base/page-set.tex
 create mode 100644 tex/context/base/page-sid.mkii
 create mode 100644 tex/context/base/page-sid.mkiv
 delete mode 100644 tex/context/base/page-sid.tex
 create mode 100644 tex/context/base/page-spr.mkii
 create mode 100644 tex/context/base/page-spr.mkiv
 delete mode 100644 tex/context/base/page-spr.tex
 create mode 100644 tex/context/base/page-str.mkii
 create mode 100644 tex/context/base/page-str.mkiv
 delete mode 100644 tex/context/base/page-str.tex
 create mode 100644 tex/context/base/pdfr-def.mkii
 delete mode 100644 tex/context/base/pdfr-def.tex
 create mode 100644 tex/context/base/pdfr-ec.mkii
 delete mode 100644 tex/context/base/pdfr-ec.tex
 create mode 100644 tex/context/base/pdfr-il2.mkii
 create mode 100644 tex/context/base/regi-8859-1.mkii
 delete mode 100644 tex/context/base/regi-8859-1.tex
 create mode 100644 tex/context/base/regi-8859-10.mkii
 delete mode 100644 tex/context/base/regi-8859-10.tex
 create mode 100644 tex/context/base/regi-8859-13.mkii
 delete mode 100644 tex/context/base/regi-8859-13.tex
 create mode 100644 tex/context/base/regi-8859-15.mkii
 delete mode 100644 tex/context/base/regi-8859-15.tex
 create mode 100644 tex/context/base/regi-8859-16.mkii
 delete mode 100644 tex/context/base/regi-8859-16.tex
 create mode 100644 tex/context/base/regi-8859-2.mkii
 delete mode 100644 tex/context/base/regi-8859-2.tex
 create mode 100644 tex/context/base/regi-8859-3.mkii
 delete mode 100644 tex/context/base/regi-8859-3.tex
 create mode 100644 tex/context/base/regi-8859-4.mkii
 delete mode 100644 tex/context/base/regi-8859-4.tex
 create mode 100644 tex/context/base/regi-8859-5.mkii
 delete mode 100644 tex/context/base/regi-8859-5.tex
 create mode 100644 tex/context/base/regi-8859-7.mkii
 delete mode 100644 tex/context/base/regi-8859-7.tex
 create mode 100644 tex/context/base/regi-8859-9.mkii
 delete mode 100644 tex/context/base/regi-8859-9.tex
 create mode 100644 tex/context/base/regi-cp1250.mkii
 delete mode 100644 tex/context/base/regi-cp1250.tex
 create mode 100644 tex/context/base/regi-cp1251.mkii
 delete mode 100644 tex/context/base/regi-cp1251.tex
 create mode 100644 tex/context/base/regi-cp1252.mkii
 delete mode 100644 tex/context/base/regi-cp1252.tex
 create mode 100644 tex/context/base/regi-cp1253.mkii
 delete mode 100644 tex/context/base/regi-cp1253.tex
 create mode 100644 tex/context/base/regi-cp1254.mkii
 delete mode 100644 tex/context/base/regi-cp1254.tex
 create mode 100644 tex/context/base/regi-cp1257.mkii
 delete mode 100644 tex/context/base/regi-cp1257.tex
 create mode 100644 tex/context/base/regi-cyp.mkii
 delete mode 100644 tex/context/base/regi-cyp.tex
 create mode 100644 tex/context/base/regi-cyr.mkii
 delete mode 100644 tex/context/base/regi-cyr.tex
 create mode 100644 tex/context/base/regi-def.mkii
 delete mode 100644 tex/context/base/regi-def.tex
 create mode 100644 tex/context/base/regi-ibm.mkii
 delete mode 100644 tex/context/base/regi-ibm.tex
 create mode 100644 tex/context/base/regi-mac.mkii
 delete mode 100644 tex/context/base/regi-mac.tex
 delete mode 100644 tex/context/base/regi-run.mkii
 create mode 100644 tex/context/base/regi-uni.mkii
 delete mode 100644 tex/context/base/regi-uni.tex
 create mode 100644 tex/context/base/regi-utf.mkii
 delete mode 100644 tex/context/base/regi-utf.tex
 create mode 100644 tex/context/base/regi-vis.mkii
 delete mode 100644 tex/context/base/regi-vis.tex
 create mode 100644 tex/context/base/s-pre-11.tex
 create mode 100644 tex/context/base/s-pre-12.tex
 create mode 100644 tex/context/base/s-pre-17.tex
 create mode 100644 tex/context/base/s-pre-18.tex
 create mode 100644 tex/context/base/s-pre-26.tex
 create mode 100644 tex/context/base/s-pre-27.tex
 create mode 100644 tex/context/base/s-pre-93.tex
 create mode 100644 tex/context/base/scrn-bar.mkiv
 create mode 100644 tex/context/base/scrn-but.mkiv
 create mode 100644 tex/context/base/scrn-int.lua
 create mode 100644 tex/context/base/scrn-men.mkiv
 create mode 100644 tex/context/base/sort-def.mkii
 delete mode 100644 tex/context/base/sort-def.tex
 create mode 100644 tex/context/base/sort-lan.mkii
 delete mode 100644 tex/context/base/sort-lan.tex
 create mode 100644 tex/context/base/spec-def.mkii
 delete mode 100644 tex/context/base/spec-def.tex
 create mode 100644 tex/context/base/spec-dpm.mkii
 delete mode 100644 tex/context/base/spec-dpm.tex
 create mode 100644 tex/context/base/spec-dpx.mkii
 delete mode 100644 tex/context/base/spec-dpx.tex
 create mode 100644 tex/context/base/spec-dvi.mkii
 delete mode 100644 tex/context/base/spec-dvi.tex
 create mode 100644 tex/context/base/spec-fdf.mkii
 delete mode 100644 tex/context/base/spec-fdf.tex
 create mode 100644 tex/context/base/spec-ini.mkii
 delete mode 100644 tex/context/base/spec-ini.tex
 create mode 100644 tex/context/base/spec-mis.mkii
 delete mode 100644 tex/context/base/spec-mis.tex
 create mode 100644 tex/context/base/spec-pdf.mkii
 delete mode 100644 tex/context/base/spec-pdf.tex
 create mode 100644 tex/context/base/spec-ps.mkii
 delete mode 100644 tex/context/base/spec-ps.tex
 create mode 100644 tex/context/base/spec-tpd.mkii
 delete mode 100644 tex/context/base/spec-tpd.tex
 create mode 100644 tex/context/base/spec-tr.mkii
 delete mode 100644 tex/context/base/spec-tr.tex
 create mode 100644 tex/context/base/spec-tst.mkii
 delete mode 100644 tex/context/base/spec-tst.tex
 create mode 100644 tex/context/base/spec-var.mkii
 delete mode 100644 tex/context/base/spec-var.tex
 create mode 100644 tex/context/base/spec-win.mkii
 delete mode 100644 tex/context/base/spec-win.tex
 create mode 100644 tex/context/base/spec-xet.mkii
 delete mode 100644 tex/context/base/spec-xet.tex
 create mode 100644 tex/context/base/spec-xtx.mkii
 delete mode 100644 tex/context/base/spec-xtx.tex
 create mode 100644 tex/context/base/spec-yy.mkii
 delete mode 100644 tex/context/base/spec-yy.tex
 create mode 100644 tex/context/base/strc-lnt.mkii
 create mode 100644 tex/context/base/strc-lnt.mkiv
 create mode 100644 tex/context/base/supp-emp.mkii
 delete mode 100644 tex/context/base/supp-emp.tex
 create mode 100644 tex/context/base/supp-eps.mkii
 delete mode 100644 tex/context/base/supp-eps.tex
 delete mode 100644 tex/context/base/supp-lan.tex
 create mode 100644 tex/context/base/supp-mis.mkii
 delete mode 100644 tex/context/base/supp-mis.tex
 create mode 100644 tex/context/base/supp-mpe.mkii
 delete mode 100644 tex/context/base/supp-mpe.tex
 create mode 100644 tex/context/base/supp-mps.mkii
 delete mode 100644 tex/context/base/supp-mps.tex
 create mode 100644 tex/context/base/supp-mrk.mkii
 delete mode 100644 tex/context/base/supp-mrk.tex
 create mode 100644 tex/context/base/supp-pat.mkii
 delete mode 100644 tex/context/base/supp-pat.tex
 create mode 100644 tex/context/base/supp-pdf.mkii
 delete mode 100644 tex/context/base/supp-pdf.tex
 create mode 100644 tex/context/base/supp-spe.mkii
 delete mode 100644 tex/context/base/supp-spe.tex
 create mode 100644 tex/context/base/supp-tpi.mkii
 delete mode 100644 tex/context/base/supp-tpi.tex
 create mode 100644 tex/context/base/symb-ini.mkii
 create mode 100644 tex/context/base/symb-ini.mkiv
 delete mode 100644 tex/context/base/symb-ini.tex
 create mode 100644 tex/context/base/symb-run.mkii
 create mode 100644 tex/context/base/symb-run.mkiv
 delete mode 100644 tex/context/base/symb-run.tex
 create mode 100644 tex/context/base/syst-ext.mkii
 delete mode 100644 tex/context/base/syst-ext.tex
 create mode 100644 tex/context/base/syst-gen.mkii
 delete mode 100644 tex/context/base/syst-gen.tex
 create mode 100644 tex/context/base/syst-new.mkii
 delete mode 100644 tex/context/base/syst-new.tex
 create mode 100644 tex/context/base/syst-tex.mkii
 delete mode 100644 tex/context/base/syst-tex.tex
 create mode 100644 tex/context/base/tabl-ltb.mkii
 create mode 100644 tex/context/base/tabl-ltb.mkiv
 delete mode 100644 tex/context/base/tabl-ltb.tex
 create mode 100644 tex/context/base/tabl-nte.mkii
 create mode 100644 tex/context/base/tabl-nte.mkiv
 delete mode 100644 tex/context/base/tabl-nte.tex
 create mode 100644 tex/context/base/tabl-pln.mkii
 create mode 100644 tex/context/base/tabl-pln.mkiv
 delete mode 100644 tex/context/base/tabl-pln.tex
 create mode 100644 tex/context/base/tabl-tab.mkii
 create mode 100644 tex/context/base/tabl-tab.mkiv
 delete mode 100644 tex/context/base/tabl-tab.tex
 create mode 100644 tex/context/base/tabl-tbl.mkii
 create mode 100644 tex/context/base/tabl-tbl.mkiv
 delete mode 100644 tex/context/base/tabl-tbl.tex
 create mode 100644 tex/context/base/tabl-tsp.mkii
 create mode 100644 tex/context/base/tabl-tsp.mkiv
 delete mode 100644 tex/context/base/tabl-tsp.tex
 create mode 100644 tex/context/base/thrd-ran.mkii
 delete mode 100644 tex/context/base/thrd-ran.tex
 create mode 100644 tex/context/base/thrd-trg.mkii
 delete mode 100644 tex/context/base/thrd-trg.tex
 delete mode 100644 tex/context/base/todo-mkii.tex
 delete mode 100644 tex/context/base/todo-mkiv.tex
 delete mode 100644 tex/context/base/type-akb.tex
 delete mode 100644 tex/context/base/type-dis.tex
 delete mode 100644 tex/context/base/type-enc.tex
 delete mode 100644 tex/context/base/type-exa.tex
 delete mode 100644 tex/context/base/type-map.tex
 delete mode 100644 tex/context/base/type-old.tex
 delete mode 100644 tex/context/base/type-omg.tex
 create mode 100644 tex/context/base/type-one.mkii
 create mode 100644 tex/context/base/type-one.mkiv
 create mode 100644 tex/context/base/type-run.mkii
 create mode 100644 tex/context/base/type-run.mkiv
 delete mode 100644 tex/context/base/type-run.tex
 delete mode 100644 tex/context/base/type-spe.tex
 delete mode 100644 tex/context/base/type-syn.tex
 create mode 100644 tex/context/base/type-tmf.mkii
 create mode 100644 tex/context/base/type-tmf.mkiv
 create mode 100644 tex/context/base/unic-000.mkii
 delete mode 100644 tex/context/base/unic-000.tex
 create mode 100644 tex/context/base/unic-001.mkii
 delete mode 100644 tex/context/base/unic-001.tex
 create mode 100644 tex/context/base/unic-002.mkii
 delete mode 100644 tex/context/base/unic-002.tex
 create mode 100644 tex/context/base/unic-003.mkii
 delete mode 100644 tex/context/base/unic-003.tex
 create mode 100644 tex/context/base/unic-004.mkii
 delete mode 100644 tex/context/base/unic-004.tex
 create mode 100644 tex/context/base/unic-005.mkii
 delete mode 100644 tex/context/base/unic-005.tex
 create mode 100644 tex/context/base/unic-030.mkii
 delete mode 100644 tex/context/base/unic-030.tex
 create mode 100644 tex/context/base/unic-031.mkii
 delete mode 100644 tex/context/base/unic-031.tex
 create mode 100644 tex/context/base/unic-032.mkii
 delete mode 100644 tex/context/base/unic-032.tex
 create mode 100644 tex/context/base/unic-033.mkii
 delete mode 100644 tex/context/base/unic-033.tex
 create mode 100644 tex/context/base/unic-034.mkii
 delete mode 100644 tex/context/base/unic-034.tex
 create mode 100644 tex/context/base/unic-035.mkii
 delete mode 100644 tex/context/base/unic-035.tex
 create mode 100644 tex/context/base/unic-037.mkii
 delete mode 100644 tex/context/base/unic-037.tex
 create mode 100644 tex/context/base/unic-039.mkii
 delete mode 100644 tex/context/base/unic-039.tex
 create mode 100644 tex/context/base/unic-251.mkii
 delete mode 100644 tex/context/base/unic-251.tex
 create mode 100644 tex/context/base/unic-cjk.mkii
 delete mode 100644 tex/context/base/unic-cjk.tex
 create mode 100644 tex/context/base/unic-exp.mkii
 delete mode 100644 tex/context/base/unic-exp.tex
 create mode 100644 tex/context/base/unic-run.mkii
 delete mode 100644 tex/context/base/unic-run.tex
 create mode 100644 tex/context/base/verb-c.mkii
 delete mode 100644 tex/context/base/verb-c.tex
 create mode 100644 tex/context/base/verb-eif.mkii
 delete mode 100644 tex/context/base/verb-eif.tex
 create mode 100644 tex/context/base/verb-ini.mkii
 delete mode 100644 tex/context/base/verb-ini.tex
 create mode 100644 tex/context/base/verb-js.mkii
 delete mode 100644 tex/context/base/verb-js.tex
 create mode 100644 tex/context/base/verb-jv.mkii
 delete mode 100644 tex/context/base/verb-jv.tex
 create mode 100644 tex/context/base/verb-mp.mkii
 delete mode 100644 tex/context/base/verb-mp.tex
 create mode 100644 tex/context/base/verb-pas.mkii
 delete mode 100644 tex/context/base/verb-pas.tex
 create mode 100644 tex/context/base/verb-pl.mkii
 delete mode 100644 tex/context/base/verb-pl.tex
 create mode 100644 tex/context/base/verb-raw.mkii
 delete mode 100644 tex/context/base/verb-raw.tex
 create mode 100644 tex/context/base/verb-sql.mkii
 delete mode 100644 tex/context/base/verb-sql.tex
 create mode 100644 tex/context/base/verb-tex.mkii
 delete mode 100644 tex/context/base/verb-tex.tex
 create mode 100644 tex/context/base/verb-xml.mkii
 delete mode 100644 tex/context/base/verb-xml.tex
 create mode 100644 tex/context/base/xetx-chr.mkii
 delete mode 100644 tex/context/base/xetx-chr.tex
 create mode 100644 tex/context/base/xetx-cls.mkii
 delete mode 100644 tex/context/base/xetx-cls.tex
 create mode 100644 tex/context/base/xetx-ini.mkii
 delete mode 100644 tex/context/base/xetx-ini.tex
 create mode 100644 tex/context/base/xetx-utf.mkii
 delete mode 100644 tex/context/base/xetx-utf.tex
 create mode 100644 tex/context/sample/demo-cld.cld
diff --git a/context/data/texworks/TUG/texworks.ini b/context/data/texworks/TUG/texworks.ini
index a0ff34539..8ef43433e 100644
--- a/context/data/texworks/TUG/texworks.ini
+++ b/context/data/texworks/TUG/texworks.ini
@@ -12,10 +12,10 @@ previewScale=200
 magnifierSize=2
 circularMagnifier=true
 defaultEngine=ConTeXt MkIV
-binaryPaths=E:/context/lua, E:/tex/texmf-mswin/bin
+binaryPaths=
 autoHideConsole=false
-openDialogDir=E:/context/manuals/mk
-recentFileList=D:/texworks/bin/texworks-setup.ini, E:/context/manuals/mk/mk-math.tex, E:/tmp/oeps.tex
+openDialogDir=
+recentFileList=
 
 [engines]
 size=6
diff --git a/context/data/texworks/texworks-context.rme b/context/data/texworks/texworks-context.rme
new file mode 100644
index 000000000..7019cb78e
--- /dev/null
+++ b/context/data/texworks/texworks-context.rme
@@ -0,0 +1,2 @@
+This is just a placeholder. We need to make sure that we end
+up here in case of multiple texworks ini files.
diff --git a/context/data/texworks/texworks-setup.ini b/context/data/texworks/texworks-setup.ini
index 1c638fc1b..6357e775b 100644
--- a/context/data/texworks/texworks-setup.ini
+++ b/context/data/texworks/texworks-setup.ini
@@ -1,2 +1,2 @@
-inipath=./../../texmf-context/context/data/texworks
-libpath=./../../texmf-context/context/data/texworks
+inipath=.
+libpath=.
diff --git a/fonts/map/luatex/context/demo-font.lum b/fonts/map/luatex/context/demo-font.lum
new file mode 100644
index 000000000..0beca031b
--- /dev/null
+++ b/fonts/map/luatex/context/demo-font.lum
@@ -0,0 +1,70 @@
+if not modules then modules = { } end modules ['demo-font.lum'] = {
+    version   = 1.001,
+    comment   = "companion to font-map.lua",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+--[[
+
+    After some testing Taco and I decided that the lack of information
+    with regards to unicode mapping of alternative shapes can best be
+    handled by an auxiliary table. So, here is an example. This file
+    gets its place in TDS in:
+
+        /fonts/map/luatex/context/demo-file.lum
+
+    We recommend that you use a lowercase filename, just to prevent
+    lookup errors. Font filenames are already such a mess.
+
+    A test file, dedicated to Dohyun Kim is:
+
+        \usemodule[fnt-20]
+
+        \starttext
+
+        \definefontfeature
+          [otftracker-kozminprovi-regular]
+          [mode=node,vrt2=yes,script=latn]
+
+        \setvariables
+          [otftracker]
+          [font=kozminprovi-regular,
+           sample=\char"3002]
+
+        \stoptext
+
+    In the resulting pdf file you will then find:
+
+        begincmap
+        /CIDSystemInfo
+        << /Registry (TeX)
+        /Ordering (FNUMTE-KozMinProVI-Regular)
+        /Supplement 0
+        >> def
+        /CMapName /TeX-Identity-FNUMTE-KozMinProVI-Regular def
+        /CMapType 2 def
+        1 begincodespacerange
+        <0000> 
+        endcodespacerange
+        0 beginbfrange
+        endbfrange
+        2 beginbfchar
+        <027B> <3002>
+        <1ED0> <3002>
+        endbfchar
+        endcmap
+
+    Of course this assumes that the font used is the same as we
+    have on our machines.
+
+]]--
+
+return {
+    version = 1.00,
+    fontname = "kozminprovi-regular.otf",
+    tounicode = {
+        ["Japan1.7888"] = 0x3002,
+    },
+}
diff --git a/metapost/context/base/mp-core.mp b/metapost/context/base/mp-core.mp
index 6720fe90d..7c5d5a1c1 100644
--- a/metapost/context/base/mp-core.mp
+++ b/metapost/context/base/mp-core.mp
@@ -346,7 +346,7 @@ boolean force_multi_par_chain  ; force_multi_par_chain  := true  ;
 boolean one_piece_multi_par    ; one_piece_multi_par    := false ;
 boolean check_multi_par_chain  ; check_multi_par_chain  := true  ; % extra page check
 
-boolean multi_column_first_page_hack; multi_column_first_page_hack := false ;
+boolean multi_column_first_page_hack; multi_column_first_page_hack := true ; % seems to work ok
 
 def simplify_multi_pars = % boundingbox ipv shape als optie
   for i := 1 upto nofmultipars :
diff --git a/scripts/context/lua/mtx-context.lua b/scripts/context/lua/mtx-context.lua
index 3e0abb1e7..71d2eee56 100644
--- a/scripts/context/lua/mtx-context.lua
+++ b/scripts/context/lua/mtx-context.lua
@@ -9,6 +9,13 @@ if not modules then modules = { } end modules ['mtx-context'] = {
 scripts         = scripts         or { }
 scripts.context = scripts.context or { }
 
+-- a demo cld file:
+--
+-- context.starttext()
+-- context.chapter("Hello There")
+-- context.readfile("tufte","","not found")
+-- context.stoptext()
+
 -- l-file / todo
 
 function file.needsupdate(oldfile,newfile)
@@ -521,6 +528,10 @@ end
 --     end
 -- end
 
+scripts.context.cldsuffixes = table.tohash {
+    "cld",
+}
+
 scripts.context.xmlsuffixes = table.tohash {
     "xml",
 }
@@ -648,6 +659,7 @@ function scripts.context.run(ctxdata,filename)
                 if a and (a.engine == 'pdftex' or a.engine == 'xetex' or environment.argument("pdftex") or environment.argument("xetex")) then
                     local texexec = resolvers.find_file("texexec.rb") or ""
                     if texexec ~= "" then
+                        os.setenv("RUBYOPT","")
                         local command = string.format("ruby %s %s",texexec,environment.reconstruct_commandline(environment.arguments_after))
                         os.exec(command)
                     end
@@ -672,7 +684,9 @@ function scripts.context.run(ctxdata,filename)
                             else
                                 filename = makestub("\\xmlprocess{\\xmldocument}{%s}{}",filename)
                             end
-                        elseif scripts.context.luasuffixes[suffix] then
+                        elseif scripts.context.cldsuffixes[suffix] or environment.argument("forcecld") then
+                            filename = makestub("\\ctxlua{context.runfile('%s')}",filename)
+                        elseif scripts.context.luasuffixes[suffix] or environment.argument("forcelua") then
                             filename = makestub("\\ctxlua{dofile('%s')}",filename)
                         end
                         --
@@ -1333,6 +1347,7 @@ messages.help = [[
 --ctx=name            use ctx file
 --version             report installed context version
 --forcexml            force xml stub (optional flag: --mkii)
+--forcecld            force cld (context lua document) stub
 --autopdf             close pdf file in viewer and start pdf viewer afterwards
 --once                only one run
 --purge(all)          purge files (--pattern=...)
diff --git a/scripts/context/lua/mtx-convert.lua b/scripts/context/lua/mtx-convert.lua
index cf1d640c5..c0c383b17 100644
--- a/scripts/context/lua/mtx-convert.lua
+++ b/scripts/context/lua/mtx-convert.lua
@@ -6,66 +6,88 @@ if not modules then modules = { } end modules ['mtx-convert'] = {
     license   = "see context related readme files"
 }
 
-do
+-- todo: eps and svg
 
-    graphics            = graphics            or { }
-    graphics.converters = graphics.converters or { }
+graphics            = graphics            or { }
+graphics.converters = graphics.converters or { }
 
-    local gsprogram = (os.platform == "windows" and "gswin32c") or "gs"
-    local gstemplate = "%s -q -sDEVICE=pdfwrite -dEPSCrop -dNOPAUSE -dNOCACHE -dBATCH -dAutoRotatePages=/None -dProcessColorModel=/DeviceCMYK -sOutputFile=%s %s -c quit"
+local gsprogram = (os.platform == "windows" and "gswin32c") or "gs"
+local gstemplate = "%s -q -sDEVICE=pdfwrite -dEPSCrop -dNOPAUSE -dNOCACHE -dBATCH -dAutoRotatePages=/None -dProcessColorModel=/DeviceCMYK -sOutputFile=%s %s -c quit"
 
-    function graphics.converters.eps(oldname,newname)
-        return gstemplate:format(gsprogram,newname,oldname)
-    end
+function graphics.converters.eps(oldname,newname)
+    return gstemplate:format(gsprogram,newname,oldname)
+end
 
-    local improgram  = "convert"
-    local imtemplate = {
-        low    = "%s -quality   0 -compress zip %s pdf:%s",
-        medium = "%s -quality  75 -compress zip %s pdf:%s",
-        high   = "%s -quality 100 -compress zip %s pdf:%s",
-    }
-
-    function graphics.converters.jpg(oldname,newname)
-        local ea = environment.arguments
-        local quality = (ea.high and 'high') or (ea.medium and 'medium') or (ea.low and 'low') or 'high'
-        return imtemplate[quality]:format(improgram,oldname,newname)
+local improgram  = "convert"
+local imtemplate = {
+    low    = "%s -quality   0 -compress zip %s pdf:%s",
+    medium = "%s -quality  75 -compress zip %s pdf:%s",
+    high   = "%s -quality 100 -compress zip %s pdf:%s",
+}
+
+function graphics.converters.jpg(oldname,newname)
+    local ea = environment.arguments
+    local quality = (ea.high and 'high') or (ea.medium and 'medium') or (ea.low and 'low') or 'high'
+    return imtemplate[quality]:format(improgram,oldname,newname)
+end
+
+graphics.converters.tif  = graphics.converters.jpg
+graphics.converters.tiff = graphics.converters.jpg
+graphics.converters.png  = graphics.converters.jpg
+
+local function convert(kind,oldname,newname)
+    if graphics.converters[kind] then -- extra test
+        local tmpname = file.replacesuffix(newname,"tmp")
+        local command = graphics.converters[kind](oldname,tmpname)
+        logs.simple("command: %s",command)
+        io.flush()
+        os.spawn(command)
+        os.remove(newname)
+        os.rename(tmpname,newname)
+        if lfs.attributes(newname,"size") == 0 then
+            os.remove(newname)
+        end
     end
+end
 
-    graphics.converters.tif  = graphics.converters.jpg
-    graphics.converters.tiff = graphics.converters.jpg
-    graphics.converters.png  = graphics.converters.jpg
-
-    function graphics.converters.convertpath(inputpath,outputpath)
-        inputpath  = inputpath  or "."
-        outputpath = outputpath or "."
-        for name in lfs.dir(inputpath) do
-            local suffix = file.extname(name)
-            if name:find("%.$") then
-                -- skip . and ..
-            elseif graphics.converters[suffix] then
-                local oldname = file.join(inputpath,name)
-                local newname = file.join(outputpath,file.replacesuffix(name,"pdf"))
-                local et = lfs.attributes(oldname,"modification")
-                local pt = lfs.attributes(newname,"modification")
-                if not pt or et > pt then
-                    dir.mkdirs(outputpath)
-                    local tmpname = file.replacesuffix(newname,"tmp")
-                    local command = graphics.converters[suffix](oldname,tmpname)
-                    logs.simple("command: %s",command)
-                    io.flush()
-                    os.spawn(command)
-                    os.remove(newname)
-                    os.rename(tmpname,newname)
-                    if lfs.attributes(newname,"size") == 0 then
-                        os.remove(newname)
-                    end
-                end
-            elseif lfs.isdir(inputpath .. "/".. name) then
-                graphics.converters.convertpath(inputpath .. "/".. name,outputpath .. "/".. name)
+function graphics.converters.convertpath(inputpath,outputpath)
+    inputpath  = inputpath  or "."
+    outputpath = outputpath or "."
+    for name in lfs.dir(inputpath) do
+        local suffix = file.extname(name)
+        if name:find("%.$") then
+            -- skip . and ..
+        elseif graphics.converters[suffix] then
+            local oldname = file.join(inputpath,name)
+            local newname = file.join(outputpath,file.replacesuffix(name,"pdf"))
+            local et = lfs.attributes(oldname,"modification")
+            local pt = lfs.attributes(newname,"modification")
+            if not pt or et > pt then
+                dir.mkdirs(outputpath)
+                convert(suffix,oldname,newname)
             end
+        elseif lfs.isdir(inputpath .. "/".. name) then
+            graphics.converters.convertpath(inputpath .. "/".. name,outputpath .. "/".. name)
         end
     end
+end
 
+function graphics.converters.convertfile(oldname)
+    local suffix = file.extname(oldname)
+    if graphics.converters[suffix] then
+        local newname = file.replacesuffix(name,"pdf")
+        if oldname == newname then
+            -- todo: downsample, crop etc
+        elseif environment.argument("force") then
+            convert(suffix,oldname,newname)
+        else
+            local et = lfs.attributes(oldname,"modification")
+            local pt = lfs.attributes(newname,"modification")
+            if not pt or et > pt then
+                convert(suffix,oldname,newname)
+            end
+        end
+    end
 end
 
 scripts         = scripts         or { }
@@ -88,6 +110,13 @@ function scripts.convert.convertall()
     end
 end
 
+function scripts.convert.convertgiven()
+    for _, name in ipairs(environment.files) do
+        graphics.converters.convertfile(name)
+    end
+end
+
+
 logs.extendbanner("Graphic Conversion Tools 0.10",true)
 
 messages.help = [[
@@ -95,11 +124,14 @@ messages.help = [[
 --inputpath=string    original graphics path
 --outputpath=string   converted graphics path
 --watch               watch folders
+--force               force conversion (even if older)
 --delay               time between sweeps
 ]]
 
 if environment.argument("convertall") then
     scripts.convert.convertall()
+elseif environment.files[1] then
+    scripts.convert.convertgiven()
 else
     logs.help(messages.help)
 end
diff --git a/scripts/context/lua/mtx-grep.lua b/scripts/context/lua/mtx-grep.lua
index 82a80314a..a6617d711 100644
--- a/scripts/context/lua/mtx-grep.lua
+++ b/scripts/context/lua/mtx-grep.lua
@@ -44,7 +44,7 @@ function scripts.grep.find(pattern, files, offset)
                         -- skip
                     elseif find(line,pattern) then
                         m = m + 1
-                        write_nl(format("%s %s: %s",name,n,line))
+                        write_nl(format("%s %6i: %s",name,n,line))
                         io.flush()
                     end
                 end
@@ -62,7 +62,7 @@ function scripts.grep.find(pattern, files, offset)
                     n = n + 1
                     if find(line,pattern) then
                         m = m + 1
-                        write_nl(format("%s %s: %s",name,n,line))
+                        write_nl(format("%s %6i: %s",name,n,line))
                         io.flush()
                     end
                 end
diff --git a/scripts/context/lua/mtx-texworks.lua b/scripts/context/lua/mtx-texworks.lua
new file mode 100644
index 000000000..f525d5336
--- /dev/null
+++ b/scripts/context/lua/mtx-texworks.lua
@@ -0,0 +1,96 @@
+if not modules then modules = { } end modules ['mtx-texworks'] = {
+    version   = 1.002,
+    comment   = "companion to mtxrun.lua",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+scripts          = scripts          or { }
+scripts.texworks = scripts.texworks or { }
+
+local texworkspaths = {
+    "completion",
+    "configuration",
+    "dictionaries",
+    "translations",
+    "scripts",
+    "templates",
+    "TUG"
+}
+
+local texworkssignal = "texworks-context.rme"
+local texworkininame = "TeXworks.ini"
+
+function scripts.texworks.start(indeed)
+    local is_mswin = os.platform == "windows"
+    local workname = (is_mswin and "texworks.exe") or "TeXworks"
+    local fullname = nil
+    local binpaths = file.split_path(os.getenv("PATH")) or file.split_path(os.getenv("path"))
+    local datapath = resolvers.find_file(texworkssignal,"other text files") or ""
+    if datapath ~= "" then
+        datapath  = file.dirname(datapath) -- data
+        if datapath == "" then
+            datapath = resolvers.ownpath
+        end
+    else
+        datapath = resolvers.find_file(texworkininame,"other text files") or ""
+        if datapath == "" then
+            datapath = resolvers.find_file(string.lower(texworkininame),"other text files") or ""
+        end
+        if datapath ~= "" and lfs.isfile(datapath) then
+            datapath  = file.dirname(datapath) -- TUG
+            datapath  = file.dirname(datapath) -- data
+            if datapath == "" then
+                datapath = resolvers.ownpath
+            end
+        end
+    end
+    if datapath == "" then
+        logs.simple("invalid datapath, maybe you need to regenerate the file database")
+        return false
+    end
+    if not binpaths or #binpaths == 0 then
+        logs.simple("invalid binpath")
+        return false
+    end
+    for i=1,#binpaths do
+        local p = file.join(binpaths[i],workname)
+        if lfs.isfile(p) then
+            fullname = p
+            break
+        end
+    end
+    if not fullname then
+        logs.simple("unable to locate %s",workname)
+        return false
+    end
+    for _, subpath in ipairs(texworkspaths)  do
+        dir.makedirs(file.join(datapath,subpath))
+    end
+    os.setenv("TW_INIPATH",datapath)
+    os.setenv("TW_LIBPATH",datapath)
+    if not indeed or environment.argument("verbose") then
+        logs.simple("data path: %s", datapath)
+        logs.simple("full name: %s", fullname)
+    end
+    if indeed then
+        os.launch(fullname)
+    end
+end
+
+
+logs.extendbanner("TeXworks startup script 1.0",true)
+
+messages.help = [[
+--start [--verbose]   start texworks
+--test                report what will happen
+]]
+
+if environment.argument("start") then
+    scripts.texworks.start(true)
+elseif environment.argument("test") then
+    scripts.texworks.start()
+else
+    logs.help(messages.help)
+end
diff --git a/scripts/context/lua/mtx-tools.lua b/scripts/context/lua/mtx-tools.lua
new file mode 100644
index 000000000..87fd51dc6
--- /dev/null
+++ b/scripts/context/lua/mtx-tools.lua
@@ -0,0 +1,57 @@
+if not modules then modules = { } end modules ['mtx-tools'] = {
+    version   = 1.002,
+    comment   = "companion to mtxrun.lua",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+-- data tables by Thomas A. Schmitz
+
+local find, gsub = string.find, string.gsub
+
+scripts       = scripts       or { }
+scripts.tools = scripts.tools or { }
+
+local bomb_1, bomb_2 = "^\254\255", "^\239\187\191"
+
+function scripts.tools.disarmutfbomb()
+    local force, done = environment.argument("force"), false
+    for _, name in ipairs(environment.files) do
+        if lfs.isfile(name) then
+            local data = io.loaddata(name)
+            if not data then
+                -- just skip
+            elseif find(data,bomb_1) then
+                logs.simple("file '%s' has a 2 character utf bomb",name)
+                if force then
+                    io.savedata(name,(gsub(data,bomb_1,"")))
+                end
+                done = true
+            elseif find(data,bomb_2) then
+                logs.simple("file '%s' has a 3 character utf bomb",name)
+                if force then
+                    io.savedata(name,(gsub(data,bomb_2,"")))
+                end
+                done = true
+            else
+            --  logs.simple("file '%s' has no utf bomb",name)
+            end
+        end
+    end
+    if done and not force then
+        logs.simple("use --force to do a real disarming")
+    end
+end
+
+logs.extendbanner("All Kind Of Tools 1.0",true)
+
+messages.help = [[
+--disarmutfbomb       remove utf bomb if present
+]]
+
+if environment.argument("disarmutfbomb") then
+    scripts.tools.disarmutfbomb()
+else
+    logs.help(messages.help)
+end
diff --git a/scripts/context/lua/mtx-update.lua b/scripts/context/lua/mtx-update.lua
index 66f6898d3..bc6ca4026 100644
--- a/scripts/context/lua/mtx-update.lua
+++ b/scripts/context/lua/mtx-update.lua
@@ -102,6 +102,15 @@ scripts.update.engines = {
     },
 }
 
+scripts.update.goodies = {
+    ["scite"] = {
+        { "bin//scite/",     "texmf-" },
+    },
+    ["texworks"] = {
+        { "bin//texworks/",  "texmf-" },
+    },
+}
+
 scripts.update.platforms = {
     ["mswin"]         = "mswin",
     ["windows"]       = "mswin",
@@ -163,7 +172,8 @@ function scripts.update.synchronize()
     local bin = states.get("rsync.program")         -- rsync
     local url = states.get("rsync.server")          -- contextgarden.net
     local version = states.get("context.version")   -- current (or beta)
-    local extras = states.get("extras")             -- extra goodies (like modules)
+    local extras = states.get("extras")             -- extras (like modules)
+    local goodies = states.get("goodies")           -- goodies (like editors)
     local force = environment.argument("force")
 
     bin = string.gsub(bin,"\\","/")
@@ -285,6 +295,14 @@ function scripts.update.synchronize()
             end
         end
 
+        if goodies and type(goodies) == "table" then
+            for goodie, _ in pairs(goodies) do
+                for platform, _ in pairs(platforms) do
+                    add_collection(scripts.update.goodies[goodie],platform)
+                end
+            end
+        end
+
         local combined = { }
         for _, repository in ipairs(scripts.update.repositories) do
             if repositories[repository] then
@@ -374,7 +392,8 @@ function scripts.update.make()
 
     local force = environment.argument("force")
     local texroot = scripts.update.fullpath(states.get("paths.root"))
-    local engines= states.get('engines')
+    local engines = states.get('engines')
+    local goodies = states.get('goodies')
     local platforms = states.get('platforms')
     local formats = states.get('formats')
 
@@ -431,6 +450,7 @@ messages.help = [[
 --texroot=string      installation directory (not guessed for the moment)
 --engine=string       tex engine (luatex, pdftex, xetex)
 --extras=string       extra modules (can be list or 'all')
+--goodies=string      extra binaries (like scite and texworks)
 --force               instead of a dryrun, do the real thing
 --update              update minimal tree
 --make                also make formats and generate file databases
@@ -500,6 +520,9 @@ if scripts.savestate then
     for r in gmatch(environment.argument("extras") or "","([^, ]+)") do
         states.set("extras." .. r, true)
     end
+    for r in gmatch(environment.argument("goodies") or "","([^, ]+)") do
+        states.set("goodies." .. r, true)
+    end
 
     logs.report("state","loaded")
 
diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua
index 0c96ed446..d30350ea5 100644
--- a/scripts/context/lua/mtxrun.lua
+++ b/scripts/context/lua/mtxrun.lua
@@ -10070,6 +10070,12 @@ function runners.execute_ctx_script(filename,arguments)
     end
 end
 
+function runners.timedrun(filename) -- just for me
+    if filename and filename ~= "" then
+        runners.timed(function() os.execute(filename) end)
+    end
+end
+
 function runners.timed(action)
     statistics.timed(action)
 end
@@ -10197,6 +10203,9 @@ elseif environment.argument("locate") then
 elseif environment.argument("platform")then
     -- locate platform
     runners.locate_platform()
+elseif environment.argument("timedrun") then
+    -- locate platform
+    runners.timedrun(filename)
 elseif environment.argument("help") or filename=='help' or filename == "" then
     logs.help(messages.help)
     -- execute script
diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua
index 0c96ed446..d30350ea5 100644
--- a/scripts/context/stubs/mswin/mtxrun.lua
+++ b/scripts/context/stubs/mswin/mtxrun.lua
@@ -10070,6 +10070,12 @@ function runners.execute_ctx_script(filename,arguments)
     end
 end
 
+function runners.timedrun(filename) -- just for me
+    if filename and filename ~= "" then
+        runners.timed(function() os.execute(filename) end)
+    end
+end
+
 function runners.timed(action)
     statistics.timed(action)
 end
@@ -10197,6 +10203,9 @@ elseif environment.argument("locate") then
 elseif environment.argument("platform")then
     -- locate platform
     runners.locate_platform()
+elseif environment.argument("timedrun") then
+    -- locate platform
+    runners.timedrun(filename)
 elseif environment.argument("help") or filename=='help' or filename == "" then
     logs.help(messages.help)
     -- execute script
diff --git a/scripts/context/stubs/mswin/mtxworks.cmd b/scripts/context/stubs/mswin/mtxworks.cmd
new file mode 100644
index 000000000..322d9464d
--- /dev/null
+++ b/scripts/context/stubs/mswin/mtxworks.cmd
@@ -0,0 +1 @@
+mtxrun --script texworks --start
diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun
index 0c96ed446..d30350ea5 100755
--- a/scripts/context/stubs/unix/mtxrun
+++ b/scripts/context/stubs/unix/mtxrun
@@ -10070,6 +10070,12 @@ function runners.execute_ctx_script(filename,arguments)
     end
 end
 
+function runners.timedrun(filename) -- just for me
+    if filename and filename ~= "" then
+        runners.timed(function() os.execute(filename) end)
+    end
+end
+
 function runners.timed(action)
     statistics.timed(action)
 end
@@ -10197,6 +10203,9 @@ elseif environment.argument("locate") then
 elseif environment.argument("platform")then
     -- locate platform
     runners.locate_platform()
+elseif environment.argument("timedrun") then
+    -- locate platform
+    runners.timedrun(filename)
 elseif environment.argument("help") or filename=='help' or filename == "" then
     logs.help(messages.help)
     -- execute script
diff --git a/scripts/context/stubs/unix/mtxworks b/scripts/context/stubs/unix/mtxworks
new file mode 100755
index 000000000..ef8f230c3
--- /dev/null
+++ b/scripts/context/stubs/unix/mtxworks
@@ -0,0 +1,2 @@
+#!/bin/sh
+mtxrun --script texworks --start
diff --git a/tex/context/base/anch-pgr.mkii b/tex/context/base/anch-pgr.mkii
index bc4e0d828..fde8755c2 100644
--- a/tex/context/base/anch-pgr.mkii
+++ b/tex/context/base/anch-pgr.mkii
@@ -1352,6 +1352,7 @@
 \def\do@@ammenuposition#1%
   {\ifnum\currentamposition>0
      \dowithnextbox{\hpos{menu:#1:\realfolio}{\flushnextbox}}\hbox
+   %  \hpos{menu:#1:\realfolio} % also ok if we skip over fi
    \fi}
 
 %D \macros
diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv
index ba566f970..8e719e0d7 100644
--- a/tex/context/base/anch-pgr.mkiv
+++ b/tex/context/base/anch-pgr.mkiv
@@ -17,6 +17,9 @@
 %D the reference point on the page. The next macro does so and
 %D is hooked into the page building routine.
 
+%D I will speed up this module when I have a proper torture
+%D test file.
+
 \unprotect
 
 % in the future, the depth of tail will reflect page depth
@@ -26,9 +29,9 @@
 %D The next macros so some housekeeping.
 
 \def\pageanchor{page:0} % for the moment only one pagesize
-\def\textanchor{text:\realfolio}
-\def\headanchor{head:\realfolio} % virtual position
-\def\tailanchor{tail:\realfolio} % virtual position
+\def\textanchor{text:\the\realpageno}
+\def\headanchor{head:\the\realpageno} % virtual position
+\def\tailanchor{tail:\the\realpageno} % virtual position
 
 %D Anchors:
 
@@ -201,7 +204,7 @@
 \newtoks\everyinsertpositionaction
 
 \def\cleanuppositionaction#1% not in trialtypesetting
-  {\ifcsname\POSactionprefix#1++\endcsname % \ifundefined{\POSactionprefix#1++}\else
+  {\ifcsname\POSactionprefix#1++\endcsname
      \the\everycleanpositionaction
      \iflocalpositioning
        \letgvalue{\POSactionprefix#1++}\empty
@@ -273,10 +276,6 @@
 
 \let\stopMPpositiongraphic\relax
 
-% \def\prepareMPpositionvariables
-%   {\ifundefined{\@@meta self}\setvalue{\@@meta self}{\currentposition}\fi
-%    \ifundefined{\@@meta from}\setvalue{\@@meta from}{\currentposition}\fi}
-
 \def\prepareMPpositionvariables
   {\ifcsname\@@meta self\endcsname\else\setvalue{\@@meta self}{\currentposition}\fi
    \ifcsname\@@meta from\endcsname\else\setvalue{\@@meta from}{\currentposition}\fi}
@@ -292,23 +291,26 @@
 % Now we need a adapted action handler:
 
 \def\dopositionaction#1% test saves hash entry in etex
-  {\ifundefined{\POSactionprefix#1::}\else
-     \ifnum\MPp{#1}>\zerocount % new
-       \bgroup
-       \setbox\scratchbox\hbox
-       \bgroup
-       \traceposstring\clap\red{<#1>}%
-       \the\everyinsertpositionaction
-       \the\everypositionaction
-       \getvalue{\POSactionprefix#1::}%
-       \cleanuppositionaction{#1}%
-       \egroup                % smashed is really needed else
-       \smashedbox\scratchbox % we get problems with too big
-       \egroup                % overlays (s-pre-0x.tex)
-     \else
-       % shouldn't happen too often
-       \traceposstring\clap\cyan{<#1>}%
-     \fi
+  {\ifcsname\POSactionprefix#1::\endcsname
+     \dodopositionaction{#1}%
+   \fi}
+
+\def\dodopositionaction#1%
+  {\ifnum\MPp{#1}>\zerocount % new
+     \bgroup
+     \setbox\scratchbox\hbox
+     \bgroup
+     \traceposstring\clap\red{<#1>}%
+     \the\everyinsertpositionaction
+     \the\everypositionaction
+     \csname\POSactionprefix#1::\endcsname
+     \cleanuppositionaction{#1}%
+     \egroup                % smashed is really needed else
+     \smashedbox\scratchbox % we get problems with too big
+     \egroup                % overlays (s-pre-0x.tex)
+   \else
+     % shouldn't happen too often
+     \traceposstring\clap\cyan{<#1>}%
    \fi}
 
 \def\MPpositiongraphic
@@ -607,28 +609,29 @@
 \newcounter\localpositionnumber
 
 \def\MPanchornumber
-  {\iflocalpositioning\localpositionnumber\else\realfolio\fi}
+  {\iflocalpositioning\localpositionnumber\else\the\realpageno\fi}
 
 %D So far for the trickery.
 
 \newcount\textbackgrounddepth
 
-\appendtoks
-  \expanded{\savecurrentvalue\noexpand\totalnofparbackgrounds{\number\nofparbackgrounds}}%
-\to \everybye
-
-\appendtoks
-  \initializeparbackgrounds
-\to \everystarttext
-
-\ifx\totalnofparbackgrounds\undefined \newcounter\totalnofparbackgrounds \fi
 \ifx\nofparbackgrounds     \undefined \newcount  \nofparbackgrounds      \fi
 
-\def\initializeparbackgrounds
-  {\ifcase\totalnofparbackgrounds\else
-     \global\positioningtrue
-     \global\positioningpartrue
-   \fi}
+% \ifx\totalnofparbackgrounds\undefined \newcounter\totalnofparbackgrounds \fi
+%
+% \appendtoks
+%   \expanded{\savecurrentvalue\noexpand\totalnofparbackgrounds{\number\nofparbackgrounds}}%
+% \to \everybye
+%
+% \appendtoks
+%   \initializeparbackgrounds
+% \to \everystarttext
+%
+% \def\initializeparbackgrounds
+%   {\ifcase\totalnofparbackgrounds\else
+%      \global\positioningtrue
+%      \global\positioningpartrue
+%    \fi}
 
 \unexpanded\def\starttextbackground
   {\bgroup
@@ -680,10 +683,6 @@
    \def\currenttextbackground{#1}%
    \global\advance\nofparbackgrounds\plusone
    \edef\currentparbackground{pbg:\number\nofparbackgrounds}%
-%    \bgroup
-%      \advance\nofparbackgrounds\plusone
-%      \xdef\nextparbackground{pbg:\number\nofparbackgrounds}%
-%    \egroup
    \xdef\nextparbackground{pbg:\number\numexpr\nofparbackgrounds+\plusone\relax}% still xdef ?
    % todo : \synchonizepositionpage{b:\currentparbackground}{s:\currentparbackground}%
    \setuptextbackground[#1][#2]%
@@ -695,8 +694,7 @@
 % todo \backgroundvariable\c!variant
 
 \def\dopresettextbackground#1% todo: \backgroundparameter
-  {\ExpandFirstAfter\processaction % \EFA niet echt nodig
-     [\textbackgroundparameter\c!location]
+  {\normalexpanded{\noexpand\processaction[\textbackgroundparameter\c!location]}
      [   \v!text=>\let\dodostarttextbackground\dostarttextbackgroundtxt
                   \let\dodostoptextbackground \dostoptextbackgroundtxt,
     \v!paragraph=>\let\dodostarttextbackground\dostarttextbackgroundpar
@@ -754,7 +752,7 @@
    \dostopattributes}
 
 \def\dostarttextbackgroundtxt
-  {\ifvmode \dontleavehmode \fi % was leavevmode, brrr
+  {\ifvmode \dontleavehmode \fi
    \dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty
    \fpos\currentparbackground\ignorespaces}
 
@@ -762,37 +760,6 @@
   {\tpos\currentparbackground
    \dostopattributes}
 
-% keep this simple one, it's used in prikkels and alike
-%
-% \def\dostarttextbackgroundpar
-%   {\endgraf % new
-%    \getvalue{\??td\currenttextbackground\c!before}%
-%    \noindent\fpos\currentparbackground\ignorespaces
-%    \bgroup
-%    \nobreak \vskip-\lineheight \nobreak
-%    \doassignsomeskip\getvalue{\??td\currenttextbackground\c!topoffset}\to\scratchskip
-%    \kern\scratchskip\nobreak
-%    \dosetleftskipadaption{\getvalue{\??td\currenttextbackground\c!leftoffset}}%
-%    \advance\leftskip\leftskipadaption
-%    \dosetleftskipadaption{\getvalue{\??td\currenttextbackground\c!rightoffset}}%
-%    \advance\rightskip\leftskipadaption
-%    \dostartattributes{\??td\currenttextbackground}\c!style\c!color{}%
-%    \nowhitespace
-%    \seteffectivehsize
-%    \par}
-%
-% \def\dostoptextbackgroundpar
-%   {\par
-%    \dostopattributes
-%    \doassignsomeskip\getvalue{\??td\currenttextbackground\c!bottomoffset}\to\scratchskip
-%    \kern\scratchskip\nobreak
-%    \nobreak \vskip-\lineheight \nobreak
-%    \nowhitespace
-%    \egroup
-%    \nobreak \noindent \strut \hfill \kern\zeropoint \tpos\currentparbackground
-%    \endgraf % new
-%    \getvalue{\??td\currenttextbackground\c!after}}
-
 \newskip\textbackgroundskip
 
 \def\dostarttextbackgroundpar
@@ -868,52 +835,83 @@
 \let\textparwidth \!!zeropoint
 
 \def\calculatetextpardimensions
-  {\docalculatetextpardimensions\btbanchor    \etbanchor    \MPparanchor}
+  {\docalculatetextpardimensions\btbanchor\etbanchor\MPparanchor}
 
 \def\calculatenexttextpardimensions
   {\docalculatetextpardimensions\nextbtbanchor\nextetbanchor\relax}
 
-\def\docalculatetextpardimensions#1#2#3% todo: dimexpr
-  {\scratchcounter\MPp#2%\etbanchor
-   \advance\scratchcounter-\MPp#1%\btanchor
-   \edef\textparpages{\the\scratchcounter}%
-   \ifcase\scratchcounter
-     % one page
-     \scratchdimen         \MPy#1%\btanchor
-     \advance\scratchdimen-\MPy#2%\etbanchor
-   \else
-     % two or more pages
-     \scratchdimen         \MPy#1%\btanchor
-     \advance\scratchdimen-\MPy#2%\etbanchor
-     \advance\scratchdimen-\MPy\textanchor
-     \advance\scratchdimen \MPy\textanchor % - and then + ?
-     \advance\scratchdimen \MPh\textanchor\relax
-     \ifcase\scratchcounter>2 \ifnum\scratchcounter<5
-       % more pages
-       \scratchdimen\textheight
-       \advance\scratchcounter \minusone
-       \multiply\scratchdimen \scratchcounter
-     \else
-       % keep'm small
-       \scratchdimen5\textheight
-     \fi \fi
-   \fi
-   \edef\textparheight{\the\scratchdimen}%
-   \ifcase\scratchcounter
-     % one page
-     \scratchdimen         \MPx#2%\etbanchor
-     \advance\scratchdimen-\MPx#1%\btanchor
-   \else
-     % two or more pages / maybe also hang
-     \ifx#3\relax
-       \scratchdimen\makeupwidth % \textwidth
-     \else
-       \scratchdimen\MPw\MPparanchor
-       \advance\scratchdimen-\MPl\MPparanchor
-       \advance\scratchdimen-\MPr\MPparanchor
-     \fi
-   \fi
-   \edef\textparwidth{\the\scratchdimen}}
+% \def\docalculatetextpardimensions#1#2#3% #1=\btbanchor #2=\etbanchor
+%   {\scratchcounter\numexpr\MPp#2-\MPp#1\relax
+%    \edef\textparpages{\the\scratchcounter}%
+%    \ifcase\scratchcounter
+%      % one page
+%      \scratchdimen\dimexpr\MPy#1-\MPy#2\relax
+%    \else
+%      % two or more pages
+%      \ifnum\scratchcounter>2
+%        \ifnum\scratchcounter<5
+%          % more pages
+%          \scratchdimen\textheight
+%          \advance\scratchcounter \minusone
+%          \multiply\scratchdimen \scratchcounter
+%        \else
+%          % keep'm small
+%          \scratchdimen5\textheight
+%        \fi
+%      \else
+%        \scratchdimen\dimexpr\MPy#1-\MPy#2-\MPy\textanchor+\MPy\textanchor+\MPh\textanchor\relax
+%      \fi
+%    \fi
+%    \edef\textparheight{\the\scratchdimen}%
+%    \ifcase\scratchcounter
+%      % one page
+%      \scratchdimen\dimexpr\MPx#2-\MPx#1\relax
+%    \else
+%      % two or more pages / maybe also hang
+%      \ifx#3\relax
+%        \scratchdimen\makeupwidth % \textwidth
+%      \else
+%        \scratchdimen\dimexpr\MPw\MPparanchor-\MPl\MPparanchor-\MPr\MPparanchor\relax
+%      \fi
+%    \fi
+%    \edef\textparwidth{\the\scratchdimen}}
+
+\def\docalculatetextpardimensions#1#2#3% #1=\btbanchor #2=\etbanchor (adapted 8/6/2009)
+  {\scratchcounter\numexpr\MPp#2-\MPp#1\relax
+   \edef\textparpages
+     {\the\scratchcounter}%
+   \edef\textparheight
+     {\the\dimexpr
+        \ifcase\scratchcounter
+          % one page
+          \MPy#1-\MPy#2%
+        \else
+          % two or more pages
+          \ifnum\scratchcounter>2
+            \ifnum\scratchcounter<5
+              % more pages
+              \textheight*\numexpr\scratchcounter+\minusone
+            \else
+              % keep'm small
+              5\textheight
+            \fi
+          \else
+            \MPy#1-\MPy#2-\MPy\textanchor+\MPy\textanchor+\MPh\textanchor
+          \fi
+        \fi}%
+   \edef\textparwidth
+     {\the\dimexpr
+        \ifcase\scratchcounter
+          % one page
+          \dimexpr\MPx#2-\MPx#1%
+        \else
+          % two or more pages / maybe also hang
+          \ifx#3\relax
+            \makeupwidth % \textwidth
+          \else
+            \MPw\MPparanchor-\MPl\MPparanchor-\MPr\MPparanchor
+          \fi
+        \fi}}
 
 \def\mintextparheight{4\lineheight}
 
@@ -938,7 +936,7 @@
 \def\definetextbackground
   {\dodoubleempty\dodefinetextbackground}
 
-\def\dodefinetextbackground[#1][#2]%
+\def\dodefinetextbackground[#1][#2]% parent and ..parameter
   {\ifsecondargument % why ?
      \copyparameters[\??td#1][\??td]
        [\c!state,\c!location,\c!alternative,\c!mp,\c!method,
@@ -1250,7 +1248,7 @@
        % new but bugged
        % \setbox#1\hbox
        %   {\hskip-\MPx{\s!margin:\number\currentmarginpos}%
-       %    \hskip\MPx{head:\realfolio}%
+       %    \hskip\MPx{head:\the\realpageno}%
        %    \box#1}%
        % so far
        \setbox#1\hbox
@@ -1278,7 +1276,7 @@
      \dp#1\zeropoint
      \ht#1\zeropoint
    \fi
-   \graphicvadjust{\box#1}%
+   \graphicvadjust{\dontleavehmode\box#1}% dontleavehmode is needed to get direction right
    \egroup}
 
 \chardef\marginrepositionmethod\plusone   % sidemethod
@@ -1308,25 +1306,22 @@
 
 % 0=notfound  1=found  2=currentpage
 
-\def\do@@amposition#1#2#3%
+\def\domenuitemposition#1#2#3%
   {\doifelsevalue{\??am#1\c!position}\v!yes
      {\doglobal\increment\currentamposition
-      \doifnumberelse{#2}
-        {\docheckrealreferencepage{#2}%
-         \global\chardef\currentamrealpage\ifrealreferencepage2\else1\fi}
-        {\doifreferencefoundelse{#2}
-           {\global\chardef\currentamrealpage\ifrealreferencepage2\else1\fi}
-           {\global\chardef\currentamrealpage0}}% % not found
+      \doifreferencefoundelse{#2}% 0=not found, 1=same page, >1=elsewhere
+        {\chardef\currentamrealpage\ifnum\currentreferencerealpage=\realpageno\plusone\else\plustwo\fi}%
+        {\chardef\currentamrealpage\plustwo}%
       \expanded
         {\doglobal\noexpand\appendtoks
-           #1_menu_button(\currentamposition,\the\currentamrealpage,\MPpos{#1:\currentamposition}) ;
+           #1_menu_button(\number\currentamposition,\the\currentamrealpage,\MPpos{#1:\currentamposition}) ;
          \to \MPmenutoks}%
       \hpos{#1:\currentamposition}{#3}}
      {#3}}
 
-\def\do@@ammenuposition#1%
+\def\dowholemenuposition#1%
   {\ifnum\currentamposition>0
-     \dowithnextbox{\hpos{menu:#1:\realfolio}{\flushnextbox}}\hbox
+     \dowithnextbox{\hpos{menu:#1:\the\realpageno}{\flushnextbox}}\hbox
    \fi}
 
 %D \macros
@@ -1337,6 +1332,7 @@
 %D specified with symbolic names, and symbolic references to
 %D the graphics involved. Each table has its own namespace.
 
+\newconditional\tablehaspositions
 \newcount\noftabpositions
 \newtoks \posXCtoks
 
@@ -1346,10 +1342,13 @@
 \def\tbPOSprefix
   {tbp:\number\noftabpositions:}
 
+% \def\tableposindeed
+%   {\scratchtoks\posXCtoks
+%    \global\posXCtoks\emptytoks
+%    \the\scratchtoks}
+
 \def\tablepos
-  {\scratchtoks\posXCtoks
-   \global\posXCtoks\emptytoks
-   \the\scratchtoks}
+  {\normalexpanded{\global\posXCtoks\emptytoks\the\posXCtoks}}
 
 \let\tabulatepos\tablepos
 
@@ -1403,10 +1402,16 @@
 \def\dodoXC[#1]%
   {{\let\NC\relax\processcommalist[#1]\dododoXC}}
 
-\def\doGSC[#1]{\iffirstargument\dodoGSC[#1]\else\expandafter\NC\fi}
-\def\doGFC[#1]{\iffirstargument\dodoGFC[#1]\else\expandafter\NC\fi}
-\def\doGTC[#1]{\iffirstargument\dodoGTC[#1]\else\expandafter\NC\fi}
-\def\doXC [#1]{\iffirstargument\dodoXC [#1]\else\expandafter\fi\NC}
+\def\@@checktablepositionstate
+  {\iftrialtypesetting
+     \global\settrue\tablehaspositions
+     \firstargumentfalse
+   \fi}
+
+\def\doGSC[#1]{\@@checktablepositionstate\iffirstargument\dodoGSC[#1]\else\expandafter\NC\fi}
+\def\doGFC[#1]{\@@checktablepositionstate\iffirstargument\dodoGFC[#1]\else\expandafter\NC\fi}
+\def\doGTC[#1]{\@@checktablepositionstate\iffirstargument\dodoGTC[#1]\else\expandafter\NC\fi}
+\def\doXC [#1]{\@@checktablepositionstate\iffirstargument\dodoXC [#1]\else\expandafter\fi\NC}
 
 \def\tbGSC{\dosingleempty\doGSC}
 \def\tbGFC{\dosingleempty\doGFC}
@@ -1419,15 +1424,30 @@
 \let\tabulatepos\tablepos
 
 \def\tabulatenormalpos
-  {\hss\tabulatepos\hss}
+  {\iftrialtypesetting
+     % nothing
+   \else\ifconditional\tablehaspositions
+     \hss\tabulatepos\hss
+   \else
+     % nothing
+   \fi\fi}
 
 \def\tabulateequalpos
+  {\iftrialtypesetting
+     \tabulateEQ
+   \else\ifconditional\tablehaspositions
+     \tabulateEQpos
+   \else
+     \tabulateEQ
+   \fi\fi}
+
+\def\tabulateEQpos
   {\setbox\scratchbox\hbox{\tabulateEQ}%
    \hbox to \wd\scratchbox{\hss\kern\zeropoint\tabulatepos\hss}%
    \hskip-\wd\scratchbox
    \box\scratchbox}
 
-\def\tabulatenormalcolumn#1% overloaded
+\def\tabulatenormalcolumn#1% overloaded later in node-bck
   {&\iftabulateequal\tabulateequalpos\else\tabulatenormalpos\fi
    &\global\chardef\tabulatetype#1&}
 
@@ -1437,6 +1457,7 @@
 
 \appendtoks
   \global\advance\noftabpositions\plusone
+  \global\setfalse\tablehaspositions
 \to \everytabulate
 
 % We need to handle paragraphs as well.
@@ -1454,7 +1475,7 @@
      \gdef\doflushtabulateepos{\epos{#1}}%
    \fi}
 
-\def\splitofftabulatebox
+\def\splitofftabulatebox % overloaded in node-bck
   {\dontcomplain
    \global\setbox\tabulatebox % % % global ? % % %
      \vsplit\tablebox\tabulatecolumn to \lineheight
@@ -1465,11 +1486,12 @@
    \ht\tabulatebox\strutht
    \dp\tabulatebox\strutdp
    \box\tabulatebox
-   \doflushtabulateepos}
+   \iftrialtypesetting\else\ifconditional\tablehaspositions\doflushtabulateepos\fi\fi}
 
 \appendtoks
   \let\dotablebpos\dotabulatebpos
   \let\dotableepos\dotabulateepos
+  \glet\doflushtabulateepos\relax
 \to \everytabulate
 
 %D In order to prevent potential clashes with abbreviations,
@@ -1517,6 +1539,7 @@
 
 \appendtoks
   \global\advance\noftabpositions\plusone
+  \global\setfalse\tablehaspositions
 \to \everytable
 
 %D Since we don't want nameclashes:
diff --git a/tex/context/base/anch-pos.lua b/tex/context/base/anch-pos.lua
index b6a66870f..b16fac05c 100644
--- a/tex/context/base/anch-pos.lua
+++ b/tex/context/base/anch-pos.lua
@@ -29,7 +29,7 @@ local dx, dy = "0pt", "0pt"
 
 local function initializer()
     ptbs, pcol = jobpositions.tobesaved, jobpositions.collected
-    local p = pcol["page:0"]
+    local p = pcol["page:0"] -- page:1
     if p then
 -- to be checked !
 --~ dx, dy = p[2] or "0pt", p[3] or "0pt"
diff --git a/tex/context/base/anch-pos.mkiv b/tex/context/base/anch-pos.mkiv
index f58f68302..88f492fb8 100644
--- a/tex/context/base/anch-pos.mkiv
+++ b/tex/context/base/anch-pos.mkiv
@@ -188,11 +188,6 @@
 %D positions.
 
 \newcount\currentpositions  % current number of positions
-\newcounter\totalnofpositions % total from previous run
-
-\appendtoks
-  \expanded{\savecurrentvalue\noexpand\totalnofpositions{\the\currentpositions}}%
-\to \everybye
 
 %D The next switch can be used to communicate a special
 %D situation. Positioning and associated actions can be
@@ -216,15 +211,6 @@
   \localpositioningfalse
 \to \everypagebody
 
-% \def\checkpositions
-%   {\startnointerference
-%    \protectlabels
-%    \doutilities{positions}\jobname\empty\relax\relax
-%    \global\let\checkpositions\relax
-%    \stopnointerference}
-
-\let\checkpositions\relax
-
 %D Since the positional values are to be fully expandable, we
 %D need to preload them as soon as possible, which is why we
 %D load the data when we start a text.
diff --git a/tex/context/base/anch-snc.tex b/tex/context/base/anch-snc.tex
index ed090eaf9..cf5b35d69 100644
--- a/tex/context/base/anch-snc.tex
+++ b/tex/context/base/anch-snc.tex
@@ -143,8 +143,6 @@
 
 \starttext
 
-\setupcolors[state=start]
-
 \definesyncpositions[1]
 
 \startuseMPgraphic{sync}
diff --git a/tex/context/base/attr-ini.lua b/tex/context/base/attr-ini.lua
index a7d09bba1..afd69f1f5 100644
--- a/tex/context/base/attr-ini.lua
+++ b/tex/context/base/attr-ini.lua
@@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['attr-ini'] = {
 }
 
 -- this module is being reconstructed
+-- we can also do the nsnone via a metatable and then also se index 0
 
 local type = type
 local format, gmatch = string.format, string.gmatch
@@ -28,11 +29,6 @@ shipouts = shipouts or { }
 -- first implementation did that and while it saves a bit for glyphs and rules, it
 -- costs more resourses for transparencies. So why bother.
 
--- namespace for all those features / plural becomes singular
-
--- i will do the resource stuff later, when we have an interface to pdf (ok, i can
--- fake it with tokens but it will take some coding
-
 --
 -- colors
 --
@@ -63,6 +59,7 @@ colors            = colors            or { }
 colors.data       = colors.data       or { }
 colors.values     = colors.values     or { }
 colors.registered = colors.registered or { }
+
 colors.enabled    = true
 colors.weightgray = true
 colors.attribute  = 0
@@ -174,38 +171,49 @@ function colors.spot(parent,f,d,p)
     return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p }
 end
 
-function colors.reviver(n)
-    local d = data[n]
-    if not d then
-        local v = values[n]
-        if not v then
-            local gray = nodeinjections.graycolor(0)
+local function graycolor(...) graycolor = nodeinjections.graycolor return graycolor(...) end
+local function rgbcolor (...) rgbcolor  = nodeinjections.rgbcolor  return rgbcolor (...) end
+local function cmykcolor(...) cmykcolor = nodeinjections.cmykcolor return cmykcolor(...) end
+local function spotcolor(...) spotcolor = nodeinjections.spotcolor return spotcolor(...) end
+
+local function extender(colors,key)
+    if key == "none" then
+        local d = graycolor(0)
+        colors.none = d
+        return d
+    end
+end
+
+local function reviver(data,n)
+    local v = values[n]
+    if not v then
+        local gray = graycolor(0)
+        d = { gray, gray, gray, gray }
+        logs.report("attributes","unable to revive color %s",n or "?")
+    else
+        local kind, gray, rgb, cmyk = v[1], graycolor(v[2]), rgbcolor(v[3],v[4],v[5]), cmykcolor(v[6],v[7],v[8],v[9])
+        if kind == 2 then
             d = { gray, gray, gray, gray }
-            logs.report("attributes","unable to revive color %s",n or "?")
-        else
-            local kind, gray, rgb, cmyk = v[1], nodeinjections.graycolor(v[2]), nodeinjections.rgbcolor(v[3],v[4],v[5]), nodeinjections.cmykcolor(v[6],v[7],v[8],v[9])
-            if kind == 2 then
-                d = { gray, gray, gray, gray }
-            elseif kind == 3 then
-                d = { rgb, gray, rgb, cmyk }
-            elseif kind == 4 then
-                d = { cmyk, gray, rgb, cmyk }
-            elseif kind == 5 then
-                local spot = nodeinjections.spotcolor(v[10],v[11],v[12],v[13])
-                d = { spot, gray, rgb, cmyk }
-            end
+        elseif kind == 3 then
+            d = { rgb, gray, rgb, cmyk }
+        elseif kind == 4 then
+            d = { cmyk, gray, rgb, cmyk }
+        elseif kind == 5 then
+            local spot = spotcolor(v[10],v[11],v[12],v[13])
+            d = { spot, gray, rgb, cmyk }
         end
-        data[n] = d
     end
+    data[n] = d
     return d
 end
 
+setmetatable(colors,      { __index = extender })
+setmetatable(colors.data, { __index = reviver  })
+
 function colors.filter(n)
     return concat(data[n],":",5)
 end
 
-colors.none = nodeinjections.graycolor(0)
-
 function colors.setmodel(attribute,name,weightgray)
     colors.model = name
     colors.selector = numbers[attribute]
@@ -221,7 +229,7 @@ function colors.register(attribute, name, colorspace, ...) -- passing 9 vars is
         color = #values+1
         values[color] = colors[colorspace](...)
         registered[stamp] = color
-        colors.reviver(color)
+    -- colors.reviver(color)
     end
     if name then
         list[numbers[attribute]][name] = color -- not grouped, so only global colors
@@ -244,9 +252,6 @@ shipouts.handle_color = nodes.install_attribute_handler {
 
 -- transparencies
 
--- for the moment we manage transparencies in the pdf driver because
--- first we need a nice interface to some pdf things
-
 transparencies            = transparencies            or { }
 transparencies.registered = transparencies.registered or { }
 transparencies.data       = transparencies.data       or { }
@@ -262,43 +267,45 @@ local data       = transparencies.data
 local values     = transparencies.values
 local template   = "%s:%s"
 
-local function reference(n)
-    reference = nodeinjections.transparency
-    return reference(n)
-end
+local function inject_transparency  (...) inject_transparency   = nodeinjections.transparency return inject_transparency  (...) end
+local function register_transparency(...) register_transparency = registrations.transparency  return register_transparency(...) end
 
 function transparencies.register(name,a,t)
     local stamp = format(template,a,t)
     local n = registered[stamp]
     if not n then
-        n = #data+1
-        data[n] = reference(n)
+        n = #values + 1
         values[n] = { a, t }
         registered[stamp] = n
-        registrations.transparency(n,a,t)
+        register_transparency(n,a,t)
     end
     return registered[stamp]
 end
 
-function transparencies.reviver(n)
-    local d = data[n]
-    if not d then
-        local v = values[n]
-        if not v then
-            d = reference(0)
-            logs.report("attributes","unable to revive transparency %s",n or "?")
-        else
-            d = reference(n)
-            registrations.transparency(n,v[1],v[2])
-        end
-        data[n] = d
+local function extender(transparencies,key)
+    if key == "none" then
+        local d = inject_transparency(0)
+        transparencies.none = d
+        return d
+    end
+end
+
+local function reviver(data,n)
+    local v = values[n]
+    if not v then
+        d = inject_transparency(0)
+    else
+        d = inject_transparency(n)
+        register_transparency(n,v[1],v[2])
     end
+    data[n] = d
     return d
 end
 
--- check if there is an identity
+setmetatable(transparencies,      { __index = extender })
+setmetatable(transparencies.data, { __index = reviver  })
 
-transparencies.none = reference(0) -- for the moment the pdf backend does this
+-- check if there is an identity
 
 function transparencies.value(id)
     return values[id]
@@ -308,8 +315,8 @@ shipouts.handle_transparency = nodes.install_attribute_handler {
     name        = "transparency",
     namespace   = transparencies,
     initializer = states.initialize,
-    finalizer   = states.finalize  ,
-    processor   = states.process   ,
+    finalizer   = states.finalize,
+    processor   = states.process,
 }
 
 --- overprint / knockout
@@ -318,21 +325,35 @@ overprints         = overprints      or { }
 overprints.data    = overprints.data or { }
 overprints.enabled = false
 
-overprints.data[1] = nodeinjections.overprint()
-overprints.data[2] = nodeinjections.knockout()
-
-overprints.none    = overprints.data[2]
-
 overprints.registered = {
     overprint = 1,
     knockout  = 2,
 }
 
---~ storage.register("overprints/registered", overprints.registered, "overprints.registered")
---~ storage.register("overprints/data",       overprints.data,       "overprints.data")
+local data, registered = overprints.data, overprints.registered
 
-local data       = overprints.data
-local registered = overprints.registered
+local function extender(overprints,key)
+    if key == "none" then
+        local d = data[2]
+        overprints.none = d
+        return d
+    end
+end
+
+local function reviver(data,n)
+    if n == 1 then
+        local d = nodeinjections.overprint() -- called once
+        data[1] = d
+        return d
+    elseif n == 2 then
+        local d = nodeinjections.knockout() -- called once
+        data[2] = d
+        return d
+    end
+end
+
+setmetatable(overprints,      { __index = extender })
+setmetatable(overprints.data, { __index = reviver  })
 
 function overprints.register(stamp)
     return registered[stamp] or registered.overprint
@@ -348,22 +369,42 @@ shipouts.handle_overprint = nodes.install_attribute_handler {
 
 --- negative / positive
 
-negatives         = negatives      or { }
-negatives.data    = negatives.data or { }
-negatives.enabled = false
-
-negatives.data[1] = nodeinjections.positive()
-negatives.data[2] = nodeinjections.negative()
-
-negatives.none    = negatives.data[1]
+negatives            = negatives      or { }
+negatives.data       = negatives.data or { }
+negatives.enabled    = false
 
 negatives.registered = {
     positive = 1,
     negative = 2,
 }
 
+local data, registered = negatives.data, negatives.registered
+
+local function extender(negatives,key)
+    if key == "none" then
+        local d = data[1]
+        negatives.none = d
+        return d
+    end
+end
+
+local function reviver(data,n)
+    if n == 1 then
+        local d = nodeinjections.positive() -- called once
+        data[1] = d
+        return d
+    elseif n == 2 then
+        local d = nodeinjections.negative() -- called once
+        data[2] = d
+        return d
+    end
+end
+
+setmetatable(negatives,      { __index = extender })
+setmetatable(negatives.data, { __index = reviver  })
+
 function negatives.register(stamp)
-    return negatives.registered[stamp] or negatives.registered.positive
+    return registered[stamp] or registered.positive
 end
 
 shipouts.handle_negative = nodes.install_attribute_handler {
@@ -374,36 +415,52 @@ shipouts.handle_negative = nodes.install_attribute_handler {
     processor   = states.process,
 }
 
--- effects -- can be optimized
+-- effects -- can be optimized (todo: metatables)
 
 effects            = effects            or { }
 effects.data       = effects.data       or { }
+effects.values     = effects.values     or { }
 effects.registered = effects.registered or { }
 effects.enabled    = false
 effects.stamp      = "%s:%s:%s"
 
 storage.register("effects/registered", effects.registered, "effects.registered")
-storage.register("effects/data",       effects.data,       "effects.data")
+storage.register("effects/values",     effects.values,     "effects.values")
 
-function effects.register(effect,stretch,rulethickness)
-    local stamp = format(effects.stamp,effect,stretch,rulethickness)
-    local n = effects.registered[stamp]
-    if not n then
-        n = #effects.data+1
-        effects.data[n] = effects.reference(effect,stretch,rulethickness)
-        effects.registered[stamp] = n
+local data, registered, values = effects.data, effects.registered, effects.values
+
+-- valid effects: normal inner outer both hidden (stretch,rulethickness,effect)
+
+local function effect(...) effect = nodeinjections.effect return effect(...) end
+
+local function extender(effects,key)
+    if key == "none" then
+        local d = effect(0,0,0)
+        effects.none = d
+        return d
     end
-    return effects.registered[stamp]
 end
 
--- valid effects: normal inner outer both hidden
-
-function effects.reference(effect,stretch,rulethickness)
-    effects.reference = nodeinjections.effect
-    return nodeinjections.effect(stretch,rulethickness,effect)
+local function reviver(data,n)
+    local e = values[n] -- we could nil values[n] now but hardly needed
+    local d = effect(v[1],v[2],v[3])
+    data[n] = d
+    return d
 end
 
-effects.none = effects.reference(0,0,0)
+setmetatable(effects,      { __index = extender })
+setmetatable(effects.data, { __index = reviver  })
+
+function effects.register(effect,stretch,rulethickness)
+    local stamp = format(effects.stamp,effect,stretch,rulethickness)
+    local n = registered[stamp]
+    if not n then
+        n = #values + 1
+        values[n] = { effect, stretch, rulethickness }
+        registered[stamp] = n
+    end
+    return n
+end
 
 shipouts.handle_effect = nodes.install_attribute_handler {
     name        = "effect",
@@ -413,61 +470,101 @@ shipouts.handle_effect = nodes.install_attribute_handler {
     processor   = states.process,
 }
 
--- layers (ugly code, due to no grouping and such)
+-- layers (ugly code, due to no grouping and such); currently we use exclusive layers
+-- but when we need it stacked layers might show up too; the next function based
+-- approach can be replaced by static (metatable driven) resolvers
 
 viewerlayers            = viewerlayers            or { }
 viewerlayers.data       = viewerlayers.data       or { }
 viewerlayers.registered = viewerlayers.registered or { }
+viewerlayers.values     = viewerlayers.values     or { }
 viewerlayers.enabled    = false
 
 storage.register("viewerlayers/registered", viewerlayers.registered, "viewerlayers.registered")
---~ storage.register("viewerlayers/data",       viewerlayers.data,       "viewerlayers.data")
+storage.register("viewerlayers/values",     viewerlayers.values,     "viewerlayers.values")
 
 local data       = viewerlayers.data
+local values     = viewerlayers.values
 local registered = viewerlayers.registered
 local template   = "%s"
 
-local somedone = false
-local somedata = { }
-local nonedata = nodeinjections.stoplayer()
+-- interwoven
+
+--~ local somedone = false
+--~ local somedata = { }
+--~ local nonedata = nodeinjections.stoplayer()
+--~
+--~ function viewerlayers.none() -- no local
+--~     if somedone then
+--~         somedone = false
+--~         return nonedata
+--~     else
+--~         return nil
+--~     end
+--~ end
+--~
+--~ local function some(name)
+--~     local sd = somedata[name]
+--~     if not sd then
+--~         sd = {
+--~             nodeinjections.switchlayer(name),
+--~             nodeinjections.startlayer(name),
+--~         }
+--~         somedata[name] = sd
+--~     end
+--~     if somedone then
+--~         return sd[1]
+--~     else
+--~         somedone = true
+--~         return sd[2]
+--~     end
+--~ end
+--~
+--~ local function initializer(...)
+--~     somedone = false
+--~     return states.initialize(...)
+--~ end
+--~
+--~ viewerlayers.register = function(name) -- if not inimode redefine data[n] in first call
+--~     local stamp = format(template,name)
+--~     local n = registered[stamp]
+--~     if not n then
+--~         n = #data + 1
+--~         data[n] = function() return some(name) end -- slow but for the moment we don't store things in the format
+--~         registered[stamp] = n
+--~     end
+--~     return registered[stamp] -- == n
+--~ end
 
-function viewerlayers.none() -- no local
-    if somedone then
-        somedone = false
-        return nonedata
-    else
-        return nil
+-- stacked
+
+local function extender(viewerlayers,key)
+    if key == "none" then
+        local d = nodeinjections.stoplayer()
+        viewerlayers.none = d
+        return d
     end
 end
 
-local function some(name)
-    local sd = somedata[name]
-    if not sd then
-        sd = {
-            nodeinjections.switchlayer(name),
-            nodeinjections.startlayer(name),
-        }
-        somedata[name] = sd
-    end
-    if somedone then
-        return sd[1]
-    else
-        somedone = true
-        return sd[2]
-    end
+local function reviver(data,n)
+    local d = nodeinjections.startlayer(values[n])
+    data[n] = d
+    return d
 end
 
+setmetatable(viewerlayers,      { __index = extender })
+setmetatable(viewerlayers.data, { __index = reviver  })
+
 local function initializer(...)
-    somedone = false
     return states.initialize(...)
 end
 
-viewerlayers.register = function(name)
+viewerlayers.register = function(name) -- if not inimode redefine data[n] in first call
     local stamp = format(template,name)
     local n = registered[stamp]
     if not n then
-        n = #data + 1
-        data[n] = function() return some(name) end -- slow but for the moment we don't store things in the format
+        n = #values + 1
+        values[n] = name
         registered[stamp] = n
     end
     return registered[stamp] -- == n
@@ -478,5 +575,5 @@ shipouts.handle_viewerlayer = nodes.install_attribute_handler {
     namespace   = viewerlayers,
     initializer = initializer,
     finalizer   = states.finalize,
-    processor   = states.process,
+    processor   = states.stacked,
 }
diff --git a/tex/context/base/attr-ini.mkiv b/tex/context/base/attr-ini.mkiv
index a44a16be6..f653e8c75 100644
--- a/tex/context/base/attr-ini.mkiv
+++ b/tex/context/base/attr-ini.mkiv
@@ -23,15 +23,17 @@
 \definesystemattribute[state]
 \definesystemattribute[skip]
 \definesystemattribute[penalty]
-\definesystemattribute[colormodel][global] % no reset
-\definesystemattribute[color]
-\definesystemattribute[transparency]
-\definesystemattribute[background]
+\definesystemattribute[colormodel][global] % no reset          \chardef\colormodelattribute    \dogetattributeid{colormodel}
+\definesystemattribute[color]                                  \chardef\colorattribute         \dogetattributeid{color}
+\definesystemattribute[transparency]                           \chardef\transparencyattribute  \dogetattributeid{transparency}
+\definesystemattribute[background]                             \chardef\backgroundattribute    \dogetattributeid{background}
 \definesystemattribute[overprint]
 \definesystemattribute[negative]
 \definesystemattribute[effect]
-\definesystemattribute[viewerlayer]
-\definesystemattribute[reference]
+\definesystemattribute[viewerlayer]                            \chardef\viewerlayerattribute   \dogetattributeid{viewerlayer}
+\definesystemattribute[reference]                              \chardef\referenceattribute     \dogetattributeid{reference}
+\definesystemattribute[destination]                            \chardef\destinationattribute   \dogetattributeid{destination}
+\definesystemattribute[graphicvadjust]                         \chardef\graphicvadjustattribute\dogetattributeid{graphicvadjust}
 
 % \definesystemattribute[ignore]
 %
@@ -85,8 +87,7 @@
   {\setevalue{(os:#1)}{\dosetattribute{overprint}{\ctxlua{tex.print(overprints.register('#2'))}}}}
 
 \def\dotriggeroverprint
-  {\initializePDFoverprint % temp here, to be tested in la code (states.collect)
-   \ctxlua{overprints.enabled=true}%
+  {\ctxlua{overprints.enabled=true}%
    \gdef\dotriggeroverprint##1{\csname(os:##1)\endcsname}%
    \dotriggeroverprint}
 
@@ -99,8 +100,7 @@
   {\setevalue{(ns:#1)}{\dosetattribute{negative}{\ctxlua{tex.print(negatives.register('#2'))}}}}
 
 \def\dotriggernegative
-  {\initializePDFnegative % temp here, to be tested in la code (states.collect)
-   \ctxlua{negatives.enabled=true}%
+  {\ctxlua{negatives.enabled=true}%
    \gdef\dotriggernegative##1{\csname(ns:##1)\endcsname}%
    \dotriggernegative}
 
@@ -126,7 +126,7 @@
 % \registereffect{both}
 % \registereffect{hidden}
 
-% viewerlayers
+% viewerlayers (will probably change a bit)
 
 % \def\registerviewerlayer#1#2% global !
 %   {\setxvalue{(vl:#1)}{\dosetattribute{viewerlayer}{\ctxlua{tex.print(viewerlayers.register('#2'))}}}}
@@ -140,8 +140,6 @@
 
 \setevalue{(vl:)}{\global\doresetattribute{viewerlayer}}
 
-%
-
 \def\dotriggerviewerlayer
   {\ctxlua{viewerlayers.enabled=true}%
    \gdef\dotriggerviewerlayer##1{\csname(vl:##1)\endcsname}%
diff --git a/tex/context/base/back-ini.lua b/tex/context/base/back-ini.lua
index 0a11c2ef7..bad6b0282 100644
--- a/tex/context/base/back-ini.lua
+++ b/tex/context/base/back-ini.lua
@@ -8,8 +8,12 @@ if not modules then modules = { } end modules ['back-ini'] = {
 
 backends = backends or { }
 
+local trace_backend = false
+
 local function nothing() return nil end
 
+backends.nothing = nothing
+
 backends.nodeinjections = {
     rgbcolor     = nothing,
     cmykcolor    = nothing,
@@ -24,10 +28,61 @@ backends.nodeinjections = {
     startlayer   = nothing,
     stoplayer    = nothing,
     switchlayer  = nothing,
+
+    reference    = nothing,
+    destination  = nothing,
+
 }
 
 backends.codeinjections = {
-    insertmovie        = nothing,
+
+    prerollreference      = nothing,
+
+    insertmovie           = nothing,
+    insertsound           = nothing,
+
+    presetsymbollist      = nothing,
+    registersymbol        = nothing,
+    registeredsymbol      = nothing,
+
+    registercomment       = nothing,
+    attachfile            = nothing,
+    adddocumentinfo       = nothing,
+    setupidentity         = nothing,
+    setpagetransition     = nothing,
+    defineviewerlayer     = nothing,
+    addbookmarks          = nothing,
+    addtransparencygroup  = nothing,
+
+    typesetfield          = nothing,
+    finishfields          = nothing,
+    doiffieldelse         = nothing,
+    doiffieldgroupelse    = nothing,
+    definefield           = nothing,
+    clonefield            = nothing,
+    definefieldset        = nothing,
+    getfieldgroup         = nothing,
+    setformsmethod        = nothing,
+    getdefaultfieldvalue  = nothing,
+
+    setupcanvas           = nothing,
+
+    initializepage        = nothing,
+    initializedocument    = nothing,
+    finalizepage          = nothing,
+    finalizedocument      = nothing,
+
+    flushpageactions      = nothing,
+    flushdocumentactions  = nothing,
+
+    insertrenderingwindow = nothing,
+    processrendering      = nothing,
+    kindofrendering       = nothing,
+    flushrenderingwindow  = nothing,
+
+    setfigurecolorspace   = nothing,
+    setfigurealternative  = nothing,
+
 }
 
 backends.registrations = {
@@ -49,27 +104,40 @@ backends.current = "unknown"
 
 function backends.install(what)
     if type(what) == "string" then
-        backends.current = what
-        what = backends[what]
-        if what then
-            local wi = what.nodeinjections
-            if wi then
-                for k, v in next, wi do
-                    nodeinjections[k] = v
-                end
-            end
-            local wi = what.codeinjections
-            if wi then
-                for k, v in next, wi do
-                    codeinjections[k] = v
-                end
+        local backend = backends[what]
+        if backend then
+            if trace_backend then
+                logs.report("backend", "initializing backend %s (%s)",what,backend.comment or "no comment")
             end
-            local wi = what.registrations
-            if wi then
-                for k, v in next, wi do
-                    registrations[k] = v
+            backends.current = what
+            for _, category in next, { "nodeinjections", "codeinjections", "registrations"} do
+                local plugin = backend[category]
+                if plugin then
+                    local whereto = backends[category]
+                    for name, meaning in next, whereto do
+                        if plugin[name] then
+                            whereto[name] = plugin[name]
+                        --  logs.report("backend", "installing function %s in category %s of %s",name,category,what)
+                        elseif trace_backend then
+                            logs.report("backend", "no function %s in category %s of %s",name,category,what)
+                        end
+                    end
+                elseif trace_backend then
+                    logs.report("backend", "no category %s in %s",category,what)
                 end
             end
+            backends.helpers = backend.helpers
+        elseif trace_backend then
+            logs.report("backend", "no backend named %s",what)
         end
     end
 end
+
+statistics.register("used backend", function()
+    local bc = backends.current
+    if bc ~= "unknown" then
+        return string.format("%s (%s)",bc,backends[bc].comment or "no comment")
+    else
+        return nil
+    end
+end)
diff --git a/tex/context/base/back-ini.mkiv b/tex/context/base/back-ini.mkiv
index a60b6a329..b074d04fe 100644
--- a/tex/context/base/back-ini.mkiv
+++ b/tex/context/base/back-ini.mkiv
@@ -11,6 +11,9 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
+%D Most will go away here as it is replaced by \LUA\ calls to
+%D backend functions.
+
 \writestatus{loading}{ConTeXt Backend Macros / Initialization}
 
 \registerctxluafile{back-ini}{1.001}
@@ -20,6 +23,9 @@
 
 \unprotect
 
+\ifdefined\everybackendshipout     \else \newtoks\everybackendshipout     \fi
+\ifdefined\everylastbackendshipout \else \newtoks\everylastbackendshipout \fi
+
 %D Right from the start \CONTEXT\ had a backend system based on
 %D runtime pluggable code. As most backend issues involved specials
 %D and since postprocessors had not that much in common, we ended up
@@ -44,122 +50,6 @@
 %D Not everything here makes sense and the content of this file will
 %D definitely change.
 
-%D We use a couple of (global) variables because it saves us the
-%D trouble of dealing with arguments.
-
-\letempty \@@DriverFieldName
-\letempty \@@DriverFieldWidth
-\letempty \@@DriverFieldHeight
-\letempty \@@DriverFieldDefault
-\letempty \@@DriverFieldNumber
-\letempty \@@DriverFieldNumber
-\letempty \@@DriverFieldStyle
-\letempty \@@DriverFieldColor
-\letempty \@@DriverFieldBackgroundColor
-\letempty \@@DriverFieldFrameColor
-\letempty \@@DriverFieldLayer
-\letempty \@@DriverFieldOption
-\letempty \@@DriverFieldAlign
-\letempty \@@DriverFieldClickIn
-\letempty \@@DriverFieldClickOut
-\letempty \@@DriverFieldRegionIn
-\letempty \@@DriverFieldRegionOut
-\letempty \@@DriverFieldAfterKey
-\letempty \@@DriverFieldFormat
-\letempty \@@DriverFieldValidate
-\letempty \@@DriverFieldCalculate
-\letempty \@@DriverFieldFocusIn
-\letempty \@@DriverFieldFocusOut
-
-\letempty \@@DriverCommentLayer
-\letempty \@@DriverAttachmentLayer
-
-\letempty \@@DriverImageBox
-\letempty \@@DriverImageOptions
-\letempty \@@DriverImageWidth
-\letempty \@@DriverImageHeight
-\letempty \@@DriverImageFile
-\letempty \@@DriverImageLabel
-\letempty \@@DriverImageType
-\letempty \@@DriverImageMethod
-\letempty \@@DriverImagePage
-
-\newif\ifcollectreferenceactions
-
-%D \macros
-%D   {dostartgraymode,dostopgraymode,
-%D    dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode}
-%D
-%D Switching to and from color can be done in two ways:
-%D
-%D \startitemize[packed,n]
-%D \item  insert driver specific commands
-%D \item  pass instructions to the output device
-%D \stopitemize
-%D
-%D The first approach is more general and lays the
-%D responsibility at the driver side. Probably due to the fact
-%D that \TEX\ does not directly support color, we have been
-%D confronted for the last few years with changing special
-%D definitions. The need for support depends on how a macro
-%D package handles colored text that crosses the page boundary.
-%D Again, there are two approaches.
-%D
-%D \startitemize[packed,n]
-%D \item  let \TEX\ do the job
-%D \item  let the driver handle things
-%D \stopitemize
-%D
-%D The first approach is as driver independant as possible and
-%D can easily be accomplished by using \TEX's mark mechanism.
-%D In \CONTEXT\ we follow this approach. More and more, drivers
-%D are starting to support color, including stacking them.
-%D
-%D Colors as well as grayscales can be represented in scales
-%D from~0 to~1. When drivers use values in the range 0..255,
-%D this value has to be adapted in the translation process.
-%D Technically it's possible to get a grayscale from combining
-%D colors. In the \cap{RGB} color system, a color with Red,
-%D Green and Blue components of 0.80 show the same gray as a
-%D Gray Scale specified 0.80. The \cap{CMYK} color system
-%D supports a Black component apart from Cyan, Magenta and
-%D Yellow.
-%D
-%D Depending on the target format, color support differs from
-%D gray support. PostScript for example offers different
-%D operators for setting gray and color. This is because
-%D printing something using three colors is someting else than
-%D printing with just black.
-%D
-%D In \CONTEXT\ we have implemented a color subsystem that
-%D supports the use of well defined colors that, when printed
-%D in black and white, still can be distinguished. This
-%D approach enables us to serve both printed and electronic
-%D versions, using colored text and illustrations. More on the
-%D fundamentals of this topic can be found in the \cap{MAPS} of
-%D the Dutch User Group, 14 (95.1).
-%D
-%D To satisfy all those needs, we define four specials which
-%D supply enough information for drivers to act upon. We
-%D could have used more general commands with the keywords
-%D 'rgb' and 'gray', but because these specials are used often,
-%D we prefer the more direct and shorter alternative.
-%D
-%D We start with the installation of color and grayscale
-%D specials. The values are in the range 0..1 (e.g. 0.25).
-%D
-%D \starttyping
-%D \dostartgraymode      {gray} ... \dostopgraymode
-%D \dostartrgbcolormode  {red} {green} {blue} ... \dostopcolormode
-%D \dostartcmykcolormode {cyan} {magenta} {yellow} {black} ... \dostopcolormode
-%D \dostartgraycolormode {gray} ... \dostopcolormode
-%D \stoptyping
-%D
-%D Because we can expect conflicts between drivers, we
-%D implement them as category \type{or}. In previous versions
-%D of \DVIPSONE\ the use of their color||specials did not
-%D interfere with the PostScript ones, but recent versions do.
-
 \let \dostartgraymode          \gobbleoneargument
 \let \dostopgraymode           \donothing
 \let \dostartrgbcolormode      \gobblethreearguments
@@ -167,70 +57,24 @@
 \let \dostartgraycolormode     \gobbleoneargument
 \let \dostopcolormode          \donothing
 \let \dostartspotcolormode     \gobbletwoarguments
-\let \doregisterrgbspotcolor   \gobblesevenarguments
-\let \doregistercmykspotcolor  \gobbleeightarguments
-\let \doregistergrayspotcolor  \gobblefourarguments
-\let \doregisterrgbindexcolor  \gobblesevenarguments
-\let \doregistercmykindexcolor \gobbleeightarguments
-\let \doregistergrayindexcolor \gobblefourarguments
 \let \doregisterspotcolorname  \gobbletwoarguments
 \let \dostartnonecolormode     \donothing
 \let \doregisternonecolor      \donothing
 
-%D \macros
-%D   {doinsertsoundtrack}
-%D
-%D Sounds are (for the moment) just files with
-%D associated options.
-%D
-%D \starttyping
-%D \doinsertsoundtrack {file} {label} {options}
-%D \stoptyping
+\let \doinsertsoundtrack       \gobblethreearguments
 
-\let \doinsertsoundtrack \gobblethreearguments
-
-%D \macros
-%D   {dostartrotation,dostoprotation,
-%D    dostartscaling,dostopscaling,
-%D    dostartmirroring,dostopmirroring,
-%D    dostartnegative,dostopnegative}
-%D    dostartoverprint,dostopoverprint}
-%D
-%D We support a couple of transformations and renderings:
-%D
-%D \starttyping
-%D \dostartrotation {angle} ... \dostoprotation
-%D \dostartscaling {x} {y} ... \dostopscaling
-%D \dostartmirroring {x} {y} ... \dostopmirroring
-%D \stoptyping
-
-\let \dostartrotation  \gobbleoneargument
-\let \dostoprotation   \donothing
-\let \dostartscaling   \gobbletwoarguments
-\let \dostopscaling    \donothing
-\let \dostartmirroring \donothing
-\let \dostopmirroring  \donothing
-
-\let \dostartnegative  \donothing
-\let \dostopnegative   \donothing
-\let \dostartoverprint \donothing
-\let \dostopoverprint  \donothing
-
-%D The following two specials are used in for instance \type
-%D {\vadjust}'d margin material inside colored paragraphs.
-
-\let \dostartgraphicgroup \donothing
-\let \dostopgraphicgroup  \donothing
-
-%D \macros
-%D   {doselectfirstpaperbin,
-%D    doselectsecondpaperbin}
-%D
-%D Here are some very printer||specific ones. No further
-%D comment.
-
-\let \doselectfirstpaperbin  \donothing
-\let \doselectsecondpaperbin \donothing
+\let \dostartrotation          \gobbleoneargument
+\let \dostoprotation           \donothing
+\let \dostartscaling           \gobbletwoarguments
+\let \dostopscaling            \donothing
+\let \dostartmirroring         \donothing
+\let \dostopmirroring          \donothing
+\let \dostartnegative          \donothing
+\let \dostopnegative           \donothing
+\let \dostartoverprint         \donothing
+\let \dostopoverprint          \donothing
+\let \dostartgraphicgroup      \donothing
+\let \dostopgraphicgroup       \donothing
 
 %D \macros
 %D   {doovalbox}
@@ -263,300 +107,8 @@
 \let \dostartclipping \gobblethreearguments
 \let \dostopclipping  \donothing
 
-%D \macros
-%D   {dosetupidentity}
-%D
-%D We can declare some characteristics of the document with
-%D
-%D \starttyping
-%D \dosetupidentity {title} {subject} {author} {creator} {date} {keys}
-%D \stoptyping
-%D
-%D All data is in string format.
-
-\let \dosetupidentity \gobblesixarguments
-
-%D \macros
-%D   {dosetuppaper}
-%D
-%D This special can be used to tell the driver what page size
-%D to use. The special takes three arguments.
-%D
-%D \starttyping
-%D \dosetuppaper {type} {width} {height}
-%D \stoptyping
-%D
-%D The type is one of the common identifiers, like A4, A5 or
-%D B2.
-
-\let \dosetuppaper \gobblethreearguments
-
-%D \macros
-%D   {dosetupprinter}
-%D
-%D Some drivers enable the user to specify the paper type
-%D used and/or page dimensions to be taken into account.
-%D
-%D \starttyping
-%D \dosetupprinter {type} {hoffset} {voffset} {width} {height}
-%D \stoptyping
-%D
-%D The first argument is one of \type{letter}, \type{legal},
-%D \type{A4}, \type{A5} etc. The dimensions are in
-%D basepoints.
-
-\let \dosetupprinter \gobblefourarguments
-
-%D \macros
-%D   {dosetupopenaction, dosetupclosaction,
-%D    dosetupopenpageaction, dosetupclospageaction,
-%D    dosetupinteraction,
-%D    dosetupscreen,
-%D    dosetupviewmode}
-%D
-%D Here come some obscure interactive commands. Probably the
-%D specs will change with the development of the macros that
-%D use them.
-%D
-%D The first ones can be used to set up the interaction.
-%D
-%D \starttyping
-%D \dosetupinteraction
-%D \stoptyping
-%D
-%D Normally this command does nothing but giving a message
-%D that some scheme is supported.
-%D
-%D \starttyping
-%D \dosetupstartaction
-%D \dosetupstopaction
-%D \stoptyping
-%D
-%D These two setup the actions to be executed when the document
-%D is opened and closed.
-%D
-%D The next commands sets up the page and screen. They are
-%D kind of related.
-%D
-%D \starttyping
-%D \dosetuppage   {hoffset} {voffset} {width} {height} {options}
-%D \dosetupscreen {hoffset} {voffset} {width} {height} {options}
-%D \stoptyping
-%D
-%D The first four arguments are in points. Option~1 results in a
-%D full screen launch.
-%D
-%D \starttyping
-%D \dosetuppageview {keyword}
-%D \stoptyping
-%D
-%D For the moment we only support \type{fit}.
-
-\let \dosetupinteraction              \donothing
-\let \dosetupopenaction               \donothing
-\let \dosetupscreen                   \gobblefourarguments
-\let \dosetuppageview                 \gobbleoneargument
-\let \dosetupcloseaction              \donothing
-\let \dosetupopenpageaction           \donothing
-\let \dosetupclosepageaction          \donothing
 \let \dosetuprenderingopenpageaction  \donothing
 \let \dosetuprenderingclosepageaction \donothing
-\let \dosetupcropbox                  \gobblefourarguments
-\let \dosetuptrimbox                  \gobblefourarguments
-\let \dosetupartbox                   \gobblefourarguments
-\let \dosetupbleedbox                 \gobblefourarguments
-
-%D \macros
-%D   {dostarthide,
-%D    dostophide}
-%D
-%D Not every part of the screen is suitable for paper. Menus
-%D for instance have no meaning on an non||interactive medium.
-%D These elements are hidden by means of:
-%D
-%D \starttyping
-%D \dostarthide .. \dostophide
-%D \stoptyping
-
-\let \dostarthide \donothing
-\let \dostophide  \donothing
-
-%D \macros
-%D   {dostartgotolocation, dostopgotolocation,
-%D    dostartgotorealpage, dostopgotorealpage}
-%D
-%D When we want to support hypertext buttons, again we have
-%D to deal with two concepts.
-%D
-%D \startitemize[packed,n]
-%D \item let \TEX\ highlight the text
-%D \item let the driver show us where to click
-%D \stopitemize
-%D
-%D The first approach is the most secure one. It gives us
-%D complete control over the visual appearance of hyper
-%D buttons. The second alternative lets the driver guess what
-%D part of the text needs highlighting. As long as we deal with
-%D not too complicated textual buttons, this is no problem.
-%D It's even a bit more efficient when we take long mid
-%D paragraph active regions into account. When we let \TEX\
-%D handle active sentences {\em for instance marked like this
-%D one}, we have to take care of line- and pagebreaks ourselve.
-%D However, it's no trivial matter to let a driver find out
-%D where things begin and end. Because most hyperlinks can be
-%D found in tables of contents and registers, the saving in
-%D terms of bytes can be neglected and the first approach is a
-%D clear winner.
-%D
-%D The most convenient way of cross||referencing is using named
-%D destinations. A more simple scheme is using page numbers as
-%D destinations. Because the latter alternative can often be
-%D implemented more efficient, and because we cannot be sure
-%D what scheme a driver supports, we always have to supply a
-%D pagenumber, even when we use named destinations.
-%D
-%D To enable a driver to find out what to make active, we have
-%D to provide begin and endpoints, so like with color, we use
-%D pairs of specials. The first scheme can be satisfied with
-%D proper dimensions of the areas to be made active.
-%D
-%D The interactive real work is done by the following four
-%D specials. The reason for providing the first one with both
-%D a label and a number, is a result of the quite poor
-%D implementation of \type{pdfmarks} in version 1.0 of
-%D Acrobat. Because only pagenumbers were supported as
-%D destination, we had to provide both labels (\DVIWINDO) and
-%D pagenumbers (\PDF). Some drivers use start stop pairs.
-%D
-%D \starttyping
-%D \dostartgotolocation {w} {h} {url} {file} {label} {page}
-%D \dostartgotorealpage {w} {h} {url} {file}         {page}
-%D \stoptyping
-%D
-%D Their counterparts are:
-%D
-%D \starttyping
-%D \dostopgotolocation
-%D \dostopgotorealpage
-%D \stoptyping
-%D
-%D The internal alternative is used for system||generated
-%D links, the external one for user||generated links. The
-%D Uniform Resource Locator can be used to let the reader
-%D surf the net.
-
-\let \dostartgotolocation \gobblesixarguments
-\let \dostopgotolocation  \donothing
-\let \dostartgotorealpage \gobblefourarguments
-\let \dostopgotorealpage  \donothing
-
-%D One may wonder why jumps to page and location are not
-%D combined. By splitting them, we enable macro||packages to
-%D force the prefered alternative, while on the other hand
-%D drivers can pick up the alternative desired most.
-
-%D \macros
-%D  {dostartgotoJS, doflushJSpreamble}
-%D
-%D Rather special is the option to include and execute
-%D JavaScript code. This is a typical \PDF\ option.
-%D
-%D \starttyping
-%D \dostartgotoJS {w} {h} {script}
-%D \stoptyping
-%D
-%D This not so standard \TEX\ feature should be used with
-%D care. Preamble scripts are flushed by
-%D
-%D \doflushJSpreamble {script}
-
-\let \dostartgotoJS      \gobblethreearguments
-\let \dostopgotoJS       \donothing
-\let \doflushJSpreamble  \gobbleoneargument
-
-%D \macros
-%D   {dostartthisislocation, dostopthisislocation,
-%D    dostartthisisrealpage, dostopthisisrealpage}
-%D
-%D Before we can goto some location or page, we have to tell
-%D the system where it can be found. Because some drivers
-%D follow the \SGML\ approach of begin||end tags, we have to
-%D support pairs. A possible extension to this scheme is
-%D supplying coordinates for viewing the text.
-%D
-%D The opposite commands of \type{\dogotosomething} have only
-%D one argument:
-%D
-%D \starttyping
-%D \dostartthisislocation {label}
-%D \dostartthisisrealpage {page}
-%D \stoptyping
-%D
-%D These commands are accompanied by:
-%D
-%D \starttyping
-%D \dostopthisislocation
-%D \dostopthisisrealpage
-%D \stoptyping
-%D
-%D As with all interactive commands's they are installed as
-%D \type{and} category specials.
-
-\let \dostartthisislocation \gobbleoneargument
-\let \dostopthisislocation  \donothing
-\let \dostartthisisrealpage \gobbleoneargument
-\let \dostopthisisrealpage  \donothing
-
-%D In \CONTEXT\ we don't use the \type{\stopsomething}
-%D macros because we let \TEX\ take care of typographic
-%D issues.
-
-%D \macros
-%D   {doresetgotowhereever}
-%D
-%D These and others need:
-
-\let \doresetgotowhereever \donothing
-
-%D \macros
-%D   {dostartexecutecommand, dostopexecutecommand}
-%D
-%D The actual behavior of the next pair of commands depends
-%D much on the viewing engine. Therefore one cannot depend
-%D too much on their support.
-%D
-%D \starttyping
-%D \dostartexecutecommand {w} {h} {command} {options}
-%D \stoptyping
-%D
-%D At least the next commands are supported (more examples
-%D can be found in \type {spec-fdf.tex}:
-%D
-%D \startlinecorrection\setupalign[middle]\leavevmode
-%D \starttable[|l|l|]
-%D \HL
-%D \NC \bf command  \NC \bf action                  \NC\SR
-%D \HL
-%D \NC first        \NC go to the first page        \NC\FR
-%D \NC previous     \NC go to the previous page     \NC\MR
-%D \NC next         \NC go to the next page         \NC\MR
-%D \NC last         \NC go to the last page         \NC\MR
-%D \NC backward     \NC go back to the  link list   \NC\MR
-%D \NC forward      \NC go forward in the link list \NC\MR
-%D \NC print        \NC enter print mode            \NC\MR
-%D \NC exit         \NC exit viewer                 \NC\MR
-%D \NC close        \NC close document              \NC\MR
-%D \NC enter        \NC enter viewer                \NC\MR
-%D \NC help         \NC show help on the viewer     \NC\LR
-%D \HL
-%D \stoptable
-%D \stoplinecorrection
-%D
-%D Options are to be passed as a comma separated list of
-%D assignments.
-
-\let \dostartexecutecommand \gobblefourarguments
-\let \dostopexecutecommand  \donothing
 
 %D \macros
 %D   {dostartobject,
@@ -590,229 +142,6 @@
 \let \doinsertobject  \gobbletwoarguments
 \let \doresetobjects  \donothing
 
-%D \macros
-%D   {doregisterfigure, doregisterfigurecolor}
-%D
-%D Images can be objects as well and it's up to the driver to
-%D handle this. Alternative images are also up to the driver,
-%D and the next macro tells the driver that the previous image
-%D is somehow followed by another and that both have to be
-%D handled together. This is a rather fuzzy model, but for the
-%D moment it suits its purpose: low res screen versions combined
-%D with high res printable ones.
-
-\let \doregisterfigure      \gobbletwoarguments
-\let \doregisterfigurecolor \gobbleoneargument
-
-% %D \macros
-% %D   {dogetobjectreference}
-% %D
-% %D For very special purposes, one can ask for the internal
-% %D reference to the object. Beware!
-%
-% \let \dogetobjectreference \gobblethreearguments
-%
-% %D The first argument is the name, the second a macro that
-% %D gets the associated value.
-
-%D \macros
-%D   {dostartrunprogram, dostoprunprogram,
-%D    dostartgotoprofile, dostopgotoprofile,
-%D    dobeginofprofile,
-%D    doendofprofile}
-%D
-%D These specials are still experimental. They are not yet
-%D supported by the programs the way they should be.
-%D
-%D {\em --- still undocumented ---}
-
-\let \dostartrunprogram  \gobblefourarguments
-\let \dostoprunprogram   \donothing
-\let \dostartgotoprofile \gobblethreearguments
-\let \dostopgotoprofile  \donothing
-\let \dobeginofprofile   \gobblefourarguments
-\let \doendofprofile     \donothing
-
-%D \macros
-%D   {doinsertbookmark}
-%D
-%D Bookmarks, that is viewer generated tables of contents, are
-%D a strange phenomena, mainly because \TEX\ can provide
-%D whatever kind of table in much better quality.
-
-\let \doinsertbookmark \gobblefourarguments
-
-%D This special is called as:
-%D
-%D \starttyping
-%D \doinstallbookmark {level} {nofsubentries} {text} {page} {open}
-%D \stoptyping
-%D
-%D This definition is very \PDF\ oriented, so for more
-%D information we kindly refer to the \PDF\ manuals.
-
-%D \macros
-%D   {dosetpagetransition}
-%D
-%D In presentations, fancy page transitions can, at least for a
-%D short moment, let the audience focus at the screen. Like the
-%D previous one, this special is very \PDF.
-%D
-%D \starttyping
-%D \dosetpagetransition{dissolve}{0}
-%D \stoptyping
-%D
-%D Transitions have symbolic names, like dissolve, box, split,
-%D blinds, wipe and glitter. The second argument determines
-%D the wait time (unless zero).
-
-\let \dosetpagetransition \gobbletwoarguments
-
-%D \macros
-%D   {dopresettextfield,dopresetlinefield,
-%D    dopresetchoicefield,dopresetpopupfield,dopresetcombofield,
-%D    dopresetbuttonfield,dopresetcheckfield,
-%D    dopresetradiofield,dopresetradiorecord}
-%D
-%D The special drivers are programmed independant from their
-%D calling macros are thereby use the standard \TEX\ way of
-%D passing parameters. Unfortunately fields often have more
-%D than nine characteristics, so we pack some arguments in one.
-%D
-%D \starttyping
-%D \dopresettextfield / \dopresetlinefield
-%D   {name} {width} {height} {default} {length}
-%D   {style,color} {options} {alignment} {actions}
-%D
-%D \dopresetchoicefield / \dopresetpopupfield / \dopresetcombofield
-%D   {name} {width} {height} {default}
-%D   {style,color} {options} {values} {actions}
-%D
-%D \dopresetpushfield
-%D   {name} {width} {height} {default}
-%D   {options} {values} {actions}
-%D
-%D \dopresetcheckfield
-%D   {name} {width} {height} {default}
-%D   {options} {values} {actions}
-%D
-%D \dopresetradiofield
-%D   {name} {width} {height} {default}
-%D   {options} {parent} {values} {actions}
-%D
-%D \dopresetradiorecord
-%D   {name} {top} {options} {kids} {actions}
-%D \stoptyping
-
-\let \dopresetlinefield   \gobbleninearguments
-\let \dopresettextfield   \gobbleninearguments
-\let \dopresetchoicefield \gobbleeightarguments
-\let \dopresetpopupfield  \gobbleeightarguments
-\let \dopresetcombofield  \gobbleeightarguments
-\let \dopresetpushfield   \gobblesevenarguments
-\let \dopresetcheckfield  \gobblesevenarguments
-\let \dopresetradiofield  \gobbleeightarguments
-\let \dopresetradiorecord \gobblefourarguments
-
-%D \macros
-%D   {dodefinefieldset,dogetfieldset,doiffieldset}
-%D
-%D Field sets, used in resetting and submitting, are handled
-%D by:
-
-\let \dodefinefieldset \gobbletwoarguments
-\let \dogetfieldset    \gobbleoneargument
-\let \doiffieldset     \gobbletwoarguments
-
-%D \macros
-%D   {dosetfieldstatus}
-%D
-%D For practical reasons we set some field characteristics
-%D using:
-%D
-%D \starttyping
-%D \dosetfieldstatus {mode} {parent} {kids} {root}
-%D \stoptyping
-
-\let \dosetfieldstatus \gobblefourarguments
-
-%D with:
-
-\def\fieldlonermode {0} % no \chardef here
-\def\fieldparentmode{1} % no \chardef here
-\def\fieldchildmode {2} % no \chardef here
-\def\fieldcopymode  {3} % no \chardef here
-
-%D \macros
-%D   {doregistercalculationset}
-%D
-%D We can define a calculation order list with:
-%D
-%D \starttyping
-%D \doregistercalculationset {set identifier}
-%D \stoptyping
-
-\let \doregistercalculationset \gobbleoneargument
-
-%D \macros
-%D   {doinsertcomment, doflushcomments}
-%D
-%D Not so much out of need, but to be complete, we also
-%D implement text annotations, so called  comment:
-%D
-%D \starttyping
-%D \doinsertcomment
-%D   {title} {width} {height} {color} {open} {symbol} {collect} {data}
-%D \stoptyping
-%D
-%D When enables, comments can be collected and flushed:
-%D
-%D \starttyping
-%D \doflushcomments
-%D \stoptyping
-
-\let \doinsertcomment \gobbleeightarguments
-\let \doflushcomments \donothing
-
-%D \macros
-%D   {dostarttransparency,dostoptransparency}
-%D
-%D \starttyping
-%D \dostarttransparency{fraction}{type}
-%D \dostoptransparency
-%D \stoptyping
-%D
-%D Although in \CONTEXT\ transparency is closely integrated
-%D in the color drivers, in the end it is an independent
-%D feature.
-
-\let \dostarttransparency \gobbletwoarguments
-\let \dostoptransparency  \donothing
-
-%D \macros
-%D   {doattachfile}
-%D
-%D \starttyping
-%D \doattachfile{title}{width}{height}{depth}{color}{symbol}{filename}{source}
-%D \stoptyping
-
-\let \doattachfile \gobbleeightarguments
-
-%D Experimental (properties):
-
-\let \dostartviewerlayer      \gobbleoneargument
-\let \dostopviewerlayer       \donothing
-\let \dodefineviewerlayer     \gobblefivearguments
-\let \domakeviewerlayerlist   \gobbleoneargument
-
-\let \doinsertrenderingwindow \gobblefourarguments
-\let \doinsertrendering       \gobblefourarguments
-\let \doinsertrenderingobject \gobblefourarguments
-\let \doinsertrenderingobject \gobblefourarguments
-
-\let \dostartfonteffect       \gobblethreearguments
-\let \dostopfonteffect        \donothing
-
 %D From now on, mapfile loading is also a special; we assume the
 %D more or less standard dvips syntax.
 
@@ -836,24 +165,6 @@
 
 \newif\ifusepagedestinations
 
-%D \macros
-%D   {ifhighlighthyperlinks}
-%D
-%D The next switch can be used to make user hyperlinks are
-%D not highlighted when clicked on.
-
-\newif\ifhighlighthyperlinks
-
-%D \macros
-%D   {ifgotonewwindow}
-%D
-%D To make the {\em goto previous jump} feature more
-%D convenient when using more than one file, it makes sense
-%D to force the viewer to open a new window for each file
-%D opened.
-
-\newif\ifgotonewwindow
-
 %D \macros
 %D   {jobsuffix}
 %D
@@ -862,8 +173,6 @@
 %D know what the target file will be. In other driver
 %D modules we wil set \type {\jobsuffix} to \type {pdf}.
 
-% this will become a mode
-
 \def\jobsuffix{pdf}
 
 \ifdefined\resetsystemmode \else
@@ -876,21 +185,6 @@
    \edef\jobsuffix{#1}%
    \setsystemmode\jobsuffix}
 
-%D \macros
-%D   {everyresetspecials}
-%D
-%D Now what will this one do? We'll see in a few lines.
-
-\newtoks\everyresetspecials
-
-\appendtoksonce
-  \ifdefined\setjobsuffix\setjobsuffix{pdf}\fi
-\to \everyresetspecials
-
-\def\defineoutput{\dodoubleargument\dodefineoutput}
-
-\def\usespecials       [#1]{}
-\def\dodefineoutput[#1][#2]{}
-\def\setupoutput       [#1]{}
+\def\setupoutput[#1]{} % will be command line switch
 
 \protect \endinput
diff --git a/tex/context/base/back-pdf.lua b/tex/context/base/back-pdf.lua
index 7f04ced5f..b2e103d36 100644
--- a/tex/context/base/back-pdf.lua
+++ b/tex/context/base/back-pdf.lua
@@ -14,63 +14,30 @@ than one argument to .
 --ldx]]--
 
 local type, next, tostring = type, next, tostring
-local char, byte, format, gsub = string.char, string.byte, string.format, string.gsub
+local char, byte, format, gsub, rep, gmatch = string.char, string.byte, string.format, string.gsub, string.rep, string.gmatch
 local concat = table.concat
+local round = math.round
 local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
 local texsprint, texwrite = tex.sprint, tex.write
 
 ctxcatcodes = tex.ctxcatcodes
 
-pdf = pdf or { } -- global
+local copy_node = node.copy
 
-backends.pdf = pdf -- registered
-
-function pdf.cleandestination(str)
-    texsprint((gsub(str,"[%/%#%<%>%[%]%(%)%-%s]+","-")))
-end
-
-function pdf.cleandestination(str)
-    texsprint((gsub(str,"[%/%#%<%>%[%]%(%)%-%s]+","-")))
-end
-
-function pdf.sanitizedstring(str)
-    texsprint((gsub(str,"([\\/#<>%[%]%(%)])","\\%1")))
-end
-
-function pdf.hexify(str)
-    texwrite("feff")
-    for b in utfvalues(str) do
-		if b < 0x10000 then
-            texwrite(format("%04x",b))
-        else
-            texwrite(format("%04x%04x",b/1024+0xD800,b%1024+0xDC00))
-        end
-    end
-end
-
-function pdf.utf8to16(s,offset) -- derived from j. sauter's post on the list
-    offset = (offset and 0x110000) or 0 -- so, only an offset when true
-	texwrite(char(offset+254,offset+255))
-	for c in utfvalues(s) do
-		if c < 0x10000 then
-			texwrite(char(offset+c/256,offset+c%256))
-		else
-			c = c - 0x10000
-			local c1, c2 = c / 1024 + 0xD800, c % 1024 + 0xDC00
-			texwrite(char(offset+c1/256,offset+c1%256,offset+c2/256,offset+c2%256))
-		end
-	end
-end
-
-pdf.nodeinjections = pdf.nodeinjections or { } -- we hash elsewhere
-pdf.codeinjections = pdf.codeinjections or { } -- we hash elsewhere
-pdf.registrations  = pdf.registrations  or { } -- we hash elsewhere
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations  = backends.pdf.registrations
 
 local pdfliteral, register = nodes.pdfliteral, nodes.register
 
-local nodeinjections = pdf.nodeinjections
-local codeinjections = pdf.codeinjections
-local registrations  = pdf.registrations
+local pdfconstant   = lpdf.constant
+local pdfdictionary = lpdf.dictionary
+local pdfarray      = lpdf.array
+local pdfreference  = lpdf.reference
+local pdfverbose    = lpdf.verbose
+
+local pdfreserveobj   = pdf.reserveobj
+local pdfimmediateobj = pdf.immediateobj
 
 function nodeinjections.rgbcolor(r,g,b)
     return register(pdfliteral(format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b)))
@@ -80,7 +47,7 @@ function nodeinjections.cmykcolor(c,m,y,k)
     return register(pdfliteral(format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k)))
 end
 
-function nodeinjections.graycolor(s)
+function nodeinjections.graycolor(s) -- caching 0/1 does not pay off
     return register(pdfliteral(format("%s g %s G",s,s)))
 end
 
@@ -95,21 +62,15 @@ function nodeinjections.transparency(n)
     return register(pdfliteral(format("/Tr%s gs",n)))
 end
 
-function nodeinjections.overprint()
-    return register(pdfliteral("/GSoverprint gs"))
-end
-
-function nodeinjections.knockout()
-    return register(pdfliteral("/GSknockout gs"))
-end
-
-function nodeinjections.positive()
-    return register(pdfliteral("/GSpositive gs"))
-end
+local positive  = register(pdfliteral("/GSpositive gs"))
+local negative  = register(pdfliteral("/GSnegative gs"))
+local overprint = register(pdfliteral("/GSoverprint gs"))
+local knockout  = register(pdfliteral("/GSknockout gs"))
 
-function nodeinjections.negative()
-    return register(pdfliteral("/GSnegative gs"))
-end
+function nodeinjections.positive () return copy_node(positive)  end
+function nodeinjections.negative () return copy_node(negative)  end
+function nodeinjections.overprint() return copy_node(overprint) end
+function nodeinjections.knockout () return copy_node(knockout)  end
 
 local effects = {
     normal = 0,
@@ -126,60 +87,379 @@ function nodeinjections.effect(stretch,rulethickness,effect)
     return register(pdfliteral(format("%s Tc %s w %s Tr",stretch,rulethickness,effect))) -- watch order
 end
 
+-- cached ..
+
+local cache = { }
+
 function nodeinjections.startlayer(name)
-    return register(pdfliteral(format("/OC /%s BDC",name)))
+    local c = cache[name]
+    if not c then
+        c = register(pdfliteral(format("/OC /%s BDC",name)))
+        cache[name] = c
+    end
+    return copy_node(c)
 end
 
+local stop = register(pdfliteral("EMC"))
+
 function nodeinjections.stoplayer()
-    return register(pdfliteral("EMC"))
+    return copy_node(stop)
 end
 
+local cache = { }
+
 function nodeinjections.switchlayer(name)
-    return register(pdfliteral(format("EMC /OC /%s BDC",name)))
+    local c = cache[name]
+    if not c then
+        c = register(pdfliteral(format("EMC /OC /%s BDC",name)))
+    end
+    return copy_node(c)
 end
 
 -- code
 
-function codeinjections.insertmovie(spec) -- width, height, factor, repeat, controls, preview, label, foundname
-    local width, height, factor = spec.width, spec.height, spec.factor or number.dimenfactors.bp
-    local options, actions = "", ""
-    if spec["repeat"] then
-        actions = actions .. "/Mode /Repeat "
+function codeinjections.insertmovie(specification)
+    -- managed in figure inclusion: width, height, factor, repeat, controls, preview, label, foundname
+    local width  = specification.width
+    local height = specification.height
+    local factor = specification.factor or number.dimenfactors.bp
+    local moviedict = pdfdictionary {
+        F      = specification.foundname,
+        Aspect = pdfarray { factor * width, factor * height },
+        Poster = (specification.preview and true) or false,
+    }
+    local controldict = pdfdictionary {
+        ShowControls = (specification.controls and true) or false,
+        Mode         = (specification["repeat"] and pdfconstant("Repeat")) or nil,
+    }
+    local action = pdfdictionary {
+        Subtype = pdfconstant("Movie"),
+        Border  = pdfarray { 0, 0, 0 },
+        T       = format("movie %s",specification.label),
+        Movie   = moviedict,
+        A       = controldict,
+    }
+    node.write(nodes.pdfannot(width,height,0,action()))
+end
+
+function codeinjections.insertsound(specification)
+    -- rmanaged in interaction: repeat, label, foundname
+    local soundclip = interactions.soundclip(specification.label)
+    if soundclip then
+        local controldict = pdfdictionary {
+            Mode = (specification["repeat"] and pdfconstant("Repeat")) or nil
+        }
+        local sounddict = pdfdictionary {
+            F = soundclip.filename
+        }
+        local action = pdfdictionary {
+            Subtype = pdfconstant("Movie"),
+            Border  = pdfarray { 0, 0, 0 },
+            T       = format("sound %s",specification.label),
+            Movie   = sounddict,
+            A       = controldict,
+        }
+        node.write(nodes.pdfannot(0,0,0,action()))
     end
-    if spec.controls then
-        actions = actions .. "/ShowControls true "
+end
+
+-- spot- and indexcolors
+
+local pdf_separation  = pdfconstant("Separation")
+local pdf_indexed     = pdfconstant("Indexed")
+local pdf_device_n    = pdfconstant("DeviceN")
+local pdf_device_rgb  = pdfconstant("DeviceRGB")
+local pdf_device_cmyk = pdfconstant("DeviceCMYK")
+local pdf_device_gray = pdfconstant("Devicegray")
+local pdf_extgstate   = pdfconstant("ExtGState")
+
+local pdf_rbg_range  = pdfarray { 0, 1, 0, 1, 0, 1 }
+local pdf_cmyk_range = pdfarray { 0, 1, 0, 1, 0, 1, 0, 1 }
+local pdf_gray_range = pdfarray { 0, 1 }
+
+local rgb_function  = "dup %s mul exch dup %s mul exch %s mul"
+local cmyk_function = "dup %s mul exch dup %s mul exch dup %s mul exch %s mul"
+local gray_function = "%s mul"
+
+local documentcolorspaces = pdfdictionary()
+
+local spotcolorhash      = { } -- not needed
+local spotcolornames     = { }
+local indexcolorhash     = { }
+local delayedindexcolors = { }
+
+function registrations.spotcolorname(name,e)
+    spotcolornames[name] = e or name
+end
+
+local function registersomespotcolor(name,noffractions,names,p,colorspace,range,funct)
+    noffractions = tonumber(noffractions) or 1 -- to be checked
+    if noffractions == 0 then
+        -- can't happen
+    elseif noffractions == 1 then
+        local dictionary = pdfdictionary {
+            FunctionType = 4,
+            Domain       = { 0, 1 },
+            Range        = range,
+        }
+        local n = pdfimmediateobj("stream",format("{ %s }",funct),dictionary())
+        local array = pdfarray {
+            pdf_separation,
+            pdfconstant(spotcolornames[name] or name),
+            colorspace,
+            pdfreference(n),
+        }
+        local m = pdfimmediateobj(tostring(array))
+        local mr = pdfreference(m)
+        spotcolorhash[name] = m
+        documentcolorspaces[name] = mr
+        lpdf.adddocumentcolorspace(name,mr)
     else
-        actions = actions .. "/ShowControls false "
-    end
-    if spec.preview then
-        options = options .. "/Poster true "
-    end
-    if actions ~= "" then
-        actions= "/A <<" .. actions .. ">>"
-    end
-    return format( -- todo: doPDFannotation
-        "\\insertpdfannotation{%ssp}{%ssp}{/Subtype /Movie /Border [0 0 0] /T (movie %s) /Movie << /F (%s) /Aspect [%s %s] %s>> %s}",
-        width, height, spec.label, spec.foundname, factor * width, factor * height, options, actions
-    )
-end
-
-local s_template_g = "\\dodoPDFregistergrayspotcolor{%s}{%s}{%s}{%s}{%s}"             -- n f d p s (p can go away)
-local s_template_r = "\\dodoPDFregisterrgbspotcolor {%s}{%s}{%s}{%s}{%s}{%s}{%s}"     -- n f d p r g b
-local s_template_c = "\\dodoPDFregistercmykspotcolor{%s}{%s}{%s}{%s}{%s}{%s}{%s}{%s}" -- n f d p c m y k
-local m_template_g = "\\doPDFregistergrayindexcolor{%s}{%s}{%s}{%s}{%s}"              -- n f d p s (p can go away)
-local m_template_r = "\\doPDFregisterrgbindexcolor {%s}{%s}{%s}{%s}{%s}{%s}{%s}"      -- n f d p r g b
-local m_template_c = "\\doPDFregistercmykindexcolor{%s}{%s}{%s}{%s}{%s}{%s}{%s}{%s}"  -- n f d p c m y k
-local s_template_e = "\\doPDFregisterspotcolorname{%s}{%s}"                           -- name, e -- todo in new backend: gsub(e," ","#20")
-local t_template   = "\\presetPDFtransparencybynumber{%s}{%s}{%s}"                    -- n, a, t
-
-function registrations.grayspotcolor (n,f,d,p,s)       states.collect(format(s_template_g,n,f,d,p,s))       end
-function registrations.rgbspotcolor  (n,f,d,p,r,g,b)   states.collect(format(s_template_r,n,f,d,p,r,g,b))   end
-function registrations.cmykspotcolor (n,f,d,p,c,m,y,k) states.collect(format(s_template_c,n,f,d,p,c,m,y,k)) end
-function registrations.grayindexcolor(n,f,d,p,s)       states.collect(format(m_template_g,n,f,d,p,s))       end
-function registrations.rgbindexcolor (n,f,d,p,r,g,b)   states.collect(format(m_template_r,n,f,d,p,r,g,b))   end
-function registrations.cmykindexcolor(n,f,d,p,c,m,y,k) states.collect(format(m_template_c,n,f,d,p,c,m,y,k)) end
-function registrations.spotcolorname (name,e)          states.collect(format(s_template_e,name,e))          end -- texsprint(ctxcatcodes,format(s_template_e,name,e))
-function registrations.transparency  (n,a,t)           states.collect(format(t_template  ,n,a,t))           end -- too many, but experimental anyway
+        local cnames = pdfarray()
+        local domain = pdfarray()
+        for n in gmatch(names,"[^,]+") do
+            cnames[#cnames+1] = pdfconstant(spotcolornames[n] or n)
+            domain[#domain+1] = 0
+            domain[#domain+1] = 1
+        end
+        local dictionary = pdfdictionary {
+            FunctionType = 4,
+            Domain       = domain,
+            Range        = range,
+        }
+        local n = pdfimmediateobj("stream",format("{ %s %s }",rep("pop ",noffractions),funct),dictionary())
+        local array = pdfarray {
+            pdf_device_n,
+            cnames,
+            colorspace,
+            pdfreference(n),
+        }
+        local m = pdfimmediateobj(tostring(array))
+        local mr = pdfreference(m)
+        spotcolorhash[name] = m
+        documentcolorspaces[name] = mr
+        lpdf.adddocumentcolorspace(name,mr)
+    end
+end
+
+function registersomeindexcolor(name,noffractions,names,p,colorspace,range,funct)
+    noffractions = tonumber(noffractions) or 1 -- to be checked
+    local cnames = pdfarray()
+    local domain = pdfarray()
+    if names == "" then
+        names = name .. ",None"
+    else
+        names = names .. ",None"
+    end
+    for n in gmatch(names,"[^,]+") do
+        cnames[#cnames+1] = pdfconstant(spotcolornames[n] or n)
+        domain[#domain+1] = 0
+        domain[#domain+1] = 1
+    end
+    local dictionary = pdfdictionary {
+        FunctionType = 4,
+        Domain       = domain,
+        Range        = range,
+    }
+    local n = pdfimmediateobj("stream",format("{ %s %s }",rep("exch pop ",noffractions),funct),dictionary()) -- exch pop
+    local a = pdfarray {
+        pdf_device_n,
+        cnames,
+        colorspace,
+        pdfreference(n),
+    }
+    if p == "" then
+        p = "1"
+    else
+        p = p .. ",1"
+    end
+    local pi = { }
+    for pp in gmatch(p,"[^,]+") do
+        pi[#pi+1] = tonumber(pp)
+    end
+    local vector, set, n = { }, { }, #pi
+    for i=255,0,-1 do
+        for j=1,n do
+            set[j] = format("%02X",round(pi[j]*i))
+        end
+        vector[#vector+1] = concat(set)
+    end
+    vector = pdfverbose { "<", concat(vector, " "), ">" }
+    local n = pdfimmediateobj(tostring(pdfarray{ pdf_indexed, a, 255, vector }))
+    lpdf.adddocumentcolorspace(format("%s_indexed",name),pdfreference(n))
+    return n
+end
+
+-- actually, names (parent) is the hash
+
+local function delayindexcolor(name,names,func)
+    local hash = (names ~= "" and names) or name
+ -- logs.report("index colors","delaying '%s'",name)
+    delayedindexcolors[hash] = func
+end
+
+local function indexcolorref(name) -- actually, names (parent) is the hash
+    if not indexcolorhash[name] then
+     -- logs.report("index colors","registering '%s'",name)
+        local delayedindexcolor = delayedindexcolors[name]
+        if type(delayedindexcolor) == "function" then
+            indexcolorhash[name] = delayedindexcolor()
+            delayedindexcolors[name] = true
+        end
+    end
+    return indexcolorhash[name]
+end
+
+function registrations.rgbspotcolor(name,noffractions,names,p,r,g,b)
+    if noffractions == 1 then
+        registersomespotcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rbg_range,format(rgb_function,r,g,b))
+    else
+        registersomespotcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rbg_range,format("%s %s %s",r,g,b))
+    end
+    delayindexcolor(name,names,function()
+        return registersomeindexcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rgb_range,format(rgb_function,r,g,b))
+    end)
+end
+
+function registrations.cmykspotcolor(name,noffractions,names,p,c,m,y,k)
+    if noffractions == 1 then
+        registersomespotcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k))
+    else
+        registersomespotcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format("%s %s %s %s",c,m,y,k))
+    end
+    delayindexcolor(name,names,function()
+        return registersomeindexcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k))
+    end)
+end
+
+function registrations.grayspotcolor(name,noffractions,names,p,s)
+    if noffractions == 1 then
+        registersomespotcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,format(gray_function,s))
+    else
+        registersomespotcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,s)
+    end
+    delayindexcolor(name,names,function()
+        return registersomeindexcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,format(gray_function,s))
+    end)
+end
+
+function registrations.rgbindexcolor(name,noffractions,names,p,r,g,b)
+    registersomeindexcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rgb_range,format(rgb_function,r,g,b))
+end
+
+function registrations.cmykindexcolor(name,noffractions,names,p,c,m,y,k)
+    registersomeindexcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k))
+end
+
+function registrations.grayindexcolor(name,noffractions,names,p,s)
+    registersomeindexcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,gray_function)
+end
+
+function codeinjections.setfigurecolorspace(data,figure)
+    local color = data.request.color
+    if color then
+        local ref = indexcolorref(color)
+        if ref then
+            figure.colorspace = ref
+            data.used.color = color
+        end
+    end
+end
+
+-- transparency
+
+local transparencies = { [0] =
+    pdfconstant("Normal"),
+    pdfconstant("Normal"),
+    pdfconstant("Multiply"),
+    pdfconstant("Screen"),
+    pdfconstant("Overlay"),
+    pdfconstant("SoftLight"),
+    pdfconstant("HardLight"),
+    pdfconstant("ColorDodge"),
+    pdfconstant("ColorBurn"),
+    pdfconstant("Darken"),
+    pdfconstant("Lighten"),
+    pdfconstant("Difference"),
+    pdfconstant("Exclusion"),
+    pdfconstant("Compatible"),
+}
+
+local documenttransparencies = { }
+local transparencyhash       = { } -- not needed
+
+local done = false
+
+function registrations.transparency(n,a,t)
+    if not done then
+        local d = pdfdictionary {
+              Type = pdf_extgstate,
+              ca   = 1,
+              CA   = 1,
+              BM   = transparencies[1],
+              AIS  = false,
+            }
+        local m = pdfimmediateobj(tostring(d))
+        local mr = pdfreference(m)
+        transparencyhash[0] = m
+        documenttransparencies[0] = mr
+        lpdf.adddocumentextgstate("Tr0",mr)
+        done = true
+    end
+    if n > 0 then
+        local d = pdfdictionary {
+              Type = pdf_extgstate,
+              ca   = tonumber(t),
+              CA   = tonumber(t),
+              BM   = transparencies[a] or transparencies[0],
+              AIS  = false,
+            }
+        local m = pdfimmediateobj(tostring(d))
+        local mr = pdfreference(m)
+        transparencyhash[n] = m
+        documenttransparencies[n] = mr
+        lpdf.adddocumentextgstate(format("Tr%s",n),mr)
+    end
+end
+
+function codeinjections.adddocumentinfo(key,value)
+    lpdf.addtoinfo(key,lpdf.tosixteen(value))
+end
+
+-- graphics
+
+function codeinjections.setfigurealternative(data,figure)
+    local display = data.request.display
+    if display and display ~= ""  then
+        local request = data.request
+        figures.push {
+            name   = request.display,
+            page   = request.page,
+            size   = request.size,
+            prefix = request.prefix,
+            cache  = request.cache,
+            width  = request.width,
+            height = request.height,
+        }
+        figures.identify()
+        local displayfigure = figures.check()
+        if displayfigure then
+        --  figure.aform = true
+            img.immediatewrite(figure)
+            local a = lpdf.array {
+                lpdf.dictionary {
+                    Image              = lpdf.reference(figure.objnum),
+                    DefaultForPrinting = true,
+                }
+            }
+            local d = lpdf.dictionary {
+                Alternates = lpdf.reference(pdf.immediateobj(tostring(a))),
+            }
+            displayfigure.attr = d()
+            return displayfigure, figures.current()
+        end
+    end
+end
 
 -- eventually we need to load this runtime
 --
@@ -187,4 +467,7 @@ function registrations.transparency  (n,a,t)           states.collect(format(t_t
 --
 -- but now we need to force this as we also load the pdf tex part which hooks into all kind of places
 
+codeinjections.finalizepage     = lpdf.finalizepage
+codeinjections.finalizedocument = lpdf.finalizedocument
+
 backends.install("pdf")
diff --git a/tex/context/base/back-pdf.mkiv b/tex/context/base/back-pdf.mkiv
index fcfc53091..aaba4554f 100644
--- a/tex/context/base/back-pdf.mkiv
+++ b/tex/context/base/back-pdf.mkiv
@@ -13,320 +13,14 @@
 
 \writestatus{loading}{ConTeXt Backend Macros / PDF}
 
-\registerctxluafile{back-pdf}{1.001}
+\registerctxluafile{back-pdf}{1.001} % this will change
 
 \unprotect
 
-%D When dealing with resources, we share the resource dictionaries
-%D between all xforms. This is inefficent in the sense that when no
-%D resources are used, redundant entries take space, but on the other
-%D hand we save redundant dictionaries so it's a nice compromise. Maybe
-%D that in \LUATEX\ I will reimplement most of the code here anyway.
-
-%D Initialization of fields is tricky. If a field has no
-%D value, it is kind of not there. If ResetForm is used, the
-%D default is assigned, but pushbuttons are spoiled. Adding a
-%D \type {/MK} dictionary helps, but gives ugly down
-%D appearances (displaced with background). What a mess.
-%D Also, in order to get at least something, the \type {/AS}
-%D key should be provided.
-
-%D A couple of variables:
-
-\newtoks \everybackendshipout
-\newtoks \everylastbackendshipout
-
-\let\lastPDFaction\empty
-
-\ifdefined\everyPDFximage \else \newtoks\everyPDFximage \fi
-\ifdefined\everyPDFxform  \else \newtoks\everyPDFxform  \fi
-\ifdefined\everygoto      \else \newtoks\everygoto      \fi
-\ifdefined\everysetfield  \else \newtoks\everysetfield  \fi
-
-%D A few helpers:
-
-\let\PDFcode        \pdfliteral
-\def\PDFcontentcode{\pdfliteral}
-\def\PDFdirectcode {\pdfliteral direct}
-
-%D \macros
-%D   {PDFobjref}
-%D
-%D Just a shortcut.
-
-% Watch out, \def\PDFobjref#1{\purenumber#1 0 R} also works, but not when
-% #1 == \the\whatever
-
-\def\PDFobjref#1{\purenumber{#1} 0 R}
-
-%D \macros
-%D   {PDFswapdir}
-
-\let\PDFswapdir\empty \def\PDFswapdir{\ifcase\inlinedirection\or\or-\fi}
-
-% the pdf spec changed cq. viewers started behaving differently / 5+
-
-\chardef\overcomePDFpage\plusone   % page numbers/ beware: optimizers remove this one
-\chardef\overcomePDFpage\plustwo   % page:number
-\chardef\overcomePDFpage\plusthree % pdftex page ref feature
-
-%D \macros
-%D   {setPDFdestination}
-%D
-%D \PDF\ destinations should obey the specifications laid down
-%D in the \PDF\ reference manual. The next macro strips illegal
-%D characters from the destination name.
-
-\def\setPDFdestination  #1{\xdef\PDFdestination{\ctxlua{pdf.cleandestination("\luaescapestring{#1}")}}}
-\def\hexifiedPDFstring  #1{\ctxlua{pdf.hexify("\luaescapestring{#1}")}}
-\def\sanitizePDFencoding#1\to#2{\xdef#2{\ctxlua{pdf.hexify("\luaescapestring{#1}")}}}
-
-%D
-
-\def\appendtopdfpageresources  #1{\normalexpanded{\global\pdfpageresources{#1\the\pdfpageresources}}}
-\def\appendtopdfpageattributes #1{\normalexpanded{\global\pdfpageattr     {#1\the\pdfpageattr     }}}
-\def\appendtopdfpagesattributes#1{\normalexpanded{\global\pdfpagesattr    {#1\the\pdfpagesattr    }}}
-\def\appendtopdfcatalog          {\pdfcatalog}
-\def\appendtopdfinfo             {\pdfinfo}
-
-\def\resetpdfpageattributes{\global\pdfpageattr\emptytoks}
-\def\resetpdfpageresources {\global\pdfpageresources\emptytoks}
-
-%D Due to the fact that \PDFTEX\ has a different concept of
-%D page attributes, we need:
-
-\appendtoksonce
-  \resetpdfpageattributes
-  \resetpdfpageresources
-\to \everyaftershipout
-
-%D \macros
-%D   {insertpdfaction,
-%D    insertpdfannotation,
-%D    insertpdfannotationobject,
-%D    createpdfdictionaryobject,
-%D    createpdfarrayobject,
-%D    defaultobjectreference,
-%D    doPDFgetobjectreference}
-%D
-%D This module deals with \PDF\ support, including fill||in
-%D forms. Before we present the largely unreadable bunch of
-%D macros, we introduce the here||not||defined low level
-%D interface macros. These must be provided by the special
-%D drivers \type{pdf} (\ACROBAT) and \type{tpd} (\PDFTEX).
-%D
-%D \starttyping
-%D \insertpdfaction             #1#2#3     width height action
-%D \insertpdfannotation         #1#2#3     width height data
-%D \createpdfannotationobject   #1#2#3#4#5 class name width height data
-%D \createpdfdictionaryobject   #1#2#3     class name data
-%D \createpdfarrayobject        #1#2#3     class name data
-%D
-%D \defaultobjectreference      #1#2       class name
-%D \doPDFgetobjectreference     #1#2#3     class name \PDFobjectreference
-%D \doPDFgetobjectpagereference #1#2#3     class name \PDFobjectreference
-%D \stoptyping
-%D
-%D The keywords reflect their use. For the moment we stick to
-%D keywords, because that way at we get an indication of what
-%D we're doing.
-
-\def\createpdfdictionaryobject#1#2#3%
-  {\flushatshipout
-     {\immediate\pdfobj{<< #3 >>}%
-      \dosetobjectreference{#1}{#2}{\the\pdflastobj}}}
-
-\def\createpdfarrayobject#1#2#3%
-  {\flushatshipout
-     {\immediate\pdfobj{[ #3 ]}%
-      \dosetobjectreference{#1}{#2}{\the\pdflastobj}}}
-
-\def\createpdfannotationobject#1#2#3#4#5%
-  {\insertpdfannotation{#3}{#4}{#5}%
-   \dosetobjectreference{#1}{#2}{\the\pdflastannot}}
-
-\def\createpdfactionobject#1#2#3#4#5%
-  {\insertpdfaction{#3}{#4}{#5}%
-   \dosetobjectreference{#1}{#2}{\the\pdflastannot}}
-
-%D \macros
-%D   {insertpdfaction,insertpdfannotation,ifsharePDFactions}
-%D
-%D Next we handle annotations. All link annotations are
-%D implemented using the action dictionary. This enables us to
-%D use multiple actions. The second macro is for instance
-%D used for movie inclusion.
-
-\newif\ifsharePDFactions \sharePDFactionstrue
-
-\def\insertpdfaction#1#2#3%
-  {\xdef\lastPDFcontent{#3}%
-   \ifcollectreferenceactions
-     \global\let\lastPDFaction\lastPDFcontent
-   \else
-     \ifsharePDFactions
-       \ifcase\similarreference\relax
-         \xdef\lastPDFaction{<<\lastPDFcontent>>}%
-       \or
-         \immediate\pdfobj{<<\lastPDFcontent>>}%
-         \xdef\lastPDFaction{\PDFobjref\pdflastobj}%
-       \else
-         % leave \lastPDFaction untouched
-       \fi
-     \else
-       \xdef\lastPDFaction{<<\lastPDFcontent>>}%
-     \fi
-     \pdfannot
-       width #1 height #2 depth \zeropoint
-         {/Subtype /Link
-          /Border [0 0 0]
-          \ifhighlighthyperlinks \else /H /N \fi
-          /A \lastPDFaction}%
-   \fi}
-
-\def\insertpdfannotation#1#2#3%
-  {\pdfannot width #1 height #2 depth \zeropoint{#3}}
-
-%D \macros
-%D   {doPDFbookmark}
-%D
-%D Well, isn't the next one ugly? Thanks to the \PDF\
-%D standard.
-
-\def\doPDFbookmark#1#2#3#4#5% to be renamed
-  {\doPDFgetpagereference{#4}\PDFobjectreference
-   \pdfoutline
-     user {<>}%
-     \ifcase#2 \else count \ifcase#5-\fi#2 \fi
-     {#3}}
-
-%D For special (\METAPOST) effects, we need to build
-%D resource dictionaries. Here is the framework.
-
-\let\docuPDFextgstates \empty
-\let\docuPDFcolorspaces\empty
-\let\docuPDFshades     \empty
-
-\def\checkPDFextgstates
-  {\ifx\docuPDFextgstates\empty \else
-     \ifnum\realpageno=\lastpage\relax
-       \createpdfdictionaryobject{FDF}{docuextgstates}{\docuPDFextgstates}%
-     \fi
-     \doPDFgetobjectreference{FDF}{docuextgstates}\PDFobjectreference
-     \appendtopdfpageresources{/ExtGState \PDFobjectreference}%
-   \fi}
-
-\def\checkPDFcolorspaces
-  {\ifx\docuPDFcolorspaces\empty \else
-     \ifnum\realpageno=\lastpage\relax
-       \createpdfdictionaryobject{FDF}{colorspaces}{\docuPDFcolorspaces}%
-     \fi
-     \doPDFgetobjectreference{FDF}{colorspaces}\PDFobjectreference
-     \appendtopdfpageresources{/ColorSpace \PDFobjectreference}%
-   \fi}
-
-\def\checkPDFshades
-  {\ifx\docuPDFshades\empty \else
-     \ifnum\realpageno=\lastpage\relax
-       \createpdfdictionaryobject{FDF}{docushades}{\docuPDFshades}%
-     \fi
-     \doPDFgetobjectreference{FDF}{docushades}\PDFobjectreference
-     \appendtopdfpageresources{/Shading \PDFobjectreference}%
-   \fi}
-
-\def\appendtoPDFdocumentextgstates #1{\xdef\docuPDFextgstates {\docuPDFextgstates \space#1}}
-\def\appendtoPDFdocumentcolorspaces#1{\xdef\docuPDFcolorspaces{\docuPDFcolorspaces\space#1}}
-\def\appendtoPDFdocumentshades     #1{\xdef\docuPDFshades     {\docuPDFshades     \space#1}}
-
-%D Page actions:
-
-\let\lastpdfopenaction \empty
-\let\lastpdfcloseaction\empty
-
-\def\dosetupopenaction {\appendtopdfcatalog{/OpenAction  <<\lastPDFaction>>}}
-\def\dosetupcloseaction{\appendtopdfcatalog{/CloseAction <<\lastPDFaction>>}}
-
-\def\dosetupopenpageaction {\glet\lastpdfopenaction \lastPDFaction}
-\def\dosetupclosepageaction{\glet\lastpdfcloseaction\lastPDFaction}
-
-\def\checkPDFpageactions
-  {\iflocation % important since direct
-     \donefalse
-     \ifx\lastpdfopenaction \empty\!!doneafalse\else\donetrue\!!doneatrue\fi
-     \ifx\lastpdfcloseaction\empty\!!donebfalse\else\donetrue\!!donebtrue\fi
-     \ifdone
-       \appendtopdfpageattributes
-         {/AA <<\if!!donea/O <<\lastpdfopenaction >> \fi
-                \if!!doneb/C <<\lastpdfcloseaction>> \fi>>}%
-     \fi
-     \glet\lastpdfopenaction \empty
-     \glet\lastpdfcloseaction\empty
-   \fi}
-
-%D \macros
-%D   {ifPDFstrokecolor}
-%D
-%D We can reduce the filesize a bit by setting the next switch
-%D to false. The amount of reduction depends on the use of
-%D color, but don't expect more than a few percent. Zip
-%D compression is already rather efficient in itself.
-
-\newif\ifPDFstrokecolor \PDFstrokecolortrue
-
-%D When submitting forms, we need to communicate the format.
-
-\chardef\submitoutputformat=0 % 0=unknown 1=HTML 2=FDF 3=XML
-
-\def\setsubmitoutputformat#1%
-  {\doifinsetelse{#1}{FDF,fdf}
-     {\chardef\submitoutputformat\plustwo}
-     {\doifinsetelse{#1}{XML,xml}
-        {\chardef\submitoutputformat\plusthree}
-        {\chardef\submitoutputformat\plusone}}%
-   \relax}
-
-%D Handy to have this available asap:
-
-\ifdefined\everyPDFxform  \newtoks\everyPDFxform  \fi
-\ifdefined\everyPDFximage \newtoks\everyPDFximage \fi
-
-% once we can be sure that the latest versions of pdftex are
-% available we can use:
-%
-% \pdfobj reserveobjnum \edef\one{\the\pdflastobj}
-% \pdfobj reserveobjnum \edef\two{\the\pdflastobj}
-%
-% \pdfobj useobjnum \one {x}
-% \pdfobj useobjnum \two {x}
-%
-% we then can rewrite part of spec-fdf because the other drivers
-% already support symbolic references
-
-%D \macros
-%D   {jobsuffix}
-%D
-%D Being one of the first typographical systems able to support
-%D advances \PDF\ support, \TEX\ is also one of the first
-%D systems to produce high quality \PDF\ code directly. Thanks
-%D to Han The Thanh c.s. the \TEX\ community can leap forward
-%D once again.
-%D
-%D One important characteristic of \PDFTEX\ is that is can
-%D produce standard \DVI\ code as well as \PDF\ code. This
-%D enables us to use one format file to support both output
-%D formats.
-
-%D All modules in this group use specials to tell drivers what
-%D non||\TEX\ actions to take. Because from the \TEX\ point of
-%D view, there is no difference between \DVI\ and \PDF, we
-%D therefore only have to bend the \DVI\ driver support into
-%D \PDF\ support. Technically spoken, specials no longer serve
-%D a purpose, except from ending up as comment in the \PDF\
-%D file.
+%D We will minimize the number of calls to \PDF\ specific primitives
+%D and delegate all management and injection of code to the backend.
 %D
-%D Before we continue we need to make sure if indeed those
-%D \PDFTEX\ primitives are permitted. If no primitives are
-%D available, we just stop reading any further.
+%D Here we initialize some internal quantities.
 
 \pdfoutput              =   1
 \pdfhorigin             =   1 true in
@@ -338,2889 +32,141 @@
 \pdfminorversion        =   5
 %pdfuniqueresname       =   1
 
-\def\PDFversion{1.\number\pdfminorversion}
-
-%D For some internal testing we need to know the output
-%D suffix.
+%D This one can be consulted by users although the suffix is also
+%D a system mode.
 
 \setjobsuffix{pdf}
 
-%D \macros
-%D   {dosetuppaper}
-%D
-%D If we don't set the paper size, \PDFTEX\ will certainly do
-%D it in a way we don't want, therefore we need:
-
-\def\dosetuppaper#1#2#3%
-  {\global\pdfpagewidth #2\relax
-   \global\pdfpageheight#3\relax}
-
-%D \macros
-%D   {doloadmapfile,doloadmapline,doresetmapfilelist}
-
-\def\doresetmapfilelist
-  {\global\let\doresetmapfilelist\relax
-   \pdfmapfile{original-empty.map}}
-
-\def\doloadmapfile #1#2{\pdfmapfile{#1#2}}
-\def\doloadmapline #1#2{\pdfmapline{#1#2}}
-
-%D nasty but needed
-
-\appendtoksonce \loadallfontmapfiles \to \everyPDFximage
-\appendtoksonce \loadallfontmapfiles \to \everyPDFxform
-
-%D left overs:
-
-        \let\currentmovie\s!unknown
-
-        \def\doPDFinsertmov
-          {\bgroup
-           \xdef\currentmovie{\@@DriverImageLabel}%
-           \PointsToBigPoints\@@DriverImageWidth \width
-           \PointsToBigPoints\@@DriverImageHeight\height
-           \let\pdf@@options\empty
-           \let\pdf@@actions\empty
-           \donefalse
-           \expanded{\processallactionsinset[\@@DriverImageOptions]}
-             [\v!controls=>\donetrue,
-                \v!repeat=>\edef\pdf@@actions{\pdf@@actions /Mode /Repeat },
-               \v!preview=>\edef\pdf@@options{\pdf@@options /Poster true  }]%
-           \edef\pdf@@actions{\pdf@@actions /ShowControls \ifdone true\else false\fi}%
-           \insertpdfannotation\@@DriverImageWidth\@@DriverImageHeight
-             {/Subtype /Movie
-              /Border [0 0 0]
-              /T (movie \currentmovie)
-              /Movie << /F (\@@DriverImageFile) /Aspect [\width\space\height] \pdf@@options >>
-              /A << \pdf@@actions >>}%
-           \egroup}
-
-%D \macros
-%D   {doinsertsoundtrack}
-%D
-%D We use numbers instead of labels to keep track of sounds.
-
-\let\currentsound\s!unknown
-
-\def\doinsertsoundtrack#1#2#3%
-  {\bgroup
-   \xdef\currentsound{#2}%
-   \let\pdf@@actions\empty
-   \@EA\processallactionsinset\@EA
-     [#3]
-     [\v!repeat=>\edef\pdf@@actions{\pdf@@actions /Mode /Repeat }]%
-   \collectdriverresource
-  %\flushatshipout % since it can be buried in a chained box
-     {\insertpdfannotation{0pt}{0pt}
-        {/Subtype /Movie
-         /Border [0 0 0]
-         /T (sound \currentsound)
-         /Movie <>%
-         \ifx\pdf@@actions\empty\else/A << \pdf@@actions >>\fi}}%
-   \egroup}
-
-%D \macros
-%D   {doPDFattachfile}
-
-\def\doPDFfilestreamobject#1#2#3#4%
-  {}
-
-\def\doPDFfilestreamidentifier#1%
-  {0}
-
-\def\doPDFgetfilestreamreference#1#2%
-  {0 0 R}
-
-\def\doattachfile#1#2#3#4#5#6#7#8%
-  {\bgroup % title width height color symbol file
-   \edefconvertedargument\PDFfile{#8}%
-   % beware: the symbol may (indirectly) use the file
-   % reference when typesetting the object number;
-   \presetPDFsymbolappearance{#5}{#6}{#2}{#3}{#4}% sets width/height
-   \startPDFsymbolappearance
-     \doPDFembedfile\PDFfile{#7}{#8}%
-     \doPDFgetembeddedfilereference\PDFfile\PDFobjectreference
-     \setFDFlayer\@@DriverAttachmentLayer
-     \insertpdfannotation{\width}{\totalheight}
-       {/Subtype /FileAttachment
-        /FS \PDFobjectreference\space
-        /Contents (#1)
-        \PDFsymbol
-        \FDFlayer
-        \PDFattributes}%
-   \stopPDFsymbolappearance
-   \egroup}
-
-% semi-public
-
-\def\doPDFembedfile#1#2#3% symbolic name | filename | user name
-  {\edefconvertedargument\PDFfile{#1}%
-   \doifnotflagged{a:\PDFfile}%
-     {\doPDFfilestreamobject{PDFEF}{\PDFfile}{#2}{#3}%
-      \doglobal\setflag{a:\PDFfile}}}
-
-\def\doPDFgetembeddedfilereference#1#2%
-  {\edefconvertedargument\PDFfile{#1}%
-   \doPDFgetobjectreference{PDFEF}\PDFfile#2}
-
-\def\doPDFgetembeddedfilestreamreference#1#2%
-  {\edefconvertedargument\PDFfile{#1}%
-   \doPDFgetfilestreamreference\PDFfile#2} % == \doPDFgetobjectreference{PDFFS}\PDFfile#2
-
-% requested by Jens-Uwe Morawski: permits usage of pdftosrc
-% in viewers that don't support attachments:
-%
-% \definesymbol
-%   [ObjectNumber]
-% % [object number {\PDFattachmentnumber[xx]}] % named
-%   [object number \PDFattachmentnumber]       % current
-%
-% \useattachment[test][xx][test.tex]
-% \setupattachments[symbol=ObjectNumber]
-% \attachment[test]
-
-\def\PDFattachmentnumber
-  {\dosingleargument\doPDFattachmentnumber}
+%D For the moment we keep these.
 
-\def\doPDFattachmentnumber[#1]%
-  {\iffirstargument
-     \doPDFfilestreamidentifier{#1}%
-   \else
-     \doPDFfilestreamidentifier\PDFfile
-   \fi}
+\newtoks \pdfbackendeveryximage
+\newtoks \pdfbackendeveryxform
 
-%D \macros
-%D   {...}
-%D
-%D Rather preliminary. We have to wait till the complete specs
-%D show up. As usual, we cannot really check it (Acrobat 6.0
-%D has a bug that inhibits us to make a test file). Half a day
-%D of testing made clear that trying to control the plugin fails
-%D in most cases (we need plugin specs -). We also miss a feature
-%D to let acrobat wait with proceeding (action processing) till
-%D the media clip is ready.
-
-% aiff audio/aiff
-% au   audio/basic
-% avi  video/avi
-% mid  audio/midi
-% mov  video/quicktime
-% mp3  audio/x-mp3 (mpeg)
-% mp4  audio/mp4
-% mp4  video/mp4
-% mpeg video/mpeg
-% smil application/smil
-% swf  application/x-shockwave-flash
-
-% beware, this is preliminary code, should be improved
-
-\def\PDFrenderingspecs#1{\executeifdefined{PDFMR:#1}\empty}
-
-\def\PDFexecutestartrendering  {/Rendition /OP 0 \PDFrenderingspecs\argumentA}
-\def\PDFexecutestoprendering   {/Rendition /OP 1 \PDFrenderingspecs\argumentA}
-\def\PDFexecutepauserendering  {/Rendition /OP 2 \PDFrenderingspecs\argumentA}
-\def\PDFexecuteresumerendering {/Rendition /OP 3 \PDFrenderingspecs\argumentA}
-
-% todo : sub files
-%
-% \doPDFembedfile{pier-39.png}{pier-39.png}{pier-39.png}%
-% \doPDFgetembeddedfilestreamreference{pier-39.png}\xPDFobjectreference
-% \edef\xxxx{/RF [(pier-39.png) \xPDFobjectreference]}%
-
-% todo: alternative renderings
-%
-% object_1  -> <> >>
-% object_2  -> <> >>
-% rendering -> <>
+%D These are the only official methods to add stuff to the resources.
 
-\def\doinsertrendering#1#2#3#4% tag mime file options
-  {\ifundefined{PDFMR:#1}%
-     \doifinstringelse{://}{#3}\donetrue\donefalse % evt url as keyword
-     \createpdfdictionaryobject{PDFMF}{#1}
-       {/Type /Rendition
-        /S    /MR
-        % does not work: /SP << /Type /MediaScreenParam /BE << /B [1 0 0] /O 0.5 >> >>
-        /C << /Type /MediaClip
-              /S /MCD
-              /N (#1)
-              /Alt [() (file not found)] % language id + message
-              /D << /Type /Filespec
-                    /F (#3)
-                    \ifdone/FS /URL\fi >>
-              /CT (#2) >>}%
-     % common code
-     \doifobjectreferencefoundelse{PDFMS}{#1}
-       {\doPDFgetobjectreference{PDFMS}{#1}\PDFobjectreferenceB}
-       {\doPDFgetobjectreference{PDFMU}{#1}\PDFobjectreferenceB}%
-     \doPDFgetobjectreference{PDFMF}{#1}\PDFobjectreferenceA
-     \setxvalue{PDFMR:#1}% needed /AA actions in /Screen
-       {/R  \PDFobjectreferenceA
-        /AN \PDFobjectreferenceB}%
-     \doifobjectreferencefoundelse{PDFMS}{#1}\donothing
-       {\dodoinsertrenderingwindow{PDFMU}{#1}\zeropoint\zeropoint{#4}}%
-   \fi}
+\def\pdfbackendsetcatalog       #1#2{\ctxlua{lpdf.addtocatalog        ("#1",\!!bs#2\!!es)}} \newtoks\pdfcatalog
+\def\pdfbackendsetinfo          #1#2{\ctxlua{lpdf.addtoinfo           ("#1",\!!bs#2\!!es)}} \newtoks\pdfinfo
+\def\pdfbackendsetname          #1#2{\ctxlua{lpdf.addtonames          ("#1",\!!bs#2\!!es)}} \newtoks\pdfnames
 
-\def\doinsertrenderingobject#1#2#3#4% tag class objectname options
-  {\ifundefined{PDFMR:#1}%
-     \doPDFgetobjectreference{#2}{#3}\PDFobjectreference
-     \createpdfdictionaryobject{PDFMF}{#1}
-       {/Type /Rendition
-        /S    /MR
-        /C << /Type /MediaClip
-              /S /MCD
-              /N (#1)
-              /D \PDFobjectreference>>}%
-     % common code
-     \doifobjectreferencefoundelse{PDFMS}{#1}
-       {\doPDFgetobjectreference{PDFMS}{#1}\PDFobjectreferenceB}
-       {\doPDFgetobjectreference{PDFMU}{#1}\PDFobjectreferenceB}%
-     \doPDFgetobjectreference{PDFMF}{#1}\PDFobjectreferenceA
-     \setxvalue{PDFMR:#1}% needed /AA actions in /Screen
-       {/R  \PDFobjectreferenceA
-        /AN \PDFobjectreferenceB}%
-     \doifobjectreferencefoundelse{PDFMS}{#1}\donothing
-       {\dodoinsertrenderingwindow{PDFMU}{#1}\zeropoint\zeropoint{#4}}%
-   \fi}
+\def\pdfbackendsetpageattribute #1#2{\ctxlua{lpdf.addtopageattributes ("#1",\!!bs#2\!!es)}} \newtoks\pdfpageresources
+\def\pdfbackendsetpagesattribute#1#2{\ctxlua{lpdf.addtopagesattributes("#1",\!!bs#2\!!es)}} \newtoks\pdfpageattr
+\def\pdfbackendsetpageresource  #1#2{\ctxlua{lpdf.addtopageresources  ("#1",\!!bs#2\!!es)}} \newtoks\pdfpagesattr
 
-\def\doinsertrenderingwindow
-  {\dodoinsertrenderingwindow{PDFMS}}
+\def\pdfbackendsetextgstate     #1#2{\ctxlua{lpdf.adddocumentextgstate ("#1",lpdf.verbose(\!!bs#2\!!es))}}
+\def\pdfbackendsetcolorspace    #1#2{\ctxlua{lpdf.adddocumentcolorspace("#1",lpdf.verbose(\!!bs#2\!!es))}}
+\def\pdfbackendsetpattern       #1#2{\ctxlua{lpdf.adddocumentpattern   ("#1",lpdf.verbose(\!!bs#2\!!es))}}
+\def\pdfbackendsetshade         #1#2{\ctxlua{lpdf.adddocumentshade     ("#1",lpdf.verbose(\!!bs#2\!!es))}}
 
-\def\dodoinsertrenderingwindow#1#2#3#4#5%
-  {\vbox to #4 \bgroup
-     \checkPDFscreenactions{#2}{#5}%
-     \doPDFgetobjectpagereference{PDFMF}{#2}\PDFobjectreferenceA
-     \doPDFgetobjectreference    {PDFMF}{#2}\PDFobjectreferenceB
-     \vss
-     \hbox to #3 \bgroup
-       \createpdfannotationobject{#1}{#2}{#3}{#4}
-         {/Subtype /Screen
-          /P \PDFobjectreferenceA
-          /A \PDFobjectreferenceB
-          \PDFattributes
-          /Border [0 0 0]}%
-       \hss
-     \egroup
-   \egroup}
-
-\global\let\PDFrenderingopenpageaction \empty
-\global\let\PDFrenderingclosepageaction\empty
-
-\def\checkPDFscreenactions#1#2%
-  {\let\PDFattributes\empty
-   \iflocation % important since direct -)
-     % the action can either (already) be set by the window handler
-     % or (normally when no window [i.e a zero dimensions one] is present) by keyword
-     \doifinset\v!auto{#2}
-       {% brrr, here instead of in navigation module, must move and become special
-        % now two sided dependency
-        \let\checkrendering\gobbleoneargument
-        \ifx\PDFrenderingopenpageaction \empty
-          \handlereferenceactions{\v!StartRendering{#1}}\dosetuprenderingopenpageaction
-        \fi
-        \ifx\PDFrenderingclosepageaction\empty
-          \handlereferenceactions{\v!StopRendering {#1}}\dosetuprenderingclosepageaction
-        \fi
-        }%
-     \donefalse
-     \ifx\PDFrenderingopenpageaction \empty\!!doneafalse\else\donetrue\!!doneatrue\fi
-     \ifx\PDFrenderingclosepageaction\empty\!!donebfalse\else\donetrue\!!donebtrue\fi
-     \ifdone
-       \edef\PDFattributes
-         {/AA <<\if!!donea/PO <<\PDFrenderingopenpageaction >> \fi
-                \if!!doneb/PC <<\PDFrenderingclosepageaction>> \fi>>}%
-     \fi
-     \global\let\PDFrenderingopenpageaction \empty
-     \global\let\PDFrenderingclosepageaction\empty
-   \fi}
-
-\def\dosetuprenderingopenpageaction {\global\let\PDFrenderingopenpageaction \lastPDFaction}
-\def\dosetuprenderingclosepageaction{\global\let\PDFrenderingclosepageaction\lastPDFaction}
+\def\pdfbackendcurrentresources     {\ctxlua{lpdf.collectedresources()}}
 
-%D For the moment we don't test for alternatives that
-%D themselves have alternatives, especially cylcic
-%D dependencies.
+%D An example of usage is:
 
-% \def\pdfimmediateximage{\immediate\pdfximage}
-%
-% \def\checkpdfimageattributes
-%   {\ifx\PDFfigurereference\empty
-%      \global\let\pdfimageattributes\empty
-%    \else
-%      \immediate\pdfobj
-%        {[ << /Image \PDFobjref\PDFfigurereference
-%              /DefaultForPrinting true >> ]}%
-%      \xdef\pdfimageattributes
-%        {attr {/Alternates \PDFobjref\pdflastobj}}%
-%    \fi}
-%
-% \global\let\PDFimagecolorreference\empty
-%
-% \def\checkpdfimagecolorspecs
-%   {\ifx\pdflastximagecolordepth \undefined
-%      \global\let\pdfimagecolorspecs\empty
-%    \else\ifx\PDFimagecolorreference\empty
-%      \global\let\pdfimagecolorspecs\empty
-%    \else
-%      \xdef\pdfimagecolorspecs{colorspace \PDFimagecolorreference\space}%
-%    \fi\fi
-%    \global\let\PDFimagecolorreference\empty}
+\appendtoks % will change ...
+  \pdfbackendsetinfo{ConTeXt.Version}{(\contextversion)}%
+  \pdfbackendsetinfo{ConTeXt.Time}   {(\number\normalyear.\twodigits\normalmonth.\twodigits\normalday\space \twodigits\currenthour:\twodigits\currentminute)}%
+  \pdfbackendsetinfo{ConTeXt.Jobname}{(\jobname)}%
+  \pdfbackendsetinfo{ConTeXt.Url}    {(www.pragma-ade.com)}%
+\to \everylastbackendshipout
 
-%D \macros
-%D   {doregisterfigure}
-%D
-%D Here is the fuzzy, very special dependant figure
-%D registration special. We need to refer to the innermost
-%D object (ximage).
+%D Unfortunately this is still needed (also for  \METAPOST\ to
+%D \PDF\ converter):
 
-        \def\doregisterfigure#1#2%
-          {\doifundefined{IM::#1::#2}
-             {\setxvalue{IM::#1::#2}{\the\pdflastximage}}%
-           \xdef\PDFfigurereference{\getvalue{IM::#1::#2}}}
+\def\doresetmapfilelist
+  {\global\let\doresetmapfilelist\relax
+   \pdfmapfile{original-empty.map}}
 
-%D \macros
-%D  {doovalbox}
-%D
-%D Drawing frames with round corners is inherited from the
-%D main module.
-%D
-%D For drawing ovals we use quite raw \PDF\ code. The next
-%D implementation does not differ that much from the one
-%D implemented in the \POSTSCRIPT\ driver.
+\def\doloadmapfile #1#2{\pdfmapfile{#1#2}}
+\def\doloadmapline #1#2{\pdfmapline{#1#2}}
 
-\def\doPDFovalcalc#1#2#3%
-  {\PointsToBigPoints{\dimexpr#1+#2\relax}#3}
+\appendtoksonce \loadallfontmapfiles \to \pdfbackendeveryxform
+\appendtoksonce \loadallfontmapfiles \to \pdfbackendeveryximage
 
-\def\doovalbox#1#2#3#4#5#6#7#8% todo: \scratchdimen/\scatchbox
-  {\forcecolorhack
-   \bgroup
-   \dimen0=#4\divide\dimen0 \plustwo
-   \doPDFovalcalc{0pt}{+\dimen0}\xmin
-   \doPDFovalcalc{#1}{-\dimen0}\xmax
-   \doPDFovalcalc{#2}{-\dimen0}\ymax
-   \doPDFovalcalc{-#3}{+\dimen0}\ymin
-   \advance\dimen0 by #5%
-   \doPDFovalcalc{0pt}{+\dimen0}\xxmin
-   \doPDFovalcalc{#1}{-\dimen0}\xxmax
-   \doPDFovalcalc{#2}{-\dimen0}\yymax
-   \doPDFovalcalc{-#3}{+\dimen0}\yymin
-   \doPDFovalcalc{#4}{\zeropoint}\stroke
-   \doPDFovalcalc{#5}{\zeropoint}\radius
-   \edef\dostroke{#6}%
-   \edef\dofill{#7}%
-   \edef\mode{\number#8 \space}%
-   % no \ifcase, else \relax in pdfcode
-   \setbox\scratchbox\hbox
-     {\ifnum\dostroke\dofill>\zerocount
-        \ifPDFstrokecolor\else\ifnum\dostroke=\plusone
-          \writestatus\m!colors{pdf stroke color will fail}\wait
-        \fi\fi
-        \PDFcode
-          {q
-           \stroke\space               w
-           \ifcase\mode
-             \xxmin\space \ymin \space m
-             \xxmax\space \ymin \space l
-             \xmax \space \ymin \space \xmax \space \yymin\space y
-             \xmax \space \yymax\space l
-             \xmax \space \ymax \space \xxmax\space \ymax \space y
-             \xxmin\space \ymax \space l
-             \xmin \space \ymax \space \xmin \space \yymax\space y
-             \xmin \space \yymin\space l
-             \xmin \space \ymin \space \xxmin\space \ymin \space y
-             h
-           \or % 1
-             \xxmin\space \ymin \space m
-             \xxmax\space \ymin \space l
-             \xmax \space \ymin \space \xmax \space \yymin\space y
-             \xmax \space \ymax \space l
-             \xmin \space \ymax \space l
-             \xmin \space \yymin\space l
-             \xmin \space \ymin \space \xxmin\space \ymin \space y
-             h
-           \or % 2
-             \xxmin\space \ymin \space m
-             \xmax \space \ymin \space l
-             \xmax \space \ymax \space l
-             \xxmin\space \ymax \space l
-             \xmin \space \ymax \space \xmin \space \yymax\space y
-             \xmin \space \yymin\space l
-             \xmin \space \ymin \space \xxmin\space \ymin \space y
-             h
-           \or % 3
-             \xmin \space \ymin \space m
-             \xmax \space \ymin \space l
-             \xmax \space \yymax\space l
-             \xmax \space \ymax \space \xxmax\space \ymax \space y
-             \xxmin\space \ymax \space l
-             \xmin \space \ymax \space \xmin \space \yymax\space y
-             \xmin \space \ymin \space l
-             h
-           \or % 4
-             \xmin \space \ymin \space m
-             \xxmax\space \ymin \space l
-             \xmax \space \ymin \space \xmax \space \yymin\space y
-             \xmax \space \yymax\space l
-             \xmax \space \ymax \space \xxmax\space \ymax \space y
-             \xmin \space \ymax \space l
-             \xmin \space \ymin\space l
-             h
-           \or % 5
-             \xmin \space \ymin \space m
-             \xmax \space \ymin \space l
-             \xmax \space \yymax\space l
-             \xmax \space \ymax \space \xxmax\space \ymax \space y
-             \xmin \space \ymax \space l
-             \xmin \space \ymin \space l
-             h
-           \or % 6
-             \xmin \space \ymin \space m
-             \xxmax\space \ymin \space l
-             \xmax \space \ymin \space \xmax \space \yymin\space y
-             \xmax \space \ymax \space l
-             \xmin \space \ymax \space l
-             \xmin \space \ymin \space l
-             h
-           \or
-             \xxmin\space \ymin \space m
-             \xmax \space \ymin \space l
-             \xmax \space \ymax \space l
-             \xmin \space \ymax \space l
-             \xmin \space \yymin\space l
-             \xmin \space \ymin \space \xxmin\space \ymin \space y
-             h
-           \or
-             \xmin \space \ymin \space m
-             \xmax \space \ymin \space l
-             \xmax \space \ymax \space l
-             \xxmin\space \ymax \space l
-             \xmin \space \ymax \space \xmin \space \yymax\space y
-             \xmin \space \ymin \space l
-             h
-           \or % 9 top open
-             \xmin \space \ymax \space m
-             \xmin \space \yymin\space l
-             \xmin \space \ymin \space \xxmin\space \ymin \space y
-             \xxmax\space \ymin \space l
-             \xmax \space \ymin \space \xmax \space \yymin\space y
-             \xmax \space \ymax \space l
-           \or % 10 right open
-             \xmax \space \ymax \space m
-             \xxmin\space \ymax \space l
-             \xmin \space \ymax \space \xmin \space \yymax\space y
-             \xmin \space \yymin\space l
-             \xmin \space \ymin \space \xxmin\space \ymin \space y
-             \xmax\space  \ymin \space l
-           \or % 11 bottom open
-             \xmax \space \ymin \space m
-             \xmax \space \yymax\space l
-             \xmax \space \ymax \space \xxmax \space \ymax\space y
-             \xxmin\space \ymax \space l
-             \xmin \space \ymax \space \xmin \space \yymax\space y
-             \xmin \space \ymin \space l
-           \or % 12 left open
-             \xmin \space \ymax \space m
-             \xxmax\space \ymax \space l
-             \xmax \space \ymax \space \xmax \space \yymax\space y
-             \xmax \space \yymin\space l
-             \xmax \space \ymin \space \xxmax\space \ymin \space y
-             \xmin \space \ymin \space l
-           \or % 13
-             \xmin \space \ymax \space m
-             \xxmax\space \ymax \space l
-             \xmax \space \ymax \space \xmax \space \yymax\space y
-             \xmax\space  \ymin \space l
-           \or % 14
-             \xmax \space \ymax \space m
-             \xmax \space \yymin\space l
-             \xmax \space \ymin \space \xxmax\space \ymin \space y
-             \xmin \space \ymin \space l
-           \or % 15
-             \xmax \space \ymin \space m
-             \xxmin\space \ymin \space l
-             \xmin \space \ymin \space \xmin \space \yymin\space y
-             \xmin \space \ymax \space l
-           \or % 16
-             \xmin \space \ymin \space m
-             \xmin \space \yymax\space l
-             \xmin \space \ymax \space \xxmin\space \ymax \space y
-             \xmax \space \ymax \space l
-           \or % 17
-             \xxmax\space \ymax \space m
-             \xmax \space \ymax \space \xmax \space \yymax\space y
-           \or % 18
-             \xmax \space \yymin\space m
-             \xmax \space \ymin \space \xxmax\space \ymin \space y
-           \or % 19
-             \xxmin\space \ymin \space m
-             \xmin \space \ymin \space \xmin \space \yymin\space y
-           \or % 20
-             \xmin \space \yymax\space m
-             \xmin \space \ymax \space \xxmin\space \ymax \space y
-           \or % 21
-             \xxmax\space \ymax \space m
-             \xmax \space \ymax \space \xmax \space \yymax\space y
-             \xmin \space \yymax\space m
-             \xmin \space \ymax \space \xxmin\space \ymax \space y
-           \or % 22
-             \xxmax\space \ymax \space m
-             \xmax \space \ymax \space \xmax \space \yymax\space y
-             \xmax \space \yymin\space m
-             \xmax \space \ymin \space \xxmax\space \ymin \space y
-           \or % 23
-             \xmax \space \yymin\space m
-             \xmax \space \ymin \space \xxmax\space \ymin \space y
-             \xxmin\space \ymin \space m
-             \xmin \space \ymin \space \xmin \space \yymin\space y
-           \or % 24
-             \xxmin\space \ymin \space m
-             \xmin \space \ymin \space \xmin \space \yymin\space y
-             \xmin \space \yymax\space m
-             \xmin \space \ymax \space \xxmin\space \ymax \space y
-           \or % 25
-             \xxmax\space \ymax \space m
-             \xmax \space \ymax \space \xmax \space \yymax\space y
-             \xmax \space \yymin\space m
-             \xmax \space \ymin \space \xxmax\space \ymin \space y
-             \xxmin\space \ymin \space m
-             \xmin \space \ymin \space \xmin \space \yymin\space y
-             \xmin \space \yymax\space m
-             \xmin \space \ymax \space \xxmin\space \ymax \space y
-           \or % 26
-             \xmax \space \yymin\space m
-             \xmax \space \ymin \space \xxmax\space \ymin \space y
-             \xmin \space \yymax\space m
-             \xmin \space \ymax \space \xxmin\space \ymax \space y
-           \or % 27
-             \xxmax\space \ymax \space m
-             \xmax \space \ymax \space \xmax \space \yymax\space y
-             \xxmin\space \ymin \space m
-             \xmin \space \ymin \space \xmin \space \yymin\space y
-           \or % 28
-           \fi
-           \ifnum\mode>8
-                                       S
-           \else
-             \ifnum\dostroke=\plusone  S \fi
-             \ifnum\dofill  =\plusone  f \fi
-           \fi
-           Q}%
-      \fi}%
-   \wd\scratchbox#1\ht\scratchbox#2\dp\scratchbox#3\box\scratchbox
-   \egroup}
+%D Transformations. Some day we will use primitives (once they're fixed).
 
-%D \macros
-%D   {dostartgraymode,dostopgraymode,
-%D    dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,
-%D    dostopcolormode,
-%D    dostartrotation,dostoprotation,
-%D    dostartscaling,dostopscaling,
-%D    dostartmirroring,dostopmirroring,
-%D    dostartnegative,dostopnegative,
-%D    dostartoverprint,dostopoverprint}
+\def\dostartgraphicgroup{\pdfliteral{q}}
+\def\dostopgraphicgroup {\pdfliteral{Q}}
 
 \def\dostartrotation#1% grouped
-  {\setcalculatedcos\cos{#1}%
-   \setcalculatedsin\sin{#1}%
-   \forcecolorhack
-   \PDFcode{q \cos\space\sin\space\negated\sin\space\cos\space0 0 cm}}
+  {\forcecolorhack
+   \pdfliteral{q \ctxlua{lpdf.rotationcm(#1)}}}
 
 \def\dostoprotation
-  {\PDFcode{Q}}
-
-\def\@@PDFzeroscale{.0001}
+  {\pdfliteral{Q}}
 
 \def\dostartscaling#1#2% the test is needed because acrobat is bugged!
   {\forcecolorhack
-   \PDFcode{q \ifdim#1\points=\zeropoint\@@PDFzeroscale\else#1\fi\space 0 0
-              \ifdim#2\points=\zeropoint\@@PDFzeroscale\else#2\fi\space 0 0 cm}}
+   \pdfliteral{q \ifdim#1\points=\zeropoint.0001\else#1\fi\space 0 0
+                 \ifdim#2\points=\zeropoint.0001\else#2\fi\space 0 0 cm}}
 
 \def\dostopscaling
-  {\PDFcode{Q}}
-
-\def\dostartmirroring{\PDFcode{-1 0 0 1 0 0 cm}}
-\def\dostopmirroring {\PDFcode{-1 0 0 1 0 0 cm}}
-
-\def\dostartnegative {\ifdefined\initializePDFnegative \initializePDFnegative \PDFcode{/GSnegative  gs}\fi}
-\def\dostopnegative  {\ifdefined\initializePDFnegative \initializePDFnegative \PDFcode{/GSpositive  gs}\fi}
-\def\dostartoverprint{\ifdefined\initializePDFoverprint\initializePDFoverprint\PDFcode{/GSoverprint gs}\fi}
-\def\dostopoverprint {\ifdefined\initializePDFoverprint\initializePDFoverprint\PDFcode{/GSknockout  gs}\fi} % wrong
-
-%D \macros
-%D   {doPDFstartgraymode,doPDFstopgraymode,
-%D    doPDFstartrgbcolormode,doPDFstartcmykcolormode,doPDFstartgraycolormode,
-%D    doPDFstopcolormode}
-%D
-%D In \PDF\ there are two color states, one for strokes and one
-%D for fills. This means that we have to set the color in a
-%D rather redundant looking way. Unfortunately this makes the
-%D \PDF\ file much larger than needed. We can save few bytes
-%D by not setting the stroke color. Due to zip compression we
-%D only save a few percent.
-
-\def\dostartgraymode           #1{\PDFcode{#1 g\ifPDFstrokecolor\space#1 G\fi}}
-\def\dostopgraymode              {\PDFcode{0  g\ifPDFstrokecolor\space 0 G\fi}}
-\def\dostartrgbcolormode   #1#2#3{\PDFcode{#1 #2 #3   rg\ifPDFstrokecolor\space#1 #2 #3   RG\fi}}
-\def\dostartcmykcolormode#1#2#3#4{\PDFcode{#1 #2 #3 #4 k\ifPDFstrokecolor\space#1 #2 #3 #4 K\fi}}
-\def\dostartgraycolormode      #1{\PDFcode{#1 g\ifPDFstrokecolor\space#1 G\fi}}
-\def\dostopcolormode             {\PDFcode{0  g\ifPDFstrokecolor\space0  G\fi}}
-
-\def\dostartspotcolormode#1#2% redefining spotcolors is not possible anyway
-  {\ifundefined{pdf:scs:#2}%
-     \bgroup
-     \getcommacommandsize[#2]%
-     \ifcase\commalistsize\or
-       \setxvalue{pdf:scs:#2}{#2 SCN #2 scn}% \setxvalue{pdf:scs:#2}{#2 SC #2 sc}%
-     \else
-       \let\PDFspotcolorspecs\empty
-       \def\dospotcolorcommand##1{\edef\PDFspotcolorspecs{\PDFspotcolorspecs##1\space}}%
-       \processcommacommand[#2]\dospotcolorcommand
-       \setxvalue{pdf:scs:#2}{\PDFspotcolorspecs SCN \PDFspotcolorspecs scn}%
-     \fi
-     \egroup
-   \fi
-   \PDFcode{/#1 cs /#1 CS \PDFgetspotcolorspec{#2}}}
-
-\def\PDFgetspotcolorspec#1%
-  {\executeifdefined{pdf:scs:#1}\empty} % better no default than one with too less args
-
-\def\dostartnonecolormode
-  {\PDFcode{/None CS 1 SC /None cs 1 sc}}
-
-%D We need to register the spot colors and their fallbacks.
-
-% we cannot use /DeviceN since GS <=7.21 breaks on it
-% and Jaws does not handle it at all {[/DeviceN [/All|/None]
-% /Device#2 \PDFobjref\pdflastobj]} so we use separation
-% colors that work and print ok
-
-\def\doPDFregistersomespotcolor#1#2#3#4% implemented in the driver
-  {\writestatus\m!systems{missing spot color definition}\wait}
-
-\def\doregisternonecolor % internal command
-  {\doregistergrayspotcolor{None}{1}%
-   \globallet\doregisternonecolor\relax}
-
-\def\dodoPDFregisterrgbspotcolor#1#2#3#4#5#6#7% name noffractions names p's r g b
-  {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{RGB}{0.0 1.0 0.0 1.0 0.0 1.0}%
-     {\ifcase#2\or dup #5 mul exch dup #6 mul exch #7 mul\else#5 #6 #7\fi}}
-
-\def\dodoPDFregistercmykspotcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k
-  {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{CMYK}{0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0}%
-     {\ifcase#2\or dup #5 mul exch dup #6 mul exch dup #7 mul exch #8 mul\else #5 #6 #7 #8\fi}}
-
-\def\dodoPDFregistergrayspotcolor#1#2#3#4#5% name noffractions names p's s
-  {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{Gray}{0.0 1.0}%
-     {\ifcase#2\or #5 mul\else #5\fi}}
-
-\def\doregisterrgbspotcolor#1#2#3#4#5#6#7% name noffractions names p's r g b
-  {\ifRGBsupported
-     \dodoPDFregisterrgbspotcolor{#1}{#2}{#3}{#4}{#5}{#6}{#7}%
-   \else
-     \edef\@@cl@@r{#5}\edef\@@cl@@g{#6}\edef\@@cl@@b{#7}%
-     \ifCMYKsupported
-       \convertRGBtoCMYK\@@cl@@r\@@cl@@g\@@cl@@b
-       \dodoPDFregistercmykspotcolor{#1}{#2}{#3}{#4}\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
-     \else
-       \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b
-       \dodoPDFregistergrayspotcolor{#1}{#2}{#3}{#4}\@@cl@@s
-     \fi
-   \fi}
-
-\def\doregistercmykspotcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k
-  {\ifCMYKsupported
-     \dodoPDFregistercmykspotcolor{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
-   \else
-     \edef\@@cl@@c{#5}\edef\@@cl@@m{#6}\edef\@@cl@@y{#7}\edef\@@cl@@k{#8}%
-     \ifRGBsupported
-       \convertCMYKtoRGB\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
-       \dodoPDFregisterrgbspotcolor{#1}{#2}{#3}{#4}\@@cl@@r\@@cl@@g\@@cl@@b
-     \else
-       \convertCMYKtoGRAY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
-       \dodoPDFregistergrayspotcolor{#1}{#2}{#3}{#4}\@@cl@@s
-     \fi
-   \fi}
-
-\def\doregistergrayspotcolor{\dodoPDFregistergrayspotcolor}
-
-%D New and very experimental.
-
-\def\doregistercmykindexcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k
-  {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{CMYK}{0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0}%
-     {dup #5 mul exch dup #6 mul exch dup #7 mul exch #8 mul}}
-
-\def\doregisterrgbindexcolor#1#2#3#4#5#6#7% name noffractions names p's r g b
-  {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{RGB}{0.0 1.0 0.0 1.0 0.0 1.0}%
-     {dup #5 mul exch dup #6 mul exch #7 mul}}
-
-\def\doregistergrayindexcolor#1#2#3#4#5% name noffractions names p's s
-  {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{Gray}{0.0 1.0}%
-     {pop}}
-
-\let\checkpredefinedcolor\predefineindexcolor % we need an index in order to negate bitmaps
-
-\def\doregisterfigurecolor#1% always an index color
-  {\dogetobjectreference{PDFIX}{\internalspotcolorname{#1}}\PDFimagecolorreference}
-
-\def\doregisterspotcolorname#1#2% no need for escape in luatex
-  {\bgroup
-   \let\ascii\empty
-   \def\docommand##1%
-     {\edef\ascii{\ascii
-      \ifx\nexthandledtoken\space
-        \letterhash20%
-      \else\ifx\nexthandledtoken\blankspace
-        \letterhash20%
-      \else
-        ##1%
-      \fi\fi}}%
-   \expanded{\handletokens#2}\with\docommand
-   \letgvalue{@@pdf@@scn@@#1}\ascii
-   \egroup}
-
-\def\doPDFregistersomespotcolor#1#2#3#4#5#6#7% name fractions names p's space domain function
-  {\bgroup
-   \let\spotpops\empty
-   \ifcase#2\or
-     %def\PDFspotcolornames{/Separation /#1}%
-     \edef\PDFspotcolornames{/Separation /\executeifdefined{@@pdf@@scn@@#1}{#1}}%
-     \def\PDFspotcolordomain{0.0 1.0}%
-   \else
-     \dorecurse{#2}{\edef\spotpops{\spotpops pop }}%
-     \let\PDFspotcolornames \empty
-     \let\PDFspotcolordomain\empty
-     \def\dospotcolorcommand##1%
-       {\edef\PDFspotcolornames {\PDFspotcolornames/\executeifdefined{@@pdf@@scn@@##1}{##1}\space}%
-        \edef\PDFspotcolordomain{\PDFspotcolordomain 0.0 1.0\space}}%
-     \processcommacommand[#3]\dospotcolorcommand
-     \edef\PDFspotcolornames{/DeviceN [\PDFspotcolornames]}%
-   \fi
-   \immediate \pdfobj stream attr
-     {/FunctionType 4 /Domain [\PDFspotcolordomain] /Range [#6]}{{\spotpops#7}}%
-   \immediate \pdfobj
-     {[\PDFspotcolornames\space /Device#5 \PDFobjref\pdflastobj]}%
-   \dosetobjectreference{PDFCS}{#1}{\the\pdflastobj}%
-   \appendtoPDFdocumentcolorspaces{/#1 \PDFobjref\pdflastobj}%
-   \egroup}
-
-%D New and very experimental.
-
-\def\doPDFregistersomeindexcolor#1#2#3#4#5#6#7% name fractions names p's space domain function
-  {\bgroup
-   \let\spotpops\empty
-   \dorecurse{#2}{\edef\spotpops{\spotpops exch pop\space}}%
-   \let\PDFspotcolornames \empty
-   \let\PDFspotcolordomain\empty
-   \def\docommand##1%
-     {%\edef\PDFspotcolornames {\PDFspotcolornames/##1\space}%
-      \edef\PDFspotcolornames{\PDFspotcolornames/\executeifdefined{@@pdf@@scn@@##1}{##1}\space}%
-      \edef\PDFspotcolordomain{\PDFspotcolordomain 0.0 1.0\space}}%
-   \processcommacommand[#3,None]\docommand
-   \let\PDFcolorindexvector\empty
-   \def\docommand##1%
-     {\scratchdimen##1\points
-      \scratchdimen\recurselevel\scratchdimen
-      \scratchcounter\scratchdimen
-      \divide\scratchcounter \maxcard
-      \edef\PDFcolorindexvector{\PDFcolorindexvector\uchexnumbers\scratchcounter}}%
-   %\dostepwiserecurse\zerocount{255}\plusone
-   \dostepwiserecurse{255}\zerocount\minusone % we need to negate
-     {\rawprocesscommacommand[#4,1]\docommand
-      \xdef\PDFcolorindexvector{\PDFcolorindexvector\space}}%
-   \immediate \pdfobj stream attr
-     {/FunctionType 4 /Domain [\PDFspotcolordomain] /Range [#6]}{{\spotpops#7}}%
-   \immediate \pdfobj
-     {[/Indexed
-         [/DeviceN [\PDFspotcolornames] /Device#5 \the\pdflastobj\space0 R] %
-         255 <\PDFcolorindexvector>]}%
-   \dosetobjectreference{PDFIX}{#1}{\the\pdflastobj}%
-   \appendtoPDFdocumentcolorspaces{/#1_INDEXED \the\pdflastobj\space0 R}%
-   \egroup}
-
-%D \macros
-%D   {dostarttransparency,dostoptransparency}
-%D
-%D For transparency, we need to implement a couple of
-%D auxiliary macros. If needed, we will generalize them later.
-
-\def\@@PDT{@PDT@}
-
-\ifx\PDFcurrenttransparency\undefined
-  \newcount\PDFcurrenttransparency \PDFcurrenttransparency=0 % -1
-\fi
-
-\def\assignPDFtransparency#1#2%
-  {\edef\PDFtransparencyidentifier{/Tr#1}%
-   \edef\PDFtransparencyreference{\PDFobjref{#2}}}
-
-\def\presetPDFtransparency#1#2%
-  {\initializePDFtransparency
-   \executeifdefined{\@@PDT#1:#2}{\dopresetPDFtransparency{#1}{#2}}}
-
-\def\dopresetPDFtransparency#1#2%
-  {\global\advance\PDFcurrenttransparency \plusone
-   \immediate\pdfobj{\PDFtransparancydictionary{#1}{#2}{}}%
-   \edef\PDFtransparencyidentifier{/Tr\the\PDFcurrenttransparency}%
-   \edef\PDFtransparencyreference {\PDFobjref\pdflastobj}%
-   \setxvalue{\@@PDT#1:#2}%
-     {\noexpand\assignPDFtransparency{\the\PDFcurrenttransparency}{\the\pdflastobj}}%
-   \appendtoPDFdocumentextgstates
-     {\PDFtransparencyidentifier\space
-      \PDFtransparencyreference\space}}
-
-\def\initializePDFtransparency
-  {\immediate\pdfobj{\PDFtransparancydictionary{1}{1}{/AIS false}}%
-   \xdef\PDFtransparencyresetidentifier{/Tr0}%
-   \xdef\PDFtransparencyresetreference{\PDFobjref\pdflastobj}%
-   \setxvalue{\@@PDT0:0}%
-     {\noexpand\assignPDFtransparency{0}{\the\pdflastobj}}%
-   \appendtoPDFdocumentextgstates
-     {\PDFtransparencyresetidentifier\space
-      \PDFtransparencyresetreference\space}%
-   \global\let\initializePDFtransparency\relax}
-
-%D Transparency support:
-
-\def\PDFtransparancydictionary#1#2#3% type fraction extras
-  {<>}
-
-\def\dodoPDFstarttransparency#1#2%
-  {\presetPDFtransparency{#1}{#2}%
-   \PDFcode{\PDFtransparencyidentifier\space gs }}
-
-\def\dodoPDFstoptransparency
-  {\PDFcode{/Tr0 gs }}
-
-\def\dostarttransparency
-  {\global\let\dostarttransparency\dodoPDFstarttransparency
-   \global\let\dostoptransparency \dodoPDFstoptransparency
-   \initializetransparency
-   \dostarttransparency}
-
-% This is tricky: because a text stream is handled before
-% the page body is built, we can run into stops that will
-% match an outer start; however, the stop is needed in case
-% of a text color: [text color text] [other color text] on a
-% first page combined with color splitting will go wrong if
-% we stick to the relaxing method.
-
-% \def\dostoptransparency
-%   {\initializetransparency
-%    \dodoPDFstoptransparency}
-
-%D These use:
+  {\pdfliteral{Q}}
 
-\let\initializetransparency\relax
+\def\dostartmirroring{\pdfliteral{-1 0 0 1 0 0 cm}}
+\def\dostopmirroring {\pdfliteral{-1 0 0 1 0 0 cm}}
 
-\let\PDFtransparencyresetreference \empty
-\let\PDFtransparencyresetidentifier\empty
-
-\let\PDFtransparencyreference \empty
-\let\PDFtransparencyidentifier\empty
-
-%D New trickery:
-
-\def\dostartgraphicgroup{\PDFcode{q}}
-\def\dostopgraphicgroup {\PDFcode{Q}}
-
-%D \macros
-%D   {dostartclipping,dostopclipping}
-%D
-%D Clipping in \PDFTEX\ is rather trivial. We can even hook
-%D in \METAPOST\ without problems.
-
-\def\dostartclipping#1#2#3%
+\def\dostartclipping#1#2#3% todo
   {\PointsToBigPoints{#2}\width
    \PointsToBigPoints{#3}\height
-   \grabMPclippath{#1}{1}\width\height
-     {0 0 m \width\space 0 l \width \height l 0 \height l}%
-   \pdfliteral % PDFcode ?
-     {q 0 w \MPclippath\space W n}}
+   \grabMPclippath{#1}{1}\width\height{0 0 m \width\space 0 l \width \height l 0 \height l}%
+   \pdfliteral{q 0 w \MPclippath\space W n}}
 
 \def\dostopclipping
-  {\pdfliteral{Q n}} % PDFcode
-
-%D \macros
-%D   {dosetupinteraction}
-%D
-%D Nothing special is needed to enable \PDF\ commands and
-%D interaction. We stick with a message.
-
-\def\dosetupinteraction
-  {\showmessage\m!interactions{21}{pdftex}}
-
-%D \macros
-%D   {doresetgotowhereever,
-%D    dostartthisisrealpage,dostartthisislocation,
-%D    dostartgotorealpage,dostartgotolocation,dostartgotoJS}
-%D
-%D The interactions macros are the core of this module. We
-%D support both page destinations and named ones. We don't
-%D need the \type{\stop}||alternatives. We also don't need
-%D to set the special that sets the real page number.
-
-%D In the goto specials we took care of secondary references.
-%D Here we define the macros used.
-
-\def\doresetgotowhereever
-  {\global\let\secondaryPDFreferences\empty}
+  {\pdfliteral{Q n}}
 
-\doresetgotowhereever % just to be sure
+%D The following will move to the backend \LUA\ code:
 
-% we can (in etex) share more by testing on this
+\appendtoks \ctxlua{backends.codeinjections.finalizepage    ()}\to \everybackendshipout       % is immediate
+\appendtoks \ctxlua{backends.codeinjections.finalizedocument()}\to \everylastbackendshipout   % is immediate
 
-\def\savesecondaryPDFreference#1%
-  {\@EA\xdef\csname PDF-SR:\the\nofsecondaryreferences\endcsname{#1}}
+%D Temporary hack, will be removed or improved.
 
-\def\savesecondaryPDFreference % #1 == \action
-  {\global\@EA\let\csname PDF-SR:\the\nofsecondaryreferences\endcsname}
-
-% test should happen in core-ref
-
-\def\getsecondaryPDFreferences
-  {\ifcase\nofsecondaryreferences\else
-     \ifcsname PDF-SR:\the\nofsecondaryreferences\endcsname
-       \xdef\secondaryPDFreferences{/Next <<\csname PDF-SR:\the\nofsecondaryreferences\endcsname\space\secondaryPDFreferences>>}%
-     \fi
-     \global\advance\nofsecondaryreferences \minusone
-     \expandafter\getsecondaryPDFreferences
-   \fi}
+\def\TransparencyHack{\ctxlua{backends.codeinjections.addtransparencygroup()}}
 
 %D \macros
-%D   {dostartthisislocation}
-%D
-%D Next we define the macros that deal with hyperreferencing,
-%D graphic inclusion and general document features. These are
-%D the olderst ones. I won't comment much because one needs
-%D knowledge of \PDF\ itself, and explaning \PDF\ is beyond
-%D this documentation.
-
-\def\dostartthisislocation#1%
-  {\bgroup
-   \setPDFdestination{#1}%
-   \ifx\PDFdestination\empty \else
-     \pdfdest name {\PDFdestination}\PDFpageviewkey
-   \fi
-   \egroup}
-
-\def\locationfilesuffix{pdf}
-
-\def\dostartgotolocation#1#2#3#4#5#6%
-  {\bgroup
-   \doifelsenothing{#3}
-     {\setPDFdestination{#5}%
-      \doifelsenothing\PDFdestination
-        {\let\action\empty}
-        {\doifelsenothing{#4}
-           {\let\PDFfile\empty}
-           {\expanded{\beforesplitstring#4}\at.\to\PDFfile
-            \doifparentfileelse\PDFfile % {#4}
-              {\let\PDFfile\empty}
-             %{\setreferencefilename#4.\locationfilesuffix\to\PDFfile
-              {\@EA\setreferencefilename\PDFfile.\locationfilesuffix\to\PDFfile
-               \edef\PDFfile
-                 {R /F (\PDFfile)\ifgotonewwindow\space/NewWindow true \fi}}}%
-         \edef\action%
-           {/S /GoTo\PDFfile\space /D (\PDFdestination)}}}
-     {\doifelsenothing{#4}
-        {\let\PDFfile\empty
-         \let\PDFdestination\empty}
-        {\setreferencefilename/#4\to\PDFfile
-         \setPDFdestination{#5}%
-         \doifsomething\PDFdestination
-           {\edef\PDFdestination{\letterhash\PDFdestination}}}%
-      \edef\action{/S /URI /URI (#3\PDFfile\PDFdestination)}}%
-   \ifx\action\empty\else
-     \ifsecondaryreference
-       \savesecondaryPDFreference\action
-     \else
-       \getsecondaryPDFreferences
-       \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
-     \fi
-   \fi
-   \egroup}
-
-\def\PDFgotonewwindow{\ifgotonewwindow\space/NewWindow true \fi}
-
-% optimization in tpd driver
-%
-% \edef\PDFdestination{(page:\the\scratchcounter)}%
-%
-%   ==>
-%
-% \advance\scratchcounter 1
-% \edef\PDFdestination{[\pdfpageref \PDFobjref\scratchcounter\PDFpageviewwrd]}%
-%
-% \doPDFgetpagedestination#1#2% pagenumber macro % % fuzzy hack
-
-\def\dostartgotorealpage#1#2#3#4#5% watch the R append trick
-  {\bgroup
-   \doifelsenothing{#3}% #1 = url
-     {\scratchcounter0#5\relax
-      \ifnum\scratchcounter>0
-        \doifelsenothing{#4}
-          {\let\PDFfile\empty}
-          {\expanded{\beforesplitstring#4}\at.\to\PDFfile
-           \doifparentfileelse\PDFfile % {#4}
-             {\let\PDFfile\empty}
-            %{\setreferencefilename#4.\locationfilesuffix\to\PDFfile
-             {\@EA\setreferencefilename\PDFfile.\locationfilesuffix\to\PDFfile
-              \edef\PDFfile{R /F (\PDFfile)\PDFgotonewwindow}}}%
-        \ifx\PDFfile\empty
-          \ifcase\overcomePDFpage
-          \or % pdf starts numbering at zero
-            \advance\scratchcounter \minusone
-            \edef\PDFdestination{[\the\scratchcounter\space\PDFpageviewwrd]}%
-          \or % pdf starts numbering at zero
-            \advance\scratchcounter \minusone
-            \edef\PDFdestination{(page:\the\scratchcounter)}%
-          \or % pdftex starts numbering at one
-            \edef\PDFdestination{[\pdfpageref\scratchcounter\space0 R \PDFpageviewwrd]}%
-          \fi
-        \else % across files it's a page number / pdf starts numbering at zero
-          \advance\scratchcounter \minusone
-          \edef\PDFdestination{[\the\scratchcounter\space\PDFpageviewwrd]}%
-        \fi
-        \edef\action{/S /GoTo\PDFfile\space /D \PDFdestination}%
-      \else
-        \let\action\empty
-      \fi}
-     {\doifelsenothing{#4}
-        {\let\PDFfile\empty}
-        {\setreferencefilename/#4\to\PDFfile}%
-      \edef\action{/S /URI /URI (#3\PDFfile)}}%
-   \ifx\action\empty\else
-     \ifsecondaryreference
-       \savesecondaryPDFreference\action
-     \else
-       \getsecondaryPDFreferences
-       \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
-     \fi
-   \fi
-   \egroup}
-
-\let\lastfakedPDFpage\!!zerocount
-
-\def\fakePDFpagedestination % as in pdf, we start numbering at zero
-  {\iflocation \ifarrangingpages \ifnum\overcomePDFpage=\plustwo \else
-     \ifnum\lastfakedPDFpage<\realpageno
-       \bgroup
-         \xdef\lastfakedPDFpage{\realfolio}%
-         \advance\realpageno \minusone % is \expanded needed ?
-         \normalexpanded{\noexpand\pdfdest name {page:\realfolio}\PDFpageviewkey}%
-       \egroup
-     \fi
-   \fi \fi \fi}
-
-\def\dostartgotoJS#1#2#3%
-  {\bgroup
-   \doPSsanitizeJScode#3\to\sanitizedJScode
-   \edef\action{/S /JavaScript /JS (\sanitizedJScode)}%
-   \ifsecondaryreference
-     \savesecondaryPDFreference\action
-   \else
-     \getsecondaryPDFreferences
-     \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
-   \fi
-   \egroup}
-
-%D When going to a location, we obey the time and space saving
-%D boolean \type{\ifusepagedestination}. Named destinations are
-%D stripped and made robust. This all happens in the macros
-%D called for.
+%D  {dostartobject,dostopobject,doinsertobject}
 
-%D \macros
-%D   {doflushJSpreamble}
-%D
-%D It does not make sense to duplicate common \JAVASCRIPT\
-%D functions, and therefore they can be predefined and must be
-%D output separately. Currently this special is not shared
-%D with the \ACROBAT\ one, simply because \DISTILLER\ does not
-%D yet support something \type{\pdfnames}.
+%D This will change:
 
-% \oneJSpreamblefalse  % buggy in acrobat
+\newbox\objectbox
 
-\def\doflushJSpreamble#1%
+\def\dostartobject#1#2#3#4#5%
   {\bgroup
-   \let\compositeJScode\empty
-   \def\docommand##1%
-     {\edef\sanitizedJScode{\getJSpreamble{##1}}%
-      \@EA\doPSsanitizeJScode\sanitizedJScode\to\sanitizedJScode
-      \immediate\pdfobj {<< /S /JavaScript /JS (\sanitizedJScode) >>}%
-      \edef\compositeJScode
-        {\compositeJScode\space (##1) \PDFobjref\pdflastobj}}%
-   \processcommalist[#1]\docommand
-   \immediate\pdfobj{<< /Names [ \compositeJScode ] >>}%
-   \pdfnames{/JavaScript \PDFobjref\pdflastobj}%
-   \egroup}
-
-%D \macros
-%D   {dostarthide,dostophide}
-%D
-%D Hiding parts of the document for printing is not yet
-%D supported by \PDF\ and therefore \PDFTEX.
-
-\let\dostarthide\donothing
-\let\dostophide \donothing
-
-%D \macros
-%D   {doPDFsetupscreen,doPDFsetupidentity}
-%D
-%D Opposite to \DVI\ drivers, \PDF\ ones must know which what
-%D page dimensions they are dealing. We also use the
-%D opportunity to launch full screen (1) or show bookmarks (2).
-%D
-%D Setting of the screen boundingbox involves some
-%D calculations. Here we also take care of (non) full screen
-%D startup. The dimensions are rounded. Because \PDFTEX\ and
-%D \ACROBAT\ handle setting the page dimensions in a
-%D different way, we do not share this special.
-
-\def\dosetupscreen{\doPDFsetupscreen\pdfpageheight}
-
-\let\currentPDFpagemode   \empty % document catalog
-\let\currentPDFviewerprefs\empty % document catalog
+   \setbox\objectbox\vbox\bgroup
+   \def\dodostopobject{\egroup\doregisterobject{#1}{#2}}}
 
-\let\currentPDFcropbox    \empty % page attributes
-\let\currentPDFbleedbox   \empty % page attributes
-\let\currentPDFartbox     \empty % page attributes
-\let\currentPDFtrimbox    \empty % page attributes
-
-\def\doPDFsetupscreen#1#2#3#4#5#6% watch the extra argument
-  {\bgroup
-   \xdef\currentPDFpagemode
-     {\ifnum#6=4
-        /PageLayout /TwoColumnRight
-      \else
-        /PageMode \ifcase#6
-        /UseNone\or/FullScreen\or/UseOutlines\else/UseNone\fi
-      \fi}%
-   \xdef\currentPDFviewerprefs % space after #6 needed, else \relax
-     {\ifcase#6 \or\or\else /ViewerPreferences << /FitWindow true >>\fi}%
+\def\dostopobject
+  {\dodostopobject
    \egroup}
 
-\def\addPDFdocumentinfo
-  {\appendtopdfcatalog{\currentPDFpagemode\currentPDFviewerprefs}%
-   \appendtopdfcatalog{/Version \ifdim\PDFversion00\points>100\points 1.\fi\PDFversion}%
-   \appendtopdfinfo{/Trapped /False}%
-   \appendtopdfinfo{/ConTeXt.Version (\contextversion)}%
-   \appendtopdfinfo{/ConTeXt.Time    (\number\normalyear.\twodigits\normalmonth.\twodigits\normalday\space \twodigits\currenthour:\twodigits\currentminute)}%
-   \appendtopdfinfo{/ConTeXt.Jobname (\jobname)}%
-   \appendtopdfinfo{/ConTeXt.Url     (www.pragma-ade.com)}%
-   \glet\addPDFdocumentinfo\relax}
+\def\doregisterobject#1#2%
+  {\the\pdfbackendeveryxform
+   \finalizeobjectbox\objectbox
+   \immediate\pdfxform resources {\pdfbackendcurrentresources}\objectbox
+   \dosetobjectreference{#1}{#2}{\the\pdflastxform}}
 
-\def\PDFversion{1.5}
+\def\doresetobjects
+  {}
 
-\appendtoksonce
-  \def\PDFversion{1.5}%
-\to \everyresetspecials
+\def\doinsertobject#1#2%
+  {\begingroup
+   \doifobjectreferencefoundelse{#1}{#2}
+     {\dogetobjectreference{#1}{#2}\PDFobjectreference\pdfrefxform\PDFobjectreference}%
+     \donothing
+   \endgroup}
 
-\def\doPDFsetupwhateverbox#1#2#3#4#5#6% watch the extra arguments
-  {\bgroup
-   \!!widtha \dimexpr#5+#3\relax
-   \!!heightb\dimexpr#2-#4\relax
-   \!!heighta\dimexpr\!!heightb-#6\relax
-   % sometimes whole values give better results
-   % \PointsToWholeBigPoints{#3}\left
-   % \PointsToWholeBigPoints\!!heighta\bottom
-   % \PointsToWholeBigPoints\!!widtha \width
-   % \PointsToWholeBigPoints\!!heightb\height
-   % but since pdf/x does not round when checking if
-   % the boxes fit inside the media box ...
-   \PointsToBigPoints{#3}\left
-   \PointsToBigPoints\!!heighta\bottom
-   \PointsToBigPoints\!!widtha \width
-   \PointsToBigPoints\!!heightb\height
-   \xdef#1{[\left\space\bottom\space\width\space\height]}%
-   \egroup}
-
-\gdef\currentPDFtrimbox{\currentPDFcropbox} % default, needed for pdf/x
-
-\def\dosetupartbox  {\doPDFsetupwhateverbox\currentPDFartbox  \pdfpageheight}
-\def\dosetupcropbox {\doPDFsetupwhateverbox\currentPDFcropbox \pdfpageheight}
-\def\dosetupbleedbox{\doPDFsetupwhateverbox\currentPDFbleedbox\pdfpageheight}
-\def\dosetuptrimbox {\doPDFsetupwhateverbox\currentPDFtrimbox \pdfpageheight}
-
-\def\flushPDFpageboxes
-  {\edef\currentPDFtrimbox{\currentPDFtrimbox}%
-   \ifx\currentPDFartbox  \empty\else\appendtopdfpageattributes{/ArtBox   \currentPDFartbox  }\fi
-   \ifx\currentPDFcropbox \empty\else\appendtopdfpageattributes{/CropBox  \currentPDFcropbox }\fi
-   \ifx\currentPDFbleedbox\empty\else\appendtopdfpageattributes{/BleedBox \currentPDFbleedbox}\fi
-   \ifx\currentPDFtrimbox \empty\else\appendtopdfpageattributes{/TrimBox  \currentPDFtrimbox }\fi}
-
-%D \macros
-%D   {dostartexecutecommand}
-%D
-%D \PDF\ viewers enable us to navigate using menus and shortcut
-%D keys. These navigational tools can also be accessed by using
-%D annotations. The next special takes care of inserting them.
-%D
-%D At the cost of much auxiliary placeholders, we can pretty
-%D fast convert the command asked for. This is how the \PDF\
-%D code looks like.
-
-\def\PDFmoviecode#1#2#3%
-  {/Movie
-   /T (\ifcase#1movie \else sound \fi\ifx\argumentA\empty#2\else\argumentA\fi)
-   /Operation /\ifcase#3Play\or Stop\or Pause\or Resume\fi\space}
-
-\def\PDFexecutestartmovie  {\PDFmoviecode0\currentmovie0}
-\def\PDFexecutestopmovie   {\PDFmoviecode0\currentmovie1}
-\def\PDFexecutepausemovie  {\PDFmoviecode0\currentmovie2}
-\def\PDFexecuteresumemovie {\PDFmoviecode0\currentmovie3}
-
-\def\PDFexecutestartsound  {\PDFmoviecode1\currentsound0}
-\def\PDFexecutestopsound   {\PDFmoviecode1\currentsound1}
-\def\PDFexecutepausesound  {\PDFmoviecode1\currentsound2}
-\def\PDFexecuteresumesound {\PDFmoviecode1\currentsound3}
-
-\def\PDFformcode#1%
-  {\doiffieldset{#1}{/Field [\dogetfieldset{#1}]}}
-
-% bit 3 = html
-% bit 6 = xml
-% bit 4 = get
-
-\ifx\PDFsubmitfiller\undefined \let\PDFsubmitfiller\empty \fi
-
-\chardef\PDFformmethod=1 % 0=GET 1=POST
-
-\def\PDFformflag#1#2{\ifcase\PDFformmethod#1\else#2\fi}
-
-\def\PDFexecuteimportform  {/Named /N /AcroForm:ImportFDF}
-\def\PDFexecuteexportform  {/Named /N /AcroForm:ExportFDF}
-\def\PDFexecuteresetform   {/ResetForm  \PDFformcode\argumentA}
-\def\PDFexecutesubmitform  {/SubmitForm \PDFformcode\argumentB
-                            /Flags \ifcase\submitoutputformat\space
-                                         \PDFformflag{12} {4} % 0=unknown
-                                   \or   \PDFformflag{12} {4} % 1=HTML
-                                   \or   \PDFformflag {8} {0} % 2=FDF
-                                   \or   \PDFformflag{40}{32} % 3=XML
-                                   \else \PDFformflag{12} {4} % ?=unknown
-                                   \fi
-                            /F (\argumentA)\PDFsubmitfiller}
-
-% urifill permits url substitution
-
-\def\PDFexecutehide        {/Hide /T (\argumentA) /H true}
-\def\PDFexecuteshow        {/Hide /T (\argumentA) /H false}
-
-\def\PDFexecutefirst       {/Named /N /FirstPage}
-\def\PDFexecuteprevious    {/Named /N /PrevPage}
-\def\PDFexecutenext        {/Named /N /NextPage}
-\def\PDFexecutelast        {/Named /N /LastPage}
-\def\PDFexecutebackward    {/Named /N /GoBack}
-\def\PDFexecuteforward     {/Named /N /GoForward}
-\def\PDFexecuteprint       {/Named /N /Print}
-\def\PDFexecuteexit        {/Named /N /Quit}
-\def\PDFexecuteclose       {/Named /N /Close}
-\def\PDFexecutesave        {/Named /N /Save}
-\def\PDFexecutesavenamed   {/Named /N /SaveAs}
-\def\PDFexecuteopennamed   {/Named /N /Open}
-\def\PDFexecutehelp        {/Named /N /HelpUserGuide}
-\def\PDFexecutetoggle      {/Named /N /FullScreen}
-\def\PDFexecutesearch      {/Named /N /Find}
-\def\PDFexecutesearchagain {/Named /N /FindAgain}
-\def\PDFexecutegotopage    {/Named /N /GoToPage}
-\def\PDFexecutequery       {/Named /N /AcroSrch:Query}
-\def\PDFexecutequeryagain  {/Named /N /AcroSrch:NextHit}
-\def\PDFexecutefitwidth    {/Named /N /FitWidth}
-\def\PDFexecutefitheight   {/Named /N /FitHeight}
-
-\let\PDFobjectclass\empty
-\let\PDFobjectname \empty
-
-\def\dostartexecutecommand#1#2#3#4%
-  {\doifdefined{PDFexecute#3}
-     {\bgroup
-      \edef\argument{#4}%
-      \ifx\argument\empty
-        \let\argumentA\empty
-        \let\argumentB\empty
-      \else
-        \@EA\dogetcommalistelement\@EA1\@EA\from#4\to\argumentA
-        \@EA\dogetcommalistelement\@EA2\@EA\from#4\to\argumentB
-      \fi
-      \edef\action%
-        {/S \getvalue{PDFexecute#3}}%
-      \ifsecondaryreference
-        \savesecondaryPDFreference\action
-      \else
-        \getsecondaryPDFreferences
-%        \ifx\PDFobjectclass\empty
-%          \let\next\insertpdfaction
-%        \else
-%          \edef\next{\createpdfactionobject{\PDFobjectclass}{\PDFobjectname}}%
-%          \globalletempty\PDFobjectclass
-%          \globalletempty\PDFobjectname
-%        \fi
-%        \next
-        \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
-      \fi
-      \egroup}}
-
-%D \macros
-%D   {dosetupidentity}
-%D
-%D Documents can be tagged with an application accessible title
-%D and subtitle, the authorname, a date, the creator, keywords
-%D etc. For the moment \PDFTEX\ only supports the first three
-%D of these.
-
-\def\dosetupidentity#1#2#3#4#5#6%
-  {\normalexpanded{\noexpand\appendtopdfinfo
-     {/Title   <\hexifiedPDFstring{#1}>
-      /Subject <\hexifiedPDFstring{#2}>
-      /Author  <\hexifiedPDFstring{#3}>
-      /Creator <\hexifiedPDFstring{#4}>
-      /ModDate (#4)
-      /ID (\jobname.#5) % needed for pdf/x
-      /Keywords <\hexifiedPDFstring{#6}>}}}
-
-%D \macros
-%D   {dostartrunprogam}
-%D
-%D We can run a program form within a document, although this
-%D feature is rather weak, due to path problems and buggy
-%D argument passing.
-
-\def\dostartrunprogram#1#2#3#4% new: #3 => #3#4
-  {\bgroup
-  %\edef\string{#3}%
-  %\@EA\beforesplitstring\string\at{ }\to\program
-  %\@EA\aftersplitstring \string\at{ }\to\parameters
-  %\edef\action%
-  %  {/S /Launch /F (\program) /P (\parameters) /D (.)}%
-   \edef\action
-     {/S /Launch /F (#3) /P (#4) /D (.)}%
-   \ifsecondaryreference
-     \savesecondaryPDFreference\action
-   \else
-     \getsecondaryPDFreferences
-     \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
-   \fi
-   \egroup}
-
-%D \macros
-%D   {dostartgotoprofile, dostopgotoprofile,
-%D    dobeginofprofile, doendofprofile}
-%D
-%D \CONTEXT\ user profiles and version control fall back on
-%D \PDF\ article threads. Unfortunately one cannot influence
-%D the view yet in an (for me) acceptable way.
-
-\def\dostartgotoprofile#1#2#3% to be done: file
-  {\bgroup
-   \setPDFdestination{#3}%
-   \doifsomething\PDFdestination
-     {\edef\action
-        {/S /Thread /D (\PDFdestination)}%
-      \ifsecondaryreference
-        \savesecondaryPDFreference\action
-      \else
-        \getsecondaryPDFreferences
-        \insertpdfaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
-      \fi}%
-   \egroup}
-
-%D Some day, I'll reimplement threading in a useful way.
-%D Currently the viewers handle threads rather diffuse.
-
-\def\dobeginofprofile#1#2#3#4%
-  {\setPDFdestination{#1}%
-   \doifsomething\PDFdestination
-     {\pdfthread
-        width #2 height #3
-        attr {/Title (\PDFdestination)} % can be omitted
-        name {\PDFdestination}}}
-
-\def\doendofprofile
-  {}
-
-%D \macros
-%D  {doinsertbookmark}
-%D
-%D In \PDF\ bookmarks are the building blocks of a viewer
-%D provided sort of table of contents. \TEX\ has to provide
-%D the entry as well as the number of child entries. Strings
-%D need to be sanatized as good as possible to suit the default
-%D encoding. In \CONTEXT\ users can overrule this string by
-%D supplying an alternative one. Look at the macro called for
-%D to see how funny these bookmarks are defined.
-
-\def\doinsertbookmark#1#2#3#4#5% level sublevels text page open=1
-  {\bgroup
-   \doPDFgetpagereference{#4}\PDFobjectreference
-   \pdfoutline
-     user {<>}%
-     \ifcase#2 \else count \ifcase#5-\fi#2 \fi
-%      {<\hexifiedPDFstring{#3}>}% goes wrong
-     {<#3>}%
-   \egroup}
-
-%D \macros
-%D  {dostartobject,dostopobject,doinsertobject}
-%D
-%D Due to \PDF's object oriented character, we can include and
-%D reuse objects. These can be compared with \TEX's boxes. The
-%D \TEX\ counterpart is defined in the module \type{spec-dvi}.
-%D We don't use the dimensions here.
-%D
-%D The next solution is not that beautiful. Because objects are
-%D containers for whatever kind of content, graphics can be
-%D part of this content, and a graphic object can be part of
-%D the more general type. In practice this means that an ximage
-%D would be embedded in an xform, which in itself is not that
-%D big a problem, apart from a few bytes overhead. However, for
-%D reasons unknown to me alternative images must be pure
-%D ximages |<|indeed, somehow one cannot use a vector graphic
-%D as alternative|>| that are not embedded into forms, so this
-%D is why the object handler treats them different. This
-%D implies knowledge of the calling routines, especially the
-%D \type{FIG} trigger, that signals that we just embedded an
-%D image. Alternatively I could have introduced a dual object
-%D system, but the overhead in duplicate specials is currently
-%D not what we want. I'd rather implement a more mature
-%D object support system from scratch.
-
-\let\currentPDFresources\empty
-\let\PDFimageattributes \empty
-\let\PDFfigurereference \empty
-\let\PDFimagereference  \empty
-
-\def\dostartobject#1#2#3#4#5%
-  {\bgroup
-   \setbox\nextbox\vbox\bgroup
-   \def\dodostopobject
-     {\egroup
-      \ifx\PDFimagereference\empty
-        % We also flush page resources, since shared
-        % resources end up there; otherwise transparencies
-        % won't work in xforms; some day I will optimize
-        % this.
-        \the\everyPDFxform
-        \finalizeobjectbox\nextbox
-        \immediate\pdfxform
-          resources {\currentPDFresources\the\pdfpageresources}%
-          \nextbox
-        \global\let\currentPDFresources\empty
-        \dosetobjectreference{#1}{#2}{\the\pdflastxform}%
-      \else
-        \dosetobjectreference{#1}{#2}{-\PDFimagereference}%
-        \global\let\PDFimagereference\empty
-      \fi}}
-
-\def\dostopobject
-  {\dodostopobject
-   \egroup}
-
-\def\doresetobjects
-  {\global\let\PDFimagereference\empty}
-
-\def\doinsertobject#1#2%
-  {\bgroup
-   \doifobjectreferencefoundelse{#1}{#2}
-     {\dogetobjectreference{#1}{#2}\PDFobjectreference
-      \ifnum\PDFobjectreference<0
-        \@EA\@EA\@EA\pdfrefximage\@EA\gobbleoneargument\PDFobjectreference
-      \else
-        \pdfrefxform\PDFobjectreference
-      \fi}%
-     {}%
-   \egroup}
-
-\appendtoksonce
-    \collectPDFresources
-    \global\let\currentPDFresources\collectedPDFresources
-\to \everyPDFxform
-
-%D \macros
-%D   {dosetpagetransition}
-%D
-%D Page transitions only make sence in presentations. They are
-%D passed as raw \PDF\ code to the page object. Take a look
-%D at the implementation to get an impression of the rubish
-%D passed on.
-%D
-%D This array holds a reasonable selection of transitions
-%D (watch out: \type{replace} is not in this list). Most of
-%D the transitions look awful anyway. By the way, \CONTEXT\ is
-%D able to select transitions randomly.
-
-\def\pagetransitions
-  {{split,in,vertical},{split,in,horizontal},
-   {split,out,vertical},{split,out,horizontal},
-   {blinds,horizontal},{blinds,vertical},
-   {box,in},{box,out},
-   {wipe,east},{wipe,west},{wipe,north},{wipe,south},
-   dissolve,
-   {glitter,east},{glitter,south},
-   {fly,in,east},{fly,in,west},{fly,in,north},{fly,in,south},
-   {fly,out,east},{fly,out,west},{fly,out,north},{fly,out,south},
-   {push,east},{push,west},{push,north},{push,south},
-   {cover,east},{cover,west},{cover,north},{cover,south},
-   {uncover,east},{uncover,west},{uncover,north},{uncover,south},
-   fade}
-
-%D Again, we use macros as placeholders for \PDF\ key||value
-%D pairs.
-
-\def\PDFpagesplit    {/S /Split    }
-\def\PDFpageblinds   {/S /Blinds   }
-\def\PDFpagebox      {/S /Box      }
-\def\PDFpagewipe     {/S /Wipe     }
-\def\PDFpagedissolve {/S /Dissolve }
-\def\PDFpageglitter  {/S /Glitter  }
-\def\PDFpagereplace  {/S /R        }
-
-\def\PDFpagefly      {/S /Fly      } % 1.5
-\def\PDFpagepush     {/S /Push     } % 1.5
-\def\PDFpagecover    {/S /Cover    } % 1.5
-\def\PDFpageuncover  {/S /Uncover  } % 1.5
-\def\PDFpagefade     {/S /Fade     } % 1.5
-
-\def\PDFpagehorizontal {/Dm /H  }
-\def\PDFpagevertical   {/Dm /V  }
-\def\PDFpagein         {/M  /I  }
-\def\PDFpageout        {/M  /O  }
-\def\PDFpageeast       {/Di   0 }
-\def\PDFpagenorth      {/Di  90 }
-\def\PDFpagewest       {/Di 180 }
-\def\PDFpagesouth      {/Di 270 }
-
-\def\dodoPDFsetpagetransition#1%
-  {\doifdefined{PDFpage#1}
-     {\edef\PDFpagetransitions{\PDFpagetransitions\getvalue{PDFpage#1}}}}
-
-\def\dosetpagetransition#1#2%
-  {\let\PDFpagetransitions\empty
-   \processcommalist[#1]\dodoPDFsetpagetransition
-   \appendtopdfpageattributes
-    %{\ifnum#2>0 /Dur #2 \fi
-     {\ifnum0<0#2 /Dur #2 \fi
-      \ifx\PDFpagetransitions\empty\else/Trans <<\PDFpagetransitions>>\fi}}
-
-%D The expansion is needed because else the \type{\pdfpageattr}
-%D token list flushes an unexpanded \type{\csname}. The
-%D \type{\global} is needed because the assignment can take
-%D place deeply buried (for instance in the \type{\shipout}
-%D box.
-
-%D \macros
-%D   {doinsertcomment, doflushcomments}
-%D
-%D Text annotation, or comments, are provided too:
-
-%D \macros
-%D   {dopresetlinefield,dopresettextfield,
-%D    dopresetchoicefield,dopresetpopupfield,dopresetcombofield,
-%D    dopresetpushfield,dopresetcheckfield,
-%D    dopresetradiofield,dopresetradiorecord}
-%D
-%D \PDF\ offers extensive field support. The next bunch of
-%D definitions map the specials.
-
-%D \macros
-%D   {dodefinefieldset,dogetfieldset,doiffieldset}
-%D
-%D Field sets, needed for reset and submit handling, are
-%D taken care of by:
-
-%D The next section of this module is dedicated to form
-%D support. These macros are complicated by the fact that
-%D cloning is possible.
-
-%D \macros
-%D   {FDFflag...,FDFplus...}
-%D
-%D The \type{/FT} key determines the type of field: text,
-%D button or choice. The latter two come in several disguises,
-%D which are set by flipping bits in the \type{/Ff}. Other bits
-%D are used to set states. Personally I hate this bitty way of
-%D doing things. The next six bit determine the field sub type:
-
-\def\FDFflagMultiLine          {4096} % 13
-\def\FDFflagNoToggleToOff     {16384} % 15
-\def\FDFflagRadio             {32768} % 16
-\def\FDFflagPushButton        {65536} % 17
-\def\FDFflagPopUp            {131072} % 18
-\def\FDFflagEdit             {262144} % 19
-
-% bugged anyway, so we need to drop it:
-
-\def\FDFflagRadiosInUnison {33554432} % 26
-
-%D A few more (pdf 1.4) flags, what the spell check one: for
-%D obscure reasons for Adobe downward compatibility means
-%D enabling features that harm old applications like testing.
-
-\def\FDFflagDoNotSpellCheck {4194304} % 23
-\def\FDFflagDoNotScroll     {8388608} % 24
-
-%D The next bits (watch how strange the bits are organized)
-%D take care of the states:
-
-\def\FDFflagReadOnly              {1} %  1
-\def\FDFflagRequired              {2} %  2
-\def\FDFflagNoExport              {4} %  3
-\def\FDFflagPassword           {8192} % 14
-\def\FDFflagSort             {524288} % 20
-\def\FDFflagFileSelect      {1048576} % 21
-
-%D There is a second, again bitset oriented, \type{/F} flag:
-
-\def\FDFplusInvisible             {1} %  1
-\def\FDFplusHidden                {2} %  2
-\def\FDFplusPrintable             {4} %  3
-
-%def\FDFplusNoView               {32} %  6
-%def\FDFplusToggleNoView        {256} %  9
-
-\def\FDFplusAutoView            {256} % {288} %  6+9
-
-%D \macros
-%D   {setFDFswitches}
-%D
-%D The non||type bits are mapped onto user||interface
-%D swithes, to be used later on:
-
-\def\@@FDFflag{FDFflag}
-\def\@@FDFplus{FDFplus}
-
-\letvalue    {\@@FDFflag\v!readonly}=\FDFflagReadOnly
-\letvalue    {\@@FDFflag\v!required}=\FDFflagRequired
-\letvalue   {\@@FDFflag\v!protected}=\FDFflagPassword
-\letvalue      {\@@FDFflag\v!sorted}=\FDFflagSort
-\letvalue {\@@FDFflag\v!unavailable}=\FDFflagNoExport
-\letvalue     {\@@FDFflag\v!nocheck}=\FDFflagDoNotSpellCheck
-\letvalue       {\@@FDFflag\v!fixed}=\FDFflagDoNotScroll
-\letvalue        {\@@FDFflag\v!file}=\FDFflagFileSelect
-
-\letvalue      {\@@FDFplus\v!hidden}=\FDFplusHidden
-\letvalue   {\@@FDFplus\v!printable}=\FDFplusPrintable
-
-\letvalue        {\@@FDFplus\v!auto}=\FDFplusAutoView
-
-%D A set of switches is collected into the flags we mentioned
-%D before by the next macro (we don't handle negations yet,
-%D but do take care of redundancy):
-
-\def\FDFflag{0}
-\def\FDFplus{0}
-
-\def\setFDFswitches[#1]%
-  {\bgroup
-   \!!counta\zerocount
-   \!!countb\zerocount
-   \def\docommand##1%
-     {\doifsomething{##1}
-        {\advance\!!counta 0\getvalue{\@@FDFflag##1}%
-         \setvalue{\@@FDFflag##1}{0}%
-         \advance\!!countb 0\getvalue{\@@FDFplus##1}%
-         \setvalue{\@@FDFplus##1}{0}}}%
-   \processcommacommand[#1]\docommand
-   \xdef\FDFflag{\the\!!counta}%
-   \xdef\FDFplus{\the\!!countb}%
-   \egroup}
-
-%D \macros
-%D   {setFDFvalues}
-%D
-%D Menu items are passed as an array of \type{(string)}'s and
-%D the content of this array is build with:
-
-\let\FDFvalues      \empty
-\let\FDFfirstvalues \empty
-\let\FDFsecondvalues\empty
-\let\FDFkidlist     \empty
-\let\FDFdefaultindex\!!zerocount
-\let\FDFdefaultvalue\empty
-
-% Why do we need to tweak this mechanism each time acrobat updates ...
-% it would make sense to have version specific sections in pdf files
-% since my guess is that it never will be done right since each year
-% new programmers have new ideas about what is supposed to happen with
-% kids. So .. best is not to trust this feature esp not for radio
-% widgets. (new flags, different interpretation of AS etc etc)
-
-\def\setFDFvalues[#1][#2]% #1 = list (item=>value) #2 = default
-  {\let\FDFvalues      \empty
-   %when radio opt works ok
-   %\let\FDFfirstvalues \empty
-   %\let\FDFsecondvalues\empty
-   \let\FDFkidlist     \empty
-   %\let\FDFdefaultindex\!!zerocount
-   %\let\FDFdefaultvalue\empty
-   %\scratchcounter\zerocount
-   \def\dodocommand##1=>##2=>##3\end
-     {\addtocommalist{##1}\FDFkidlist
-      %\edef\FDFfirstvalues{\FDFfirstvalues(##1)}%
-      %\doif{##1}{#2}{\edef\FDFdefaultindex{\the\scratchcounter}}%
-      %\advance\scratchcounter\plusone
-      \doifelsenothing{##2}
-        {\doif{##1}{#2}{\edef\FDFdefaultvalue{##1}}%
-         %\edef\FDFsecondvalues{\FDFsecondvalues(##1)}%
-         \edef\FDFvalues{\FDFvalues [(##1)(##1)] }}
-        {\doif{##1}{#2}{\edef\FDFdefaultvalue{##2}}%
-         %\edef\FDFsecondvalues{\FDFsecondvalues(##2)}%
-         \edef\FDFvalues{\FDFvalues [(##2)(##1)] }}}% ! ##1 is shown
-   \def\docommand##1%
-     {\dodocommand##1=>=>\end}%
-   \expanded{\processcommalist[#1]}\docommand}
-
-%D This macro accepts comma separated \type{visual=>result}
-%D pairs.
-
-%D \macros
-%D   {setFDFalignment}
-%D
-%D Text and line fields can be entered and showed in three
-%D alternative alingments, indicated by a digit:
-
-\def\FDFalign{0}
-
-\def\setFDFalignment[#1]%
-  {\processaction
-     [#1]
-     [  \v!left=>\edef\FDFalign{2},    % raggedleft
-      \v!middle=>\edef\FDFalign{1},    % raggedcenter
-       \v!right=>\edef\FDFalign{0}]}   % raggedright
-
-%D \macros
-%D   {setFDFattributes}
-%D
-%D The weak part of (at least version 2.1 \PDF) is that only
-%D default fonts are handled well. Another restriction is that
-%D the encoding vector must be the standard \PDF\ document one.
-%D Although the \PDF\ reference explictly states that one could
-%D use the normal text operators, leading is not yet handled.
-%D
-%D For the moment the current \CONTEXT\ font is mapped onto
-%D one best suitable default font. The color attribute is
-%D less problematic and is directly derived from the \CONTEXT\
-%D color.
-
-\def\FDFattributes{/Helv 12 Tf 0 g 14.4 TL}
-
-\def\FDFrm  {TiRo} \def\FDFss  {Helv} \def\FDFtt  {Cour}
-\def\FDFrmtf{TiRo} \def\FDFsstf{Helv} \def\FDFtttf{Cour}
-\def\FDFrmbf{TiBo} \def\FDFssbf{HeBo} \def\FDFttbf{CoBo}
-\def\FDFrmit{TiIt} \def\FDFssit{HeOb} \def\FDFttit{CoOb}
-\def\FDFrmsl{TiIt} \def\FDFsssl{HeOb} \def\FDFttsl{CoOb}
-\def\FDFrmbi{TiBI} \def\FDFssbi{HeBO} \def\FDFttbi{CoBO}
-\def\FDFrmbs{TiBI} \def\FDFssbs{HeBO} \def\FDFttbs{CoBO}
-
-\let\FDFusedfonts=\FDFsstf
-
-\def\setFDFattributes[#1,#2,#3,#4]% style, color, backgroundcolor, framecolor
-  {\bgroup % nog interlinie: n TL
-   \setbox\scratchbox\hbox
-     \bgroup
-       \doconvertfont{#1}{}%
-       \PointsToBigPoints\bodyfontsize\size % x/xx, so better the actual size
-       \doifdefinedelse{FDF\fontstyle\fontalternative}
-         {\xdef\FDFattributes{\getvalue{FDF\fontstyle\fontalternative}}}
-         {\doifdefinedelse{FDF\fontstyle}
-            {\xdef\FDFattributes{\getvalue{FDF\fontstyle}}}
-            {\xdef\FDFattributes{\FDFrm}}}%
-       \doglobal\addtocommalist\FDFattributes\FDFusedfonts
-       \xdef\FDFattributes% move up with "x.y Ts"
-         {/\FDFattributes\space\size\space Tf\space\PDFcolor{#2}}%
-       \doifelsenothing{#3}
-         {\global\let\FDFsurroundings\empty}
-         {\xdef\FDFsurroundings{/BG \FDFcolor{#3}}}%
-       \doifsomething{#4}
-         {\xdef\FDFsurroundings{\FDFsurroundings\space /BC \FDFcolor{#4}}}%
-       \ifx\FDFsurroundings\empty \else
-         \xdef\FDFsurroundings{/MK << \FDFsurroundings\space>>}%
-       \fi
-     \egroup
-   \egroup}
-
-%D \macros
-%D   {setFDFactions}
-%D
-%D Depending on the type of the field, one can assign
-%D \JAVASCRIPT\ code to a mouse event or keystroke. The next
-%D preparation macro shows what events are handled.
-
-\let\FDFactions\empty
-
-\def\setFDFactions[#1,#2,#3,#4,#5,#6,#7,#8,%
-  {\global\let\FDFactions\empty
-   \setFDFaction D#1%  mousedown
-   \setFDFaction U#2%  mouseup
-   \setFDFaction E#3%  enterregion
-   \setFDFaction X#4%  exitregion
-   \setFDFaction K#5%  afterkeystroke
-   \setFDFaction F#6%  formatresult
-   \setFDFaction V#7%  validateresult
-   \setFDFaction C#8%  calculatewhatever
-   \setFDFactionsmore}
-
-\def\setFDFactionsmore#1,#2]%
-  {\setFDFaction{Fo}#1%  focusin
-   \setFDFaction{Bl}#2%  focusout % was I (now pdf ref manual explicitly talks about lowercase l)
-   \ifx\FDFactions\empty\else
-     \xdef\FDFactions{/AA << \FDFactions >>}% since 1.3 no longer inherited
-   \fi}
-
-% todo, when new var scheme is implemented
-%
-%   \setFDFaction{PO}\@@DriverFieldPageOpen
-%   \setFDFaction{PC}\@@DriverFieldPageClose
-%   \setFDFaction{PV}\@@DriverFieldPageVisible
-%   \setFDFaction{PI}\@@DriverFieldPageInVisible
-
-%D The event handler becomes something:
-%D
-%D \starttyping
-%D /AA << /D << /S ... >> ... /C << /S ... >>
-%D /A << /S /JavaScript /JS (...) >>
-%D \stoptyping
-
-\def\setFDFaction#1#2%
-  {\bgroup
-   \def\docommand{\xdef\FDFactions{\FDFactions /#1 << \lastPDFaction >> }}%
-   \@EA\handlereferenceactions\@EA{#2}\docommand % one level expansion
-   \egroup}
-
-%D \macros
-%D   {testFDFactions}
-%D
-%D This rather confusion prone series of script can be tested
-%D with:
-%D
-%D \starttyping
-%D \testFDFactions
-%D \stoptyping
-%D
-%D which simply redefined the previous macro to one that prints
-%D a message to the console.
-
-\def\testFDFactions
-  {\def\setFDFaction##1##2%
-     {\doPSsanitizeJScode console.show();console.println("executing:##1"); \to\sanitizedJScode
-      \edef\FDFactions{\FDFactions /##1 << /S /JavaScript /JS (\sanitizedJScode) >> }}}
-
-%D \macros
-%D   {doregistercalculationset}
-%D
-%D There is at most one calculation order list, which defines
-%D the order in which fields are calculated. The calculation
-%D order is defined using:
-
-\let\PDFcalculationset\empty
-
-\def\doregistercalculationset#1%
-  {\def\PDFcalculationset{#1}}
-
-%D \macros
-%D   {registerFDFobject,everylastshipout}
-%D
-%D Officially one needs to embed some general datastructures
-%D that tell the viewer what fields are present in the file, as
-%D well as what resources they use. The next mechanism does that
-%D job automatically when one registers the field.
-
-\def\flushFDFnames
-  {\ifx\FDFcollection\empty\else
-     \defineFDFfonts
-     \createpdfarrayobject{FDF}{local:fields}{\FDFcollection}%
-     \doPDFgetobjectreference{FDF}{local:fields}\PDFobjectreference
-     % The /NeedAppearances is pretty important because
-     % otherwise Acrobat 5 blows up on cloned radio widgets
-     \createpdfdictionaryobject{FDF}{local:acroform}
-       {/Fields \PDFobjectreference\space
-        /NeedAppearances true
-        \doiffieldset\PDFcalculationset{/CO [\dogetfieldset\PDFcalculationset]}
-        /DR << /Font << \FDFfonts >> >>
-        /DA (/Helv 10 Tf 0 g)}%
-     \doPDFgetobjectreference{FDF}{local:acroform}\PDFobjectreference
-     \appendtopdfcatalog
-       {/AcroForm \PDFobjectreference}%
-     \global\let\FDFcollection\empty
-     \global\let\flushFDFnames\relax
-   \fi}
-
-\let\FDFcollection\empty
-
-\def\registerFDFobject#1%
-  {\ifx\flushFDFnames\relax
-     \writestatus{FDF}{second run needed for field list (#1)}%
-   \fi
-   \doPDFgetobjectreference{FDF}{#1}\PDFobjectreference
-   \xdef\FDFcollection{\FDFcollection\space\PDFobjectreference}}
-
-\appendtoksonce \flushFDFnames \to \everylastshipout % test \everybye / was \prependtoksonce
-
-%D \macros
-%D   {defineFDFfonts}
-%D
-%D Another datastruture concerns the fonts used. We only
-%D define the fonts we use.
-
-\def\defineFDFfonts
-  {\let\FDFfonts\empty
-   \processcommacommand[\FDFusedfonts]\defineFDFfont}
-
-\def\defineFDFfont#1%
-  {\createpdfdictionaryobject{FDF}{local:#1}
-     {/Type /Font
-      /Subtype /Type1
-      /Name /#1
-      /BaseFont /\getvalue{FDFname#1}}%
-   \doPDFgetobjectreference{FDF}{local:#1}\PDFobjectreference
-   \edef\FDFfonts{\FDFfonts \space/#1 \PDFobjectreference}}
-
-%D Another list of constants:
-
-\def\FDFnameTiRo {Times-Roman}
-\def\FDFnameTiBo {Times-Bold}
-\def\FDFnameTiIt {Times-Italic}
-\def\FDFnameTiBI {Times-BoldItalic}
-\def\FDFnameHelv {Helvetica}
-\def\FDFnameHeBo {Helvetica-Bold}
-\def\FDFnameHeOb {Helvetica-Oblique}
-\def\FDFnameHeBO {Helvetica-BoldOblique}
-\def\FDFnameCour {Courier}
-\def\FDFnameCoBo {Courier-Bold}
-\def\FDFnameCoOb {Courier-Oblique}
-\def\FDFnameCoBO {Courier-BoldOblique}
-
-%D \macros
-%D   {currentFDFmode,currentFDFparent,currentFDFkids,currenrFDFroot}
-%D
-%D There are three more quasi global interfacing variables
-%D that need to be set.
-
-\let\currentFDFmode  \fieldlonermode
-\let\currentFDFkids  \empty
-\let\currentFDFparent\empty
-\let\currentFDFroot  \empty
-
-%D \macros
-%D   {dosetfieldstatus}
-%D
-%D And here comes the special that deals with them.
-
-\def\dosetfieldstatus#1#2#3#4%
-  {\chardef\currentFDFmode #1%
-   \edef\currentFDFparent {#2}%
-   \edef\currentFDFkids   {#3}%
-   \edef\currentFDFroot   {#4}}
-
-%D We already dealt with the encoding vector. Conversion from
-%D \TEX\ \ASCII\ encoding to the other one, is accomplished by
-%D the next few macros. Wach out: we don't group here.
-
-\appendtoksonce
-  \simplifycommands
-\to \everysetfield
-
-%D \macros
-%D   {doPDFinsertcomment}
-%D
-%D An example its use is the next special, one that deals with
-%D text annotations.
-
-\newcounter\nofFDFcomments
-
-\newif\ifPDFpopupcomments \PDFpopupcommentstrue
-
-\def\doflushcomments
-  {\box\PDFsymbolbox}
-
-\long\def\doinsertcomment#1#2#3#4#5#6#7#8% % \@@DriverCommentLayer set otherwise
-  {\bgroup % title width height color open symbol collect data
-   \presetPDFsymbolappearance{#4}{#6}{#2}{#3}\!!zeropoint% sets width/height
-   \doifelsenothing{#1}
-     {\let\PDFidentifier\empty}
-     {\sanitizePDFencoding#1\to\PDFcommenttitle
-      \def\PDFidentifier{/T <\PDFcommenttitle>}}%
-   \sanitizePDFencoding#8\to\PDFdata
-   \setFDFlayer\@@DriverCommentLayer
-   \startPDFsymbolappearance
-     \ifPDFpopupcomments
-       \doglobal\increment\nofFDFcomments
-       \doifobjectreferencefoundelse{FDF}{c:\nofFDFcomments}
-         {\doPDFgetobjectreference{FDF}{c:\nofFDFcomments}\PDFobjectreference
-          \donetrue}
-         \donefalse
-       \ifdone
-         \setbox\scratchbox\hbox
-           {\createpdfannotationobject{FDF}{c::\nofFDFcomments}{#2}{#3}% text window, size does not work
-              {/Subtype /Popup
-               /Parent \PDFobjectreference}}%
-         \ifcase#7\relax
-           \vbox to \height{\forgetall\vskip#3\box\scratchbox\vss}%
-         \else % incredible trial and error hack
-           % it's quite a mess, the annot width cannot be set, well, it can
-           % but the appearance and text sizes get mixed up
-%            \setbox\scratchbox\vbox to \height{\forgetall\vskip#3\box\scratchbox\vss}%
-%            \global\setbox\PDFsymbolbox\vbox
-%              {\hsize#2%
-%               \forgetall
-%               \vsmash{\box\PDFsymbolbox}
-%               \box\scratchbox}%
-           % this may change when acrobat gets less bugged
-           \setbox\scratchbox\vbox to #3{\forgetall\vss\box\scratchbox}%
-           \wd\scratchbox#2%
-           \global\setbox\PDFsymbolbox\vbox
-             {\startoverlay{\box\PDFsymbolbox}{\box\scratchbox}\stopoverlay}%
-         \fi
-       \fi
-       % generic
-       \doifobjectreferencefoundelse{FDF}{c::\nofFDFcomments}
-         {\doPDFgetobjectreference{FDF}{c::\nofFDFcomments}\PDFobjectreference
-          \donetrue}
-         \donefalse
-       \createpdfannotationobject{FDF}{c:\nofFDFcomments}{\width}{\height}
-         {/Subtype /Text
-          \ifcase#5 \else/Open true\fi
-          % pdftex (efficient)
-          % \ifdone /Popup \PDFobjref\pdflastannot\fi
-          % generic (less efficient)
-          \ifdone /Popup \PDFobjectreference\fi
-          /Contents <\PDFdata>
-          \PDFidentifier
-          \FDFlayer
-          \PDFsymbol
-          \PDFattributes}%
-     \else
-       \insertpdfannotation{#2}{#3}
-         {/Subtype /Text
-          \ifcase#5 \else/Open true\fi
-          /Contents <\PDFdata>
-          \FDFlayer
-          \PDFsymbol
-          \PDFidentifier
-          \PDFattributes}%
-     \fi
-   \stopPDFsymbolappearance
-   \egroup}
-
-% symbols with a reasonable default of 18/24 pt
-
-\newbox\PDFsymbolbox
-
-\def\PDFsymbolNew       {/Insert}
-\def\PDFsymbolBalloon   {/Comment}
-\def\PDFsymbolAddition  {/NewParagraph}
-\def\PDFsymbolHelp      {/Help}
-\def\PDFsymbolParagraph {/Paragraph}
-\def\PDFsymbolKey       {/Key }
-
-\def\PDFsymbolGraph     {/Graph}
-\def\PDFsymbolPaperclip {/Paperclip}
-\def\PDFsymbolAttachment{/Attachment}
-\def\PDFsymbolTag       {/Tag}
-
-\def\startPDFsymbolappearance
-  {\setbox\scratchbox\vbox to \totalheight \bgroup \vfill}
-
-\def\stopPDFsymbolappearance
-  {\egroup
-   \setbox\scratchbox\hbox{\lower\depth\box\scratchbox}%
-   \wd\scratchbox\width
-   \ht\scratchbox\height
-   \dp\scratchbox\depth
-   \box\scratchbox}
-
-\def\presetPDFsymbolappearance#1#2#3#4#5% symbol color width height depth
-  {\doifelsenothing{#1}
-     {\let\PDFattributes\empty}
-     {\def\PDFattributes{/C \FDFcolor{#1}}}%
-   \scratchdimen#3\edef\width {\the\scratchdimen}%
-   \scratchdimen#4\edef\height{\the\scratchdimen}%
-   \scratchdimen#5\edef\depth {\the\scratchdimen}%
-   \advance\scratchdimen\height\edef\totalheight{\the\scratchdimen}%
-   \doifelsenothing{#2}
-     {\let\PDFsymbol\empty}
-     {\ifundefined{PDFsymbol#2}%
-        \getfromcommacommand[#2][1]\let\PDFsymbolnormalsymbol\commalistelement
-        \getfromcommacommand[#2][2]\let\PDFsymboldownsymbol  \commalistelement
-        \doifsymboldefinedelse\PDFsymbolnormalsymbol
-          {\doifsymboldefinedelse\PDFsymboldownsymbol
-             {\dopresetPDFsymbolappearance
-                \PDFsymbolnormalsymbol\PDFsymboldownsymbol}
-             {\dopresetPDFsymbolappearance
-                \PDFsymbolnormalsymbol\PDFsymbolnormalsymbol}}
-          {\doifsymboldefinedelse\PDFsymboldownsymbol
-             {\dopresetPDFsymbolappearance
-                \PDFsymboldownsymbol\PDFsymboldownsymbol}
-             {\let\PDFsymbol\empty}}%
-      \else
-        \def\PDFsymbol{/Name \getvalue{PDFsymbol#2} }%
-      \fi}}
-
-\def\dopresetPDFsymbolappearance#1#2%
-  {\dopresetfieldsymbol{#1}%
-   \dopresetfieldsymbol{#2}%
-   \setbox\scratchbox\hbox{\symbol[#1]}%
-   \edef\width {\the\wd\scratchbox}%
-   \edef\height{\the\ht\scratchbox}%
-   \edef\depth {\the\dp\scratchbox}%
-   \scratchdimen\height \advance\scratchdimen\depth
-   \edef\totalheight{\the\scratchdimen}%
-   \doPDFgetobjectreference{SYM}{#1}\FDFsymbolNappearance
-   \doPDFgetobjectreference{SYM}{#2}\FDFsymbolDappearance
-   \edef\PDFsymbol
-     {/AP <>}}
-
-%D Hooked into \CONTEXT, this special supports
-%D
-%D \starttyping
-%D \startcomment
-%D   hello beautiful\\world
-%D \stopcomment
-%D
-%D \startcomment[hello]
-%D   de \'e\'erste keer
-%D   the f\'irst time
-%D \stopcommen
-%D
-%D \startcommentaar[hallo][color=green,width=4cm,height=3cm]
-%D   first
-%D
-%D   second
-%D \stopcommentaar
-%D \stoptyping
-%D
-%D So, special characters, forced linebreaks using \type{\\}
-%D and \type{\par} are handled in the appropriate way.
-
-%D \macros
-%D   {dosetuppageview}
-%D
-%D Because this command will seldom be called, we can permit
-%D slow action processing. We need three settings, one for
-%D direct \PDF\ inclusion, the other as \PDFTEX\ keyword, an
-%D a last one for form. All determine in what way the
-%D screen is adapted when going to a destination. Watch the
-%D space.
-
-\def\PDFpageviewkey{fit}
-\def\PDFpageviewwrd{/Fit}
-\def\PDFpageview   {/View [\PDFpageviewwrd] }
-\def\PDFpagexyzspec{0 0 0} % hack, pdftex does handle this
-\let\PDFpagexyzspec\empty  % hack, pdftex does not accept spec
-
-\def\dosetuppageview#1% watch the v-h swapping here
-  {\processaction
-     [#1]
-     [       \v!fit=>\def\PDFpageviewkey  {fit}\def\PDFpageviewwrd{/Fit},
-           \v!width=>\def\PDFpageviewkey {fith}\def\PDFpageviewwrd{/FitH},
-          \v!height=>\def\PDFpageviewkey {fitv}\def\PDFpageviewwrd{/FitV},
-        \v!minwidth=>\def\PDFpageviewkey{fitbh}\def\PDFpageviewwrd{/FitBH},
-       \v!minheight=>\def\PDFpageviewkey{fitbv}\def\PDFpageviewwrd{/FitBV},
-        \v!standard=>\def\PDFpageviewkey{xyz \PDFpagexyzspec}\def\PDFpageviewwrd{/XYZ \PDFpagexyzspec},
-         \s!unknown=>\def\PDFpageviewkey  {fit}\def\PDFpageviewwrd{/Fit}]%
-   \edef\PDFpageview{/View [\PDFpageviewwrd]}}
-
-%D \macros
-%D   {setFDFkids}
-%D
-%D Clones as well as radiofields (which themselves can have
-%D cloned components) need a list of kids. The next macro
-%D builds one.
-
-\def\setFDFkids[#1][#2]% tag commalist
-  {\let\FDFkids\empty
-   \def\docommand##1%
-     {\doPDFgetobjectreference{FDF}{#1##1}\PDFobjectreference
-      \edef\FDFkids{\FDFkids\PDFobjectreference\space}}%
-   \@EA\processcommalist\@EA[#2]\docommand
-   \ifx\FDFkids\empty\else\edef\FDFkids{/Kids [\FDFkids]}\fi}
-
-%D \macros
-%D   {dopresetlinefield,dopresettextfield,
-%D    dopresetchoicefield,dopresetpopupfield,dopresetcombofield,
-%D    dopresetpushfield,dopresetcheckfield,
-%D    dopresetfield,dopresetradiorecord}
-%D
-%D I would say: read the \PDF\ reference manual first and see
-%D what happens here next. Lucky us that they have so much in
-%D common.
-
-\def\dopresetlinefield#1#2#3#4#5#6#7#8#9%
-  {\bgroup
-   \setFDFlayer\@@DriverFieldLayer
-   \setFDFswitches[#7]%
-   \setFDFattributes[#6]%
-   \setFDFalignment[#8]%
-   \setFDFactions[#9]%
-   \edef\FDFtext{\hexifiedPDFstring{#4}}%
-   \ifcase\currentFDFmode
-     \createpdfannotationobject{FDF}{#1}{#2}{#3}
-       {/Subtype /Widget /T (#1) /FT /Tx
-        /MaxLen \ifcase0#5 1000 \else#5 \fi
-       %/DV (#4) /V (#4) % value added
-        /DV <\FDFtext> /V <\FDFtext>
-        /Ff \FDFflag\space
-        /F \FDFplus\space
-        /DA (\FDFattributes)
-        \FDFlayer\space
-        \FDFsurroundings\space
-        /Q \FDFalign\space
-        \FDFactions}%
-     \registerFDFobject{#1}%
-   \or
-     \setFDFkids[kids:][\currentFDFkids]%
-     \createpdfdictionaryobject{FDF}{#1}
-       {/T (#1) /FT /Tx
-        /MaxLen \ifcase0#5 1000 \else#5 \fi
-        \FDFkids\space
-       %/DV (#4) /V (#4) % value added
-        /DV <\FDFtext> /V <\FDFtext>
-        /Ff \FDFflag\space
-        /F \FDFplus\space
-        /DA (\FDFattributes)
-        \FDFlayer\space
-        \FDFsurroundings\space
-        /Q \FDFalign\space
-        \FDFactions}%
-     \registerFDFobject{#1}%
-   \or
-     \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
-    %\global\objectreferencingtrue
-     \createpdfannotationobject{FDF}{kids:#1}{#2}{#3}
-       {/Subtype /Widget
-        /Parent \PDFobjectreference
-        /Ff \FDFflag\space
-        /F \FDFplus\space
-        /DA (\FDFattributes)
-        \FDFlayer\space
-        \FDFsurroundings\space
-        /Q \FDFalign\space
-        \FDFactions}%
-   \or
-     \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
-    %\global\objectreferencingtrue
-     \createpdfannotationobject{FDF}{kids:#1}{#2}{#3}
-       {/Subtype /Widget
-        /Parent \PDFobjectreference
-        /F \FDFplus
-        \FDFactions}%
-   \fi
-   \egroup}
-
-\def\dopresettextfield#1#2#3#4#5#6#7#8#9%
-  {\dopresetlinefield{#1}{#2}{#3}{#4}{#5}{#6}{MultiLine,#7}{#8}{#9}}
-
-\def\dopresetchoicefield#1#2#3#4#5#6#7#8%
-  {\bgroup
-   \setFDFlayer\@@DriverFieldLayer
-   \setFDFswitches[#6]%
-   \setFDFattributes[#5]%
-   \setFDFvalues[#7][#4]%
-   \setFDFactions[#8]%
-   \ifcase\currentFDFmode
-     \createpdfannotationobject{FDF}{#1}{#2}{#3}
-       {/Subtype /Widget
-        /T (#1) /FT /Ch
-        /DV (#4) /V (#4)
-        /Ff \FDFflag\space
-        /F \FDFplus\space
-        /DA (\FDFattributes)
-        \FDFlayer\space
-        \FDFsurroundings\space
-        /Opt [\FDFvalues]
-        \FDFactions}%
-     \registerFDFobject{#1}%
-   \or
-     \setFDFkids[kids:][\currentFDFkids]%
-     \createpdfdictionaryobject{FDF}{#1}
-       {/T (#1) /FT /Ch
-        \FDFkids\space
-        /DV (#4) /V (#4)
-        /Ff \FDFflag\space
-        /F \FDFplus\space
-        /DA (\FDFattributes)
-        \FDFlayer\space
-        \FDFsurroundings\space
-        /Opt [\FDFvalues]
-        \FDFactions}%
-     \registerFDFobject{#1}%
-   \or
-     \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
-    %\global\objectreferencingtrue
-     \createpdfannotationobject{FDF}{kids:#1}{#2}{#3}
-       {/Subtype /Widget
-        /Parent \PDFobjectreference
-        /Ff \FDFflag\space
-        /F \FDFplus\space
-        /DA (\FDFattributes)
-        \FDFlayer\space
-        \FDFsurroundings\space
-        \FDFactions}%
-   \or
-     \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
-    %\global\objectreferencingtrue
-     \createpdfannotationobject{FDF}{kids:#1}{#2}{#3}
-       {/Subtype /Widget
-        /Parent \PDFobjectreference
-        /F \FDFplus
-        \FDFactions}%
-   \fi
-   \egroup}
-
-\def\dopresetpopupfield#1#2#3#4#5#6#7#8%
-  {\dopresetchoicefield{#1}{#2}{#3}{#4}{#5}{PopUp,#6}{#7}{#8}}
-
-\def\dopresetcombofield#1#2#3#4#5#6#7#8%
-  {\dopresetchoicefield{#1}{#2}{#3}{#4}{#5}{PopUp,Edit,#6}{#7}{#8}}
-
-\newif\ifFDFvalues
-
-\def\doFDFpresetpushcheckfield#1#2#3#4#5#6#7#8% in acro<5 (\FDFdefault)
-  {\bgroup                                    % in acro>5 /\FDFdefault
-   \setFDFlayer\@@DriverFieldLayer
-   \ifcase#8\relax\FDFvaluesfalse\else\FDFvaluestrue\fi
-   \setFDFswitches[#5]%
-   \setFDFactions[#7]%
-   \doifelse{#4}{1}
-     {\def\FDFdefault{On}}
-     {\def\FDFdefault{Off}}%
-   \ifcase\currentFDFmode
-     \doFDFappearance{On}{#6}{#8}%
-     \createpdfannotationobject{FDF}{#1}{#2}{#3}
-       {/Subtype /Widget /T (#1) /FT /Btn
-        \ifFDFvalues
-          /DV /\FDFdefault\space
-          /V  /\FDFdefault\space
-          /AS /\FDFdefault\space
-        \fi
-        \FDFlayer
-        /Ff \FDFflag\space
-        /F \FDFplus\space
-        \FDFlayer\space
-        \FDFappearance\space
-% /IF << /SW /N >> % strange, only works for stupid buttons
-        \FDFactions}%
-     \registerFDFobject{#1}%
-   \or % no appearance and layer ?
-     \setFDFkids[kids:][\currentFDFkids]%
-     \createpdfdictionaryobject{FDF}{#1}
-       {/T (#1) /FT /Btn
-        \FDFkids\space
-        \ifFDFvalues
-          /DV /\FDFdefault\space
-          /V  /\FDFdefault\space
-          /AS /\FDFdefault\space
-        \fi
-        /Ff \FDFflag\space
-        /F \FDFplus\space
-        \FDFactions}%
-     \registerFDFobject{#1}%
-   \or
-     \doFDFappearance{On}{#6}{#8}%
-     \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
-    %\global\objectreferencingtrue
-     \createpdfannotationobject{FDF}{kids:#1}{#2}{#3}
-       {/Subtype /Widget
-        /Parent \PDFobjectreference\space
-        \ifFDFvalues
-          /DV /\FDFdefault\space
-          /V  /\FDFdefault\space
-          /AS /\FDFdefault\space
-        \fi
-        /Ff \FDFflag\space
-        /F \FDFplus\space
-        \FDFlayer\space
-        \FDFappearance\space
-        \FDFactions}%
-   \or
-     \doFDFappearance{On}{#6}{#8}%
-     \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
-    %\global\objectreferencingtrue
-     \createpdfannotationobject{FDF}{kids:#1}{#2}{#3}
-       {/Subtype /Widget
-        /Parent \PDFobjectreference\space
-        /F \FDFplus\space
-        \ifFDFvalues
-          /DV /\FDFdefault\space
-          /V  /\FDFdefault\space
-          /AS /\FDFdefault\space
-        \fi
-        \FDFlayer\space
-        \FDFappearance
-        \FDFactions}%
-   \fi
-   \egroup}
-
-\def\dopresetpushfield#1#2#3#4#5#6#7%
-  {\doFDFpresetpushcheckfield{#1}{#2}{#3}{#4}{PushButton,#5}{#6}{#7}{0}}
-
-\def\dopresetcheckfield#1#2#3#4#5#6#7%
-  {\doFDFpresetpushcheckfield{#1}{#2}{#3}{#4}{#5}{#6}{#7}{1}}
-
-\def\dopresetradiofield#1#2#3#4#5#6#7#8%
-  {\bgroup
-   \setFDFlayer\@@DriverFieldLayer
-   \FDFvaluestrue
-   \setFDFswitches[#5]%
-   \setFDFactions[#8]%
-   \doifelsenothing{#4}
-     {\def\FDFdefault{Off}}
-     {\def\FDFdefault{#4}}%
-   \@EA\aftersplitstring\FDFdefault\at=>\to\FDFdefaultvalue
-   \ifx\FDFdefaultvalue\empty\else\let\FDFdefault\FDFdefaultvalue\fi
-   \ifcase\currentFDFmode
-     \doFDFappearance{#1}{#7}{1}%
-     \doPDFgetobjectreference{FDF}{#6}\PDFobjectreference
-     \createpdfannotationobject{FDF}{#1}{#2}{#3}
-       {/Subtype /Widget
-        /Parent \PDFobjectreference\space
-        /F \FDFplus\space
-        /AS /\FDFdefault\space
-        \FDFlayer\space
-        \FDFappearance\space
-        \FDFactions}%
-     \registerFDFobject{#1}%
-   \or
-     \setFDFkids[kids:][\currentFDFkids]%
-     \doPDFgetobjectreference{FDF}{#6}\PDFobjectreference
-     \createpdfdictionaryobject{FDF}{#1}
-       {/Parent \PDFobjectreference\space
-        \FDFkids\space
-        /F \FDFplus\space
-        \FDFactions}%
-     \registerFDFobject{#1}%
-   \or
-     %\doFDFappearance{#1}{#7}{1}%
-     \doFDFappearance{\currentFDFparent}{#7}{1}%
-     \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
-    %\global\objectreferencingtrue % nb
-     \createpdfannotationobject{FDF}{kids:#1}{#2}{#3}
-       {/Subtype /Widget
-        /Parent \PDFobjectreference\space
-        /AS /\FDFdefault\space
-        /F \FDFplus\space
-        \FDFlayer\space
-        \FDFappearance\space
-        \FDFactions}%
-   \or
-     %\doFDFappearance{#1}{#7}{1}%
-     \doFDFappearance{\currentFDFparent}{#7}{1}%
-     \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
-    %\global\objectreferencingtrue
-     \createpdfannotationobject{FDF}{kids:#1}{#2}{#3}
-       {/Subtype /Widget
-        /Parent \PDFobjectreference\space
-        /AS /\FDFdefault\space
-        /F \FDFplus\space
-        \FDFlayer\space
-        \FDFappearance\space
-        \FDFactions}%
-   \fi
-   \egroup}
-
-% Beware, RadiosInUnison is really needed in the pre 1.5/6 time this
-% was the default but out of a sudden it's no longer the case.  Also
-% the NoToggleToOff interferes with kids of kids and both it will
-% break older documents, i.e. so much for pdf as standard. With
-% features like widgets we can probably best wait till adobe tools
-% themselves support it because that's probably the moment that
-% functionality gets frozen/becomes definitive. Actually, acrobat
-% flattens the kids tree, so that's yet another situation. The
-% interesting thing is that it worked ok in acrobat 2/3 but got bugged
-% in later versions. [The rationale is in html compatibility, which
-% seems to be more important than compatibility of documents, which in
-% turn renders acrobat useless for forms.] Anyway, synchronization is
-% broken or not depending on the combination pdfversion/acrobatversion.
-
-\def\dopresetradiorecord#1#2#3#4#5%
-  {\bgroup
-   % < pdf 1.5 (1.5 was broken)
-   % \setFDFswitches[Radio,NoToggleToOff,RadiosInUnison,#3]%
-   % > pdf 1.5
-   \setFDFswitches[Radio,RadiosInUnison,#3]%
-   % older, else fatal error
-   % \setFDFkids[#4][]%
-   % newer
-   \setFDFvalues[#4][#2]% inits kidlist
-   \expanded{\setFDFkids[][\FDFkidlist]}%
-   %
-   \setFDFactions[#5]%
-   \createpdfdictionaryobject{FDF}{#1}
-     {%/Subtype /Widget
-      /FT /Btn /T (#1) /Rect [0 0 0 0]
-      % used to be this
-      % /V (#2)
-      % then this
-      % /DV (#2)
-      % since this bomded in 5
-      % /V (#2)
-      % and now finally this works
-      /H /N
-      % /opt is buggy in 5.05, only works once, sigh
-      %\ifx\FDFfirstvalues\FDFsecondvalues
-        /V /#2
-      %\else
-      %  /V /\FDFdefaultindex\space
-      %  /Opt [\FDFsecondvalues]
-      %\fi
-      /Ff \FDFflag\space
-      /F \FDFplus\space
-      \FDFkids\space
-      \FDFactions}%
-   \egroup}
-
-%D At the cost of some more references, we can save bytes,
-%D by sharing appearance dictionaries. This code needs more
-%D documentation. Surprise:
-
-\def\dodoFDFappearance#1#2%
-  {\ifx#2\empty\else
-     \dogetcommacommandelement1\from#2\to\commalistelement
-     \ifx\commalistelement\empty\else
-       \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference
-       \edef\N{\ifFDFvalues\N /#1 \fi\PDFobjectreference\space}%
-     \fi
-     \dogetcommacommandelement2\from#2\to\commalistelement
-     \ifx\commalistelement\empty\else
-       \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference
-       \edef\R{\ifFDFvalues\R /#1 \fi\PDFobjectreference\space}%
-     \fi
-     \dogetcommacommandelement3\from#2\to\commalistelement
-     \ifx\commalistelement\empty\else
-       \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference
-       \edef\D{\ifFDFvalues\D /#1 \fi\PDFobjectreference\space}%
-       \def\FDFappearance{/H /P }%
-     \fi
-   \fi}
-
-\def\redoFDFappearance#1%
-  {\ifx#1\empty\else
-     \dogetcommacommandelement3\from#1\to\commalistelement
-     \ifx\commalistelement\empty\else
-       \def\FDFappearance{/H /P }%
-     \fi
-   \fi}
-
-\def\doFDFappearance#1#2#3%
-  {\ifcase#3\relax % push only field
-     \edef\yes{#2}%
-     \let\no\empty
-   \else % on / off field
-     \dogetcommacommandelement1\from#2,\to\yes
-     \dogetcommacommandelement2\from#2,\to\no
-   \fi
-   \def\FDFappearance{/H /N}%
-   \doifobjectfoundelse{FDF}{ap:#1:\yes:\no}
-     {\redoFDFappearance\yes
-      \redoFDFappearance\no}
-     {\presetobject{FDF}{ap:#1:\yes:\no}% funny hack
-      \let\N\empty\let\R\empty\let\D\empty
-      \dodoFDFappearance{#1}\yes
-      \dodoFDFappearance{Off}\no
-      \createpdfdictionaryobject{FDF}{ap:#1:\yes:\no}
-        {\ifx\N\empty\else/N \ifFDFvalues<<\N>>\else\N\fi\fi
-         \ifx\R\empty\else/R \ifFDFvalues<<\R>>\else\R\fi\fi
-         \ifx\D\empty\else/D \ifFDFvalues<<\D>>\else\D\fi\fi}}%
-   \doPDFgetobjectreference{FDF}{ap:#1:\yes:\no}\PDFobjectreference
-   \edef\FDFappearance{\FDFappearance /AP \PDFobjectreference}}
-
-\def\doFDFdefault#1#2%
-  {\doifelse{#2}{1}{\def\FDFdefault{On}}{\def\FDFdefault{Off}}}
-
-%D Layer support:
-
-\def\setFDFlayer#1% todo : \ifx\PDFobjectreference\noPDFobjectreference ipv found
-  {\letempty\FDFlayer
-   \doifsomething{#1}%
-     {\checkproperty[#1]% == \dodocheckproperty\@@DriverFieldLayer
-      \doifobjectreferencefoundelse{PDLN}{#1}
-        {\doPDFgetobjectreference{PDLN}{#1}\!!stringa % we need to avoid a clash with other macros
-         \edef\FDFlayer{/OC \!!stringa}}%
-        \donothing}}
-
-%D The three appearances {\em normal}, \type{roll over} and
-%D \type{push down} are passed as comma separated triplets,
-%D that is, the second argument can look like:
-%D
-%D \starttyping
-%D {yes,ok,fine},{no,rubish,awful}
-%D \stoptyping
-
-%D \macros
-%D   {dodefinefieldset,dogetfieldset,doiffieldset}
-%D
-%D Field sets, the ones we use in submitting and resetting
-%D fields, are implemented using the next low level specials:
-%D
-%D \starttyping
-%D \doFDFdefinefieldset{TAG}{name,name,...}
-%D \doFDFgetfieldset{TAG}
-%D \doiffieldset{TAG}{sequence}
-%D \stoptyping
-
-\def\dodefinefieldset#1#2% tag commalist
-  {\let\FDFfieldset\empty
-   \def\docommand##1%
-     {\doPDFgetobjectreference{FDF}{##1}\PDFobjectreference
-      \edef\FDFfieldset{\FDFfieldset\PDFobjectreference\space}}%
-   \processcommacommand[#2]\docommand % nb: command
-   \setevalue{FDF:set:#1}{\FDFfieldset}}
-
-\def\dogetfieldset#1%
-  {\getvalue{FDF:set:#1}}
-
-\def\doiffieldset#1#2%
-  {\ifundefined{FDF:set:#1}\else#2\fi}
-
-%D \macros
-%D   {defaultobjectreference,doPDFgetobjectreference}
-%D
-%D Because in \PDFTEX\ we have to construct the object
-%D references \type{N 0 R}, we can default to the non existing
-%D zero object number.
-
-\def\defaultobjectreference#1#2%
-  {0}
-
-\def\doPDFgetobjectreference#1#2#3%
-  {\dogetobjectreference{#1}{#2}#3%
-   \edef#3{\ifx#3\empty null\else\PDFobjref{#3}\fi}}
-
-\def\doPDFgetobjectnumber#1#2#3%
-  {\dogetobjectreference{#1}{#2}#3%
-   \edef#3{\ifx#3\empty 0\else#3\fi}}
-
-\def\doPDFgetobjectpage#1#2#3%
-  {\dogetobjectreferencepage{#1}{#2}#3%
-   \ifx#3\empty\def#3{1}\fi}
+\def\doPDFgetobjectpage#1#2#3%
+  {\dogetobjectreferencepage{#1}{#2}#3%
+   \ifx#3\empty\def#3{\realfolio}\fi}
 
 \def\doPDFgetobjectpagereference#1#2#3%
   {\dogetobjectreferencepage{#1}{#2}#3%
-   \ifx#3\empty
-     \doPDFgetpagereference\realfolio#3%
-   \else
-     \doPDFgetpagereference#3#3% we assume that #3 gets expanded
-   \fi}
-
-\def\doPDFgetpagereference#1#2% number macro
-  {\edef#2{\ifnum#1>\zerocount\PDFobjref{\pdfpageref#1}\else null\fi}}
-
-\def\thePDFpagereference#1#2% number macro
-  {\ifnum#1>\zerocount\PDFobjref{\pdfpageref#1}\else null\fi}
-
-%D \macros
-%D   {initializePDFnegative,initializePDFoverprint}
-%D
-%D Here follow some rather obscure macros. They will only
-%D come into action when one wants negated output.
-
-\def\initializePDFnegative
-  {\immediate\pdfobj stream attr {/FunctionType 4 /Range [0 1] /Domain [0 1]} {{1 exch sub}}%
-   \immediate\pdfobj{<>}%
-   \appendtoPDFdocumentextgstates{/GSnegative \PDFobjref\pdflastobj}%
-   \immediate\pdfobj{<>}%
-   \appendtoPDFdocumentextgstates{/GSpositive \PDFobjref\pdflastobj}%
-   \global\let\initializePDFnegative\relax}
-
-\def\initializePDFoverprint
-  {\immediate\pdfobj{<>}% /op defaults to /OP
-   \appendtoPDFdocumentextgstates{/GSknockout \PDFobjref\pdflastobj}%
-   \immediate\pdfobj{<>}% /op defaults to /OP
-   \edef\PDFobjectreferenceB{\the\pdflastobj}%
-   \appendtoPDFdocumentextgstates{/GSoverprint \PDFobjref\pdflastobj}%
-   \global\let\initializePDFoverprint\relax}
-
-%D File embedding. Storing the stream identifier is needed
-%D to get access to the number. When typeset, the user can
-%D feed this number to \type {pdftosrc} and filter the
-%D file from the \PDF\ file.
-
-\let\PDFlaststreamobject   \s!unknown
-%def\PDFlaststreamreference{0 0 R}
-
-\def\doPDFfilestreamobject#1#2#3#4%
-  {\immediate\pdfobj stream file{#4}%
-   \edef\PDFlaststreamobject{\the\pdflastobj}%
-   \dosetobjectreference{PDFFS}{#2}{\PDFlaststreamobject}%
-   \createpdfdictionaryobject{#1}{#2}{/Type /Filespec /F (#3) /EF <>}}
-
-\def\doPDFgetfilestreamreference#1#2%
-  {\doPDFgetobjectreference{PDFFS}{#1}#2}
-
-\def\doPDFfilestreamidentifier#1%
-  {\doifsomething{#1}
-     {\doPDFgetfilestreamreference{#1}\PDFobjectreference
-      \@EA\beforesplitstring\PDFobjectreference\at{ }\to\PDFlaststreamobject
-      \PDFlaststreamobject}}
-
-% MP ?
-
-        \def\setMPPDFobject#1#2% resources boxnumber
-          {\the\everyPDFxform
-           \finalizeobjectbox{#2}%
-           \immediate\pdfxform resources{#1}#2%
-           \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}}
-
-        \let\getMPPDFobject\relax
-
-        \def\doinsertMPfile#1%
-          {\doiffileelse{./#1}{\includeMPasPDF{./#1}}{\message{[MP #1]}}}
-
-%D Even newer trickery:
-
-% resource -> prop -> mc's -> OCG|OCMD (nested)
-% ocg:
-% /Intent/Design
-% ocmd
-% /P /AllOn
-% kan zelf ocmd bevatten
-
-\let\PDFtextlayers\empty
-\let\PDFpagelayers\empty
-\let\PDFhidelayers\empty
-\let\PDFvidelayers\empty
-
-\def\dostartlayer#1{\PDFcode{/OC /#1 BDC}}
-\def\dostoplayer   {\PDFcode        {EMC}}
-
-\def\dodefineviewerlayer#1#2#3#4#5% tag title visible type printable
-  {\createpdfdictionaryobject{PDLN}{#1}
-     {/Type /OCG
-      \ifcase#4 \or
-        /Intent /Design % disable layer hiding by user
-      \fi
-      \ifnum#5=\zerocount
-        /Usage << /Print << /PrintState /OFF >> >> % printable or not
-      \fi
-      /Name (#2)}%
-   \doPDFgetobjectreference{PDLN}{#1}\PDFobjectreference
-   \xdef\PDFtextlayers{\PDFtextlayers\space\PDFobjectreference}%
-   \doifelse{#3}\v!start
-     {\xdef\PDFvidelayers{\PDFvidelayers\space\PDFobjectreference}}%
-     {\xdef\PDFhidelayers{\PDFhidelayers\space\PDFobjectreference}}%
-   \createpdfdictionaryobject{PDLD}{#1}
-     {/Type /OCMD
-      /OCGs [\PDFobjectreference]}%
-   \doPDFgetobjectreference{PDLD}{#1}\PDFobjectreference
-   \xdef\PDFpagelayers{\PDFpagelayers\space /#1 \PDFobjectreference}}
-
-\def\flushPDFtextlayers
-  {\ifx\PDFtextlayers\empty \else
-     \driverreferenced \createpdfarrayobject{PDF}{textlayers}{\PDFtextlayers}%
-     \doPDFgetobjectreference{PDF}{textlayers}\!!stringa
-     \ifx\PDFvidelayers\empty
-       \def\!!stringb{[null]}%
-     \else
-       \driverreferenced \createpdfarrayobject{PDF}{videlayers}{\PDFvidelayers}%
-       \doPDFgetobjectreference{PDF}{videlayers}\!!stringb
-     \fi
-     \ifx\PDFhidelayers\empty
-       \def\!!stringc{[null]}%
-     \else
-       \driverreferenced \createpdfarrayobject{PDF}{hidelayers}{\PDFhidelayers}%
-       \doPDFgetobjectreference{PDF}{hidelayers}\!!stringc
-     \fi
-     \appendtopdfcatalog
-       {/OCProperties
-        << % display in menu
-           /D  << /Order \!!stringa
-                  /ON    \!!stringb
-                  /OFF   \!!stringc >>
-           % used properties
-           /OCGs \!!stringa >>}%
-     \globallet\flushPDFtextlayers\relax
-   \fi}
-
-\def\flushPDFpagelayers
-  {\ifx\PDFpagelayers\empty \else
-     \appendtopdfpageresources{/Properties <<\PDFpagelayers>>}%
-   \fi}
-
-\def\PDFlayeractionlist{null}
-
-\def\PDFexecutehidelayer   {/SetOCGState /State [/OFF    \PDFlayeractionlist]}
-\def\PDFexecutevidelayer   {/SetOCGState /State [/ON     \PDFlayeractionlist]}
-\def\PDFexecutetogglelayer {/SetOCGState /State [/Toggle \PDFlayeractionlist]}
-
-\def\domakeviewerlayerlist#1%
-  {\bgroup
-   \globallet\PDFlayeractionlist\empty
-   \def\docommand##1%
-     {\doPDFgetobjectreference{PDLN}{##1}\PDFobjectreference
-      \xdef\PDFlayeractionlist{\PDFlayeractionlist\space\PDFobjectreference}}%
-   \processcommalist[#1]\docommand
-   \egroup}
-
-%D Something rather pdf dependent:
-
-% #1 => 1=fill 2=stroke 3=strokedfill 4=invisible
-% #2 => linewidth
-% #3 => spacing (beware, one needs to set the hsize as well)
-
-\def\dostartfonteffect#1#2#3%
-  {\ifdim#2>\zeropoint
-     \PointsToBigPoints{#2}\ascii
-     \PDFcode{\ascii\space w}%
-   \fi
-   \ifdim#3\points=\onepoint\else
-     \scratchdimen#3\points
-     \PDFcode{\withoutpt{\the\scratchdimen}\space Tc}%
-   \fi
-   \PDFcode{\purenumber#1 Tr}}
-
-\def\dostopfonteffect
-  {\PDFcode{1 w 0 Tc 0 Tr}}
-
-%D Handy for the \METAPOST\ to \PDF\ converter:
-
-\appendtoksonce
-    \collectPDFresources
-    \global\let\currentPDFresources\collectedPDFresources
-\to \everyPDFxform
-
-\let\collectedPDFresources\empty
-
-\def\collectPDFresources % suboptimal
-  {\doifobjectreferencefoundelse{FDF}{docushades} % redundant, we have an reserved object now
-     {\doPDFgetobjectreference{FDF}{docushades}\PDFobjectreference
-      \xdef\collectedPDFresources{\collectedPDFresources/Shading \PDFobjectreference}}\donothing
-   \doifobjectreferencefoundelse{FDF}{docuextgstates}
-     {\doPDFgetobjectreference{FDF}{docuextgstates}\PDFobjectreference
-      \xdef\collectedPDFresources{\collectedPDFresources/ExtGState \PDFobjectreference}}\donothing
-   \doifobjectreferencefoundelse{FDF}{colorspaces}
-     {\doPDFgetobjectreference{FDF}{colorspaces}\PDFobjectreference
-      \xdef\collectedPDFresources{\collectedPDFresources/ColorSpace \PDFobjectreference}}\donothing
-   \global\let\collectPDFresources\relax}
-
-\appendtoks
-    \flushPDFpagelayers
-    \flushJSpreamble
-    \flushJSpreamble
-    \checkPDFextgstates
-    \checkPDFcolorspaces
-    \checkPDFshades
-    \checkPDFpageactions
-    \fakePDFpagedestination
-    \flushPDFpageboxes
-    \addPDFdocumentinfo
-\to \everybackendshipout
-
-\appendtoks
-    \flushPDFtextlayers
-    \finalflushJSpreamble
-\to \everylastbackendshipout
-
-%D Temporary hack:
-
-\def\TransparencyHack %  png: /CS /DeviceRGB /I true
-  {\appendtoksonce
-     \appendtopdfpageattributes{/Group << /S /Transparency /I true /K true>>}%
-   \to \everyPDFxform
-   \appendtoksonce
-     \appendtopdfpageattributes{/Group << /S /Transparency /I true /K true>>}%
-   \to \everyshipout}
+   \doPDFgetpagereference{\ifx#3\empty\realfolio\else#3\fi}#3}
+
+\def\predefinesymbol[#1]%
+  {\begingroup
+   \setobject{SYM}{#1}\hbox{\symbol[#1]}%
+   \dogetobjectreference{SYM}{#1}\lastref
+   \ctxlua{backends.codeinjections.registersymbol("#1",\lastref)}%
+   \endgroup}
 
 \protect \endinput
diff --git a/tex/context/base/bibl-bib.mkiv b/tex/context/base/bibl-bib.mkiv
new file mode 100644
index 000000000..51db67ed7
--- /dev/null
+++ b/tex/context/base/bibl-bib.mkiv
@@ -0,0 +1,29 @@
+%D \module
+%D   [       file=bibl-bib,
+%D        version=2007.08.17,
+%D          title=\CONTEXT\ Bibliography Support,
+%D       subtitle=Initialization,
+%D         author=Hans Hagen \& Taco Hoekwater,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Bibliography Support / BibTeX}
+
+\registerctxluafile{bibl-bib}{1.001}
+
+\unprotect
+
+\def\definebibtexsession       [#1]{\ctxlua{commands.definebibtexsession("#1")}}
+\def\preparebibtexsession      [#1]{\ctxlua{commands.preparebibtexsession("#1")}}
+\def\registerbibtexfile            {\dodoubleargument\doregisterbibtexfile}
+\def\doregisterbibtexfile  [#1][#2]{\ctxlua{commands.registerbibtexfile("#1","#2")}}  % also the fast one
+\def\registerbibtexentry           {\dodoubleargument\doregisterbibtexentry}
+\def\doregisterbibtexentry [#1][#2]{\ctxlua{commands.registerbibtexentry("#1","#2")}} % also the fast one
+\def\applytobibtexsession          {\dodoubleargument\doapplytobibtexsession}
+\def\doapplytobibtexsession[#1][#2]{\xmlprocessregistered{bibtex:#1}{#2}{#2}}
+
+\protect \endinput
diff --git a/tex/context/base/bibl-bib.tex b/tex/context/base/bibl-bib.tex
deleted file mode 100644
index 51db67ed7..000000000
--- a/tex/context/base/bibl-bib.tex
+++ /dev/null
@@ -1,29 +0,0 @@
-%D \module
-%D   [       file=bibl-bib,
-%D        version=2007.08.17,
-%D          title=\CONTEXT\ Bibliography Support,
-%D       subtitle=Initialization,
-%D         author=Hans Hagen \& Taco Hoekwater,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Bibliography Support / BibTeX}
-
-\registerctxluafile{bibl-bib}{1.001}
-
-\unprotect
-
-\def\definebibtexsession       [#1]{\ctxlua{commands.definebibtexsession("#1")}}
-\def\preparebibtexsession      [#1]{\ctxlua{commands.preparebibtexsession("#1")}}
-\def\registerbibtexfile            {\dodoubleargument\doregisterbibtexfile}
-\def\doregisterbibtexfile  [#1][#2]{\ctxlua{commands.registerbibtexfile("#1","#2")}}  % also the fast one
-\def\registerbibtexentry           {\dodoubleargument\doregisterbibtexentry}
-\def\doregisterbibtexentry [#1][#2]{\ctxlua{commands.registerbibtexentry("#1","#2")}} % also the fast one
-\def\applytobibtexsession          {\dodoubleargument\doapplytobibtexsession}
-\def\doapplytobibtexsession[#1][#2]{\xmlprocessregistered{bibtex:#1}{#2}{#2}}
-
-\protect \endinput
diff --git a/tex/context/base/buff-ini.lua b/tex/context/base/buff-ini.lua
index 4be320f76..5b13f669a 100644
--- a/tex/context/base/buff-ini.lua
+++ b/tex/context/base/buff-ini.lua
@@ -31,6 +31,10 @@ local ctxcatcodes = tex.ctxcatcodes
 
 local data, commands, flags, hooks, visualizers = buffers.data, buffers.commands, buffers.flags, buffers.hooks, buffers.visualizers
 
+function buffers.raw(name)
+    return data[name] or { }
+end
+
 function buffers.erase(name)
     data[name] = nil
 end
@@ -484,3 +488,48 @@ function buffers.flush_result(result,nested)
         texsprint(ctxcatcodes,concat(result,""))
     end
 end
+
+-- THIS WILL BECOME A FRAMEWORK: the problem with prety printing is that
+-- we deal with snippets and therefore we need tolerant parsing
+
+--~ local type = type
+
+--~ visualizers = visualizers or { }
+
+--~ local function fallback(s) return s end
+
+--~ function visualizers.visualize(visualizer,kind,pattern)
+--~     if type(visualizer) == "table" and type(kind) == "string" then
+--~         kind = visualizer[kind] or visualizer.default or fallback
+--~     else
+--~         kind = fallback
+--~     end
+--~     return (lpeg.C(pattern))/kind
+--~ end
+
+--~ local flusher = texio.write
+--~ local format = string.format
+
+--~ local visualizer = {
+--~     word    = function(s) return flusher(format("\\bold{%s}",s)) end,
+--~     number  = function(s) return flusher(format("\\slanted{%s}",s)) end,
+--~     default = function(s) return flusher(s) end,
+--~ }
+
+--~ local word   = lpeg.R("AZ","az")^1
+--~ local number = lpeg.R("09")^1
+--~ local any    = lpeg.P(1)
+
+--~ local pattern = lpeg.P { "start",
+--~     start = (
+--~         visualizers.visualize(visualizer,"word",word) +
+--~         visualizers.visualize(visualizer,"number",number) +
+--~         visualizers.visualize(visualizer,"default",any)
+--~     )^1
+--~ }
+
+--~ str = [[test 123 test $oeps$]]
+
+--~ pattern:match(str)
+
+
diff --git a/tex/context/base/buff-ini.mkiv b/tex/context/base/buff-ini.mkiv
index c9c1ae052..29ce4687d 100644
--- a/tex/context/base/buff-ini.mkiv
+++ b/tex/context/base/buff-ini.mkiv
@@ -15,6 +15,41 @@
 
 \registerctxluafile{buff-ini}{1.001}
 
+% todo:
+%
+% \startluacode
+%     local locations = { }
+%     function document.set_number(name)
+%         locations[name] = {
+%             line = status.linenumber,
+%             file = status.filename
+%         }
+%     end
+%     function document.add_number(name)
+%         local b, l = buffers.raw(name), locations[name]
+%         if b and l then
+%             for i=1,#b do
+%                 b[i] = string.gsub(b[i],"# line: ","# line: " .. l.line + 2)
+%             end
+%         end
+%     end
+% \stopluacode
+%
+% \starttext
+%
+% \ctxlua{document.set_number("oeps")}
+% \startbuffer[oeps]
+% # line: 
+%
+% test
+% test
+% \stopbuffer
+% \ctxlua{document.add_number("oeps")}
+%
+% \typebuffer[oeps]
+%
+% \stoptext
+
 \ifdefined\doinitializeverbatim \else% temp hack
     \ifdefined\mkinitializeverbatim
         \let\doinitializeverbatim\mkinitializeverbatim
diff --git a/tex/context/base/buff-ver.mkii b/tex/context/base/buff-ver.mkii
index c9ad8cbc9..8c2929a4b 100644
--- a/tex/context/base/buff-ver.mkii
+++ b/tex/context/base/buff-ver.mkii
@@ -60,7 +60,7 @@
         \restorecatcodes % also needed when loading during \newpretty
         \startreadingfile % restore < and > if needed
         \lowercasestring verb-\prettyidentifier.tex\to\filename
-        \readsysfile\filename\donothing\donothing
+        \readsysfile{\filename.mkii}\donothing\donothing
         \stopreadingfile
       \stopnointerference}%
    \doifdefinedelse{setuppretty\prettyidentifier type}%
diff --git a/tex/context/base/buff-ver.mkiv b/tex/context/base/buff-ver.mkiv
index aed357de8..53ad235fe 100644
--- a/tex/context/base/buff-ver.mkiv
+++ b/tex/context/base/buff-ver.mkiv
@@ -142,7 +142,6 @@
    \def\obs{\obeyedspace}%
    \ctxlua{buffers.doifelsevisualizer("\prettyidentifier")}
      {\ctxlua{buffers.setvisualizer("\prettyidentifier")}%
-      \localcolortrue % tricky, maybe not here
       \def\bop{\bgroup\beginofpretty}%
       \def\eop{\endofpretty\egroup}%
       \def\sop{\endofpretty\egroup\bgroup\beginofpretty}}%
@@ -568,14 +567,14 @@
    \ctxlua{buffers.typefile("\readfilename")}%
    #2}
 
-\def\dotypeblockverbatim#1#2%
+\unexpanded\def\dotypeblockverbatim#1#2%
    {\dowithbuffer{_typing_}{#1}{#2}
       {}
       {\doinitializeverbatim
        \beginofverbatimlines
        \ctxlua{buffers.type("_typing_")}%
        \endofverbatimlines
-       \getvalue{\strippedcsname#2}}}
+       \csname#2\endcsname}}
 
 \def\dododostarttyping[#1]%
   {\typingparameter\c!before
@@ -583,7 +582,7 @@
    \dosetuptypelinenumbering{#1}%
    \initializetyping
    \startverbatimcolor
-   \expanded{\dotypeblockverbatim{\s!start\currenttyping}{\s!stop\currenttyping}}}
+   \normalexpanded{\dotypeblockverbatim{\e!start\currenttyping}{\e!stop\currenttyping}}} % was s!start
 
 \def\dostoptyping#1% hm, currenttyping
   {\stopverbatimcolor
@@ -753,8 +752,9 @@
    \fi\fi}
 
 \def\dosetuptypelinenumbering#1% fuzzy
-  {\doifundefined{\currenttypingclass\currenttyping\c!start}
-     {\setuptyping[\currenttyping][\c!start=1,\c!stop=,\c!step=1,\c!nlines=]}%
+  {\ifcsname\currenttypingclass\currenttyping\c!start\endcsname \else
+     \setuptyping[\currenttyping][\c!start=1,\c!stop=,\c!step=1,\c!nlines=]%
+   \fi
    \setuptyping[\currenttyping][#1]%
    \doifelse{\typingparameter\c!numbering}\v!file
      {% kind of special: filters lines !
@@ -804,11 +804,13 @@
       \settypingparameter\c!option{\prettyidentifier}}%
    \initializetyping
    \startverbatimcolor
-   \doifundefinedelse{\currenttypingclass#3\v!global\c!start}
-     {\scratchcounter\zerocount}
-     {\scratchcounter\getvalue{\currenttypingclass#3\v!global\c!start}}%
-   \advance\scratchcounter\plusone
-   \setxvalue{\currenttypingclass#3\v!global\c!start}{\the\scratchcounter}%
+   \scratchcounter
+     \ifcsname\currenttypingclass#3\v!global\c!start\endcsname
+       \numexpr\csname\currenttypingclass#3\v!global\c!start\endcsname+\plusone\relax
+     \else
+       \plusone
+     \fi
+   \setxvalue{\currenttypingclass#3\v!global\c!start}{\the\scratchcounter}% no direct setxvalue as it defines beforehand
    \doifelsenothing{\typingparameter\c!start}
      {#4}
      {\doif{\typingparameter\c!start}\v!continue
diff --git a/tex/context/base/catc-ctx.tex b/tex/context/base/catc-ctx.tex
index 028ae496c..83e802e77 100644
--- a/tex/context/base/catc-ctx.tex
+++ b/tex/context/base/catc-ctx.tex
@@ -205,3 +205,46 @@
 \let\xmlcatcodes        \xmlcatcodesn
 
 \endinput
+
+% under consideration:
+%
+% \newcatcodetable\txtcatcodes
+%
+% \startcatcodetable \txtcatcodes
+%     \catcode`\^^I = 10
+%     \catcode`\^^M =  5
+%     \catcode`\^^L =  5
+%     \catcode`\    = 10
+%     \catcode`\\   =  0
+%     \catcode`\{   =  1
+%     \catcode`\}   =  2
+% \stopcatcodetable
+%
+% \newcount\relaxedcatcodedepth
+%
+% \def\startrelaxedcatcodes
+%   {\global\chardef\relaxedcatcodeparent\catcodetable
+%    \global\advance\relaxedcatcodedepth\plusone
+%    \nonknuthmode\setcatcodetable\txtcatcodes}
+%
+% \def\stoprelaxedcatcodes
+%   {\ifcase\relaxedcatcodedepth
+%      % error
+%    \or
+%      \setcatcodetable\relaxedcatcodeparent
+%      \global\relaxedcatcodedepth\zerocount
+%    \else
+%      \global\advance\relaxedcatcodedepth\minusone
+%      \setcatcodetable\txtcatcodes
+%    \fi}
+%
+% \starttext
+%
+% \startrelaxedcatcodes
+%     \startcomment test \stopcomment
+%     test $ test 10% whatever|test \mathematics{x^2=1}
+% \stoprelaxedcatcodes
+%
+% $x^2=1$
+%
+% \stoptext
diff --git a/tex/context/base/catc-sym.tex b/tex/context/base/catc-sym.tex
index 49d94815c..da6c9c068 100644
--- a/tex/context/base/catc-sym.tex
+++ b/tex/context/base/catc-sym.tex
@@ -115,4 +115,73 @@
 
 \egroup
 
+%D (Inspired by a discussion on the \CONTEXT\ mailing list)
+%D
+%D In \TEX\ each character can have one of 16 catcodes. This way the
+%D backslash, dollar, ampersand, hash and some more characters get
+%D their  special meaning. If you want to process tokens under a
+%D certain catcode  regime, passing arguments can interfere badly.
+%D
+%D \startbuffer[a]
+%D \def\whatever#1{[#1]}
+%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
+%D \stopbuffer
+%D
+%D \typebuffer[a]
+%D
+%D Here we pass an argument to \type {\whatever} but part of that
+%D argument is to be processed under a different catcode regime, i.e.\
+%D all characters that need to be typeset verbatim need to get
+%D the catcode that makes it a letter. This is what we get when we typeset
+%D the text verbatim:
+%D
+%D \starttyping
+%D whatever \type {\whatever{you want}} $or$ not!
+%D \stoptyping
+%D
+%D However, when passed to \type {\whatever} we get:
+%D
+%D \getbuffer[a]
+%D
+%D In \ETEX\ one can use  \type {\scantokens} to circumvent this problem.
+%D
+%D \startbuffer[b]
+%D \def\rescan#1{\scantokens{#1}}
+%D \def\whatever#1{[\rescan{#1}]}
+%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
+%D \stopbuffer
+%D
+%D \getbuffer[b] \typebuffer[b]
+%D
+%D This time the \type {\whatever} call gives:
+%D
+%D \getbuffer[b]
+%D
+%D In this example, two spaces have crept in. The first one, after the
+%D macro name, is inserted by \TEX\ and cannot be avoided. The last space
+%D is inserted by \type {\scantokens}, and is the consequence of the fact
+%D that this macro mimics reading from a file. You can avoid the last
+%D space by a slightly different definition:
+%D
+%D \startbuffer[c]
+%D \def\rescan#1{\scantokens{#1\ignorespaces}}
+%D \def\whatever#1{[\rescan{#1}]}
+%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
+%D \stopbuffer
+%D
+%D \typebuffer[c]
+%D
+%D Unfortunately we still keep the first space, but at least it's better than
+%D a failure:
+%D
+%D \getbuffer[c]
+
+\long\def\rescan#1{\scantokens{#1\ignorespaces}}
+\long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantokens{#2\ignorespaces}\endgroup}
+
+\ifx\scantextokens\undefined \else
+  \long\def\rescan#1{\scantextokens{#1}}
+  \long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantextokens{#2}\endgroup}
+\fi
+
 \protect \endinput
diff --git a/tex/context/base/colo-ext.mkiv b/tex/context/base/colo-ext.mkiv
index 06facd34e..274086bb6 100644
--- a/tex/context/base/colo-ext.mkiv
+++ b/tex/context/base/colo-ext.mkiv
@@ -32,7 +32,7 @@
 \def\negatecolorbox#1%
   {\setbox#1\hbox
      {\dostartnegative
-      \localstartcolor[white]\vrule\!!height\ht#1\!!depth\dp#1\!!width\wd#1\localstopcolor
+      \startcolor[white]\vrule\!!height\ht#1\!!depth\dp#1\!!width\wd#1\stopcolor
       \hskip-\wd#1%
       \box#1%
       \dostopnegative}}
diff --git a/tex/context/base/colo-hex.mkii b/tex/context/base/colo-hex.mkii
index dac2e46d0..7cef6e8a2 100644
--- a/tex/context/base/colo-hex.mkii
+++ b/tex/context/base/colo-hex.mkii
@@ -38,7 +38,17 @@
 
 \unprotect
 
-\newdimen\hexcolorfraction \hexcolorfraction=\dimexpr(1pt/256)
+% \definecolor[rgbtestcolor] [r=0.87843,g=0.87451,b=0.89020] % RGB(224,223,227)
+% \definecolor[hextestcolor] [h=E0DFE3]
+%
+% \startMPpage
+%     path p ; % example by Peter Rolf
+%     p := unitsquare xyscaled(5cm,5cm) ;
+%     fill (point 0 of p -- point 1 of p -- point 2 of p --cycle) withcolor \MPcolor{rgbtestcolor} ; % bottom right part of the square
+%     fill (point 0 of p -- point 3 of p -- point 2 of p --cycle) withcolor \MPcolor{hextestcolor} ; % top left part
+% \stopMPpage
+
+\newdimen\hexcolorfraction \hexcolorfraction=\dimexpr1pt/255\relax
 
 \chardef\hexcolorprefix=`#
 
@@ -49,7 +59,7 @@
 
 \def\hexcolorcomponent#1#2%
   {\ifnum\dohexstringtonumber#1#2=\zerocount0\else\ifnum\dohexstringtonumber#1#2=\plusone1\else
-     \expandafter\withoutpt\the\dimexpr(\dohexstringtonumber#1#2\hexcolorfraction)%
+     \expandafter\withoutpt\the\dimexpr\dohexstringtonumber#1#2\hexcolorfraction\relax
    \fi\fi}
 
 \def\dohexcolorspec#1#2#3#4#5#6#7#8\relax
@@ -98,7 +108,7 @@
 
 \def\colorhexcomponent#1%
   {\ifdim#1\points<.005\points
-     00\else\lchexnumbers{\the\dimexpr(255\dimexpr(#1\points)\relax+.5\points)\relax}%
+     00\else\lchexnumbers{\the\dimexpr255\dimexpr#1\points\relax+.5\points\relax}%
    \fi}
 
 % the faster one
@@ -109,7 +119,7 @@
 
 \def\colorhexcomponent#1%
   {\ifdim#1\points<\hex@color@a
-     00\else\lchexnumbers{\the\dimexpr(#1\points*\hex@color@c+\hex@color@b)\relax}%
+     00\else\lchexnumbers{\the\dimexpr#1\points*\hex@color@c+\hex@color@b\relax}%
    \fi}
 
 \protect \endinput
diff --git a/tex/context/base/colo-hex.mkiv b/tex/context/base/colo-hex.mkiv
index b31321b7e..dd8e03938 100644
--- a/tex/context/base/colo-hex.mkiv
+++ b/tex/context/base/colo-hex.mkiv
@@ -11,105 +11,16 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-%D Not yet supported in \MKIV.
+%D This is built in.
 
-\endinput
-
-\writestatus{loading}{ConTeXt Color Macros / Hexadecimal}
-
-% \edef\testcolor{\string#FFC0C0}
-% \edef\testcolor{\string#55}
-%
-% \setupcolors[state=start]
-%
-% \expanded{\definecolor[thehexcolor][\hexcolorspec\testcolor]}
-%
-% \checkhexcolor[\testcolor]
-%
-% \definecolor[thehexcolor][\testcolor]
-%
-% \starttext
+% \definecolor[rgbtestcolor] [r=0.87843,g=0.87451,b=0.89020] % RGB(224,223,227)
+% \definecolor[hextestcolor] [\letterhash E0DFE3] % or [h=E0DFE3]
 %
-% test \color[thehexcolor]{rood}
-% test \color[red]{rood}
-% test \color[\testcolor]{rood}
-%
-% \stoptext
-
-\unprotect
-
-\newdimen\hexcolorfraction \hexcolorfraction=\dimexpr1pt/256\relax
-
-\chardef\hexcolorprefix=`#
-
-\def\hexcolorspec   #1{\expandafter\dohexcolorspec   #1\empty\empty\empty\empty\relax}
-\def\hexcolorpattern#1{\expandafter\dohexcolorpattern#1\empty\empty\empty\empty\relax}
-
-\ifx\dohexstringtonumber\undefined \def\dohexstringtonumber{"} \fi
-
-\def\hexcolorcomponent#1#2%
-  {\ifnum\dohexstringtonumber#1#2=\zerocount0\else\ifnum\dohexstringtonumber#1#2=\plusone1\else
-     \expandafter\withoutpt\the\dimexpr(\dohexstringtonumber#1#2\hexcolorfraction)%
-   \fi\fi}
-
-\def\dohexcolorspec#1#2#3#4#5#6#7#8\relax
-  {\ifx#4\empty
-     s=\hexcolorcomponent#2#3%
-   \else
-     r=\hexcolorcomponent#2#3,g=\hexcolorcomponent#4#5,b=\hexcolorcomponent#6#7%
-   \fi}
+% \startMPpage
+%     path p ; % example by Peter Rolf
+%     p := unitsquare xyscaled(5cm,5cm) ;
+%     fill (point 0 of p -- point 1 of p -- point 2 of p --cycle) withcolor \MPcolor{rgbtestcolor} ; % bottom right part of the square
+%     fill (point 0 of p -- point 3 of p -- point 2 of p --cycle) withcolor \MPcolor{hextestcolor} ; % top left part
+% \stopMPpage
 
-\def\dohexcolorpattern#1#2#3#4#5#6#7#8\relax
-  {0\ifx#4\empty
-     S:\hexcolorcomponent#2#3%
-   \else
-     R:\hexcolorcomponent#2#3:\hexcolorcomponent#4#5:\hexcolorcomponent#6#7%
-   \fi:0:0}
-
-\def\doifhexcolorelse#1%
-  {\expandafter\dodoifhexcolorelse#10\od} % 0 is a dirty trick to catch an empty #1
-
-\def\dodoifhexcolorelse#1#2\od
-  {\ifnum`#1=\hexcolorprefix
-     \expandafter\firstoftwoarguments
-   \else
-     \expandafter\secondoftwoarguments
-   \fi}
-
-\def\docheckhexcolor#1%
-  {\doifhexcolorelse{#1}{\doifundefined{#1}{\setxvalue{\??cr#1}{\hexcolorpattern{#1}}}}\donothing}
-
-\def\checkhexcolor[#1]%
-  {\expanded{\docheckhexcolor{#1}}}
-
-\def\colorHpattern{\@EA\hexcolorpattern\@EA{\@EA*\@@cl@@h}} % * == dummy placeholder
-
-\let\dodododefinecolor\dododefinecolor % we will overload this one
-
-\def\dododefinecolor#1#2#3#4[#5][#6]%
-  {\doifhexcolorelse{#6}
-     {\setxvalue{\??cr#5}{\hexcolorpattern{#6}}}
-     {\dodododefinecolor#1#2#3#4[#5][#6]}}
-
-%D For Adam Lindsay and his XeTeX special driver:
-
-% because we intercept the zero condition, the .23pt in 1.23pt will disappear in the
-% ifcase zero part branch
-
-\def\colorhexcomponent#1%
-  {\ifdim#1\points<.005\points
-     00\else\lchexnumbers{\the\dimexpr(255\dimexpr(#1\points)\relax+.5\points)\relax}%
-   \fi}
-
-% the faster one
-
-\newdimen\hex@color@a \hex@color@a=.005pt
-\newdimen\hex@color@b \hex@color@b=.5pt
-\chardef \hex@color@c             =255
-
-\def\colorhexcomponent#1%
-  {\ifdim#1\points<\hex@color@a
-     00\else\lchexnumbers{\the\dimexpr(#1\points*\hex@color@c+\hex@color@b)\relax}%
-   \fi}
-
-\protect \endinput
+\endinput
diff --git a/tex/context/base/colo-ini.lua b/tex/context/base/colo-ini.lua
index 4a188eba8..befac2452 100644
--- a/tex/context/base/colo-ini.lua
+++ b/tex/context/base/colo-ini.lua
@@ -6,26 +6,15 @@ if not modules then modules = { } end modules ['colo-ini'] = {
     license   = "see context related readme files"
 }
 
--- split_settings -> aux.settings_to_hash
-
--- for the moment this looks messy but we're waiting for a pdf backend interface
---
--- code collected here will move and be adapted
---
--- some pdf related code can go away
-
--- spec-pdf.lua
-
--- todo: %s -> %f
-
+local concat = table.concat
+local format, gmatch, gsub, lower, match = string.format, string.gmatch, string.gsub, string.lower, string.match
 local texsprint = tex.sprint
-local concat =table.concat
-local format, gmatch, gsub, lower = string.format, string.gmatch, string.gsub, string.lower
+local ctxcatcodes = tex.ctxcatcodes
 
-ctx     = ctx     or { }
-ctx.aux = ctx.aux or { }
+local settings_to_hash_strict = aux.settings_to_hash_strict
 
-local ctxcatcodes = tex.ctxcatcodes
+colors         = colors         or { }
+transparencies = transparencies or { }
 
 local registrations = backends.registrations
 
@@ -60,7 +49,7 @@ local r_l_t_template = "\\localundefine{(ta:%s)}" ..
 local r_g_t_template = "\\globalundefine{(ta:%s)}" ..
                        "\\globalundefine{(ts:%s)}"
 
-function ctx.aux.definecolor(name, ca, global)
+local function definecolor(name, ca, global)
     if ca and ca > 0 then
         if global then
             texsprint(ctxcatcodes,format(a_g_c_template, name, ca, name, ca))
@@ -75,7 +64,7 @@ function ctx.aux.definecolor(name, ca, global)
         end
     end
 end
-function ctx.aux.inheritcolor(name, ca, global)
+local function inheritcolor(name, ca, global)
     if ca and ca ~= "" then
         if global then
             texsprint(ctxcatcodes,format(f_g_c_template, name, ca, name, ca))
@@ -90,7 +79,7 @@ function ctx.aux.inheritcolor(name, ca, global)
         end
     end
 end
-function ctx.aux.definetransparent(name, ta, global)
+local function definetransparent(name, ta, global)
     if ta and ta > 0 then
         if global then
             texsprint(ctxcatcodes,format(a_g_t_template, name, ta, name, ta))
@@ -105,7 +94,7 @@ function ctx.aux.definetransparent(name, ta, global)
         end
     end
 end
-function ctx.aux.inherittransparent(name, ta, global)
+local function inherittransparent(name, ta, global)
     if ta and ta ~= "" then
         if global then
             texsprint(ctxcatcodes,format(f_g_t_template, name, ta, name, ta))
@@ -139,17 +128,17 @@ local transparent = {
 
 -- By coupling we are downward compatible. When we decouple we need to do more tricky
 -- housekeeping (e.g. persist color independent transparencies when color bound ones
--- are nil.
+-- are nil.)
 
-ctx.couplecolors = true
+colors.couple = true
 
-function ctx.definetransparency(name,n)
+function colors.definetransparency(name,n)
     transparent[name] = n
 end
 
 local registered = { }
 
-local function registerspotcolor(parent,name,parentnumber,e,f,d,p)
+local function do_registerspotcolor(parent,name,parentnumber,e,f,d,p)
     if not registered[parentnumber] then
         local v = colors.values[parentnumber]
         if v then
@@ -170,7 +159,7 @@ local function registerspotcolor(parent,name,parentnumber,e,f,d,p)
     end
 end
 
-local function registermultitonecolor(parent,name,parentnumber,e,f,d,p) -- same as spot but different template
+local function do_registermultitonecolor(parent,name,parentnumber,e,f,d,p) -- same as spot but different template
     if not registered[parentnumber] then
         local v = colors.values[parentnumber]
         if v then
@@ -188,41 +177,42 @@ local function registermultitonecolor(parent,name,parentnumber,e,f,d,p) -- same
     end
 end
 
-function ctx.definesimplegray(name,s)
+function colors.definesimplegray(name,s)
     return colors.register('color',name,'gray',s) -- we still need to get rid of 'color'
 end
 
-function ctx.defineprocesscolor(name,str,global,freeze) -- still inconsistent color vs transparent
-    local t = str:split_settings()
+function colors.defineprocesscolor(name,str,global,freeze) -- still inconsistent color vs transparent
+    local r = match(str,"^#(.+)$") -- for old times sake (if we need to feed from xml or so)
+    local t = (r and { h = r }) or settings_to_hash_strict(str)
     if t then
         if t.h then
-            local r, g, b = (t.h .. "000000"):match("(..)(..)(..)")
-            ctx.aux.definecolor(name, colors.register('color',name,'rgb',(tonumber(r,16) or 0)/256,(tonumber(g,16) or 0)/256,(tonumber(b,16) or 0)/256               ), global)
+            local r, g, b = match(t.h .. "000000","(..)(..)(..)") -- watch the 255
+            definecolor(name, colors.register('color',name,'rgb',(tonumber(r,16) or 0)/255,(tonumber(g,16) or 0)/255,(tonumber(b,16) or 0)/255               ), global)
         elseif t.r or t.g or t.b then
-            ctx.aux.definecolor(name, colors.register('color',name,'rgb', tonumber(t.r)  or 0,      tonumber(t.g)  or 0,      tonumber(t.b)  or 0                    ), global)
+            definecolor(name, colors.register('color',name,'rgb', tonumber(t.r)  or 0,      tonumber(t.g)  or 0,      tonumber(t.b)  or 0                    ), global)
         elseif t.c or t.m or t.y or t.k then
-            ctx.aux.definecolor(name, colors.register('color',name,'cmyk',tonumber(t.c)  or 0,      tonumber(t.m)  or 0,      tonumber(t.y)  or 0, tonumber(t.k) or 0), global)
+            definecolor(name, colors.register('color',name,'cmyk',tonumber(t.c)  or 0,      tonumber(t.m)  or 0,      tonumber(t.y)  or 0, tonumber(t.k) or 0), global)
         else
-            ctx.aux.definecolor(name, colors.register('color',name,'gray',tonumber(t.s)  or 0), global)
+            definecolor(name, colors.register('color',name,'gray',tonumber(t.s)  or 0), global)
         end
         if t.a and t.t then
-            ctx.aux.definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global)
-        elseif ctx.couplecolors then
-        --  ctx.aux.definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up
-            ctx.aux.definetransparent(name, 0, global) -- can be sped up
+            definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global)
+        elseif colors.couple then
+        --  definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up
+            definetransparent(name, 0, global) -- can be sped up
         end
     elseif freeze then
         local ca = attributes.list[a_color]       [str]
         local ta = attributes.list[a_transparency][str]
         if ca then
-            ctx.aux.definecolor(name, ca, global)
+            definecolor(name, ca, global)
         end
         if ta then
-            ctx.aux.definetransparent(name, ta, global)
+            definetransparent(name, ta, global)
         end
     else
-        ctx.aux.inheritcolor(name, str, global)
-        ctx.aux.inherittransparent(name, str, global)
+        inheritcolor(name, str, global)
+        inherittransparent(name, str, global)
     --  if global and str ~= "" then -- For Peter Rolf who wants access to the numbers in Lua. (Currently only global is supported.)
     --      attributes.list[a_color]       [name] = attributes.list[a_color]       [str] or attributes.unsetvalue  -- reset
     --      attributes.list[a_transparency][name] = attributes.list[a_transparency][str] or attributes.unsetvalue
@@ -230,28 +220,28 @@ function ctx.defineprocesscolor(name,str,global,freeze) -- still inconsistent co
     end
 end
 
-function ctx.isblack(ca) -- maybe commands
+function colors.isblack(ca) -- maybe commands
     local cv = ca > 0 and colors.value(ca)
     return (cv and cv[2] == 0) or false
 end
 
-function ctx.definespotcolor(name,parent,str,global)
+function colors.definespotcolor(name,parent,str,global)
     if parent == "" or parent:find("=") then
-        ctx.registerspotcolor(name, parent)
+        colors.registerspotcolor(name, parent)
     elseif name ~= parent then
         local cp = attributes.list[a_color][parent]
         if cp then
-            local t = str:split_settings()
+            local t = settings_to_hash_strict(str)
             if t then
                 t.p = tonumber(t.p) or 1
-                registerspotcolor(parent, name, cp, t.e, 1, "", t.p) -- p not really needed, only diagnostics
+                do_registerspotcolor(parent, name, cp, t.e, 1, "", t.p) -- p not really needed, only diagnostics
                 if name and name ~= "" then
-                    ctx.aux.definecolor(name, colors.register('color',name,'spot', parent, 1, "", t.p), true)
+                    definecolor(name, colors.register('color',name,'spot', parent, 1, "", t.p), true)
                     if t.a and t.t then
-                        ctx.aux.definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global)
-                    elseif ctx.couplecolors then
-                    --~ ctx.aux.definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up
-                        ctx.aux.definetransparent(name, 0, global) -- can be sped up
+                        definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global)
+                    elseif colors.couple then
+                    --~ definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up
+                        definetransparent(name, 0, global) -- can be sped up
                     end
                 end
             end
@@ -259,49 +249,49 @@ function ctx.definespotcolor(name,parent,str,global)
     end
 end
 
-function ctx.registerspotcolor(parent, str)
+function colors.registerspotcolor(parent, str)
     local cp = attributes.list[a_color][parent]
     if cp then
         local e = ""
         if str then
-            local t = str:split_settings()
+            local t = settings_to_hash_strict(str)
             e = (t and t.e) or ""
         end
-        registerspotcolor(parent, "dummy", cp, e, 1, "", 1) -- p not really needed, only diagnostics
+        do_registerspotcolor(parent, "dummy", cp, e, 1, "", 1) -- p not really needed, only diagnostics
     end
 end
 
-function ctx.definemultitonecolor(name,multispec,colorspec,selfspec)
+function colors.definemultitonecolor(name,multispec,colorspec,selfspec)
     local dd, pp, nn = { }, { }, { }
     for k,v in gmatch(multispec,"(%a+)=([^%,]*)") do
         dd[#dd+1] = k
         pp[#pp+1] = v
         nn[#nn+1] = k
-        nn[#nn+1] = format("%1.3g",tonumber(v))
+        nn[#nn+1] = format("%1.3g",tonumber(v) or 0) -- 0 can't happen
     end
 --~ v = tonumber(v) * p
     local nof = #dd
     if nof > 0 then
         dd, pp, nn = concat(dd,','), concat(pp,','), concat(nn,'_')
         local parent = gsub(lower(nn),"[^%d%a%.]+","_")
-        ctx.defineprocesscolor(parent,colorspec..","..selfspec,true,true)
+        colors.defineprocesscolor(parent,colorspec..","..selfspec,true,true)
         local cp = attributes.list[a_color][parent]
         if cp then
-            registerspotcolor     (parent, name, cp, "", nof, dd, pp)
-            registermultitonecolor(parent, name, cp, "", nof, dd, pp)
-            ctx.aux.definecolor(name, colors.register('color', name, 'spot', parent, nof, dd, pp), true)
-            local t = selfspec:split_settings()
+            do_registerspotcolor(parent, name, cp, "", nof, dd, pp)
+            do_registermultitonecolor(parent, name, cp, "", nof, dd, pp)
+            definecolor(name, colors.register('color', name, 'spot', parent, nof, dd, pp), true)
+            local t = settings_to_hash_strict(selfspec)
             if t and t.a and t.t then
-                ctx.aux.definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global)
-            elseif ctx.couplecolors then
-            --  ctx.aux.definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up
-                ctx.aux.definetransparent(name, 0, global) -- can be sped up
+                definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global)
+            elseif colors.couple then
+            --  definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up
+                definetransparent(name, 0, global) -- can be sped up
             end
         end
     end
 end
 
-function ctx.mpcolor(model,ca,ta,default)
+function colors.mp(model,ca,ta,default)
     local cv = colors.value(ca) -- faster when direct colors.values[ca]
     if cv then
         local tv = transparencies.value(ta)
@@ -335,7 +325,7 @@ function ctx.mpcolor(model,ca,ta,default)
     end
 end
 
-function ctx.formatcolor(ca,separator)
+function colors.formatcolor(ca,separator)
     local cv = colors.value(ca)
     if cv then
         local c, f, t, model = { }, 13, 13, cv[1]
@@ -355,12 +345,12 @@ function ctx.formatcolor(ca,separator)
     end
 end
 
-function ctx.formatgray(ca,separator)
+function colors.formatgray(ca,separator)
     local cv = colors.value(ca)
     return format("%0.3f",(cv and cv[2]) or 0)
 end
 
-function ctx.colorcomponents(ca)
+function colors.colorcomponents(ca)
     local cv = colors.value(ca)
     if cv then
         local model = cv[1]
@@ -380,7 +370,7 @@ function ctx.colorcomponents(ca)
     end
 end
 
-function ctx.transparencycomponents(ta)
+function colors.transparencycomponents(ta)
     local tv = transparencies.value(ta)
     if tv then
         return format("a=%1.3f t=%1.3f",tv[1],tv[2])
@@ -389,153 +379,29 @@ function ctx.transparencycomponents(ta)
     end
 end
 
-function ctx.pdfcolor(model,ca,default) -- todo: use gray when no color
-    local cv = colors.value(ca)
-    if cv then
-        if model == 1 then
-            model = cv[1]
-        end
-        if model == 2 then
-            local s = cv[2]
-            return format("%s g %s G",s,s)
-        elseif model == 3 then
-            local r, g, b = cv[3], cv[4], cv[5]
-            return format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b)
-        elseif model == 4 then
-            local c, m, y, k = cv[6],cv[7],cv[8],cv[9]
-            return format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k)
-        else
-            local n,f,d,p = cv[10],cv[11],cv[12],cv[13]
-            if type(p) == "string" then
-                p = gsub(p,","," ") -- brr misuse of spot
-            end
-            return format("/%s cs /%s CS %s SCN %s scn",n,n,p,p)
-        end
-    else
-        return format("%s g %s G",default or 0,default or 0)
-    end
-end
-
-function ctx.pdfcolorvalue(model,ca,default)
-    local cv = colors.value(ca)
-    if cv then
-        if model == 1 then
-            model = cv[1]
-        end
-        if model == 2 then
-            return format("%s",cv[2])
-        elseif model == 3 then
-            return format("%s %s %s",cv[3],cv[4],cv[5])
-        elseif model == 4 then
-            return format("%s %s %s %s",cv[6],cv[7],cv[8],cv[9])
-        else
-            return format("%s",cv[13])
-        end
-    else
-        return format("%s",default or 0)
-    end
-end
-
-function ctx.fdfcolor(model,ca,default)
-    local cv = colors.value(ca)
-    if cv then
-        if model == 1 then
-            model = cv[1]
-        end
-        if model == 2 then
-            return format("[%s]",cv[2])
-        elseif model == 3 then
-            return format("[%s %s %s]",cv[3],cv[4],cv[5])
-        elseif model == 4 then
-            return format("[%s %s %s %s]",cv[6],cv[7],cv[8],cv[9])
-        elseif model == 4 then
-            return format("[%s]",cv[13])
-        end
-    else
-        return format("[%s]",default or 0)
-    end
-end
-
-function ctx.pdfcolorspace(model,ca)
-    local cv = colors.value(ca)
-    if cv then
-        if model == 1 then
-            model = cv[1]
-        end
-        if model == 2 then
-            return "DeviceGray"
-        elseif model == 3 then
-            return "DeviceRGB"
-        elseif model == 4 then
-            return "DeviceCMYK"
-        end
+function colors.spotcolorname(ca,default)
+    local cv, v = colors.value(ca), "unknown"
+    if cv and cv[1] == 5 then
+        v = cv[10]
     end
-    return "DeviceGRAY"
+    return tostring(v)
 end
 
-function ctx.spotcolorname(ca,default)
+function colors.spotcolorparent(ca,default)
     local cv, v = colors.value(ca), "unknown"
     if cv and cv[1] == 5 then
-        v = cv[10]
+        v = cv[12]
+        if v == "" then
+            v = cv[10]
+        end
     end
     return tostring(v)
 end
 
-function ctx.spotcolorvalue(ca,default)
+function colors.spotcolorvalue(ca,default)
     local cv, v = colors.value(ca), 0
     if cv and cv[1] == 5 then
        v = cv[13]
     end
     return tostring(v)
 end
-
--- unfortunately we have \cs's here but this will go anyway once we have mplib and such
-
-function ctx.resolvempgraycolor(csa,csb,model,s)
-    local ca = colors.register('color',nil,'gray',s)
-    texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
-    texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csb,ctx.pdfcolorspace(model,ca)))
-end
-function ctx.resolvemprgbcolor(csa,csb,model,r,g,b)
-    local ca = colors.register('color',nil,'rgb',r,g,b)
-    texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
-    texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csb,ctx.pdfcolorspace(model,ca)))
-end
-function ctx.resolvempcmykcolor(csa,csb,model,c,m,y,k)
-    local ca = colors.register('color',nil,'cmyk',c,m,y,k)
-    texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
-    texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csb,ctx.pdfcolorspace(model,ca)))
-end
-function ctx.resolvempspotcolor(csa,csb,model,n,f,d,p)
-    local ca = colors.register('color',nil,'spot',n,f,d,p)
-    texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
-    texsprint(ctxcatcodes,format("\\setxvalue{%s}{%s}",csb,ctx.pdfcolorspace(model,ca)))
-end
-
--- literals needed to inject code in the mp stream, we cannot use attributes there
--- since literals may have qQ's, much may go away once we have mplib code in place
-
-local intransparency = false
-
-function ctx.pdfrgbliteral(model,r,g,b)
-    texsprint(ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'rgb',r,g,b))))
-end
-function ctx.pdfcmykliteral(model,c,m,y,k)
-    texsprint(ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'cmyk',c,m,y,k))))
-end
-function ctx.pdfgrayliteral(model,s)
-    texsprint(ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'gray',s))))
-end
-function ctx.pdfspotliteral(model,n,f,d,p)
-    texsprint(ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'spot',n,f,d,p)))) -- incorrect
-end
-function ctx.pdftransparencyliteral(a,t)
-    intransparency = true
-    texsprint(ctxcatcodes,format("\\pdfliteral{/Tr%s gs}",transparencies.register(nil,a,t)))
-end
-function ctx.pdffinishtransparency()
-    if intransparency then
-        intransparency = false
-        texsprint(ctxcatcodes,"\\pdfliteral{/Tr0 gs}") -- we happen to know this -)
-    end
-end
diff --git a/tex/context/base/colo-ini.mkiv b/tex/context/base/colo-ini.mkiv
index 197a69ba6..197cbcdca 100644
--- a/tex/context/base/colo-ini.mkiv
+++ b/tex/context/base/colo-ini.mkiv
@@ -20,6 +20,7 @@
 %D different approach, this module only implements a few generic mechanisms.
 
 \registerctxluafile{colo-ini}{1.000}
+\registerctxluafile{lpdf-col}{1.000}
 
 \unprotect
 
@@ -80,7 +81,6 @@
 
 \newif\iffreezecolors  \freezecolorsfalse
 \newif\ifincolor                          % true if colors enabled
-\newif\iflocalcolor
 
 \let\colorlist        \empty
 \let\currentspotcolor \empty
@@ -122,8 +122,6 @@
 %D \macros
 %D   {startcolor,stopcolor,
 %D    faststartcolor,faststopcolor,
-%D    localstartcolor,localstopcolor,
-%D    localstartraster,localstopraster,
 %D    startraster,stopraster,raster,
 %D    color,graycolor}
 %D
@@ -162,13 +160,7 @@
            \def\faststopcolor          {}
 \unexpanded\def\dosetcolorattribute#1#2{\ifcsname#1#2\endcsname\doactivatecolor{\csname#1#2\endcsname}\fi}
 
-\let\localstartcolor \startcolor
-\let\localstopcolor  \stopcolor
-\let\globalstartcolor\startcolor
-\let\globalstopcolor \stopcolor
-\let\localstartraster\startraster
-\let\localstopraster \stopraster
-\let\grey            \graycolor
+\let\grey\graycolor
 
 %D \macros
 %D   {startcurrentcolor,stopcurrentcolor}
@@ -211,8 +203,8 @@
   {\makeshortfilename[\truefilename{\f!colorprefix#1}]%
    \startreadingfile
      \readsysfile\shortfilename
-       {\showmessage\m!colors4\colorstyle}
-       {\showmessage\m!colors5\colorstyle}%
+       {\showcolormessage\m!colors4\colorstyle}
+       {\showcolormessage\m!colors5\colorstyle}%
    \stopreadingfile}
 
 \let\usecolors\setupcolor
@@ -262,6 +254,8 @@
    \setsystemmode{\v!color\colorsplitsuffix}%
    \iffilterspotcolor \let\@@clrgb\v!no \fi}
 
+\let\showcolormessage\gobblethreearguments
+
 \def\dosetupcolors[#1]% some no longer make sense in MkIV
   {\getparameters[\??cl][#1]%
    \doifelse\@@clspot\v!yes
@@ -283,17 +277,17 @@
      \weightGRAYfalse
      \weightGRAYtrue
    \doifelse\@@clrgb\v!no
-     {\ifRGBsupported      \ifproductionrun\showmessage\m!colors {9}\v!rgb         \fi\RGBsupportedfalse \fi}
-     {\ifRGBsupported \else\ifproductionrun\showmessage\m!colors{10}\v!rgb        \fi\RGBsupportedtrue  \fi}%
+     {\ifRGBsupported      \showcolormessage\m!colors {9}\v!rgb        \RGBsupportedfalse \fi}
+     {\ifRGBsupported \else\showcolormessage\m!colors{10}\v!rgb        \RGBsupportedtrue  \fi}%
    \doifelse\@@clcmyk\v!no
-     {\ifCMYKsupported     \ifproductionrun\showmessage\m!colors {9}\v!cmyk       \fi\CMYKsupportedfalse\fi}
-     {\ifCMYKsupported\else\ifproductionrun\showmessage\m!colors{10}\v!cmyk       \fi\CMYKsupportedtrue \fi}%
+     {\ifCMYKsupported     \showcolormessage\m!colors {9}\v!cmyk       \CMYKsupportedfalse\fi}
+     {\ifCMYKsupported\else\showcolormessage\m!colors{10}\v!cmyk       \CMYKsupportedtrue \fi}%
    \doifelse\@@clmpcmyk\v!no
-     {\ifMPcmykcolors      \ifproductionrun\showmessage\m!colors {9}{\v!mp\v!cmyk}\fi\MPcmykcolorsfalse \fi}
-     {\ifMPcmykcolors \else\ifproductionrun\showmessage\m!colors{10}{\v!mp\v!cmyk}\fi\MPcmykcolorstrue  \fi}%
+     {\ifMPcmykcolors      \showcolormessage\m!colors {9}{\v!mp\v!cmyk}\MPcmykcolorsfalse \fi}
+     {\ifMPcmykcolors \else\showcolormessage\m!colors{10}{\v!mp\v!cmyk}\MPcmykcolorstrue  \fi}%
    \doifelse\@@clmpspot\v!no
-     {\ifMPspotcolors      \ifproductionrun\showmessage\m!colors {9}{\v!mp\v!spot}\fi\MPspotcolorsfalse \fi}
-     {\ifMPspotcolors \else\ifproductionrun\showmessage\m!colors{10}{\v!mp\v!spot}\fi\MPspotcolorstrue  \fi}%
+     {\ifMPspotcolors      \showcolormessage\m!colors {9}{\v!mp\v!spot}\MPspotcolorsfalse \fi}
+     {\ifMPspotcolors \else\showcolormessage\m!colors{10}{\v!mp\v!spot}\MPspotcolorstrue  \fi}%
    \preferGRAYfalse
    \processaction
      [\@@clconversion]
@@ -310,23 +304,15 @@
        \reduceMPcolorstrue
      \fi
    \else
-     \ifconverttoGRAY\else\showmessage\m!colors{11}\empty\fi
+     \ifconverttoGRAY\else\showcolormessage\m!colors{11}\empty\fi
      \converttoGRAYtrue
      \forcegrayMPcolorstrue
      \convertMPcolorsfalse
      \reduceMPcolorsfalse
    \fi\fi
-   \processaction
-     [\@@clstate]
-     [ \v!global=>\ifincolor\else\showmessage\m!colors1\colorstyle\fi
-                  \incolortrue\localcolorfalse,
-        \v!local=>\ifincolor\else\showmessage\m!colors2\colorstyle\fi
-                  \incolortrue\localcolortrue,
-        \v!start=>\ifincolor\else\showmessage\m!colors1\colorstyle\fi
-                  \incolortrue\localcolorfalse
-                  \let\@@clstate\v!global,
-         \v!stop=>\incolorfalse\localcolorfalse
-                  \forcegrayMPcolorstrue]%
+   \doifelse\@@clstate\v!stop
+     {\incolorfalse\forcegrayMPcolorstrue}%
+     {\ifincolor\else\showcolormessage\m!colors1\colorstyle\fi\incolortrue\let\@@clstate\v!start}%
    \dosetupcolormodel
    \initializemaintextcolor}
 
@@ -400,7 +386,7 @@
 
 \def\dodefinepalet[#1][#2]%
   {\doifassignmentelse{#2}
-     {%\showmessage\m!colors6{#1}%
+     {%\showcolormessage\m!colors6{#1}%
       \letvalue{\??pa#1}\empty
       \setevalue{\??pa\??pa#1}{#2}%
       \def\dodododefinepalet[##1=##2]%
@@ -448,7 +434,7 @@
    \else\ifcsname\??pa\currentpalet\endcsname
      \edef\currentpalet{#1:}%
    \else
-     \showmessage\m!colors7\currentpalet
+     \showcolormessage\m!colors7\currentpalet
      \let\currentpalet\empty
    \fi\fi}
 
@@ -695,11 +681,6 @@
     \def\MPcolor#1{(0,0,0)}
 \fi
 
-%D \macros
-%D   {PDFcolor,FDFcolor}
-%D
-%D Similar alternatives are avaliable for \PDF:
-
 %D For the moment we keep the next downward compatibility
 %D switch, i.e.\ expanded colors. However, predefined colors
 %D and palets are no longer expanded (which is what I wanted
@@ -791,7 +772,7 @@
 \ifx\currentcolormodel\undefined \newcount\currentcolormodel \fi
 
 \def\setcolormodel#1%
-  {\showmessage\m!colors1{#1}%
+  {\showcolormessage\m!colors1{#1}%
    \currentcolormodel\ctxlua{tex.print(colors.setmodel('colormodel','#1',\ifweightGRAY true\else false\fi))}%
    \dosetattribute{colormodel}{\the\currentcolormodel}}
 
@@ -859,8 +840,8 @@
 
 \def\deactivatecolor
   {\let\currentcolorname\s!black
-   \doresetattribute\s!color
-   \doresetattribute\s!transparency}
+   \attribute\colorattribute\attributeunsetvalue
+   \attribute\transparencyattribute\attributeunsetvalue}
 
 \def\dodefinecolorcommand#1#2%
   {\unexpanded#1{#2}{\doactivatecolor{#2}}}
@@ -869,41 +850,41 @@
 \setfalse\collectcolorsinlist
 \def\collectcolorinlist#1{\doglobal\addtocommalist{#1}\colorlist}
 
-\def\doregistercolor#1#2{\ctxlua{ctx.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}}
+\def\doregistercolor#1#2{\ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}}
 
 \def\dodefinecolor[#1][#2]%
   {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
-   \ctxlua{ctx.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
+   \ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
    \dodefinecolorcommand\setvalue{#1}}
 
 \def\dodefineglobalcolor[#1][#2]%
   {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
-   \ctxlua{ctx.defineprocesscolor("#1","#2",true,\iffreezecolors true\else false\fi)}%
+   \ctxlua{colors.defineprocesscolor("#1","#2",true,\iffreezecolors true\else false\fi)}%
    \dodefinecolorcommand\setgvalue{#1}}
 
 \def\dodefinenamedcolor[#1][#2]%
   {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
-   \ctxlua{ctx.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
+   \ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
    \dodefinecolorcommand\setvalue{#1}}
 
 \def\dodefinespotcolor[#1][#2][#3]%
   {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
-   \ctxlua{ctx.definespotcolor("#1","#2","#3",true)}%
+   \ctxlua{colors.definespotcolor("#1","#2","#3",true)}%
    \dodefinecolorcommand\setxvalue{#1}}
 
 \def\dodefinemultitonecolor[#1][#2][#3][#4]%
-  {\ctxlua{ctx.definemultitonecolor("#1","#2","#3","#4",true)}%
+  {\ctxlua{colors.definemultitonecolor("#1","#2","#3","#4",true)}%
    \dodefinecolorcommand\setxvalue{#1}}
 
 \def\dodefinetransparency[#1][#2]%
-  {\ctxlua{ctx.definetransparency("#1",#2)}}
+  {\ctxlua{colors.definetransparency("#1",#2)}}
 
 \def\dosetrastercolor#1% slow, we need a fast one
   {\edef\@@rastervalue{#1}%
    \ifx\@@rastervalue\empty
      \let\@@rastervalue\@@rsscreen
    \fi
-   \dosetattribute\s!color{\ctxlua{tex.sprint(ctx.definesimplegray("_raster_",\@@rastervalue))}}}
+   \dosetattribute\s!color{\ctxlua{tex.sprint(colors.definesimplegray("_raster_",\@@rastervalue))}}}
 
 %D \macros
 %D   {doifcolorelse, doifcolor}
@@ -936,7 +917,7 @@
 %D A bit like \type {\definedfont}:
 
 \unexpanded\def\colored[#1]%
-  {\ctxlua{ctx.defineprocesscolor("@colored@","#1",false,false)}%
+  {\ctxlua{colors.defineprocesscolor("@colored@","#1",false,false)}%
    \groupedcommand{\doactivatecolor{@colored@}}{}}
 
 %D \macros
@@ -965,37 +946,15 @@
 %D \stopregistercolor
 %D \stoptyping
 
+% can be cleaned up
+
 \let\maintextcolor     \empty
 \def\defaulttextcolor  {black}
 \def\@@themaintextcolor{themaintextcolor}
 
-\def\startregistercolor[#1]%
-  {\doifelsenothing{#1}
-     {\let\stopregistercolor\relax}
-     {\edef\stopregistercolor
-        {\dosetattribute\s!color       {\dogetattribute\s!color       }%
-         \dosetattribute\s!transparency{\dogetattribute\s!transparency}}%
-      \doactivatecolor{#1}}}
-
-\let\resynccolor  \relax % ?
-\let\pushcolor    \relax
-\let\popcolor     \relax
-\let\popsplitcolor\relax
-
-\def\restorecolormode
-  {\ifincolor
-     \deactivatecolor
-     \ifx\maintextcolor\empty \else
-       \doactivatecolor\maintextcolor
-     \fi
-   \fi}
-
-\let\pushpostponedpagecolor\relax
-\let\poppostponedpagecolor \relax
-
-\appendtoks\deactivatecolor\to\everybeforeoutput % maybe we don't need push pop now
+\appendtoks\deactivatecolor\to\everybeforeoutput
 
-\def\startregistercolor[#1]%
+\def\startregistercolor[#1]% probably obsolete
   {\doifelsenothing{#1}
      {\let\stopregistercolor\relax}
      {\edef\stopregistercolor
@@ -1024,10 +983,6 @@
 
 \appendtoks \initializemaintextcolor \to \everyjob
 
-\def\localstarttextcolor{\normalexpanded{\noexpand\startcolor[\ifx\maintextcolor\empty\defaulttextcolor\else\maintextcolor\fi]}}
-\let\localstoptextcolor  \stopcolor
-\let\restoretextcolor    \firstofoneargument
-
 \def\dodefinepaletcolor#1#2#3%
   {\doifassignmentelse{#3}% \definepalet[test][xx={y=.4}]
      {\definecolor[\??pa#1:#2][#3]%
@@ -1071,7 +1026,7 @@
 
 \def\colorformatseparator{ }
 
-\def\MPcolor#1{\ctxlua{tex.sprint(ctx.mpcolor(\number\currentcolormodel,\number\doinheritca{#1},\number\doinheritta{#1}))}}
+\def\MPcolor#1{\ctxlua{tex.sprint(colors.mp(\number\currentcolormodel,\number\doinheritca{#1},\number\doinheritta{#1}))}}
 
 \let\currentcolorname\s!black % todo
 \let\outercolorname  \s!black % todo
@@ -1079,33 +1034,18 @@
 \def\thecolorattribute       #1{\number\csname(ca:\ifcsname(ca:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ca:#1)\endcsname#1\fi\fi)\endcsname}
 \def\thetransparencyattribute#1{\number\csname(ta:\ifcsname(ta:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ta:#1)\endcsname#1\fi\fi)\endcsname}
 
-\def\PDFcolor     #1{\ctxlua{tex.sprint(ctx.pdfcolor     (\number\currentcolormodel, \thecolorattribute{#1}))}}
-\def\PDFcolorvalue#1{\ctxlua{tex.sprint(ctx.pdfcolorvalue(\number\currentcolormodel, \thecolorattribute{#1}))}}
-\def\FDFcolor     #1{\ctxlua{tex.sprint(ctx.fdfcolor     (\number\currentcolormodel, \thecolorattribute{#1}))}}
-
-\def\internalspotcolorname#1{\ctxlua{tex.sprint(ctx.spotcolorname (\thecolorattribute{#1}))}}
-\def\internalspotcolorsize#1{\ctxlua{tex.sprint(ctx.spotcolorvalue(\thecolorattribute{#1}))}}
-
-\def\colorcomponents       #1{\ctxlua{tex.sprint(ctx.colorcomponents       (\thecolorattribute       {#1}))}}
-\def\transparencycomponents#1{\ctxlua{tex.sprint(ctx.transparencycomponents(\thetransparencyattribute{#1}))}}
-
-\def\colorvalue#1{\ctxlua{tex.sprint(ctx.formatcolor(\thecolorattribute{#1},"\colorformatseparator"))}}
-\def\grayvalue #1{\ctxlua{tex.sprint(ctx.formatgray (\thecolorattribute{#1},"\colorformatseparator"))}}
+\def\internalspotcolorname  #1{\ctxlua{tex.sprint(colors.spotcolorname  (\thecolorattribute{#1}))}}
+\def\internalspotcolorparent#1{\ctxlua{tex.sprint(colors.spotcolorparent(\thecolorattribute{#1}))}}
+\def\internalspotcolorsize  #1{\ctxlua{tex.sprint(colors.spotcolorvalue (\thecolorattribute{#1}))}}
 
-% \definecolor[foo][black] {\red red {\foo (\doifblackelse{foo}{YES}{NO} \doifdrawingblackelse{YES}{NO}) black} red}
-% \definecolor[foo][green] {\red red {\foo (\doifblackelse{foo}{YES}{NO} \doifdrawingblackelse{YES}{NO}) green} red}
+\def\colorcomponents       #1{\ctxlua{tex.sprint(colors.colorcomponents       (\thecolorattribute       {#1}))}}
+\def\transparencycomponents#1{\ctxlua{tex.sprint(colors.transparencycomponents(\thetransparencyattribute{#1}))}}
 
-\def\doifblackelse       #1{\ctxlua{commands.doifelse(ctx.isblack(\thecolorattribute{#1}))}}
-\def\doifdrawingblackelse  {\ctxlua{commands.doifelse(ctx.isblack(tex.attribute[attributes.numbers['color']]))}}
+\def\colorvalue#1{\ctxlua{tex.sprint(colors.formatcolor(\thecolorattribute{#1},"\colorformatseparator"))}}
+\def\grayvalue #1{\ctxlua{tex.sprint(colors.formatgray (\thecolorattribute{#1},"\colorformatseparator"))}}
 
-% hack, till we have adapted backend: (move it there)
-
-\def\presetPDFtransparencybynumber#1#2#3%
-  {\initializetransparency
-   \ifcase#1\else
-     \global\PDFcurrenttransparency\numexpr#1+\minusone\relax
-     \presetPDFtransparency{#2}{#3}%
-   \fi}
+\def\doifblackelse       #1{\ctxlua{commands.doifelse(colors.isblack(\thecolorattribute{#1}))}}
+\def\doifdrawingblackelse  {\ctxlua{commands.doifelse(colors.isblack(tex.attribute[attributes.numbers['color']]))}}
 
 %D \macros
 %D   {forcecolorhack}
@@ -1129,21 +1069,6 @@
 
 \unexpanded\def\forcecolorhack{\leaders\hrule\normalhskip\zeropoint}
 
-% \setupcolors[state=start]
-%
-% \starttext
-%     \defineglobalcolor[foo][black] {\red red {\foo black} red}
-%     \ctxlua{tex.print(ctx.aux.colorattribute("foo"))}
-%     \ctxlua{tex.print(ctx.aux.colorattribute("red"))}
-%     \ctxlua{tex.print(ctx.aux.colorattribute("green"))}
-%     \ctxlua{tex.print(ctx.aux.colorattribute("black"))}
-%     \definecolor[black][green] {\red red {\foo black} red}
-%     \ctxlua{tex.print(ctx.aux.colorattribute("foo"))}
-%     \ctxlua{tex.print(ctx.aux.colorattribute("red"))}
-%     \ctxlua{tex.print(ctx.aux.colorattribute("green"))}
-%     \ctxlua{tex.print(ctx.aux.colorattribute("black"))}
-% \stoptext
-
 %D We default to the colors defined in \module{colo-rgb} and
 %D support both \cap{RGB} and \cap{CMYK} output. As you can
 %D see, color support is turned off by default. Reduction of
@@ -1170,6 +1095,10 @@
     \setupcolors[\c!state=\v!start]% later direct
 \to \everyjob
 
+\appendtoks
+    \let\showcolormessage\showmessage
+\to \everyjob
+
 \setupcolors
   [\c!state=\v!stop, % in mkii: \v!stop
    \c!conversion=\v!yes,
diff --git a/tex/context/base/cont-log.tex b/tex/context/base/cont-log.tex
index 27f3b1134..a22c1d2c4 100644
--- a/tex/context/base/cont-log.tex
+++ b/tex/context/base/cont-log.tex
@@ -292,4 +292,18 @@
 \let\LUATEX   \luaTeX
 \let\XETEX    \XeTeX
 
+\def\MkApproved
+  {\rotate
+     [\c!rotation={\ifnum\texengine=\luatexengine\ctxlua{tex.write(45-45*\the\luatexversion/100)}\else0\fi},
+      \c!align=\v!middle,
+      \c!foregroundstyle=\v!type,
+      \c!foregroundcolor=darkred,
+      \c!frame=\v!on,
+      \c!offset=1ex,
+      \c!background=\v!color,
+      \c!backgroundcolor=lightgray,
+      \c!framecolor=darkred,
+      \c!rulethickness=2pt]
+     {Mk\ifnum\texengine=\luatexengine IV\else II\fi\\approved}}
+
 \protect \endinput
diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii
index 6af6de4b6..8b5bed657 100644
--- a/tex/context/base/cont-new.mkii
+++ b/tex/context/base/cont-new.mkii
@@ -13,4 +13,7 @@
 
 \enablemode[mkii]
 
+\long\def\startluacode#1\stopluacode{}
+\long\def\ctxlua      #1{}
+
 \endinput
diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv
index 9e2ca49c0..35b716ed4 100644
--- a/tex/context/base/cont-new.mkiv
+++ b/tex/context/base/cont-new.mkiv
@@ -11,19 +11,26 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
+% 2009-07-15 / vista sp 2 / 2.2G duo dell M90 precision:
+%
+% \dorecurse{10000}{test \page} % 300 pps
+% \dorecurse {2000}{test \page} % 260 pps
+% \dorecurse  {300}{test \page} % 135 pps
+
 % \ctxlua { fonts.define.method = 2 }  % normally 3
 
 \enablemode[mkiv] \setsystemmode{mkiv}
 
-% there is more code here that is wise, but first we need to split
-% more modules in mkii/mkiv
-
 % potential new defaults:
-
+%
 % \setbreakpoints[compound]
 
 \unprotect
 
+% % % % % % needs testing but saves runtime
+
+\let\checknotes\relax % probably not needed, checking already done
+
 % we need to figure this out (to be discussed)
 
 \unexpanded\def\textminus
@@ -46,82 +53,6 @@
 % \def\pagedir{\expandafter\gobblethreearguments}
 % \def\bodydir{\expandafter\gobblethreearguments}
 
-% we have to make an mkii/mkiv core-not
-
-\ifx\definestructurecounter\undefined
-
-\def\dochecknote % only to be called locally, some bools will become class-ones
-  {% for the moment no mixed text/endnotes modes, so we use
-   % \footnoteparameter and not \noteparameter (**)
-   \setnotedistance
-   \edef\notelocationasked{\noteparameter\c!location}% can be set
-   \count\currentnoteins\plusthousand
-   \expdoifcommonelse{\v!columns,\v!lastcolumn}\notelocationasked
-     {\chardef\clevernotes\plustwo}
-     {\expdoifinsetelse\v!firstcolumn\notelocationasked
-        {\chardef\clevernotes\plusone}%
-        {\chardef\clevernotes\zerocount}}%
-   \ifcase\clevernotes\relax
-     % notes not in column areas
-     \ifnum\noteparameter\c!n=\zerocount % no ifcase
-       \settextnotes
-       \scratchcounter\plusone
-     \else
-       \setcolumnnotes
-       \scratchcounter\noteparameter\c!n\relax
-       \divide\count\currentnoteins \scratchcounter
-     \fi
-     \global\endnotesfalse
-     \expdoifinsetelse\v!page\notelocationasked
-       {\expdoifinsetelse\v!high\notelocationasked
-          {\global\bottomnotesfalse}
-          {\global\bottomnotestrue}}
-       {\global\endnotestrue
-        \global\bottomnotestrue}% not: \postponenotes, else global
-    \else
-      % notes in column areas
-      \ifnum\@@kln=\zerocount % no ifcase / brrr dependency on \??kl
-        \scratchcounter\plusone
-      \else
-        \scratchcounter\footnoteparameter\c!n\relax % **
-      \fi
-      \global\endnotesfalse
-      \global\bottomnotestrue
-      \setclevernotes
-   \fi
-   \doifsomething{\noteparameter\c!factor}
-     {\ifnum\noteparameter\c!factor<\zerocount\else
-        \count\currentnoteins\noteparameter\c!factor
-      \fi}%
-   \ifnotelimit
-     \dimen\currentnoteins\noteparameter\c!height
-     \multiply\dimen\currentnoteins \scratchcounter
-   \fi
-   \ifendnotes
-     \dimen\currentnoteins\maxdimen
-     \count\currentnoteins\zerocount
-     \skip \currentnoteins\zeropoint
-   \fi}
-
-\fi
-
-\ifx\clearmarks\undefined
-    \def\clearmarks  {\begingroup\afterassignment\doclearmarks\scratchcounter}
-    \def\doclearmarks{\normalmarks\scratchcounter{}\endgroup}
-\fi
-
-\ifx\@@trk\undefined \else
-
-    \def\resetmark#1% we cannot use \normalmarks#1{}
-      {\global\@EA\chardef\csname\@@mrk\string#1\endcsname\zerocount
-       \@EA\clearmarks\csname\@@prk\string#1\endcsname
-       \global\@EA\let\csname\@@trk\string#1\endcsname\empty
-       \global\@EA\let\csname\@@frk\string#1\endcsname\empty
-       \global\@EA\let\csname\@@brk\string#1\endcsname\empty
-       \global\@EA\let\csname\@@crk\string#1\endcsname\empty}
-
-\fi
-
 %D Since this can be a showstopper, we report the path at the beginning
 %D as well as at the end of a run.
 
@@ -169,12 +100,12 @@
 %     remapper.define('encoding','^qtm','^(.*)$','q-\letterpercent1')
 % }
 
-\appendtoksonce \loadallXfontmapfiles \to \everyPDFxform
-\appendtoksonce \loadallXfontmapfiles \to \everyPDFximage
-\appendtoksonce \loadallXfontmapfiles \to \everystarttext
-\appendtoksonce \loadallXfontmapfiles \to \everybeforepagebody
+% \appendtoksonce \loadallXfontmapfiles \to \pdfbackendeveryximage
+% \appendtoksonce \loadallXfontmapfiles \to \pdfbackendeveryxform
+% \appendtoksonce \loadallXfontmapfiles \to \everystarttext
+% \appendtoksonce \loadallXfontmapfiles \to \everybeforepagebody
 
-\def\loadallXfontmapfiles{\ctxlua{fonts.map.flush("pdftex")}}
+% \def\loadallXfontmapfiles{\ctxlua{fonts.map.flush("pdftex")}}
 
 % \ctxlua{
 %     do
diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex
index 378eed523..9c729629c 100644
--- a/tex/context/base/cont-new.tex
+++ b/tex/context/base/cont-new.tex
@@ -11,7 +11,7 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-\newcontextversion{2009.06.13 14:03}
+\newcontextversion{2009.07.17 13:16}
 
 %D This file is loaded at runtime, thereby providing an
 %D excellent place for hacks, patches, extensions and new
@@ -28,8 +28,6 @@
 % \font\f=dummyfont  \rpcode\f0=500 \hbox{..}\char0
 % todo: mp-new
 % caption: grid=top|bottom in xml defs
-
-\let\then\relax % \ifnum1>2\then -)
 
 \def\fastscale#1%
   {\begingroup
@@ -74,35 +72,6 @@
      \fi
    \relax}
 
-% maybe to be integrated (option=...)
-
-\def\directexternalfigure
-  {\dodoubleempty\dodirectexternalfigure}
-
-\def\dodirectexternalfigure[#1][#2]%
-  {\bgroup
-   \getparameters[\??ef][\c!type=\splitofftype,\c!page=1,#2]%
-   \sanitizefilename#1\to\expandedfigurename
-   \splitfilename\expandedfigurename
-   \let\@@DriverImageWidth  \!!zeropoint
-   \let\@@DriverImageHeight \!!zeropoint
-   \let\@@DriverImageFile   \splitofffull
-   \let\@@DriverImageType   \@@eftype
-   \let\@@DriverImageMethod \@@eftype
-   \let\@@DriverImageLabel  \empty
-   \let\@@DriverImagePage   \@@efpage
-   \doinsertfile
-   \egroup}
-
-% \directexternalfigure[cow.pdf]
-
-% normally one does not want this to happen nested, maybe there
-% is more; non public vars btw, will become conditionals
-
-\ifx\writetoregisterfalse\undefined \else \appendtoks \writetoregisterfalse \to \everybeforeutilityread \fi
-\ifx\writetolistfalse    \undefined \else \appendtoks \writetolistfalse     \to \everybeforeutilityread \fi
-\ifx\notesenabledfalse   \undefined \else \appendtoks \notesenabledfalse    \to \everybeforeutilityread \fi
-
 % \setuplabeltext[\s!itemcount1={{I(},{)}}]
 % \def\labeledcountervalue#1{\labeltexts{#1}{\countervalue{#1}}}
 
@@ -213,132 +182,6 @@
 %
 % \shapesynonym{eacute}
 
-% \page[left]
-% \definecolumntextarea[intro][left][x=1,y=1,nx=4,ny=20,state=start,background=introlayer]
-% \setupcolumntextareatext[intro][left][\setups{intro}]
-% \flushcolumntextareas
-
-\def\flushcolumntextareas
-  {\initializecolumntextareas
-   \setvsize}
-
-%D (Inspired by a discussion on the \CONTEXT\ mailing list)
-%D
-%D In \TEX\ each character can have one of 16 catcodes. This way the
-%D backslash, dollar, ampersand, hash and some more characters get
-%D their  special meaning. If you want to process tokens under a
-%D certain catcode  regime, passing arguments can interfere badly.
-%D
-%D \startbuffer[a]
-%D \def\whatever#1{[#1]}
-%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
-%D \stopbuffer
-%D
-%D \typebuffer[a]
-%D
-%D Here we pass an argument to \type {\whatever} but part of that
-%D argument is to be processed under a different catcode regime, i.e.\
-%D all characters that need to be typeset verbatim need to get
-%D the catcode that makes it a letter. This is what we get when we typeset
-%D the text verbatim:
-%D
-%D \starttyping
-%D whatever \type {\whatever{you want}} $or$ not!
-%D \stoptyping
-%D
-%D However, when passed to \type {\whatever} we get:
-%D
-%D \getbuffer[a]
-%D
-%D In \ETEX\ one can use  \type {\scantokens} to circumvent this problem.
-%D
-%D \startbuffer[b]
-%D \def\rescan#1{\scantokens{#1}}
-%D \def\whatever#1{[\rescan{#1}]}
-%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
-%D \stopbuffer
-%D
-%D \getbuffer[b] \typebuffer[b]
-%D
-%D This time the \type {\whatever} call gives:
-%D
-%D \getbuffer[b]
-%D
-%D In this example, two spaces have crept in. The first one, after the
-%D macro name, is inserted by \TEX\ and cannot be avoided. The last space
-%D is inserted by \type {\scantokens}, and is the consequence of the fact
-%D that this macro mimics reading from a file. You can avoid the last
-%D space by a slightly different definition:
-%D
-%D \startbuffer[c]
-%D \def\rescan#1{\scantokens{#1\ignorespaces}}
-%D \def\whatever#1{[\rescan{#1}]}
-%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
-%D \stopbuffer
-%D
-%D \typebuffer[c]
-%D
-%D Unfortunately we still keep the first space, but at least it's better than
-%D a failure:
-%D
-%D \getbuffer[c]
-
-\long\def\rescan#1{\scantokens{#1\ignorespaces}}
-\long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantokens{#2\ignorespaces}\endgroup}
-
-\ifx\scantextokens\undefined \else
-  \long\def\rescan#1{\scantextokens{#1}}
-  \long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantextokens{#2}\endgroup}
-\fi
-
-% In 2005 we will abandon support for font encodings that don't have
-% the ascii characters { } $ etc in their normal slot, i.e. latin modern
-% instead of computer modern. Then we can also clean up some of the ugly
-% xml internals that are a result from the need to deal with funny
-% encodings.
-%
-% a solution:
-%
-% \defineXMLargument[ctx:c]{\getXMLcharacter}
-% \defineXMLargument[ctx:e]{\getXMLentity   }
-% \defineXMLargument[ctx:u]{\unicodechar    }
-%
-% \bgroup \catcode`\<=\active \catcode`\&=\active
-%
-% \gdef\dontexpandutf
-%   {\def\getXMLcharacter##1{##1}%
-%    \def\getXMLentity   ##1{##1}%
-%    \def\unicodechar    ##1{##1}}
-%
-% \egroup
-%
-% more generic
-%
-% IS THIS STILL OK? TO BE CHECKED (UTF AND SUCH) ! ! ! !
-
-\def\XMLexpanded#1%
-  {\bgroup
-   \honorunexpanded
-%    \dontexpandencoding
-%    \dontexpandutf
-   \chardef\activecharactermode\zerocount
-   \xdef\@@globalexpanded{#1}%
-   \egroup
-   \@@globalexpanded}
-
-\def\setXMLexpandedmark#1#2% using a tok prevents unwanted expansion in mark
-  {\XMLexpanded{\scratchtoks{\enableXML#2}}%
-   \expanded{\normalsetnormalmark{#1}{\the\scratchtoks}}}
-
-% \separatestring123 456\to\test [\test]
-
-% \def\separatestring#1\to#2%
-%   {\let#2\empty
-%    \def\docommand##1{\edef#2{\ifx#2\empty\else#2,\fi##1}}%
-%    \processseparatedlist[#1][ ]\docommand}
-%
-% \processseparatedlist[aap noot][]\ruledhbox
-
 % this will be activated when
 
 % \newinsert\thispageinsert % <- installinsertion
@@ -509,7 +352,7 @@
      \expandafter#1%
    \fi}
 
-\gdef\collapsespaces%
+\gdef\collapsespaces
   {\prependtoksonce\relax\to\everyeof%
    \ignorelines%
    \ignoretabs%
@@ -518,165 +361,6 @@
 
 \egroup
 
-% no, wrong! never!
-%
-% \def\tightlayer[#1]%
-%   {\begingroup
-%    \def\currentlayer{#1}% todo: left/right
-%    \setbox\nextbox\emptybox        % hoogte/breedte are \wd\nextbox/\ht\nextbox
-%    \hsize\layerparameter\c!width   % \overlaywidth   = \hsize
-%    \vsize\layerparameter\c!height  % \overlaywheight = \vsize
-%    \hbox to \hsize{\composedlayer{#1}}%
-%    \endgroup}
-
-% todo : share symbols
-
-% \definecolor[rollover:n][red]
-% \definecolor[rollover:r][green]
-% \definecolor[rollover:d][blue]
-
-\definepalet
-  [rollover]
-  [n=red,
-   r=green,
-   d=blue]
-
-% \newcounter\nofrollovers
-%
-% \def\dorollbutton[#1][#2]#3[#4]%
-%   {\dontleavehmode
-%    \bgroup
-%    \doglobal\increment\nofrollovers
-%    \unexpanded\def\dosetlocationbox[##1]##2[##3]%
-%      {\getparameters[##1][##3]%
-%       \definecolor[rollover][rollover:##2]%
-%       \let\next\hbox
-%       \doif{##2}{n}
-%         {\doifvalue{##1\c!variant}\v!verborgen{\let\next\phantom}}%
-%       \next
-%         {\localframed[##1]
-%            [\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]%
-%            {\dolocationattributes{##1}\c!style\c!color{#3}}}}%
-%    \iffirstargument
-%      \ifsecondargument
-%        \def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[#2]}%
-%      \else
-%        \doifassignmentelse{#1}
-%          {\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[#1]}}
-%          {\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[]}}%
-%      \fi
-%    \else
-%      \def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[]}%
-%    \fi
-%    % todo: share symbols
-%    \definesymbol[rsym:\nofrollovers:n][\setlocationbox n]%
-%    \definesymbol[rsym:\nofrollovers:r][\setlocationbox r]%
-%    \definesymbol[rsym:\nofrollovers:d][\setlocationbox d]%
-%    \nextsystemfield
-%    \setupfield
-%      [rollbutton]
-%      [\c!frame=\v!off,\c!offset=\v!overlay,\c!klickoff={#4}]%
-%    \definefield
-%      [\currentsystemfield][push][rollbutton]
-%      [rsym:\nofrollovers:n,%
-%       rsym:\nofrollovers:r,%
-%       rsym:\nofrollovers:d]%
-%    \fitfield[\currentsystemfield]%
-%    \egroup}
-
-\newcounter\nofrollovers
-\newcounter\nofrollbuttons
-
-\def\dorollbutton[#1][#2]#3[#4]%
-  {\dontleavehmode
-   \bgroup
-   \doglobal\increment\nofrollovers
-   \doglobal\increment\nofrollbuttons
-   \unexpanded\def\dosetlocationbox[##1]##2[##3]%
-     {\getparameters[##1][##3]%
-      \definecolor[rollover][rollover:##2]%
-      \doifelse{##2}{n}{\doifelsevalue{##1\c!alternative}\v!hidden\phantom\hbox}\hbox
-        {\localframed[##1]
-           [\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]%
-           {\dolocationattributes{##1}\c!style\c!color{#3}}}}%
-   \iffirstargument
-     \ifsecondargument
-       \def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[#2]}%
-     \else
-       \doifassignmentelse{#1}
-         {\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[#1]}}
-         {\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[]}}%
-     \fi
-   \else
-     \def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[]}%
-   \fi
-   % todo: share symbols, tricky since different dimensions
-   \definesymbol[rsym:\nofrollovers:n][\setlocationbox n]%
-   \definesymbol[rsym:\nofrollovers:r][\setlocationbox r]%
-   \definesymbol[rsym:\nofrollovers:d][\setlocationbox d]%
-   \setupfield
-     [rollbutton]
-     [\c!frame=\v!off,
-      \c!offset=\v!overlay,
-      \c!clickout={#4}]%
-   \definefield
-     [roll:\nofrollbuttons][push][rollbutton]
-     [rsym:\nofrollovers:n,%
-      rsym:\nofrollovers:r,%
-      rsym:\nofrollovers:d]%
-   \fitfield[roll:\nofrollbuttons]%
-   \egroup}
-
-\unexpanded\def\rollbutton
-  {\dodoubleempty\dorollbutton}
-
-% \def\do@@amrob[#1]#2\\%
-%   {\txt\rollbutton[\currentmenu]{\ignorespaces#2\unskip}[#1]\\}%
-
-% \appendtoks \let\rob\do@@amrob \to \everysetmenucommands
-
-\def\menu@rob[#1]#2\\%
-  {\@@amboxcommand\rollbutton[\currentmenu]{\ignorespaces#2\unskip}[#1]\\}%
-
-\appendtoks \let\rob\menu@rob \to \everysetmenucommands
-
-% calls:
-%              {..} [JS..]
-% [left]       {..} [JS..]
-%        [a=b] {..} [JS..]
-% [left] [a=b] {..} [JS..]
-%
-% \setupbuttons[offset=0pt,frame=off] % alternative=hidden
-%
-% \rollbutton {Manuals}       [JS(Goto_File{show-man.pdf})]
-% \rollbutton {Articles}      [JS(Goto_File{show-art.pdf})]
-% \rollbutton {Papers}        [JS(Goto_File{show-pap.pdf})]
-% \rollbutton {Presentations} [JS(Goto_File{show-pre.pdf})]
-% \rollbutton {Resources}     [JS(Goto_File{show-res.pdf})]
-%
-% \rob [JS(...)] bla bla \\
-
-\unexpanded\def\overlayrollbutton
-  {\dodoubleargument\dooverlayrollbutton}
-
-\def\dooverlayrollbutton[#1][#2]%
-  {\bgroup
-   \nextsystemfield
-   \setupfield
-     [overlayrollbutton]
-     [\c!frame=\v!off,\c!offset=\v!overlay,\c!regionin={#1},\c!regionout={#2}]%
-   \definesymbol
-     [\currentsystemfield]
-     [{\framed[\c!frame=\v!off,\c!width=\overlaywidth,\c!height=\overlayheight]{}}]%
-   \definefield
-     [\currentsystemfield][push][overlayrollbutton][\currentsystemfield][\currentsystemfield]%
-   \fitfield[\currentsystemfield]%
-   \egroup}
-
-% \defineoverlay
-%   [ShowMenu]
-%   [{\overlayrollbutton[VideLayer{navigation}][HideLayer{navigation}]}]
-
 \def\inlinedbox
   {\bgroup
    \dowithnextbox
@@ -708,19 +392,6 @@
 
 \unexpanded\def\asciistr#1{\dontleavehmode{\defconvertedargument\ascii{#1}\verbatimfont\ascii}}
 
-% messy, will be improved:
-
-\prependtoks \setnormalcatcodes  \to \everyTEXinputmode
-\appendtoks  \processingXMLfalse \to \everyTEXinputmode
-
-\let\normalenableXML\enableXML % some day we move the normal \enableXML into the toks
-
-\prependtoks \normalenableXML    \to \everyXMLinputmode
-\appendtoks  \processingXMLtrue  \to \everyXMLinputmode
-
-\unexpanded\def\enableXML {\setinputmode[XML]} % \enableXML is used in edef's and marks
-\unexpanded\def\disableXML{\setinputmode[TEX]}
-
 \def\shapefill{\vskip\zeropoint\!!plus\lineheight\!!minus\lineheight\relax}
 
 \let\normaltype\type
@@ -771,10 +442,6 @@
    \fi \fi
    \advance\boislevel\minusone}
 
-\defineblankmethod [\v!synchronize] {\verticalstrut\vskip-2\lineheight\verticalstrut}
-
-% \vtop{\blank[synchronize]\blank[line]test}
-
 \def\minimalhbox#1#%
   {\dowithnextbox
      {\bgroup
@@ -784,28 +451,6 @@
       \egroup}
      \hbox}
 
-% manual
-%
-% externfiguur     -> grid        =ja|hoogte|diepte|halveregel|passend -> helemaal in details
-% stelplaatsblokin -> zijuitlijnen=hoogte|diepte|regel|halveregel|grid -> halveregel in 'details'
-
-% todo: switch koppelen aan par scheelt pos
-
-% to be documented: \startspread .. \stopspread
-
-% to be documented primarydef p crossed d
-% to be documented PlainTextArea
-
-% manual
-%
-% Sometimes the demands are getting pretty weird:
-%
-% \startitemize
-%   \item test
-%   \item test
-%   \headsym{xx} test \par test
-% \stopitemize
-
 % \def\dodimchoice#1#2#3%
 %   {\ifx#3\relax
 %      #1\@EA\gobbleuntilrelax
@@ -853,22 +498,6 @@
 \def\showsetupsdefinition[#1]{\showvalue{\??su:#1}} % temp hack for debugging
 
 % documentation : \setupregister[alternative=a|b|A|B]
-
-\def\defineXMLstore {\doquadrupleargument\dodefineXMLstore[\saveXMLasdata]}
-\def\defineXMLgstore{\doquadrupleargument\dodefineXMLstore[\gsaveXMLasdata]}
-
-\def\dodefineXMLstore[#1][#2][#3][#4]% element attribute prefix % will become faster
-  {\defineXMLargument[#2][#3=\s!dummy]{#1{#4:\XMLop{#3}}}}
-
-\def\countXMLchildren[#1]#2%
-  {\startnointerference
-     \doglobal\newcounter\nofXMLchildren
-     \defineXMLargument[#1]{\doglobal\increment\nofXMLchildren}%
-     \startXMLignore
-       #2%
-     \stopXMLignore
-   \stopnointerference}
-
 \unprotected \def\traceposstring#1#2#3%
   {\iftracepositions
      \smashedhbox%
@@ -878,144 +507,6 @@
         \vrule\!!width4\scratchdimen\!!height\scratchdimen\!!depth\scratchdimen}%
    \fi}
 
-% It took quite a while to figure this out (using the preliminary 1.5
-% spec). There are still a lot of things to be implemented. This is
-% the third alternative.
-
-% todo: multiple instances, dus indirect
-
-\let\currentrendering\empty
-
-\definereference[StartCurrentRendering] [\v!StartRendering {\currentrendering}]
-\definereference[StopCurrentRendering]  [\v!StopRendering  {\currentrendering}]
-\definereference[PauseCurrentRendering] [\v!PauseRendering {\currentrendering}]
-\definereference[ResumeCurrentRendering][\v!ResumeRendering{\currentrendering}]
-
-\newcounter\nofexternalrenderings
-
-\def\useexternalrendering{\doquadrupleempty\douseexternalrendering}
-\def\setinternalrendering{\dodoubleempty   \dosetinternalrendering}
-
-\def\douseexternalrendering[#1][#2][#3][#4]% tag mime file options
-  {\setgvalue{\??rd:#1}{\plusone{#1}{#2}{#3}{#4}}}
-
-\def\dosetinternalrendering[#1][#2]% tag options {content}
-  {\bgroup
-   \dowithnextbox
-     {\setgvalue{\??rd:#1}{\plustwo{#1}{IRO}{#1}{#2}}%
-      \let\objectoffset\zeropoint
-      \setobject{IRO}{#1}\hbox{\box\nextbox}%
-      \egroup}%
-     \hbox}
-
-\def\checkrendering#1% let's hope that \next is not used
-  {\iflocation
-    \doifsomething{#1}%
-      {\doifdefined{\??rd:#1}%
-         {\expanded{\getvalue{\??rd::\number\renderingtype{#1}}%
-            {\filterfromvalue{\??rd:#1}52}{\filterfromvalue{\??rd:#1}53}%
-            {\filterfromvalue{\??rd:#1}54}{\filterfromvalue{\??rd:#1}55}}}}%
-   \fi}
-
-\setvalue{\??rd::1}{\doinsertrendering}
-\setvalue{\??rd::2}{\doinsertrenderingobject}
-
-\def\renderingtype   #1{\filterfromvalue{\??rd:#1}51}
-\def\renderingoptions#1{\filterfromvalue{\??rd:#1}55}
-
-\setexecutecommandcheck {startrendering}  \checkrendering
-\setexecutecommandcheck {stoprendering}   \checkrendering
-\setexecutecommandcheck {pauserendering}  \checkrendering
-\setexecutecommandcheck {resumerendering} \checkrendering
-
-% by using a nice trick (used in other places of context as well) we
-% can easily overload the default size to match the opbject size
-
-\def\renderingwidth {8cm}
-\def\renderingheight{6cm}
-
-\def\definerenderingwindow
-  {\dodoubleempty\dodefinerenderingwindow}
-
-\def\dodefinerenderingwindow[#1][#2]%
-  {\presetlocalframed[\??rw#1]%
-   \getparameters%
-     [\??rw#1]%
-     [\c!openpageaction=,\c!closepageaction=,%
-      \c!width=\renderingwidth,\c!height=\renderingheight,%
-      #2]}
-
-\def\setuprenderingwindow
-  {\dodoubleargument\dosetuprenderingwindow}
-
-\def\dosetuprenderingwindow[#1]%
-  {\getparameters[\??rw#1]}
-
-\def\placerenderingwindow
-  {\dodoubleempty\doplacerenderingwindow}
-
-\def\doplacerenderingwindow[#1][#2]%
-  {\bgroup
-   \edef\currentrendering{\ifsecondargument#2\else#1\fi}%
-   \ifcase\renderingtype\currentrendering\or
-     % a file
-   \or
-     % an object
-     \getobjectdimensions{IRO}\currentrendering
-     \scratchdimen\objectheight
-     \advance\scratchdimen\objectdepth
-     \edef\renderingheight{\the\scratchdimen}%
-     \edef\renderingwidth{\objectwidth}%
-   \fi
-   % create fall back if needed
-   \doifdefinedelse{\??rw#1\c!width}
-     {\def\currentrenderingwindow{#1}}
-     {\let\currentrenderingwindow\s!default
-      \definerenderingwindow[\currentrenderingwindow]}%
-   \checkrendering\currentrendering
-   \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!openpageaction }}\dosetuprenderingopenpageaction
-   \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!closepageaction}}\dosetuprenderingclosepageaction
-   \localframed
-     [\??rw\currentrenderingwindow][\c!offset=\v!overlay]%
-     {\expanded{\doinsertrenderingwindow
-        \noexpand\currentrendering\hsize\vsize{\renderingoptions\currentrendering}}}%
-   \egroup}
-
-% todo:
-%
-% \setinternalrendering[example-1][options]{}
-
-% test file:
-%
-% \definerenderingwindow
-%   [example]
-%   [width=320pt,height=150pt,frame=off,
-%    background=color,backgroundcolor=gray,
-%    openpageaction=StartCurrentRendering,
-%    closepageaction=NextPage]% StopCurrentRendering]
-%
-% \useexternalrendering[example-1][audio/mpeg]                   [eldorado.mp3]
-% \useexternalrendering[example-2][audio/mpeg]                   [myst-12.mp3]
-% \useexternalrendering[example-3][application/x-shockwave-flash][http://localhost/mb.swf] [auto]
-% \useexternalrendering[example-4][application/x-shockwave-flash][celebration.swf]
-% \useexternalrendering[example-5][video/quicktime]              [p1000726.mov]
-% \useexternalrendering[example-6][application/smil]             [quadratic_map.smi]
-%
-% \def\renderingmenu[#1]%
-%   {\hbox
-%      {\setupbuttons[width=2.5em]%
-%       \button{\symbol[StartRendering]} [StartRendering{#1}]\enspace
-%       \button{\symbol[StopRendering]}  [StopRendering{#1}]\enspace
-%       \button{\symbol[PauseRendering]} [PauseRendering{#1}]\enspace
-%       \button{\symbol[ResumeRendering]}[ResumeRendering{#1}]}}
-%
-% \renderingmenu[example-1]\blank
-% \renderingmenu[example-2]\blank
-% \renderingmenu[example-3]\blank
-% \renderingmenu[example-4] \placefigure{A ShockWave}{\placerenderingwindow[example][example-4]} \page
-% \renderingmenu[example-5] \placefigure{A Movie}{\placerenderingwindow[example][example-5]} \page
-% \renderingmenu[example-6] \placefigure{A Smile}{\placerenderingwindow[example][example-6]}
-
 % will be a MyWay
 %
 % \setuplayout[grid=yes] \setupcaption[figure][inbetween=] \useMPlibrary[dum] \setupcolors[state=start]
@@ -1118,94 +609,12 @@
   {\endgraf\verticalstrut\endgraf\kern-2\lineheight
    \egroup}
 
-\def\definepushbutton % name optional setup
-  {\dodoubleempty\dodefinepushbutton}
-
-\def\dodefinepushbutton[#1][#2]% name setup
-  {\dododefinepushbutton{#1}{n}{push}%
-   \dododefinepushbutton{#1}{r}{\symbol[psym:#1:n]}%
-   \dododefinepushbutton{#1}{d}{\symbol[psym:#1:r]}%
-   \setvalue{pushbutton:#1}{\dohandlepushbutton{#1}{#2}}}
-
-\def\dododefinepushbutton#1#2#3%
-  {\doifsymboldefinedelse{psym:#1:#2}%
-     \donothing{\definesymbol[psym:#1:#2][{#3}]}}
-
-\def\definepushsymbol
-  {\dotripleargument\dodefinepushsymbol}
-
-\def\dodefinepushsymbol[#1][#2]% [#3]
-  {\definesymbol[psym:#1:#2]}
-
-\def\dopushbutton[#1][#2]%
-  {\executeifdefined{pushbutton:#1}\gobbleoneargument{#2}}
-
-\def\pushbutton
-  {\dodoubleargument\dopushbutton}
-
-\def\dohandlepushbutton#1#2#3% identifier setup script
-  {\bgroup
-   \nextsystemfield
-   \setupfield
-     [pushbutton]
-     [\c!frame=\v!overlay,
-      \c!offset=\v!overlay,
-      \c!clickout=#3,#2]%
-   \definefield
-     [\currentsystemfield]
-     [push]
-     [pushbutton]
-     [psym:#1:n,psym:#1:r,psym:#1:d]%
-   \fitfield
-     [\currentsystemfield]%
-   \egroup}
-
-% \def\do@@ampsh
-%   {\dodoubleargument\dodo@@ampsh}
-%
-% \def\dodo@@ampsh[#1][#2]#3\\%
-%   {\txt\pushbutton[#1][#2]\\}%
-%
-%\appendtoks \let\psh\do@@ampsh \to \everysetmenucommands
-
-\def\@@ampsh{\txt\pushbutton}
-
-\appendtoks \let\psh\@@ampsh \to \everysetmenucommands
-
-% \definepushbutton [reset]
-%
-% \definepushsymbol [reset] [n] [\uniqueMPgraphic{whatever}{color=green}]
-% \definepushsymbol [reset] [r] [\uniqueMPgraphic{whatever}{color=white}]
-%
-% \startinteractionmenu[bottom]
-%   \psh [reset] [JS(reset_something)] \\
-% \stopinteractionmenu
-
 \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
 
-% todo: \setupinterlinespace[\c!regel=\v!vast] => ==\the\baselineskip
-
-%%%%%%%% todo: \chardef\snapstruts=1 => d=l-h
-
-\def\useMPvariables
-  {\dodoubleargument\douseMPvariables}
-
-\def\douseMPvariables[#1][#2]%
-  {\def\@@meta{#1:}%
-   \prepareMPvariables{#2}}
-
-\def\processlinetableXMLfile#1%
-  {\bgroup
-   \let\startlinetable\donothing
-   \let\stoplinetable \donothing
-   \startlinetableanalysis\processXMLfile{#1}\stoplinetableanalysis
-   \startlinetablerun     \processXMLfile{#1}\stoplinetablerun
-   \egroup}
-
 % experimental: \synchronizegrid bla bla bla
 
 \newcounter\currentgridsync
@@ -1241,13 +650,10 @@
   %  \message{no grid correction: \the\scratchdimen}\wait
    \fi}
 
-% needed for extreme
+% needed for extreme (will go away)
 
 \definesystemvariable{ie}
 
-% \def\definetest[#1]#2%
-%   {\long\setvalue{\??ie#1}{#2}}
-
 \def\definetest
   {\dodoubleempty\dodefinetest}
 
@@ -1257,13 +663,13 @@
       \processaction
         [#2]
         [% first test true, rest depends
-         \v!next=>\setgvalue{\??ie#1}{\setgvalue{\??ie#1}{#3}\firstoftwoarguments},
+            \v!next=>\setgvalue{\??ie#1}{\setgvalue{\??ie#1}{#3}\firstoftwoarguments},
          % rest true if first true
          % \v!first=>\setgvalue{\??ie#1}{#3{\letgvalue{\??ie#1}%
-         %              \firstoftwoarguments\firstoftwoarguments}%
-         %              \secondoftwoarguments},
+         %           \firstoftwoarguments\firstoftwoarguments}%
+         %           \secondoftwoarguments},
          % always true
-               \v!yes=>\letgvalue{\??ie#1}\firstoftwoarguments,
+             \v!yes=>\letgvalue{\??ie#1}\firstoftwoarguments,
          % always false
               \v!no=>\letgvalue{\??ie#1}\secondoftwoarguments]%
    \fi}
@@ -1296,42 +702,13 @@
 %    \tableifelse{\doifelse{a}{a}}{\NC Xtest \NC test \NC \NR}{}%
 %    \stoptabulate}
 
-\long \def\tableifelse#1%
+\long\def\tableifelse#1%
   {\TABLEnoalign{#1%
      {\aftergroup \firstoftwoarguments}%
      {\aftergroup\secondoftwoarguments}}}
 
-% \long \def\tableif#1% whow, this is real ugly
-%   {\TABLEnoalign{\let\gnext\gobbleoneargument#1%
-%      {\let\gnext\firstofoneargument}}\gnext}
-
 \long \def\tableiftextelse#1{\tableifelse{\doiftextelse{#1}}}
 
-\def\expandifnonempty#1%
-  {\@EA\ifx\csname#1\endcsname\empty
-     \expandafter\secondoftwoarguments
-   \else
-     \expandafter\firstoftwoarguments
-   \fi
-   {\csname#1\endcsname}}
-
-\def\@@sectiekoppeling#1%
-  {\expandifnonempty{\??ko#1\c!coupling}{#1}}
-
-\def\@@sectiesectie#1%
-  {\expandifnonempty{\??ko#1\c!section}{\@@sectiekoppeling{#1}}}
-
-\def\sectioncountervalue#1%
-  {\@@sectionvalue{\@@sectiesectie{#1}}}
-
-% todo namespace \@@meta:#1:... ! ! ! ! ! !
-
-\def\presetMPvariable
-  {\dodoubleargument\dopresetMPvariable}
-
-\def\dopresetMPvariable[#1][#2=#3]%
-  {\doifundefined{#1:#2}{\setvalue{#1:#2}{#3}}}
-
 % experiment, not yet to be used
 
 \def\displaybreak
@@ -1347,30 +724,6 @@
 \def\tightvbox{\dowithnextbox{\nextboxdp\zeropoint\flushnextbox}\vbox}
 \def\tightvtop{\dowithnextbox{\nextboxht\zeropoint\flushnextbox}\vtop}
 
-% \translateMPinput{il2-pl}
-%
-% \startMPenvironment[global]
-%   \setupbodyfont[plr]
-% \stopMPenvironment
-%
-% \TeX:  
-%
-% \startMPcode
-% draw btex MetaPost:   etex scaled 5 ;
-% \stopMPcode
-
-% now in cont-loc.tex, for the sake of testing.
-%
-% %D When \type {\somecolor} is issued, we can savely assume
-% %D grouping. Using \type {\groupedcommand} here (i.e.\ the
-% %D definition of \type {\color}) is unsafe because in
-% %D interferes with for instance switching attributes.
-%
-% \def\switchtocolor[#1]%
-%   {\bgroup\startcolor[#1]
-%    \aftergroup\stopcolor
-%    \aftergroup\egroup}
-
 % what is this stupid macro meant for:
 
 \def\hyphenationpoint
@@ -1502,8 +855,6 @@
    \egroup
    \synchronizehsize}
 
-% todo : hoe komt box er uit
-
 \long\def\startexternalfigure
   {\dotripleempty\dostartexternalfigure}
 
@@ -1538,6 +889,18 @@
 %% \def\changedpage#1%
 %%   {\getvalue{\s!paragraph:p:#1}}
 
+\newcount\nofprofiled
+
+\def\profilemacro#1%
+  {\nofprofiled\zerocount
+   \letvalue{\string#1\string#1}#1%
+   \appendtoks
+     \normalwritestatus\m!systems{profile \string#1: \number\nofprofiled}%
+   \to \everystoptext
+   \unexpanded\def#1%
+     {\global\advance\nofprofiled\plusone
+      \csname\string#1\string#1\endcsname}}
+
 % incomplete, will be a special case of float placement
 
 \def\startfixed{\dosingleempty\dostartfixed}
@@ -1555,7 +918,7 @@
      \processaction
        [#2]
        [   \v!high=>\bbox   {\flushnextbox},
-           \v!low=>\tbox   {\flushnextbox},
+           \v!low=>\tbox    {\flushnextbox},
          \v!middle=>\vcenter{\flushnextbox},
            \v!lohi=>\vcenter{\flushnextbox},
         \s!unknown=>\tbox   {\flushnextbox},
@@ -1596,44 +959,29 @@
 %
 % \stopitemize
 
-% still needed for uguide
-
-\let\placefloatlabel          \placefloatcaption
-\let\placefloatlabeltext      \placefloatcaptiontext
-\let\placefloatlabelreference \placefloatcaptionreference
-
 \def\obeyfollowingtoken{{}}  % end \cs scanning
 
-\def\gobbleparameters{\doquadrupleempty\dogobbleparameters}
-\def\dogobbleparameters[#1][#2][#3][#4]{}
-
-% documentation
-
-% \starttable[|||]
-% \HL
-% \VL test \VS test \VL \FR
-% \VL test \VD test \VL \MR
-% \VL test \VT test \VL \LR
-% \HL
-% \stoptable
-
-%D To be documented, \type {\includemenu[menu]}.
-%D To be documented, \type {\emphbf} cum suis.
-
-%D For Ton. To be documented.
-
-\def\plaatsexterndocument[#1]%
-  {\def\doexternaldocument##1##2##3{\readlocfile{##2}\donothing\donothing}%
-   \getvalue{\v!file:::#1}}
-
-%D Far from complete.
-
-\def\startgeheel
-  {\startlinecorrection
-   \insidefloattrue}
-
-\def\stopgeheel
-  {\stoplinecorrection}
+% \def\comparedimension#1#2%
+%   {\chardef\compresult
+%      \ifdim#1<#2%
+%        \zerocount
+%      \else\ifdim#1<#2%
+%        \plusone
+%      \else
+%        \plustwo
+%      \fi\fi}
+% \newdimen\roundingeps \roundingeps=10sp
+% \def\comparedimensioneps#1#2%
+%   {\chardef\compresult
+%      \ifdim\dimexpr(#1-#2)<\roudingeps
+%        \zerocount
+%      \else\ifdim\dimexpr(#2-#1)<\roudingeps
+%        \zerocount
+%      \else\ifdim#1<#2%
+%        \plusone
+%      \else
+%        \plustwo
+%      \fi\fi\fi}
 
 %D Next we load a few local optimizations and new features. They
 %D live on on my machine and are not distributed, but they may end
@@ -1643,6 +991,6 @@
 
 \readsysfile {cont-loc} {} {} % local improvements, patches, new features
 \readsysfile {cont-exp} {} {} % experimental features (e.g. local speed-ups)
-\readsysfile {cont-mtx} {} {} % experimental metatex features
+%readsysfile {cont-mtx} {} {} % experimental metatex features
 
 \protect \endinput
diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii
index 61650e4fd..24a4d6514 100644
--- a/tex/context/base/context.mkii
+++ b/tex/context/base/context.mkii
@@ -15,35 +15,35 @@
 %D manipulation macros. The first one loads \PLAIN\ \TEX, as
 %D minimal as possible.
 
-\loadcorefile{syst-ini.tex}
-\loadcorefile{norm-tex.tex}
-\loadcorefile{norm-etx.tex}
-\loadcorefile{norm-ptx.tex}
-\loadcorefile{norm-xtx.tex}
-\loadcorefile{norm-ctx.tex}
-\loadcorefile{syst-pln.tex}
+\loadcorefile{syst-ini}
+\loadcorefile{norm-tex}
+\loadcorefile{norm-etx}
+\loadcorefile{norm-ptx}
+\loadcorefile{norm-xtx}
+\loadcorefile{norm-ctx}
+\loadcorefile{syst-pln}
 
 \loadmarkfile{catc-ini}
-\loadcorefile{catc-act.tex}
-\loadcorefile{catc-def.tex}
-\loadcorefile{catc-ctx.tex}
-\loadcorefile{catc-sym.tex}
-
-\loadcorefile{syst-gen.tex}
-\loadcorefile{syst-ext.tex}
-\loadcorefile{syst-new.tex}
+\loadcorefile{catc-act}
+\loadcorefile{catc-def}
+\loadcorefile{catc-ctx}
+\loadcorefile{catc-sym}
+
+\loadmarkfile{syst-gen}
+\loadmarkfile{syst-ext}
+\loadmarkfile{syst-new}
 \loadmarkfile{syst-con}
-\loadcorefile{thrd-trg.tex}  % based on: David Carlisle
+\loadmarkfile{thrd-trg}  % based on: David Carlisle
 
 \loadmarkfile{syst-fnt}
 \loadmarkfile{syst-str}
 \loadmarkfile{syst-rtp}
 
 \ifnum\texengine=\xetexengine
-    \loadcorefile{xetx-ini.tex}
-    \loadcorefile{xetx-utf.tex}
-    \loadcorefile{xetx-chr.tex}
-    \loadcorefile{xetx-cls.tex}
+    \loadmarkfile{xetx-ini}
+    \loadmarkfile{xetx-utf}
+    \loadmarkfile{xetx-chr}
+    \loadmarkfile{xetx-cls}
 \fi
 
 %D To enable selective loading, we say:
@@ -60,36 +60,35 @@
 %D modules.
 
 \loadmarkfile{mult-ini}
-\loadcorefile{mult-fst.tex}
-\loadcorefile{mult-sys.tex}
-\loadcorefile{mult-def.tex}
+\loadcorefile{mult-fst}
+\loadcorefile{mult-sys}
+\loadcorefile{mult-def}
 \loadmarkfile{mult-chk}
 
 %D Now we're ready for some general support modules. These
 %D modules implement some basic typesetting functionality.
 
-\loadcorefile{core-var.tex}
+\loadmarkfile{core-var}
 \loadmarkfile{core-env}
 
-\loadcorefile{supp-box.tex}
-\loadcorefile{supp-mrk.tex}
-\loadcorefile{supp-vis.tex}
-\loadcorefile{supp-fun.tex}
-%loadcorefile{supp-eps.tex}
-\loadcorefile{supp-spe.tex}
+\loadcorefile{supp-box}
+\loadmarkfile{supp-mrk}
+\loadcorefile{supp-vis}
+\loadcorefile{supp-fun}
+%loadmarkfile{supp-eps}
+\loadmarkfile{supp-spe}
 \loadmarkfile{supp-ran}
-%loadcorefile{supp-mps.tex}
-\loadmkiifile{supp-mps.tex}
-\loadmkiifile{supp-tpi.tex}
-\loadcorefile{supp-mat.tex}
-\loadcorefile{supp-ali.tex}
-\loadcorefile{supp-num.tex}
+\loadmarkfile{supp-mps}
+\loadmarkfile{supp-tpi}
+\loadcorefile{supp-mat}
+\loadcorefile{supp-ali}
+\loadcorefile{supp-num}
 
 %D Verbatim typesetting is implemented in a separate class of
 %D modules. The pretty typesetting modules are loaded at run
 %D time.
 
-\loadcorefile{verb-ini.tex}
+\loadmarkfile{verb-ini}
 
 %D The following modules are not sequentially dependent,
 %D i.e. they have ugly dependencies, which will be cleaned
@@ -99,33 +98,33 @@
 %D bit more advanced file handling as well as some general
 %D variables, and features, so next we load:
 
-\loadcorefile{core-ins.tex}
-\loadcorefile{core-fil.tex}
+\loadmarkfile{page-ins}
+\loadmarkfile{core-fil}
 \loadmarkfile{core-con}
 
 %D We already need some synonyms (patterns). At runtime this
 %D file will be reloaded.
 
-\loadcorefile{cont-fil.tex}
+\loadcorefile{cont-fil}
 
 %D \CONTEXT\ does not implement its own table handling. We
 %D just go for the best there is and load \TABLE. Just to be
 %D sure we do it here, before we redefine \type{|}.
 
-\loadcorefile{thrd-tab.tex}  % based on: Michael Wichura / will be reimplemented
+\loadcorefile{thrd-tab}  % based on: Michael Wichura / will be reimplemented
 
 %D Here comes the last support modules. They take care of
 %D some language specific things.
 
-\loadcorefile{supp-pat.tex}
+\loadmarkfile{supp-pat}
 
 %D The next few modules do what their names state. They
 %D load additional definition modules when needed.
 
 \loadmarkfile{regi-ini}
-\loadcorefile{regi-syn.tex}
+\loadcorefile{regi-syn}
 \loadmarkfile{enco-ini}
-%loadcorefile{filt-ini.tex}
+%loadmarkfile{filt-ini}
 \loadmarkfile{hand-ini}
 
 \loadmarkfile{lang-ini}
@@ -134,15 +133,15 @@
 
 \loadmarkfile{unic-ini}
 
-\loadcorefile{core-gen.tex}
+\loadmarkfile{core-gen}
 \loadmarkfile{core-uti}
 \loadmarkfile{core-two}
-\loadcorefile{core-stg.tex}
+\loadmarkfile{core-stg}
 
-\loadcorefile{spec-ini.tex}
-\loadcorefile{spec-mis.tex}
-\loadcorefile{spec-def.tex}
-\loadcorefile{spec-var.tex}
+\loadmarkfile{spec-ini}
+\loadmarkfile{spec-mis}
+\loadmarkfile{spec-def}
+\loadmarkfile{spec-var}
 
 \loadmarkfile{colo-ini}
 \loadmarkfile{colo-ext}
@@ -150,29 +149,28 @@
 %D For the moment we load a lot of languages. In the future
 %D we'll have to be more space conservative.
 
-\loadcorefile{lang-mis.tex}
+\loadmarkfile{lang-mis}
 \loadmarkfile{lang-url}
 
-\loadcorefile{lang-ger.tex}
-\loadcorefile{lang-ita.tex}
-\loadcorefile{lang-sla.tex}
-\loadcorefile{lang-alt.tex}
-\loadcorefile{lang-ana.tex}
-\loadcorefile{lang-art.tex}
-\loadcorefile{lang-bal.tex}
-\loadcorefile{lang-cel.tex}
-\loadcorefile{lang-grk.tex}
-\loadcorefile{lang-ind.tex}
-\loadcorefile{lang-ura.tex}
-\loadcorefile{lang-vn.tex}
-\loadcorefile{lang-ara.tex}
-\loadcorefile{lang-cyr.tex}
+\loadcorefile{lang-ger}
+\loadcorefile{lang-ita}
+\loadcorefile{lang-sla}
+\loadcorefile{lang-alt}
+\loadcorefile{lang-ana}
+\loadcorefile{lang-art}
+\loadcorefile{lang-bal}
+\loadcorefile{lang-cel}
+\loadcorefile{lang-grk}
+\loadcorefile{lang-ind}
+\loadcorefile{lang-ura}
+\loadcorefile{lang-vn}
+\loadcorefile{lang-cyr}
 
 \loadmarkfile{typo-ini}
 
 %D All kind of symbols are handled in:
 
-\loadcorefile{symb-ini.tex}
+\loadmarkfile{symb-ini}
 
 %D Sorting:
 
@@ -183,10 +181,9 @@
 %D is important, due to dependancies.
 
 \loadmarkfile{core-spa}
-\loadcorefile{core-grd.tex}
+\loadmarkfile{core-grd}
 \loadmarkfile{strc-mar}
 \loadmarkfile{anch-pos}
-\loadcorefile{core-mak.tex}
 
 \loadmarkfile{buff-ver}
 \loadmarkfile{buff-ini}
@@ -194,9 +191,9 @@
 \loadmarkfile{pack-rul}
 \loadmarkfile{trac-vis}
 \loadmarkfile{strc-num}
-\loadcorefile{tabl-pln.tex}
-\loadcorefile{tabl-tab.tex}
-\loadcorefile{tabl-tsp.tex}
+\loadmarkfile{tabl-pln}
+\loadmarkfile{tabl-tab}
+\loadmarkfile{tabl-tsp}
 \loadmarkfile{scrn-nav}
 \loadmarkfile{strc-ref}
 \loadmarkfile{pack-obj}
@@ -209,22 +206,22 @@
 
 \loadmarkfile{page-ini}
 \loadmarkfile{page-bck}
-\loadcorefile{page-not.tex}
+\loadmarkfile{page-not}
 \loadmarkfile{page-one}
-\loadcorefile{page-lay.tex}
-\loadmkiifile{page-log.tex}
+\loadmarkfile{page-lay}
+\loadmarkfile{page-log}
 \loadmarkfile{page-txt}
-\loadcorefile{page-sid.tex}
+\loadmarkfile{page-sid}
 \loadmarkfile{strc-flt}
-\loadcorefile{page-mis.tex}
-\loadcorefile{page-mul.tex}
-\loadcorefile{page-set.tex}
+\loadmarkfile{page-mis}
+\loadmarkfile{page-mul}
+\loadmarkfile{page-set}
 \loadmarkfile{pack-lyr}
-\loadcorefile{page-mak.tex}
+\loadmarkfile{page-mak}
 \loadmarkfile{strc-pag}
 \loadmarkfile{page-lin}
-\loadcorefile{page-par.tex}
-\loadcorefile{page-mar.tex}
+\loadmarkfile{page-par}
+\loadmarkfile{page-mar}
 
 \loadmarkfile{core-job} % why so late?
 
@@ -234,18 +231,19 @@
 \loadmarkfile{strc-swd}
 \loadmarkfile{strc-blk}
 
-\loadcorefile{page-imp.tex}
-\loadcorefile{tabl-tbl.tex}
+\loadmarkfile{page-imp}
+\loadmarkfile{tabl-tbl}
 \loadmarkfile{scrn-int}
 \loadmarkfile{tabl-ntb}
-\loadcorefile{tabl-nte.tex}
-\loadcorefile{tabl-ltb.tex}
+\loadmarkfile{tabl-nte}
+\loadmarkfile{tabl-ltb}
 
 %D A few more languages, that have specifics using core
 %D functionality:
 
-\loadcorefile{lang-chi.tex}
-\loadcorefile{lang-jap.tex}
+%loadmarkfile{lang-ara} % undefined
+\loadmarkfile{lang-chi}
+\loadmarkfile{lang-jap}
 
 %D How about fill||in fields and related stuff?
 
@@ -265,17 +263,17 @@
 \loadmarkfile{font-ini}
 
 \ifnum\texengine=\xetexengine
-    \loadcorefile{font-xtx.tex}
+    \loadmarkfile{font-xtx}
 \fi
 
 \loadmarkfile{font-unk}
 \loadmarkfile{font-uni}
-\loadcorefile{font-bfm.tex}
+\loadmarkfile{font-bfm}
 
-\loadcorefile{enco-pfr.tex}
+\loadmarkfile{enco-pfr}
 
 \loadmarkfile{type-ini}
-\loadcorefile{type-def.tex}
+\loadcorefile{type-def}
 
 %D Properties. Don't ask.
 
@@ -290,20 +288,20 @@
 \loadmarkfile{meta-tex}
 \loadmarkfile{meta-pdf}
 
-\loadcorefile{meta-pag.tex}
+\loadmarkfile{meta-pag}
 
 %D Special page handling (maybe even later)
 
-\loadcorefile{page-flw.tex}
-\loadcorefile{page-spr.tex}
-\loadcorefile{page-plg.tex}
-\loadcorefile{page-str.tex}
+\loadmarkfile{page-flw}
+\loadmarkfile{page-spr}
+\loadmarkfile{page-plg}
+\loadmarkfile{page-str}
 
 %D Anchoring graphics:
 
 \loadmarkfile{anch-pgr}
-\loadcorefile{anch-bar.tex}
-\loadcorefile{anch-snc.tex}
+\loadcorefile{anch-bar}
+\loadcorefile{anch-snc}
 
 %D Math.
 
@@ -316,7 +314,7 @@
 
 \loadmarkfile{core-fnt}
 \loadmarkfile{strc-not}
-\loadcorefile{core-lnt.tex}
+\loadmarkfile{strc-lnt}
 
 \loadmarkfile{core-mis}
 
@@ -324,35 +322,35 @@
 \loadmarkfile{grph-inc}
 \loadmarkfile{grph-fig}
 
-\loadcorefile{core-par.tex}
+\loadmarkfile{core-par}
 
 \loadmarkfile{pack-box}
-\loadcorefile{page-app.tex}
+\loadmarkfile{page-app}
 \loadmarkfile{meta-fig}
 
 %D Language specific spacing.
 
-\loadcorefile{lang-spa.tex}
+\loadcorefile{lang-spa}
 
 %D Only the basic XML parser and remapper are part of the core.
 %D These macros are loaded last since they overload and|/|or
 %D extend previously defined ones.
 
-\loadcorefile{xtag-ini.tex}
-\loadcorefile{xtag-ext.tex}
-\loadcorefile{xtag-exp.tex}
-\loadcorefile{xtag-pre.tex}
-\loadcorefile{xtag-xsd.tex}
-\loadcorefile{xtag-rng.tex}
+\loadcorefile{xtag-ini}
+\loadcorefile{xtag-ext}
+\loadcorefile{xtag-exp}
+\loadcorefile{xtag-pre}
+\loadcorefile{xtag-xsd}
+\loadcorefile{xtag-rng}
 
 %D How about this:
 
-\loadcorefile{meta-xml.tex}
+\loadcorefile{meta-xml}
 
 %D \TEX\ related logo's are always typeset in a special way.
 %D Here they come:
 
-\loadcorefile{cont-log.tex}
+\loadcorefile{cont-log}
 
 %D This one overloads af few things:
 
@@ -361,8 +359,7 @@
 %D Defaults go here (more will be moved to this module
 %D later):
 
-\loadcorefile{core-lme.tex}
-\loadcorefile{core-ini.tex}
+\loadmarkfile{core-ini}
 \loadmarkfile{core-def}
 
 %D Preloaded modules (some need xml support):
@@ -383,4 +380,4 @@
 % %D Except from english, no hyphenation patterns are loaded
 % %D yet. Users can specify their needs in the next module:
 %
-% \input cont-usr.tex
+% \input cont-usr
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index fc3149f6b..735d1c780 100644
--- a/tex/context/base/context.mkiv
+++ b/tex/context/base/context.mkiv
@@ -18,19 +18,25 @@
 %D manipulation macros. The first one loads \PLAIN\ \TEX, as
 %D minimal as possible.
 
-\loadcorefile{syst-ini.tex}
-\loadcorefile{norm-ctx.tex}
-\loadcorefile{syst-pln.tex}
+\loadcorefile{syst-ini}
+
+\ifnum\luatexversion<42
+    \writestatus{!!!!}{Your luatex binary is way too old, you need at least version 0.42.}
+    \expandafter\end
+\fi
+
+\loadcorefile{norm-ctx}
+\loadcorefile{syst-pln}
 
 \loadmarkfile{luat-cod}
 \loadmarkfile{luat-bas}
 \loadmarkfile{luat-lib}
 
 \loadmarkfile{catc-ini}
-\loadcorefile{catc-act.tex}
-\loadcorefile{catc-def.tex}
-\loadcorefile{catc-ctx.tex}
-\loadcorefile{catc-sym.tex}
+\loadcorefile{catc-act}
+\loadcorefile{catc-def}
+\loadcorefile{catc-ctx}
+\loadcorefile{catc-sym}
 
 \newif\ifCONTEXT \CONTEXTtrue % will disappear
 
@@ -50,10 +56,11 @@
 \loadmarkfile{char-act}
 
 \loadmarkfile{mult-ini}
-\loadcorefile{mult-fst.tex}
-\loadcorefile{mult-sys.tex}
-\loadcorefile{mult-def.tex}
+\loadcorefile{mult-fst}
+\loadcorefile{mult-sys}
+\loadcorefile{mult-def}
 \loadmarkfile{mult-chk}
+\loadmarkfile{mult-cld}
 
 \loadmarkfile{luat-ini}
 
@@ -63,12 +70,11 @@
 \loadmarkfile{node-fin}
 \loadmarkfile{node-par}
 
-\loadcorefile{core-var.tex}
-
-\loadmarkfile{lpdf-ini}
+\loadmarkfile{core-var}
 
 \loadmarkfile{back-ini}
-\loadmarkfile{back-pdf}
+\loadmarkfile{lpdf-ini} % some day back-ini will load this
+\loadmarkfile{back-pdf} % some day back-ini will load this
 
 \loadmarkfile{attr-ini}
 
@@ -77,71 +83,70 @@
 \loadmarkfile{trac-lmx}
 \loadmarkfile{trac-deb}
 
-\loadcorefile{supp-box.tex}
+\loadcorefile{supp-box}
 
-\loadcorefile{supp-vis.tex}
-\loadcorefile{supp-fun.tex}
+\loadcorefile{supp-vis}
+\loadcorefile{supp-fun}
 
 \loadmarkfile{supp-ran}
-\loadcorefile{supp-mat.tex}
-\loadcorefile{supp-ali.tex}
-\loadcorefile{supp-num.tex}
+\loadcorefile{supp-mat}
+\loadcorefile{supp-ali}
+\loadcorefile{supp-num}
 
 \loadmarkfile{typo-ini}
 
-\loadcorefile{core-ins.tex}
-\loadcorefile{core-fil.tex}
+\loadmarkfile{page-ins}
+\loadmarkfile{core-fil}
 \loadmarkfile{core-con}
 
-\loadcorefile{cont-fil.tex}
+\loadcorefile{cont-fil}
 
 \loadmarkfile{regi-ini}
-\loadcorefile{regi-syn.tex}
+\loadcorefile{regi-syn}
 \loadmarkfile{enco-ini}
 \loadmarkfile{hand-ini}
 
 \loadmarkfile{lang-ini}
-\loadmarkfile{lang-spe}
 \loadmarkfile{lang-lab}
 
 \loadmarkfile{unic-ini}
 
-\loadcorefile{core-gen.tex}
+\loadmarkfile{core-gen}
 \loadmarkfile{core-uti}
 \loadmarkfile{core-two}
-\loadcorefile{core-stg.tex}
 
 \loadmarkfile{colo-ini}
 \loadmarkfile{colo-ext}
 
 \loadmarkfile{trac-vis}
 
-\loadcorefile{lang-mis.tex}
+\loadmarkfile{lang-mis}
 \loadmarkfile{lang-url}
 
-\loadcorefile{lang-ger.tex}
-\loadcorefile{lang-ita.tex}
-\loadcorefile{lang-sla.tex}
-\loadcorefile{lang-alt.tex}
-\loadcorefile{lang-ana.tex}
-\loadcorefile{lang-art.tex}
-\loadcorefile{lang-bal.tex}
-\loadcorefile{lang-cel.tex}
-\loadcorefile{lang-grk.tex}
-\loadcorefile{lang-ind.tex}
-\loadcorefile{lang-ura.tex}
-\loadcorefile{lang-cjk.tex}
-\loadcorefile{lang-vn.tex}
-\loadcorefile{lang-ara.tex}
-\loadcorefile{lang-cyr.tex}
-
-\loadcorefile{symb-ini.tex}
+\loadcorefile{lang-ger}
+\loadcorefile{lang-ita}
+\loadcorefile{lang-sla}
+\loadcorefile{lang-alt}
+\loadcorefile{lang-ana}
+\loadcorefile{lang-art}
+\loadcorefile{lang-bal}
+\loadcorefile{lang-cel}
+\loadcorefile{lang-grk}
+\loadcorefile{lang-ind}
+\loadcorefile{lang-ura}
+\loadcorefile{lang-vn}
+\loadcorefile{lang-cyr}
+
+\loadmarkfile{lang-ara}
+\loadmarkfile{lang-cjk}
+
+\loadmarkfile{symb-ini}
 
 \loadmarkfile{sort-ini}
 
 \loadmarkfile{pack-rul}
 
-\loadcorefile{lxml-ini}
+\loadmarkfile{lxml-ini}
 
 \loadmarkfile{strc-ini}
 \loadmarkfile{strc-doc}
@@ -158,13 +163,12 @@
 \loadmarkfile{strc-ref}
 \loadmarkfile{strc-reg}
 
-\loadcorefile{bibl-bib}
+\loadmarkfile{bibl-bib}
 
 \loadmarkfile{core-spa}
-\loadcorefile{core-grd.tex}
+\loadmarkfile{core-grd}
 
 \loadmarkfile{anch-pos}
-\loadcorefile{core-mak.tex}
 
 \loadmarkfile{scrn-nav}
 \loadmarkfile{pack-obj}
@@ -177,23 +181,23 @@
 
 \loadmarkfile{page-ini}
 \loadmarkfile{page-bck}
-\loadcorefile{page-not.tex}
+\loadmarkfile{page-not}
 \loadmarkfile{page-one}
-\loadcorefile{page-lay.tex}
+\loadmarkfile{page-lay}
 \loadmarkfile{page-txt}
-\loadcorefile{page-sid.tex}
+\loadmarkfile{page-sid}
 
 \loadmarkfile{strc-flt}
 
-\loadcorefile{page-mis.tex}
-\loadcorefile{page-mul.tex}
-\loadcorefile{page-set.tex}
+\loadmarkfile{page-mis}
+\loadmarkfile{page-mul}
+\loadmarkfile{page-set}
 \loadmarkfile{pack-lyr}
-\loadcorefile{page-mak.tex}
+\loadmarkfile{page-mak}
 
 \loadmarkfile{page-lin}
-\loadcorefile{page-par.tex}
-\loadcorefile{page-mar.tex}
+\loadmarkfile{page-par}
+\loadmarkfile{page-mar}
 
 \loadmarkfile{core-job} % why so late?
 
@@ -202,19 +206,22 @@
 
 \loadmarkfile{strc-blk}
 
-\loadcorefile{page-imp.tex}
+\loadmarkfile{page-imp}
 
 \loadmarkfile{scrn-int}
+\loadmarkfile{scrn-men}
+\loadmarkfile{scrn-but}
+\loadmarkfile{scrn-bar}
 \loadmarkfile{strc-bkm} % bookmarks
 
-\loadcorefile{tabl-pln.tex}
-\loadcorefile{thrd-tab.tex}
-\loadcorefile{tabl-tab.tex}
-\loadcorefile{tabl-tbl.tex}
+\loadmarkfile{tabl-pln}
+\loadcorefile{thrd-tab}
+\loadmarkfile{tabl-tab}
+\loadmarkfile{tabl-tbl}
 \loadmarkfile{tabl-ntb}
-\loadcorefile{tabl-nte.tex}
-\loadcorefile{tabl-ltb.tex}
-\loadcorefile{tabl-tsp.tex}
+\loadmarkfile{tabl-nte}
+\loadmarkfile{tabl-ltb}
+\loadmarkfile{tabl-tsp}
 
 \loadmarkfile{java-ini}
 
@@ -235,7 +242,7 @@
 \loadmarkfile{typo-cap}
 
 \loadmarkfile{type-ini}
-\loadcorefile{type-def.tex}
+\loadcorefile{type-def}
 
 \loadmarkfile{scrp-ini}
 
@@ -252,16 +259,16 @@
 \loadmarkfile{meta-pdf}
 \loadmarkfile{meta-fun}
 
-\loadcorefile{meta-pag.tex}
+\loadmarkfile{meta-pag}
 
-\loadcorefile{page-flw.tex}
-\loadcorefile{page-spr.tex}
-\loadcorefile{page-plg.tex}
-\loadcorefile{page-str.tex}
+\loadmarkfile{page-flw}
+\loadmarkfile{page-spr}
+\loadmarkfile{page-plg}
+\loadmarkfile{page-str}
 
-\loadmarkfile{anch-pgr}
-\loadcorefile{anch-bar.tex}
-\loadcorefile{anch-snc.tex}
+\loadmarkfile{anch-pgr} % overloads tabl-tbl
+\loadcorefile{anch-bar}
+\loadcorefile{anch-snc}
 
 \loadmarkfile{math-pln}
 \loadmarkfile{math-ini}
@@ -284,8 +291,7 @@
 \loadmarkfile{core-fnt}
 
 \loadmarkfile{strc-not}
-
-\loadcorefile{core-lnt.tex}
+\loadmarkfile{strc-lnt}
 
 \loadmarkfile{core-mis}
 
@@ -294,28 +300,28 @@
 \loadmarkfile{grph-fig}
 
 \loadmarkfile{pack-box}
-\loadcorefile{page-app.tex}
+\loadmarkfile{pack-bar}
+\loadmarkfile{page-app}
 \loadmarkfile{meta-fig}
 
-\loadcorefile{lang-spa.tex}
+\loadcorefile{lang-spa}
 
-\loadcorefile{xtag-ini.tex} % might go away
-\loadcorefile{xtag-ext.tex} % might go away
-\loadcorefile{xtag-exp.tex} % will go away
-\loadcorefile{xtag-pre.tex} % has old encoding code
-\loadcorefile{xtag-xsd.tex} % will go away (stub anyway)
-\loadcorefile{xtag-rng.tex} % will go away (stub anyway)
+\loadcorefile{xtag-ini} % might go away
+\loadcorefile{xtag-ext} % might go away
+\loadcorefile{xtag-exp} % will go away
+\loadcorefile{xtag-pre} % has old encoding code
+\loadcorefile{xtag-xsd} % will go away (stub anyway)
+\loadcorefile{xtag-rng} % will go away (stub anyway)
 
-\loadcorefile{meta-xml.tex}
+\loadcorefile{meta-xml}
 
-\loadcorefile{cont-log.tex}
+\loadcorefile{cont-log}
 
 \loadmarkfile{task-ini}
 
 \loadmarkfile{core-ctx}
 
-\loadcorefile{core-lme.tex}
-\loadcorefile{core-ini.tex}
+\loadmarkfile{core-ini}
 \loadmarkfile{core-def}
 
 %usemodule[x][res-04] % xml resource libraries
diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex
index 6316c6156..95c528f32 100644
--- a/tex/context/base/context.tex
+++ b/tex/context/base/context.tex
@@ -20,7 +20,7 @@
 %D your styles an modules.
 
 \edef\contextformat {\jobname}
-\edef\contextversion{2009.06.13 14:03}
+\edef\contextversion{2009.07.17 13:16}
 
 %D For those who want to use this:
 
diff --git a/tex/context/base/core-def.mkii b/tex/context/base/core-def.mkii
index ea2d0ff15..e51cd96d3 100644
--- a/tex/context/base/core-def.mkii
+++ b/tex/context/base/core-def.mkii
@@ -74,4 +74,11 @@
 
 % \appendtoks\everyjob\expandafter{\the\everyjob\checkpreprocessor}\to\everydump
 
+% normally one does not want this to happen nested, maybe there
+% is more; non public vars btw, will become conditionals
+
+\ifx\writetoregisterfalse\undefined \else \appendtoks \writetoregisterfalse \to \everybeforeutilityread \fi
+\ifx\writetolistfalse    \undefined \else \appendtoks \writetolistfalse     \to \everybeforeutilityread \fi
+\ifx\notesenabledfalse   \undefined \else \appendtoks \notesenabledfalse    \to \everybeforeutilityread \fi
+
 \protect \endinput
diff --git a/tex/context/base/core-def.mkiv b/tex/context/base/core-def.mkiv
index 380b733bc..782fe3f67 100644
--- a/tex/context/base/core-def.mkiv
+++ b/tex/context/base/core-def.mkiv
@@ -54,8 +54,6 @@
 \appendtoks  \ifarrangingpages\poparrangedpages\fi \to \everybye
 \appendtoks  \registerfileinfo[end]\jobname        \to \everybye
 
-\prependtoks \resetutilities                       \to \everystarttext % moved 28-02-2002
-
 \appendtoks  \MPLIBallocate{1000}                  \to \everydump
 
 \prependtoks \resetallattributes                   \to \everybeforeoutput
diff --git a/tex/context/base/core-fil.mkii b/tex/context/base/core-fil.mkii
new file mode 100644
index 000000000..fca253a7b
--- /dev/null
+++ b/tex/context/base/core-fil.mkii
@@ -0,0 +1,347 @@
+%D \module
+%D   [       file=core-fil,
+%D        version=1997.11.15,
+%D          title=\CONTEXT\ Core Macros,
+%D       subtitle=File Support,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / File Support}
+
+\unprotect
+
+%D Files registered as temporary files will be deleted after a
+%D run by texexec:
+
+% \starttext
+%     \immediate\openout\scratchwrite=oeps.tmp
+%     \immediate\write\scratchwrite{oeps}
+%     \immediate\closeout\scratchwrite
+%     \registertempfile{oeps.tmp}
+%     \typefile{oeps.tmp}
+% \stoptext
+
+\let\usedtempfile\gobbleoneargument
+
+\def\registertempfile#1{\immediatewriteutility{f t {#1}}}
+
+%D \macros
+%D   {definefilesynonym}
+%D
+%D One of the problems with loading files is that their names
+%D can depend on the interface language. We therefore need a
+%D method to define filesynonyms. The actual synonyms are
+%D defined elsewhere, but look like:
+%D
+%D \starttyping
+%D \definefilesynonym [chemic]  [chemie]
+%D \definefilesynonym [einheit] [unit]
+%D \definefilesynonym [unit]    [unit]
+%D \stoptyping
+%D
+%D So we can say in english:
+%D
+%D \starttyping
+%D \usemodules[pictex,chemic,unit]
+%D \stoptyping
+%D
+%D and in dutch:
+%D
+%D \starttyping
+%D \usemodules[pictex,chemie,unit]
+%D \stoptyping
+
+% will be redone in mkiv
+
+\def\definefilesynonym
+  {\dodoubleempty\dodefinefilesynonym}
+
+\def\dodefinefilesynonym[#1][#2]%
+  {\ifundefined{\??fs#1}\else
+     \doifnotvalue{\??fs#1}{#2}{\showmessage\m!files1{#1 (#2),\getvalue{\??fs#1}}}%
+   \fi
+   \doifelse{#1}{#2}{\letbeundefined{\??fs#1}{#2}}{\setevalue{\??fs#1}{#2}}}
+
+%D \macros
+%D   {definefilefallback}
+
+\def\definefilefallback
+  {\dodoubleargument\dodefinefilefallback}
+
+\def\dodefinefilefallback[#1][#2]%
+  {\doifnotfile{#1}
+     {\def\docommand##1{\doiffile{##1}{\definefilesynonym[#1][##1]\quitcommalist}}%
+      \processcommalist[#2]\docommand}}
+
+%D \macros
+%D   {truefilename}
+%D
+%D At the system level such a filename can be called upon by
+%D saying:
+%D
+%D \starttyping
+%D \truefilename{filename/filesynonym}
+%D \stoptyping
+%D
+%D The implementation shows that nesting is supported.
+
+\def\truefilename#1%
+  {\ifundefined{\??fs#1}#1\else\truefilename{\csname\??fs#1\endcsname}\fi}
+
+%D \macros
+%D   {makeshortfilename}
+%D
+%D To prevent cross platform problems with filenames, we
+%D lowercase them as well as only use the first 8~characters.
+%D
+%D \starttyping
+%D \def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]%
+%D   {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}%
+%D    \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
+%D
+%D \def\makeshortfilename[#1]%
+%D   {\edef\fullfilename{#1.........}%
+%D    \expanded{\domakeshortfilename[\fullfilename]}}
+%D \stoptyping
+%D
+%D In 2005 there is no need for the 8~character limit any more, so:
+
+\def\makeshortfilename[#1]% no need for further cleanup and shortening
+  {\lowercase{\edef\shortfilename{#1.}}%
+   \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
+
+%D \macros
+%D   {usemodule}
+%D
+%D Most of \CONTEXT is preloaded in the format file. Some very
+%D domain specific typesetting topics are however dealt with in
+%D separate modules, e.g. typesetting of chemical structure
+%D formulas. These modules are loaded by:
+%D
+%D \showsetup{usemodule}
+%D
+%D More information on the specific modules can be found in
+%D their dedicated manuals. We use \type {\next} so that we
+%D can \type {\end} in modules.
+
+\newconditional\moduleisloaded
+
+\def\dododousemodules#1#2% no \unprotect/\protect when loading,
+  {\relax                % since we need to use ? ! unprotected
+   \ifconditional\moduleisloaded % sometimes (see xtag-map)
+     \let\next\relax % or: \expandafter\gobbleoneargument
+   \else
+     \makeshortfilename[#1\truefilename{#2}]% beware: *- is not part of syn
+     \doifelseflagged\shortfilename
+       {\showmessage\m!systems7{#2 (line \number\inputlineno)}%
+        \settrue\moduleisloaded
+        \let\next\relax}
+       {\doglobal\setflag\shortfilename
+        \def\next
+          {\startreadingfile
+             \readsysfile\shortfilename
+               {\showmessage\m!systems5{#2}\settrue\moduleisloaded}
+               {\readsysfile{\shortfilename.\mksuffix} % new
+                  {\showmessage\m!systems5{#2 (\mksuffix)}\settrue\moduleisloaded}
+                  \donothing}%
+           \stopreadingfile}}%
+   \fi
+   \next}
+
+\def\dodousemodules#1#2%
+  {\setfalse\moduleisloaded
+   \doifelsenothing{#1}
+     {\dododousemodules\f!moduleprefix {#2}%
+      \dododousemodules\f!privateprefix{#2}%
+      \dododousemodules\f!styleprefix  {#2}%
+      \dododousemodules\f!xstyleprefix {#2}%
+      \dododousemodules\f!thirdprefix  {#2}%
+      \dododousemodules\empty          {#2}}% new, fall back on raw name
+     {\dododousemodules{#1-}{#2}}%
+   \ifconditional\moduleisloaded\else
+     \showmessage\m!systems6{#2}%
+     \appendtoks\showmessage\m!systems6{#2}\to\everynotabene
+   \fi}
+
+% \def\usemodules
+%   {\dodoubleempty\dousemodules}
+%
+% \def\dousemodules[#1][#2]%
+%   {\ifsecondargument
+%      \doifelsenothing{#2}
+%        {\let\next\relax}
+%        {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}%
+%    \else
+%      \def\next{\usemodules[][#1]}%
+%    \fi
+%    \next}
+%
+% \let\usemodule\usemodules
+
+\def\usemodules
+  {\dotripleempty\dousemodules}
+
+\def\dousemodules[#1][#2][#3]%
+  {\pushmacro\currentmodule
+   \pushmacro\currentmoduleparameters
+   \let\currentmoduleparameters\empty
+   \ifthirdargument
+     \doifelsenothing{#2}
+       {\let\next\relax}
+       {\def\currentmoduleparameters{#3}%
+        \def\next{\processcommalist[#2]{\dodousemodules{#1}}}}%
+   \else\ifsecondargument
+     \doifelsenothing{#2}
+       {\let\next\relax}
+       {\doifassignmentelse{#2}
+          {\def\currentmoduleparameters{#2}%
+           \def\next{\processcommalist[#1]{\dodousemodules{}}}}
+          {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}}%
+   \else
+     \def\next{\processcommalist[#1]{\dodousemodules{}}}%
+   \fi\fi
+   \next
+   \popmacro\currentmoduleparameters
+   \popmacro\currentmodule}
+
+\let\currentmoduleparameters\empty
+\let\currentmodule          \s!unknown
+
+\def\startmodule
+  {\doifnextoptionalelse\dostartmodule\nostartmodule}
+
+\def\nostartmodule #1 %
+  {\dostartmodule[#1]}
+
+\def\dostartmodule[#1]%
+  {\pushmacro\currentmodule
+   \pushmacro\currentmoduleparameters
+   \def\currentmodule{#1}}
+
+\def\stopmodule
+  {\popmacro\currentmoduleparameters
+   \popmacro\currentmodule}
+
+\def\setupmodule
+  {\dodoubleempty\dosetupmodule}
+
+\def\dosetupmodule[#1][#2]%
+  {\scratchtoks\expandafter{\currentmoduleparameters}%
+   \ifsecondargument
+     \getparameters[\??md:#1:][#2]%
+     \expanded{\getparameters[\??md:#1:][\the\scratchtoks]}%
+   \else
+     \getparameters[\??md:\currentmodule:][#1]%
+     \expanded{\getparameters[\??md:\currentmodule:][\the\scratchtoks]}%
+   \fi
+   \let\currentmoduleparameters\empty}
+
+\def\moduleparameter     #1#2{\executeifdefined{\??md:#1:#2}\s!empty}
+\def\currentmoduleparameter#1{\executeifdefined{\??md:\currentmodule:#1}\s!empty}
+
+% \usemodule[newmml]
+% \usemodule[newmml][a=b]
+% \usemodule[x][newmml]
+% \usemodule[x][newmml][a=b]
+%
+% \startmodule [mathml]
+%   \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars will be set afterwards
+%   \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars are now forgotten
+% \stopmodule
+
+% one can introduce test sections with:
+%
+% \enablemode[newmml:test:\currentmoduleparameter{test}]
+% \startmode[newmml:test:yes} ... \stopmode
+%
+% these will be ignored unless test=yes
+%
+% however, a better way is:
+
+\let\stopmoduletestsection\donothing
+
+\def\startmoduletestsection
+  {\bgroup
+   \setupmodule % we need to make sure that the vars are set
+   \doifelse{\currentmoduleparameter\v!test}\v!yes
+     {\egroup
+      \writestatus{\currentmodule}{loading experimental code}}
+     {\egroup
+      \writestatus{\currentmodule}{skipping experimental code}%
+      \gobbleuntil\stopmoduletestsection}}
+
+%D We also support a singular call, which saves us for
+%D frustrations when we do a typo.
+
+\let\usemodule=\usemodules
+
+% %D The definition shows that the language specific settings
+% %D are activated after loading all the modules specified.
+
+%D \macros
+%D   {ifprotectbuffers, bufferprefix,
+%D    TEXbufferfile, MPgraphicfile}
+%D
+%D The next switch enables protection of temporary filenames,
+%D which is needed when we process more files on one path at
+%D the same time.
+
+\newif\ifprotectbuffers
+
+\def\bufferprefix{\ifprotectbuffers\jobname-\fi}
+
+% The following filenames are defined here:
+
+\def\TEXbufferfile   #1{\bufferprefix#1.\f!temporaryextension}
+\def\MPgraphicfile     {\bufferprefix mp\ifMPrun run\else graph\fi} % not needed in luatex
+\def\convertMPcolorfile{\bufferprefix metacmyk.tmp}
+
+%D To save memory, we implement some seldomly used commands
+%D in a lazy way. Nota bene: such runtime definitions are
+%D global.
+%D
+%D \starttyping
+%D \fetchruntimecommand\showaccents{\f!encodingprefix ...}
+%D \stoptyping
+
+\def\fetchruntimecommand#1#2%
+  {\def#1{\dofetchruntimecommand#1{#2}}}
+
+\def\dofetchruntimecommand#1#2%
+  {\doifnotflagged{#2}
+     {\let#1\undefined
+      \startreadingfile
+      \startnointerference % \bgroup
+      \cleanupfeatures % better \setnormalcatcodes / test first
+      \readfile{#2}\donothing\donothing
+      \stopnointerference  % \egroup
+      \stopreadingfile
+      \doglobal\setflag{#2}}%
+   \ifx#1\undefined
+     \writestatus\m!systems{command \string#1 not found in file #2}%
+     \def#1{{\infofont[unknown command \string#1]}}%
+   \fi
+   #1}
+
+%D Experimental:
+
+\let\checkpreprocessor\relax
+
+%D To be documented and probably moved
+
+\def\documentresources{\@@erurl}
+
+\def\setupexternalresources
+  {\dodoubleargument\getparameters[\??er]}
+
+\setupexternalresources
+  [url=]
+
+%D This module will be perfected / changed / weeded.
+
+\protect \endinput
diff --git a/tex/context/base/core-fil.mkiv b/tex/context/base/core-fil.mkiv
new file mode 100644
index 000000000..14154fca4
--- /dev/null
+++ b/tex/context/base/core-fil.mkiv
@@ -0,0 +1,317 @@
+%D \module
+%D   [       file=core-fil,
+%D        version=1997.11.15,
+%D          title=\CONTEXT\ Core Macros,
+%D       subtitle=File Support,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / File Support}
+
+\unprotect
+
+%D \macros
+%D   {definefilesynonym}
+%D
+%D One of the problems with loading files is that their names
+%D can depend on the interface language. We therefore need a
+%D method to define filesynonyms. The actual synonyms are
+%D defined elsewhere, but look like:
+%D
+%D \starttyping
+%D \definefilesynonym [chemic]  [chemie]
+%D \definefilesynonym [einheit] [unit]
+%D \definefilesynonym [unit]    [unit]
+%D \stoptyping
+%D
+%D So we can say in english:
+%D
+%D \starttyping
+%D \usemodules[pictex,chemic,unit]
+%D \stoptyping
+%D
+%D and in dutch:
+%D
+%D \starttyping
+%D \usemodules[pictex,chemie,unit]
+%D \stoptyping
+
+% will be redone in mkiv
+
+\def\definefilesynonym
+  {\dodoubleempty\dodefinefilesynonym}
+
+\def\dodefinefilesynonym[#1][#2]%
+  {\ifcsname\??fs#1\endcsname
+     \doifnotvalue{\??fs#1}{#2}{\showmessage\m!files1{#1 (#2),\getvalue{\??fs#1}}}%
+   \fi
+   \doifelse{#1}{#2}{\letbeundefined{\??fs#1}{#2}}{\setevalue{\??fs#1}{#2}}}
+
+%D \macros
+%D   {definefilefallback}
+
+\def\definefilefallback
+  {\dodoubleargument\dodefinefilefallback}
+
+\def\dodefinefilefallback[#1][#2]%
+  {\doifnotfile{#1}
+     {\def\docommand##1{\doiffile{##1}{\definefilesynonym[#1][##1]\quitcommalist}}%
+      \processcommalist[#2]\docommand}}
+
+%D \macros
+%D   {truefilename}
+%D
+%D At the system level such a filename can be called upon by
+%D saying:
+%D
+%D \starttyping
+%D \truefilename{filename/filesynonym}
+%D \stoptyping
+%D
+%D The implementation shows that nesting is supported.
+
+\def\truefilename#1%
+  {\ifcsname\??fs#1\endcsname\expandafter\truefilename\csname\??fs#1\endcsname\else#1\fi}
+
+%D \macros
+%D   {makeshortfilename}
+%D
+%D To prevent cross platform problems with filenames, we
+%D lowercase them as well as only use the first 8~characters.
+%D
+%D \starttyping
+%D \def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]%
+%D   {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}%
+%D    \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
+%D
+%D \def\makeshortfilename[#1]%
+%D   {\edef\fullfilename{#1.........}%
+%D    \expanded{\domakeshortfilename[\fullfilename]}}
+%D \stoptyping
+%D
+%D In 2005 there is no need for the 8~character limit any more, so:
+
+\def\makeshortfilename[#1]% no need for further cleanup and shortening
+  {\lowercase{\edef\shortfilename{#1.}}%
+   \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
+
+%D \macros
+%D   {usemodule}
+%D
+%D Most of \CONTEXT is preloaded in the format file. Some very
+%D domain specific typesetting topics are however dealt with in
+%D separate modules, e.g. typesetting of chemical structure
+%D formulas. These modules are loaded by:
+%D
+%D \showsetup{usemodule}
+%D
+%D More information on the specific modules can be found in
+%D their dedicated manuals. We use \type {\next} so that we
+%D can \type {\end} in modules.
+
+\newconditional\moduleisloaded
+
+\def\dododousemodules#1#2% no \unprotect/\protect when loading,
+  {\relax                % since we need to use ? ! unprotected
+   \ifconditional\moduleisloaded % sometimes (see xtag-map)
+     \let\next\relax % or: \expandafter\gobbleoneargument
+   \else
+     \makeshortfilename[#1\truefilename{#2}]% beware: *- is not part of syn
+     \doifelseflagged\shortfilename
+       {\showmessage\m!systems7{#2 (line \number\inputlineno)}%
+        \settrue\moduleisloaded
+        \let\next\relax}
+       {\doglobal\setflag\shortfilename
+        \def\next
+          {\startreadingfile
+             \readsysfile\shortfilename
+               {\showmessage\m!systems5{#2}\settrue\moduleisloaded}
+               {\readsysfile{\shortfilename.\mksuffix} % new
+                  {\showmessage\m!systems5{#2 (\mksuffix)}\settrue\moduleisloaded}
+                  \donothing}%
+           \stopreadingfile}}%
+   \fi
+   \next}
+
+\def\dodousemodules#1#2%
+  {\setfalse\moduleisloaded
+   \doifelsenothing{#1}
+     {\dododousemodules\f!moduleprefix {#2}%
+      \dododousemodules\f!privateprefix{#2}%
+      \dododousemodules\f!styleprefix  {#2}%
+      \dododousemodules\f!xstyleprefix {#2}%
+      \dododousemodules\f!thirdprefix  {#2}%
+      \dododousemodules\empty          {#2}}% new, fall back on raw name
+     {\dododousemodules{#1-}{#2}}%
+   \ifconditional\moduleisloaded\else
+     \showmessage\m!systems6{#2}%
+     \appendtoks\showmessage\m!systems6{#2}\to\everynotabene
+   \fi}
+
+\def\usemodules
+  {\dotripleempty\dousemodules}
+
+\def\dousemodules[#1][#2][#3]%
+  {\pushmacro\currentmodule
+   \pushmacro\currentmoduleparameters
+   \let\currentmoduleparameters\empty
+   \ifthirdargument
+     \doifelsenothing{#2}
+       {\let\next\relax}
+       {\def\currentmoduleparameters{#3}%
+        \def\next{\processcommalist[#2]{\dodousemodules{#1}}}}%
+   \else\ifsecondargument
+     \doifelsenothing{#2}
+       {\let\next\relax}
+       {\doifassignmentelse{#2}
+          {\def\currentmoduleparameters{#2}%
+           \def\next{\processcommalist[#1]{\dodousemodules{}}}}
+          {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}}%
+   \else
+     \def\next{\processcommalist[#1]{\dodousemodules{}}}%
+   \fi\fi
+   \next
+   \popmacro\currentmoduleparameters
+   \popmacro\currentmodule}
+
+\let\currentmoduleparameters\empty
+\let\currentmodule          \s!unknown
+
+\def\startmodule
+  {\doifnextoptionalelse\dostartmodule\nostartmodule}
+
+\def\nostartmodule #1 %
+  {\dostartmodule[#1]}
+
+\def\dostartmodule[#1]%
+  {\pushmacro\currentmodule
+   \pushmacro\currentmoduleparameters
+   \def\currentmodule{#1}}
+
+\def\stopmodule
+  {\popmacro\currentmoduleparameters
+   \popmacro\currentmodule}
+
+\def\setupmodule
+  {\dodoubleempty\dosetupmodule}
+
+\def\dosetupmodule[#1][#2]%
+  {\scratchtoks\expandafter{\currentmoduleparameters}%
+   \ifsecondargument
+     \getparameters[\??md:#1:][#2]%
+     \expanded{\getparameters[\??md:#1:][\the\scratchtoks]}%
+   \else
+     \getparameters[\??md:\currentmodule:][#1]%
+     \expanded{\getparameters[\??md:\currentmodule:][\the\scratchtoks]}%
+   \fi
+   \let\currentmoduleparameters\empty}
+
+\def\moduleparameter     #1#2{\executeifdefined{\??md:#1:#2}\s!empty}
+\def\currentmoduleparameter#1{\executeifdefined{\??md:\currentmodule:#1}\s!empty}
+
+% \usemodule[newmml]
+% \usemodule[newmml][a=b]
+% \usemodule[x][newmml]
+% \usemodule[x][newmml][a=b]
+%
+% \startmodule [mathml]
+%   \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars will be set afterwards
+%   \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars are now forgotten
+% \stopmodule
+
+% one can introduce test sections with:
+%
+% \enablemode[newmml:test:\currentmoduleparameter{test}]
+% \startmode[newmml:test:yes} ... \stopmode
+%
+% these will be ignored unless test=yes
+%
+% however, a better way is:
+
+\let\stopmoduletestsection\donothing
+
+\def\startmoduletestsection
+  {\bgroup
+   \setupmodule % we need to make sure that the vars are set
+   \doifelse{\currentmoduleparameter\v!test}\v!yes
+     {\egroup
+      \writestatus{\currentmodule}{loading experimental code}}
+     {\egroup
+      \writestatus{\currentmodule}{skipping experimental code}%
+      \gobbleuntil\stopmoduletestsection}}
+
+%D We also support a singular call, which saves us for
+%D frustrations when we do a typo.
+
+\let\usemodule=\usemodules
+
+% %D The definition shows that the language specific settings
+% %D are activated after loading all the modules specified.
+
+%D \macros
+%D   {ifprotectbuffers, bufferprefix,
+%D    TEXbufferfile, MPgraphicfile}
+%D
+%D The next switch enables protection of temporary filenames,
+%D which is needed when we process more files on one path at
+%D the same time.
+
+\newif\ifprotectbuffers
+
+\def\bufferprefix{\ifprotectbuffers\jobname-\fi}
+
+% The following filenames are defined here:
+
+\def\TEXbufferfile   #1{\bufferprefix#1.\f!temporaryextension}
+\def\MPgraphicfile     {\bufferprefix mp\ifMPrun run\else graph\fi} % not needed in luatex
+\def\convertMPcolorfile{\bufferprefix metacmyk.tmp}
+
+%D To save memory, we implement some seldomly used commands
+%D in a lazy way. Nota bene: such runtime definitions are
+%D global.
+%D
+%D \starttyping
+%D \fetchruntimecommand\showaccents{\f!encodingprefix ...}
+%D \stoptyping
+
+\def\fetchruntimecommand#1#2%
+  {\def#1{\dofetchruntimecommand#1{#2}}}
+
+\def\dofetchruntimecommand#1#2%
+  {\doifnotflagged{#2}
+     {\let#1\undefined
+      \startreadingfile
+      \startnointerference % \bgroup
+      \cleanupfeatures % better \setnormalcatcodes / test first
+      \readfile{#2}\donothing\donothing
+      \stopnointerference  % \egroup
+      \stopreadingfile
+      \doglobal\setflag{#2}}%
+   \ifx#1\undefined
+     \writestatus\m!systems{command \string#1 not found in file #2}%
+     \def#1{{\infofont[unknown command \string#1]}}%
+   \fi
+   #1}
+
+%D Experimental:
+
+\let\checkpreprocessor\relax
+
+%D To be documented and probably moved
+
+\def\documentresources{\@@erurl}
+
+\def\setupexternalresources
+  {\dodoubleargument\getparameters[\??er]}
+
+\setupexternalresources
+  [url=]
+
+%D This module will be perfected / changed / weeded.
+
+\protect \endinput
diff --git a/tex/context/base/core-fil.tex b/tex/context/base/core-fil.tex
deleted file mode 100644
index fca253a7b..000000000
--- a/tex/context/base/core-fil.tex
+++ /dev/null
@@ -1,347 +0,0 @@
-%D \module
-%D   [       file=core-fil,
-%D        version=1997.11.15,
-%D          title=\CONTEXT\ Core Macros,
-%D       subtitle=File Support,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / File Support}
-
-\unprotect
-
-%D Files registered as temporary files will be deleted after a
-%D run by texexec:
-
-% \starttext
-%     \immediate\openout\scratchwrite=oeps.tmp
-%     \immediate\write\scratchwrite{oeps}
-%     \immediate\closeout\scratchwrite
-%     \registertempfile{oeps.tmp}
-%     \typefile{oeps.tmp}
-% \stoptext
-
-\let\usedtempfile\gobbleoneargument
-
-\def\registertempfile#1{\immediatewriteutility{f t {#1}}}
-
-%D \macros
-%D   {definefilesynonym}
-%D
-%D One of the problems with loading files is that their names
-%D can depend on the interface language. We therefore need a
-%D method to define filesynonyms. The actual synonyms are
-%D defined elsewhere, but look like:
-%D
-%D \starttyping
-%D \definefilesynonym [chemic]  [chemie]
-%D \definefilesynonym [einheit] [unit]
-%D \definefilesynonym [unit]    [unit]
-%D \stoptyping
-%D
-%D So we can say in english:
-%D
-%D \starttyping
-%D \usemodules[pictex,chemic,unit]
-%D \stoptyping
-%D
-%D and in dutch:
-%D
-%D \starttyping
-%D \usemodules[pictex,chemie,unit]
-%D \stoptyping
-
-% will be redone in mkiv
-
-\def\definefilesynonym
-  {\dodoubleempty\dodefinefilesynonym}
-
-\def\dodefinefilesynonym[#1][#2]%
-  {\ifundefined{\??fs#1}\else
-     \doifnotvalue{\??fs#1}{#2}{\showmessage\m!files1{#1 (#2),\getvalue{\??fs#1}}}%
-   \fi
-   \doifelse{#1}{#2}{\letbeundefined{\??fs#1}{#2}}{\setevalue{\??fs#1}{#2}}}
-
-%D \macros
-%D   {definefilefallback}
-
-\def\definefilefallback
-  {\dodoubleargument\dodefinefilefallback}
-
-\def\dodefinefilefallback[#1][#2]%
-  {\doifnotfile{#1}
-     {\def\docommand##1{\doiffile{##1}{\definefilesynonym[#1][##1]\quitcommalist}}%
-      \processcommalist[#2]\docommand}}
-
-%D \macros
-%D   {truefilename}
-%D
-%D At the system level such a filename can be called upon by
-%D saying:
-%D
-%D \starttyping
-%D \truefilename{filename/filesynonym}
-%D \stoptyping
-%D
-%D The implementation shows that nesting is supported.
-
-\def\truefilename#1%
-  {\ifundefined{\??fs#1}#1\else\truefilename{\csname\??fs#1\endcsname}\fi}
-
-%D \macros
-%D   {makeshortfilename}
-%D
-%D To prevent cross platform problems with filenames, we
-%D lowercase them as well as only use the first 8~characters.
-%D
-%D \starttyping
-%D \def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]%
-%D   {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}%
-%D    \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
-%D
-%D \def\makeshortfilename[#1]%
-%D   {\edef\fullfilename{#1.........}%
-%D    \expanded{\domakeshortfilename[\fullfilename]}}
-%D \stoptyping
-%D
-%D In 2005 there is no need for the 8~character limit any more, so:
-
-\def\makeshortfilename[#1]% no need for further cleanup and shortening
-  {\lowercase{\edef\shortfilename{#1.}}%
-   \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
-
-%D \macros
-%D   {usemodule}
-%D
-%D Most of \CONTEXT is preloaded in the format file. Some very
-%D domain specific typesetting topics are however dealt with in
-%D separate modules, e.g. typesetting of chemical structure
-%D formulas. These modules are loaded by:
-%D
-%D \showsetup{usemodule}
-%D
-%D More information on the specific modules can be found in
-%D their dedicated manuals. We use \type {\next} so that we
-%D can \type {\end} in modules.
-
-\newconditional\moduleisloaded
-
-\def\dododousemodules#1#2% no \unprotect/\protect when loading,
-  {\relax                % since we need to use ? ! unprotected
-   \ifconditional\moduleisloaded % sometimes (see xtag-map)
-     \let\next\relax % or: \expandafter\gobbleoneargument
-   \else
-     \makeshortfilename[#1\truefilename{#2}]% beware: *- is not part of syn
-     \doifelseflagged\shortfilename
-       {\showmessage\m!systems7{#2 (line \number\inputlineno)}%
-        \settrue\moduleisloaded
-        \let\next\relax}
-       {\doglobal\setflag\shortfilename
-        \def\next
-          {\startreadingfile
-             \readsysfile\shortfilename
-               {\showmessage\m!systems5{#2}\settrue\moduleisloaded}
-               {\readsysfile{\shortfilename.\mksuffix} % new
-                  {\showmessage\m!systems5{#2 (\mksuffix)}\settrue\moduleisloaded}
-                  \donothing}%
-           \stopreadingfile}}%
-   \fi
-   \next}
-
-\def\dodousemodules#1#2%
-  {\setfalse\moduleisloaded
-   \doifelsenothing{#1}
-     {\dododousemodules\f!moduleprefix {#2}%
-      \dododousemodules\f!privateprefix{#2}%
-      \dododousemodules\f!styleprefix  {#2}%
-      \dododousemodules\f!xstyleprefix {#2}%
-      \dododousemodules\f!thirdprefix  {#2}%
-      \dododousemodules\empty          {#2}}% new, fall back on raw name
-     {\dododousemodules{#1-}{#2}}%
-   \ifconditional\moduleisloaded\else
-     \showmessage\m!systems6{#2}%
-     \appendtoks\showmessage\m!systems6{#2}\to\everynotabene
-   \fi}
-
-% \def\usemodules
-%   {\dodoubleempty\dousemodules}
-%
-% \def\dousemodules[#1][#2]%
-%   {\ifsecondargument
-%      \doifelsenothing{#2}
-%        {\let\next\relax}
-%        {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}%
-%    \else
-%      \def\next{\usemodules[][#1]}%
-%    \fi
-%    \next}
-%
-% \let\usemodule\usemodules
-
-\def\usemodules
-  {\dotripleempty\dousemodules}
-
-\def\dousemodules[#1][#2][#3]%
-  {\pushmacro\currentmodule
-   \pushmacro\currentmoduleparameters
-   \let\currentmoduleparameters\empty
-   \ifthirdargument
-     \doifelsenothing{#2}
-       {\let\next\relax}
-       {\def\currentmoduleparameters{#3}%
-        \def\next{\processcommalist[#2]{\dodousemodules{#1}}}}%
-   \else\ifsecondargument
-     \doifelsenothing{#2}
-       {\let\next\relax}
-       {\doifassignmentelse{#2}
-          {\def\currentmoduleparameters{#2}%
-           \def\next{\processcommalist[#1]{\dodousemodules{}}}}
-          {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}}%
-   \else
-     \def\next{\processcommalist[#1]{\dodousemodules{}}}%
-   \fi\fi
-   \next
-   \popmacro\currentmoduleparameters
-   \popmacro\currentmodule}
-
-\let\currentmoduleparameters\empty
-\let\currentmodule          \s!unknown
-
-\def\startmodule
-  {\doifnextoptionalelse\dostartmodule\nostartmodule}
-
-\def\nostartmodule #1 %
-  {\dostartmodule[#1]}
-
-\def\dostartmodule[#1]%
-  {\pushmacro\currentmodule
-   \pushmacro\currentmoduleparameters
-   \def\currentmodule{#1}}
-
-\def\stopmodule
-  {\popmacro\currentmoduleparameters
-   \popmacro\currentmodule}
-
-\def\setupmodule
-  {\dodoubleempty\dosetupmodule}
-
-\def\dosetupmodule[#1][#2]%
-  {\scratchtoks\expandafter{\currentmoduleparameters}%
-   \ifsecondargument
-     \getparameters[\??md:#1:][#2]%
-     \expanded{\getparameters[\??md:#1:][\the\scratchtoks]}%
-   \else
-     \getparameters[\??md:\currentmodule:][#1]%
-     \expanded{\getparameters[\??md:\currentmodule:][\the\scratchtoks]}%
-   \fi
-   \let\currentmoduleparameters\empty}
-
-\def\moduleparameter     #1#2{\executeifdefined{\??md:#1:#2}\s!empty}
-\def\currentmoduleparameter#1{\executeifdefined{\??md:\currentmodule:#1}\s!empty}
-
-% \usemodule[newmml]
-% \usemodule[newmml][a=b]
-% \usemodule[x][newmml]
-% \usemodule[x][newmml][a=b]
-%
-% \startmodule [mathml]
-%   \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars will be set afterwards
-%   \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars are now forgotten
-% \stopmodule
-
-% one can introduce test sections with:
-%
-% \enablemode[newmml:test:\currentmoduleparameter{test}]
-% \startmode[newmml:test:yes} ... \stopmode
-%
-% these will be ignored unless test=yes
-%
-% however, a better way is:
-
-\let\stopmoduletestsection\donothing
-
-\def\startmoduletestsection
-  {\bgroup
-   \setupmodule % we need to make sure that the vars are set
-   \doifelse{\currentmoduleparameter\v!test}\v!yes
-     {\egroup
-      \writestatus{\currentmodule}{loading experimental code}}
-     {\egroup
-      \writestatus{\currentmodule}{skipping experimental code}%
-      \gobbleuntil\stopmoduletestsection}}
-
-%D We also support a singular call, which saves us for
-%D frustrations when we do a typo.
-
-\let\usemodule=\usemodules
-
-% %D The definition shows that the language specific settings
-% %D are activated after loading all the modules specified.
-
-%D \macros
-%D   {ifprotectbuffers, bufferprefix,
-%D    TEXbufferfile, MPgraphicfile}
-%D
-%D The next switch enables protection of temporary filenames,
-%D which is needed when we process more files on one path at
-%D the same time.
-
-\newif\ifprotectbuffers
-
-\def\bufferprefix{\ifprotectbuffers\jobname-\fi}
-
-% The following filenames are defined here:
-
-\def\TEXbufferfile   #1{\bufferprefix#1.\f!temporaryextension}
-\def\MPgraphicfile     {\bufferprefix mp\ifMPrun run\else graph\fi} % not needed in luatex
-\def\convertMPcolorfile{\bufferprefix metacmyk.tmp}
-
-%D To save memory, we implement some seldomly used commands
-%D in a lazy way. Nota bene: such runtime definitions are
-%D global.
-%D
-%D \starttyping
-%D \fetchruntimecommand\showaccents{\f!encodingprefix ...}
-%D \stoptyping
-
-\def\fetchruntimecommand#1#2%
-  {\def#1{\dofetchruntimecommand#1{#2}}}
-
-\def\dofetchruntimecommand#1#2%
-  {\doifnotflagged{#2}
-     {\let#1\undefined
-      \startreadingfile
-      \startnointerference % \bgroup
-      \cleanupfeatures % better \setnormalcatcodes / test first
-      \readfile{#2}\donothing\donothing
-      \stopnointerference  % \egroup
-      \stopreadingfile
-      \doglobal\setflag{#2}}%
-   \ifx#1\undefined
-     \writestatus\m!systems{command \string#1 not found in file #2}%
-     \def#1{{\infofont[unknown command \string#1]}}%
-   \fi
-   #1}
-
-%D Experimental:
-
-\let\checkpreprocessor\relax
-
-%D To be documented and probably moved
-
-\def\documentresources{\@@erurl}
-
-\def\setupexternalresources
-  {\dodoubleargument\getparameters[\??er]}
-
-\setupexternalresources
-  [url=]
-
-%D This module will be perfected / changed / weeded.
-
-\protect \endinput
diff --git a/tex/context/base/core-gen.mkii b/tex/context/base/core-gen.mkii
new file mode 100644
index 000000000..b6ab2a208
--- /dev/null
+++ b/tex/context/base/core-gen.mkii
@@ -0,0 +1,166 @@
+%D \module
+%D   [       file=core-gen,
+%D        version=1995.10.10,
+%D          title=\CONTEXT\ Core Macros,
+%D       subtitle=General,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / General}
+
+\unprotect
+
+%D \macros
+%D   {assigndimension,assignalfadimension}
+%D
+%D Hieronder worden enkele commando's gedefinieerd rond
+%D toekenningen. Allereerst een commando om waarden aan
+%D een \DIMENSION\ toe te kennen:
+%D
+%D \starttyping
+%D \assigndimension
+%D   {|klein|middel|groot|-klein|-middel|-groot|geen}
+%D   {\dimension}
+%D   {waarde klein}
+%D   {waarde middel}
+%D   {waarde groot}
+%D \stoptyping
+%D
+%D Hierbij krijgt de \DIMENSION\ \type{\dimension} een waarde
+%D afhankelijk van het meegegeven trefwoord.
+%D
+%D \startnarrower
+%D \startlines
+%D \type{(-)klein }\qquad (--) waarde klein
+%D \type{(-)middel}\qquad (--) waarde middel
+%D \type{(-)groot }\qquad (--) waarde groot
+%D \type{geen     }\qquad 0pt
+%D \type{waarde   }\qquad waarde
+%D \stoplines
+%D \stopnarrower
+%D
+%D Een trefwoord mag worden voorafgegaan door een \type{-}.
+%D Deze macro toont een voorbeeld van het gebruik van
+%D \type{\processaction} en constanten.
+%D
+%D Analoog aan het bovenstaande commando kennen we een
+%D commando om waarden toe te kennen aan een macro:
+%D
+%D \starttyping
+%D \assignalfadimension
+%D   {|klein|middel|groot|geen}
+%D   {\macro}
+%D   {waarde klein}
+%D   {waarde middel}
+%D   {waarde groot}
+%D \stoptyping
+
+% The third (optimized) version:
+
+\def\@ad@{@ad@}
+
+\setvalue{\@ad@ \v!none  }{\zeropoint\gobblethreearguments}
+\setvalue{\@ad@ \v!big   }{\thirdofthreearguments}
+\setvalue{\@ad@ \v!medium}{\secondofthreearguments}
+\setvalue{\@ad@ \v!small }{\firstofthreearguments}
+\setvalue{\@ad@-\v!big   }{-\thirdofthreearguments}
+\setvalue{\@ad@-\v!medium}{-\secondofthreearguments}
+\setvalue{\@ad@-\v!small }{-\firstofthreearguments}
+
+\def\assigndimension#1#2% #3 #4 #5
+  {#2=\ifcsname\@ad@#1\endcsname
+     \csname\@ad@#1\expandafter\endcsname
+   \else
+     #1\expandafter\gobblethreearguments
+   \fi}
+
+\def\@aa@{@aa@}
+
+\setvalue{\@aa@\v!none  }{0\gobblethreearguments}
+\setvalue{\@aa@\v!big   }{\thirdofthreearguments}
+\setvalue{\@aa@\v!medium}{\secondofthreearguments}
+\setvalue{\@aa@\v!small }{\firstofthreearguments}
+
+\def\assignalfadimension#1#2#3#4#5% #3#4#5 are single digits
+  {\edef#2{\ifcsname\@aa@#1\endcsname
+     \csname\@aa@#1\expandafter\endcsname
+   \else
+     #1\expandafter\gobblethreearguments
+   \fi#3#4#5}}
+
+%D \macros
+%D   {assignvalue}
+%D
+%D Een variant hierop is het commando:
+%D
+%D \starttyping
+%D \assignvalue
+%D   {|klein|middel|groot}
+%D   {\macro}
+%D   {waarde klein }
+%D   {waarde middel}
+%D   {waarde groot}
+%D \stoptyping
+%D
+%D Hierbij krijgt \type{\macro} een waarde afhankelijk van
+%D het meegegeven trefwoord:
+%D
+%D \startnarrower
+%D \startlines
+%D \type{klein }\qquad waarde klein
+%D \type{middel}\qquad waarde middel
+%D \type{groot }\qquad waarde groot
+%D \type{waarde}\qquad waarde
+%D \stoplines
+%D \stopnarrower
+%D
+%D Hier doet \type{geen} dus niet mee.
+
+\def\@av@{@av@}
+
+\letvalue{\@av@\v!big   }\thirdofthreearguments
+\letvalue{\@av@\v!medium}\secondofthreearguments
+\letvalue{\@av@\v!small }\firstofthreearguments
+
+\def\assignvalue#1#2#3#4#5%
+  {\edef#2{\ifcsname\@av@#1\endcsname
+     \csname\@av@#1\expandafter\endcsname
+   \else
+     #1\expandafter\gobblethreearguments
+   \fi{#3}{#4}{#5}}}
+
+%D \macros
+%D   {assignwidth}
+%D
+%D Een breedte van een opgegeven tekst kan worden berekend en
+%D toegekend aan een \DIMENSION\ met:
+%D
+%D \starttyping
+%D \assignwidth
+%D   {\dimension}
+%D   {|passend|ruim}
+%D   {tekst}
+%D \stoptyping
+%D
+%D Dit commando sluit, evenals de bovenstaande
+%D \type{\assign}||commando's, aan op de wijze waarop
+%D in de andere \CONTEXT||modules toekenningen
+%D plaatsvinden. Bij \type{ruim} wordt de gemeten breedte
+%D met 1~em vermeerderd.
+
+\def\assignwidth#1#2#3#4%
+  {\doifelsenothing{#2}
+     {\setbox\scratchbox\hbox{#3}%
+      #1\wd\scratchbox}
+     {\doifinsetelse{#2}{\v!fit,\v!broad}
+        {\setbox\scratchbox\hbox{#3}%
+         #1\wd\scratchbox
+         \doif{#2}\v!broad{\advance#1 #4}}%
+        {#1=#2}}}%
+
+\protect \endinput
diff --git a/tex/context/base/core-gen.mkiv b/tex/context/base/core-gen.mkiv
new file mode 100644
index 000000000..b6ab2a208
--- /dev/null
+++ b/tex/context/base/core-gen.mkiv
@@ -0,0 +1,166 @@
+%D \module
+%D   [       file=core-gen,
+%D        version=1995.10.10,
+%D          title=\CONTEXT\ Core Macros,
+%D       subtitle=General,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / General}
+
+\unprotect
+
+%D \macros
+%D   {assigndimension,assignalfadimension}
+%D
+%D Hieronder worden enkele commando's gedefinieerd rond
+%D toekenningen. Allereerst een commando om waarden aan
+%D een \DIMENSION\ toe te kennen:
+%D
+%D \starttyping
+%D \assigndimension
+%D   {|klein|middel|groot|-klein|-middel|-groot|geen}
+%D   {\dimension}
+%D   {waarde klein}
+%D   {waarde middel}
+%D   {waarde groot}
+%D \stoptyping
+%D
+%D Hierbij krijgt de \DIMENSION\ \type{\dimension} een waarde
+%D afhankelijk van het meegegeven trefwoord.
+%D
+%D \startnarrower
+%D \startlines
+%D \type{(-)klein }\qquad (--) waarde klein
+%D \type{(-)middel}\qquad (--) waarde middel
+%D \type{(-)groot }\qquad (--) waarde groot
+%D \type{geen     }\qquad 0pt
+%D \type{waarde   }\qquad waarde
+%D \stoplines
+%D \stopnarrower
+%D
+%D Een trefwoord mag worden voorafgegaan door een \type{-}.
+%D Deze macro toont een voorbeeld van het gebruik van
+%D \type{\processaction} en constanten.
+%D
+%D Analoog aan het bovenstaande commando kennen we een
+%D commando om waarden toe te kennen aan een macro:
+%D
+%D \starttyping
+%D \assignalfadimension
+%D   {|klein|middel|groot|geen}
+%D   {\macro}
+%D   {waarde klein}
+%D   {waarde middel}
+%D   {waarde groot}
+%D \stoptyping
+
+% The third (optimized) version:
+
+\def\@ad@{@ad@}
+
+\setvalue{\@ad@ \v!none  }{\zeropoint\gobblethreearguments}
+\setvalue{\@ad@ \v!big   }{\thirdofthreearguments}
+\setvalue{\@ad@ \v!medium}{\secondofthreearguments}
+\setvalue{\@ad@ \v!small }{\firstofthreearguments}
+\setvalue{\@ad@-\v!big   }{-\thirdofthreearguments}
+\setvalue{\@ad@-\v!medium}{-\secondofthreearguments}
+\setvalue{\@ad@-\v!small }{-\firstofthreearguments}
+
+\def\assigndimension#1#2% #3 #4 #5
+  {#2=\ifcsname\@ad@#1\endcsname
+     \csname\@ad@#1\expandafter\endcsname
+   \else
+     #1\expandafter\gobblethreearguments
+   \fi}
+
+\def\@aa@{@aa@}
+
+\setvalue{\@aa@\v!none  }{0\gobblethreearguments}
+\setvalue{\@aa@\v!big   }{\thirdofthreearguments}
+\setvalue{\@aa@\v!medium}{\secondofthreearguments}
+\setvalue{\@aa@\v!small }{\firstofthreearguments}
+
+\def\assignalfadimension#1#2#3#4#5% #3#4#5 are single digits
+  {\edef#2{\ifcsname\@aa@#1\endcsname
+     \csname\@aa@#1\expandafter\endcsname
+   \else
+     #1\expandafter\gobblethreearguments
+   \fi#3#4#5}}
+
+%D \macros
+%D   {assignvalue}
+%D
+%D Een variant hierop is het commando:
+%D
+%D \starttyping
+%D \assignvalue
+%D   {|klein|middel|groot}
+%D   {\macro}
+%D   {waarde klein }
+%D   {waarde middel}
+%D   {waarde groot}
+%D \stoptyping
+%D
+%D Hierbij krijgt \type{\macro} een waarde afhankelijk van
+%D het meegegeven trefwoord:
+%D
+%D \startnarrower
+%D \startlines
+%D \type{klein }\qquad waarde klein
+%D \type{middel}\qquad waarde middel
+%D \type{groot }\qquad waarde groot
+%D \type{waarde}\qquad waarde
+%D \stoplines
+%D \stopnarrower
+%D
+%D Hier doet \type{geen} dus niet mee.
+
+\def\@av@{@av@}
+
+\letvalue{\@av@\v!big   }\thirdofthreearguments
+\letvalue{\@av@\v!medium}\secondofthreearguments
+\letvalue{\@av@\v!small }\firstofthreearguments
+
+\def\assignvalue#1#2#3#4#5%
+  {\edef#2{\ifcsname\@av@#1\endcsname
+     \csname\@av@#1\expandafter\endcsname
+   \else
+     #1\expandafter\gobblethreearguments
+   \fi{#3}{#4}{#5}}}
+
+%D \macros
+%D   {assignwidth}
+%D
+%D Een breedte van een opgegeven tekst kan worden berekend en
+%D toegekend aan een \DIMENSION\ met:
+%D
+%D \starttyping
+%D \assignwidth
+%D   {\dimension}
+%D   {|passend|ruim}
+%D   {tekst}
+%D \stoptyping
+%D
+%D Dit commando sluit, evenals de bovenstaande
+%D \type{\assign}||commando's, aan op de wijze waarop
+%D in de andere \CONTEXT||modules toekenningen
+%D plaatsvinden. Bij \type{ruim} wordt de gemeten breedte
+%D met 1~em vermeerderd.
+
+\def\assignwidth#1#2#3#4%
+  {\doifelsenothing{#2}
+     {\setbox\scratchbox\hbox{#3}%
+      #1\wd\scratchbox}
+     {\doifinsetelse{#2}{\v!fit,\v!broad}
+        {\setbox\scratchbox\hbox{#3}%
+         #1\wd\scratchbox
+         \doif{#2}\v!broad{\advance#1 #4}}%
+        {#1=#2}}}%
+
+\protect \endinput
diff --git a/tex/context/base/core-gen.tex b/tex/context/base/core-gen.tex
deleted file mode 100644
index b6ab2a208..000000000
--- a/tex/context/base/core-gen.tex
+++ /dev/null
@@ -1,166 +0,0 @@
-%D \module
-%D   [       file=core-gen,
-%D        version=1995.10.10,
-%D          title=\CONTEXT\ Core Macros,
-%D       subtitle=General,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / General}
-
-\unprotect
-
-%D \macros
-%D   {assigndimension,assignalfadimension}
-%D
-%D Hieronder worden enkele commando's gedefinieerd rond
-%D toekenningen. Allereerst een commando om waarden aan
-%D een \DIMENSION\ toe te kennen:
-%D
-%D \starttyping
-%D \assigndimension
-%D   {|klein|middel|groot|-klein|-middel|-groot|geen}
-%D   {\dimension}
-%D   {waarde klein}
-%D   {waarde middel}
-%D   {waarde groot}
-%D \stoptyping
-%D
-%D Hierbij krijgt de \DIMENSION\ \type{\dimension} een waarde
-%D afhankelijk van het meegegeven trefwoord.
-%D
-%D \startnarrower
-%D \startlines
-%D \type{(-)klein }\qquad (--) waarde klein
-%D \type{(-)middel}\qquad (--) waarde middel
-%D \type{(-)groot }\qquad (--) waarde groot
-%D \type{geen     }\qquad 0pt
-%D \type{waarde   }\qquad waarde
-%D \stoplines
-%D \stopnarrower
-%D
-%D Een trefwoord mag worden voorafgegaan door een \type{-}.
-%D Deze macro toont een voorbeeld van het gebruik van
-%D \type{\processaction} en constanten.
-%D
-%D Analoog aan het bovenstaande commando kennen we een
-%D commando om waarden toe te kennen aan een macro:
-%D
-%D \starttyping
-%D \assignalfadimension
-%D   {|klein|middel|groot|geen}
-%D   {\macro}
-%D   {waarde klein}
-%D   {waarde middel}
-%D   {waarde groot}
-%D \stoptyping
-
-% The third (optimized) version:
-
-\def\@ad@{@ad@}
-
-\setvalue{\@ad@ \v!none  }{\zeropoint\gobblethreearguments}
-\setvalue{\@ad@ \v!big   }{\thirdofthreearguments}
-\setvalue{\@ad@ \v!medium}{\secondofthreearguments}
-\setvalue{\@ad@ \v!small }{\firstofthreearguments}
-\setvalue{\@ad@-\v!big   }{-\thirdofthreearguments}
-\setvalue{\@ad@-\v!medium}{-\secondofthreearguments}
-\setvalue{\@ad@-\v!small }{-\firstofthreearguments}
-
-\def\assigndimension#1#2% #3 #4 #5
-  {#2=\ifcsname\@ad@#1\endcsname
-     \csname\@ad@#1\expandafter\endcsname
-   \else
-     #1\expandafter\gobblethreearguments
-   \fi}
-
-\def\@aa@{@aa@}
-
-\setvalue{\@aa@\v!none  }{0\gobblethreearguments}
-\setvalue{\@aa@\v!big   }{\thirdofthreearguments}
-\setvalue{\@aa@\v!medium}{\secondofthreearguments}
-\setvalue{\@aa@\v!small }{\firstofthreearguments}
-
-\def\assignalfadimension#1#2#3#4#5% #3#4#5 are single digits
-  {\edef#2{\ifcsname\@aa@#1\endcsname
-     \csname\@aa@#1\expandafter\endcsname
-   \else
-     #1\expandafter\gobblethreearguments
-   \fi#3#4#5}}
-
-%D \macros
-%D   {assignvalue}
-%D
-%D Een variant hierop is het commando:
-%D
-%D \starttyping
-%D \assignvalue
-%D   {|klein|middel|groot}
-%D   {\macro}
-%D   {waarde klein }
-%D   {waarde middel}
-%D   {waarde groot}
-%D \stoptyping
-%D
-%D Hierbij krijgt \type{\macro} een waarde afhankelijk van
-%D het meegegeven trefwoord:
-%D
-%D \startnarrower
-%D \startlines
-%D \type{klein }\qquad waarde klein
-%D \type{middel}\qquad waarde middel
-%D \type{groot }\qquad waarde groot
-%D \type{waarde}\qquad waarde
-%D \stoplines
-%D \stopnarrower
-%D
-%D Hier doet \type{geen} dus niet mee.
-
-\def\@av@{@av@}
-
-\letvalue{\@av@\v!big   }\thirdofthreearguments
-\letvalue{\@av@\v!medium}\secondofthreearguments
-\letvalue{\@av@\v!small }\firstofthreearguments
-
-\def\assignvalue#1#2#3#4#5%
-  {\edef#2{\ifcsname\@av@#1\endcsname
-     \csname\@av@#1\expandafter\endcsname
-   \else
-     #1\expandafter\gobblethreearguments
-   \fi{#3}{#4}{#5}}}
-
-%D \macros
-%D   {assignwidth}
-%D
-%D Een breedte van een opgegeven tekst kan worden berekend en
-%D toegekend aan een \DIMENSION\ met:
-%D
-%D \starttyping
-%D \assignwidth
-%D   {\dimension}
-%D   {|passend|ruim}
-%D   {tekst}
-%D \stoptyping
-%D
-%D Dit commando sluit, evenals de bovenstaande
-%D \type{\assign}||commando's, aan op de wijze waarop
-%D in de andere \CONTEXT||modules toekenningen
-%D plaatsvinden. Bij \type{ruim} wordt de gemeten breedte
-%D met 1~em vermeerderd.
-
-\def\assignwidth#1#2#3#4%
-  {\doifelsenothing{#2}
-     {\setbox\scratchbox\hbox{#3}%
-      #1\wd\scratchbox}
-     {\doifinsetelse{#2}{\v!fit,\v!broad}
-        {\setbox\scratchbox\hbox{#3}%
-         #1\wd\scratchbox
-         \doif{#2}\v!broad{\advance#1 #4}}%
-        {#1=#2}}}%
-
-\protect \endinput
diff --git a/tex/context/base/core-grd.mkii b/tex/context/base/core-grd.mkii
new file mode 100644
index 000000000..249e2e430
--- /dev/null
+++ b/tex/context/base/core-grd.mkii
@@ -0,0 +1,1074 @@
+%D \module
+%D   [       file=core-grd,
+%D        version=1998.03.10,
+%D          title=\CONTEXT\ Core Macros,
+%D       subtitle=Grid Snapping (Experimental),
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Grid Snapping}
+
+\unprotect
+
+%D Moved from supp-box:
+
+%D \macros
+%D  {startbaselinecorrection,baselinecorrection,
+%D   showbaselinecorrection,offbaselinecorrection}
+%D
+%D Spacing around ruled boxes can get pretty messed up. The
+%D next macro tries as good as possible to fix this.
+%D
+%D \startbuffer[1]
+%D \startbaselinecorrection
+%D \ruledhbox{Rule Brittanica}
+%D \stopbaselinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer[1]
+%D
+%D The macros put some white space around the box:
+%D
+%D \getbuffer[1]
+%D
+%D A simple alternative is \type {\baselinecorrection}, which
+%D only looks at the previous line.
+%D
+%D \startbuffer[2]
+%D \baselinecorrection
+%D \ruledhbox{Rule Brittanica}
+%D \baselinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer[2]
+%D
+%D This time the last preceding line gets a correction,%
+%D dependant on the depth.
+%D
+%D \getbuffer[2]
+%D
+%D One can make the correction visible by saying \type
+%D {\showbaselinecorrection}. Part of the correction is
+%D calculated from the dimensions of a~(. One can disble the
+%D correction by calling \type {\offbaselinecorrection}.
+%D
+%D When visualize the first example looks like:
+%D
+%D {\showbaselinecorrection\getbuffer[1]}
+%D
+%D and the second one comes out as:
+%D
+%D {\showbaselinecorrection\getbuffer[2]}
+
+% \definecolor[GridLineColor][red]
+% \definecolor[GridTextColor][blue]
+
+\definepalet
+  [grid]
+  [  one=red,
+     two=green,
+   three=blue,
+    four=gray]
+
+\def\setbaselinecorrections
+  {\setbox0\hbox{\setstrut\strut}%
+   \setbox2\hbox{(}%
+   \dimen0\ht0\advance\dimen0 -\ht2
+   \ifdim\dimen0<\zeropoint\dimen0\zeropoint\fi
+   \dimen2\dp0\advance\dimen2 -\dp2
+   \ifdim\dimen2<\zeropoint\dimen2\zeropoint\fi
+   \edef\thetopbaselinecorrection   {\the\dimen0}\dimen0-\dimen0
+   \edef\thebotbaselinecorrection   {\the\dimen2}\dimen2-\dimen2
+   \edef\thenegtopbaselinecorrection{\the\dimen0}%
+   \edef\thenegbotbaselinecorrection{\the\dimen2}}
+
+\def\dotopbaselinecorrection   {\kern\thetopbaselinecorrection}
+\def\dobotbaselinecorrection   {\kern\thebotbaselinecorrection}
+\def\donegtopbaselinecorrection{\kern\thenegtopbaselinecorrection}
+\def\donegbotbaselinecorrection{\kern\thenegbotbaselinecorrection}
+
+\def\showbaselinecorrection
+  {\def\dobaselinecorrection % visualization is not watertight!
+     {\bgroup
+\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
+      \setbox0\null
+      \wd0\hsize
+      \dp0\strutdp
+      \nointerlineskip
+      \forgetall
+      \ruledvbox{\box0}%
+      \egroup
+      \prevdepth\strutdp}%
+   \def\dotopbaselinecorrection
+     {\hrule\!!height\thetopbaselinecorrection}%
+   \def\dobotbaselinecorrection
+     {\hrule\!!height\thebotbaselinecorrection}}
+
+\def\dobaselinecorrection
+  {\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
+   \kern\strutdp
+   \prevdepth\strutdp}
+
+% \def\baselinecorrection
+%   {\endgraf
+%    \ifvmode
+%      \ifdim\prevdepth<\maxdimen
+%        \ifdim\prevdepth<\zeropoint \else
+%          \ifdim\prevdepth<\strutdp
+%            \dobaselinecorrection
+%          \fi
+%        \fi
+%      \fi
+%    \fi}
+
+\def\baselinecorrection
+  {\endgraf
+   \ifvmode
+     \ifdim\prevdepth<\maxdimen
+       \ifdim\prevdepth<\zeropoint \else
+         \ifdim\prevdepth<\strutdepth \relax
+           \pushlastnode
+           \dobaselinecorrection
+           \poplastnode
+         \fi
+       \fi
+     \fi
+   \fi}
+
+\def\pagebaselinecorrection
+  {\ifdim\pagegoal<\maxdimen
+     \ifdim\pagetotal>\lineheight % or \topskip
+       \scratchdimen\pagetotal
+       \advance\scratchdimen\lineheight
+       \ifdim\scratchdimen<\pagegoal
+         \baselinecorrection
+       \fi
+     \fi
+   \fi}
+
+% Beware, keep this one as it is, see for instance module
+% m-steps.tex, where we apply a \localhsize to the \vbox, in
+% order to follow narrower and side floats !
+
+% \def\startbaselinecorrection
+%   {\baselinecorrection
+%    \ifvmode
+%      \bgroup
+%      \setbox\scratchbox\vbox\bgroup
+%      \ignorespaces
+%      \let\stopbaselinecorrection\dostopbaselinecorrection
+%    \else
+%      \let\stopbaselinecorrection\relax
+%    \fi}
+
+% \def\dostopbaselinecorrection % I have to check columns yet.
+%   {\endgraf
+%    \egroup
+%    \topbaselinecorrection
+%    \box\scratchbox
+%    \botbaselinecorrection
+%    \egroup}
+
+% \let\stopbaselinecorrection=\relax
+
+\def\startbaselinecorrection
+  {\bgroup
+   \let\stopbaselinecorrection\egroup
+   \ifcase\baselinecorrectionmode
+   \or % normal
+     \baselinecorrection
+     \ifvmode
+       \setbox\scratchbox\vbox\bgroup\ignorespaces
+       \let\stopbaselinecorrection\donormalstopbaselinecorrection
+     \fi
+   \or % off
+   \or % force
+     \baselinecorrection
+     \ifvmode
+       \setbox\scratchbox\vbox\bgroup\ignorespaces
+       \let\stopbaselinecorrection\doforcedstopbaselinecorrection
+     \fi
+   \fi}
+
+\let\stopbaselinecorrection\relax
+
+\def\donormalstopbaselinecorrection % I have to check columns yet.
+  {\egroup
+   \topbaselinecorrection
+   \box\scratchbox
+   \botbaselinecorrection
+   \egroup}
+
+\def\doforcedstopbaselinecorrection % I have to check columns yet.
+  {\egroup
+   \forcedtopbaselinecorrection
+   \box\scratchbox
+   \forcedbotbaselinecorrection
+   \egroup}
+
+%D We do a bit more checking than needed. The pageborder check
+%D is not needed, but I want to look the visualization as good
+%D as possible too.
+
+% \def\offbaselinecorrection % Can be used inside correction.
+%   {\def\startbaselinecorrection{\bgroup\let\stopbaselinecorrection\egroup}}
+
+\chardef\baselinecorrectionmode\plusone
+
+\def\onbaselinecorrection   {\chardef\baselinecorrectionmode\plusone  }
+\def\offbaselinecorrection  {\chardef\baselinecorrectionmode\plustwo  }
+\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree}
+
+%D \macros
+%D  {topbaselinecorrection,botbaselinecorrection}
+%D
+%D The actual top and bottom corrections are implemented as:
+
+% \def\topbaselinecorrection
+%   {\ifvmode \ifdim\pagegoal<\maxdimen
+%      \bgroup
+%      \setbaselinecorrections
+%      \whitespace
+%      \nointerlineskip
+%      \dotopbaselinecorrection
+%      \egroup
+%    \fi \fi}
+
+
+\def\topbaselinecorrection
+  {\ifvmode \ifdim\pagegoal<\maxdimen
+     \forcedtopbaselinecorrection
+   \fi \fi}
+
+\def\forcedtopbaselinecorrection
+  {\ifvmode
+     \bgroup
+     \setbaselinecorrections
+     \whitespace
+     \nointerlineskip
+     \dotopbaselinecorrection
+     \egroup
+   \fi}
+
+\def\botbaselinecorrection
+  {\ifvmode
+     \bgroup
+     \setbaselinecorrections
+     \dobotbaselinecorrection
+     \allowbreak % new, otherwise problems when many in a row
+     \prevdepth\strutdp
+     \egroup
+   \fi}
+
+\let\forcedbotbaselinecorrection\botbaselinecorrection
+
+%D Still very experimental and therefore undocumented.
+
+\newif\ifgridsnapping  % UNDER DEVELOPMENT, USE WITH CARE
+\newif\ifforcepresnap  \forcepresnaptrue  % false in mixed single/double
+\newif\ifstrutsnapping \strutsnappingtrue % sometimes handy to be false
+
+\def\positiveextrasnap {\gdef\extrasnapsign{+}}
+\def\negativeextrasnap {\gdef\extrasnapsign{-}}
+
+\def\extrasnapreset  {\global\chardef\@@extrasnap0
+                      \positiveextrasnap}
+\def\extrasnapbefore {\global\chardef\@@extrasnap1 }
+\def\extrasnaparound {\global\chardef\@@extrasnap2 }
+\def\extrasnapafter  {\global\chardef\@@extrasnap3 }
+
+\def\enablepresnapcorrection  {\global\chardef\@@presnap\zerocount}
+\def\disablepresnapcorrection {\global\chardef\@@presnap\plusone}
+
+\extrasnapreset \enablepresnapcorrection
+
+\newif\iftracegridsnapping
+\newif\ifshowgridboxes
+\newif\ifshowfuzzyskips
+
+\let\showgridboxes\showgridboxestrue
+
+\def\showgridsnapping
+  {\tracegridsnappingtrue
+   \showgridboxestrue}
+
+\chardef\@@alignsnap      =0
+\chardef\@@alignsnapbox   =0
+\chardef\@@alignsnapmethod=0
+
+\let\presnapskip \!!zeropoint  \def\presnap {-}
+\let\postsnapskip\!!zeropoint  \let\postsnap\presnap
+
+\newcount\currentgridsnap
+
+\def\tracedsnapping
+  {\iftracegridsnapping
+     \llap
+       {\startlayoutcomponent{gridsnaps}{grid snaps}%
+        \infofont
+        \global\advance\currentgridsnap\plusone
+        \color[grid:three]{\vl\presnapskip
+                    \vl\presnap
+                    \vl\postsnap
+                    \ifcase\@@alignsnapbox\relax
+                      \vl\ifcase\@@extrasnap
+                              00\or
+                 \extrasnapsign0\or
+    \extrasnapsign\extrasnapsign\or
+                 0\extrasnapsign\fi
+                    \fi
+                    \vl\the\currentgridsnap\vl}%
+        \stoplayoutcomponent}%
+   \fi}
+
+\def\snaptogrid% [#1]#2 -> #2 == \hbox|\vbox
+  {\dosingleempty\dosnaptogrid}
+
+% \def\dosnaptogrid[#1]%
+%   {\ifgridsnapping
+%      \iffirstargument\doifsomething{#1}{\verplaatsopgrid[#1]}\fi
+%      \expandafter\dodosnaptogrid
+%    \fi}
+
+% \def\dosnaptogrid[#1]%
+%   {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up
+%    \ifgridsnapping
+%      \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi
+%      \expandafter\dodosnaptogrid
+%    \fi}
+
+\def\dosnaptogrid[#1]%
+  {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up
+   \doifinsetelse\v!force{#1}%
+     {\moveongrid[#1]%
+      \dodosnaptogrid}
+     {\ifgridsnapping
+        \doifsomething{#1}{\moveongrid[#1]}%
+        \expandafter\dodosnaptogrid
+      \fi}}
+
+% \def\forcedpresnapcorrection % test this on 'details'
+%   {\ifforcepresnap
+%      \ifvmode \else \par \fi % new
+%      % we don't want top of page space  when 'top' option
+%      %\verticalstrut\nobreak\vskip-\struttotal
+%      %\verticalstrut\vskip-\struttotal
+%      % nobreak really needed
+%      \allowbreak\verticalstrut\nobreak\vskip-\struttotal
+%      %\ifdim\pagetotal>\topskip \else
+%        % eigenlijk signal
+%        %\writestatus{grid}{removing dummy at top of page}%
+%        %\bgroup
+%        %\output{\setbox\scratchbox\box255}%
+%        %\penalty\outputpenalty
+%        %\egroup
+%      %\fi
+%    \fi}
+
+\def\forcedpresnapcorrection % test this on 'details'
+  {\ifforcepresnap
+     \ifvmode \else \par \fi % new
+     % we don't want top of page space  when 'top' option
+     % \verticalstrut\nobreak\vskip-\struttotal
+     % \verticalstrut\vskip-\struttotal
+     % \nobreak really needed
+     % \dosomebreak\allowbreak % no: spoils heads, so only under know situation, not in snapper
+     \verticalstrut
+     \nobreak
+     \vskip-\struttotal
+     %\ifdim\pagetotal>\topskip \else
+       % eigenlijk signal
+       %\writestatus{grid}{removing dummy at top of page}%
+       %\bgroup
+       %\output{\setbox\scratchbox\box255}%
+       %\penalty\outputpenalty
+       %\egroup
+     %\fi
+   \fi}
+
+\def\setgridtracebox#1[#2]% % maybe reverse the order
+  {\setbox\nextbox#1%
+     {\hbox
+        {\hbox to \zeropoint
+           {\startlayoutcomponent{gridsnaps}{grid snaps}%
+            \color[grid:#2]{\ruledhbox{\fakebox\nextbox}}%
+            \stoplayoutcomponent
+            \hss}%
+         \flushnextbox}}}
+
+\newif\ifboxedsnapping \boxedsnappingtrue
+
+\chardef\depthsnapmethod \plusone % downward compatible, minus one line
+\chardef\heightsnapmethod\plusone % downward compatible, minus one line
+
+\def\dodosnaptogrid
+  {\dowithnextbox
+     {\bgroup
+      \ifcase\@@alignsnapmethod \or
+        % we're dealing with text with a possible big depth/height
+        \chardef\depthsnapmethod \plustwo
+        \chardef\heightsnapmethod\plustwo
+      \fi
+      \ifdim\nextboxht<\textheight % handle special case (like page fig)
+        \ifcase\@@alignsnapbox\relax
+          \ifcase\@@alignsnap\else % 1=top 2=high 3=middle 4=low
+            \ifshowgridboxes
+              \setgridtracebox\hbox[two]%
+            \fi
+           %\getnoflines{\nextboxht}%
+            \getnoflines\nextboxht
+            \setbox\nextbox\vbox to \noflines\lineheight
+              {\ifnum\@@alignsnap=1 \kern\lineheight\kern-\topskip\fi
+               \ifnum\@@alignsnap>2 \vfill\fi
+               \flushnextbox
+             \ifnum\@@alignsnap<4 \vfill\fi}%
+          \fi
+          \ifshowgridboxes
+            \setgridtracebox\hbox[three]%
+          \fi
+          \forgetall
+          \par
+          \ifvbox\nextbox
+            \setbox\nextbox\hbox{\flushnextbox}% don't ask
+          \fi
+          \scratchskip\lastskip
+          \edef\presnapskip{\the\lastskip}%
+          % mixing single/double columns sometimes goes wrong,
+          % check 'som' document
+          \ifinsidecolumns
+            \forcepresnaptrue
+          \fi
+          \forcedpresnapcorrection
+          \ifdim\nextboxht>\strutht
+            \scratchdimen\nextboxht
+            \ifcase\@@presnap\relax
+              \ifdim\scratchskip>\zeropoint\relax
+                \scratchcounter\scratchskip
+                \advance\scratchcounter -\openlineheight
+                \ifnum\scratchcounter<0
+                  \scratchcounter-\scratchcounter
+                \fi
+                \ifnum\scratchcounter<10 % \lastkip is about \openlineheight
+                  \advance\scratchdimen -\openstrutdepth
+                  \edef\presnapskip{*\presnapskip}%
+                \else\ifdim\scratchskip>\openlineheight
+                                      %<\openlineheight \else
+                  \advance\scratchdimen -\openstrutdepth
+                  \edef\presnapskip{*\presnapskip}%
+                \fi\fi
+              \fi
+            \fi
+          % \getnoflines\scratchdimen % maybe raw ?
+          % \advance\noflines -1
+            \ifcase\heightsnapmethod
+              % raw
+            \or
+              \advance\scratchdimen-\lineheight  % tight (default)
+            \or
+              \advance\scratchdimen-\strutheight % fit (text)
+            \or
+              \advance\scratchdimen-\strutheight % tolerant
+              \advance\scratchdimen-\roundingeps
+            \fi
+            \getnoflines\scratchdimen
+            \ifnum\noflines>0
+              \scratchdimen\noflines\lineheight
+            \else
+              \scratchdimen\zeropoint
+            \fi
+          \else
+            \scratchdimen\zeropoint
+          \fi
+          \ifnum\@@extrasnap=1 \advance\scratchdimen \extrasnapsign  \lineheight \fi
+          \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi
+          \edef\presnap{\the\scratchdimen}%
+          \ifstrutsnapping
+            \ifboxedsnapping
+              \getrawnoflines\scratchdimen
+              \advance\scratchdimen-\noflines\lineheight
+              \vskip\scratchdimen % disappears at top of page
+              \dorecurse\noflines{\verticalstrut\nobreak}%
+            \else \ifdim\scratchdimen=\zeropoint
+              % nothing to skip
+            \else % disappears at top of page
+              \vskip\scratchdimen
+            \fi \fi
+          \fi
+          \ifdim\nextboxdp>\strutdp
+          % \getnoflines\nextboxdp
+          % \advance\noflines \minusone
+            \scratchdimen\nextboxdp\relax
+            \ifcase\depthsnapmethod
+              % raw
+            \or
+              \advance\scratchdimen-\lineheight % tight (default)
+            \or
+              \advance\scratchdimen-\strutdepth % fit (text)
+            \or
+              \advance\scratchdimen-\strutdepth % tolerant
+              \advance\scratchdimen-\roundingeps
+            \fi
+            \getnoflines\scratchdimen
+            \ifnum\noflines>0
+              \scratchdimen\noflines\lineheight
+            \else
+              \scratchdimen\zeropoint
+            \fi
+          \else
+            \scratchdimen\zeropoint
+          \fi
+          \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi
+          \ifnum\@@extrasnap=3 \advance\scratchdimen \extrasnapsign  \lineheight \fi
+          \edef\postsnap{\the\scratchdimen}%
+          \ifstrutsnapping
+            \nextboxht\strutht
+            \nextboxdp\strutdp
+          \else
+            \scratchdimen\presnap
+            \advance\scratchdimen \strutht
+            \nextboxht\scratchdimen
+            \scratchdimen\postsnap
+            \advance\scratchdimen \strutdp
+            \nextboxdp\scratchdimen
+          \fi
+          \hbox{\tracedsnapping\flushnextbox}%
+          \ifstrutsnapping
+            \ifdim\scratchdimen=\zeropoint\else\vskip\scratchdimen\fi
+          \fi
+        \else
+          \scratchdimen\nextboxht\relax
+          \ifcase\@@alignsnapbox
+            % can't happen here
+          \or
+            \getrawnoflines\scratchdimen
+          \else
+            \getnoflines   \scratchdimen
+          \fi
+          \scratchdimen\noflines\lineheight\relax
+          \advance\scratchdimen-\strutdepth
+          % spoils the whole game (fit/broad/line)
+          % \ifnum\pagetotal>\zeropoint \else % disable this as option
+          %   \advance\scratchdimen-\strutheight
+          %   \advance\scratchdimen+\topskip
+          % \fi
+          \dimen0=\scratchdimen
+          \dimen2=\strutdepth
+          \ifshowgridboxes
+            \setgridtracebox\hbox[two]%
+          \fi
+          \nextboxdp\strutdp
+          \dimen4=\nextboxht
+          \dimen6=\nextboxdp
+          \iftracegridsnapping
+            \setbox\scratchbox\hbox
+              {\scratchdimen\@@alignsnapamount\relax
+               \ifdim\scratchdimen<\zeropoint
+                 \tracedgridamount\zeropoint{-\scratchdimen}%
+               \else
+                 \tracedgridamount\scratchdimen\zeropoint
+               \fi}%
+            \smashbox\scratchbox
+            \setbox\nextbox\hbox{\box\scratchbox\flushnextbox}%
+          \fi
+          \setbox\nextbox\hbox
+            {\scratchdimen\@@alignsnapamount\relax
+             \ifcase\@@alignsnapdepth\or
+               % don't change this ever !
+               \ifdim\dimen0<\lineheight
+                 % otherwise it is ok, but ending up inside
+                 % the next paragraph is seldom what we want,
+                 % so we move one line up
+                 \advance\scratchdimen-\lineheight
+                 \advance\scratchdimen\strutheight
+               \else
+                 % otherwise we can move down to the
+                 % baseline
+                 \advance\scratchdimen\dimen6 % == \strutdepth
+               \fi
+             \fi
+             \lower\scratchdimen\flushnextbox}%
+          \nextboxht\dimen4
+          \nextboxdp\dimen6
+          \ifnum\@@alignsnap<4 % 4 = regel
+            \setbox\nextbox\vbox to \scratchdimen
+              {\forgetall
+               \ifnum\@@alignsnap>2 \vfill\fi % 3 4
+               \flushnextbox
+               \nointerlineskip % \offinterlineskip
+               \ifnum\@@alignsnap<4 \vfill\fi % 2 3
+               \kern\zeropoint}%
+          \fi
+          \ifshowgridboxes
+            \setgridtracebox\vbox[three]%
+          \fi
+          \scratchdimen\@@alignsnapamount
+          \edef\presnapskip{\the\scratchdimen}%
+          \ifnum\@@alignsnap>2 \def\presnap {+}\fi
+          \ifnum\@@alignsnap<4 \def\postsnap{+}\fi
+          \setbox\nextbox\hbox{\tracedsnapping\flushnextbox}%
+          \par
+          \nextboxht\dimen0
+          \nextboxdp\dimen2
+          \forcedpresnapcorrection
+          \nointerlineskip
+          \flushnextbox
+        \fi
+      \else
+        \setbox\nextbox\vbox to \textheight
+          {\ifdim\nextboxdp=\zeropoint
+             \hbox{\lower\strutdepth\flushnextbox}
+           \else % this branch is yet untested
+             \vss
+             \hbox{\lower\nextboxdp\flushnextbox}
+             \vskip-\strutdepth
+           \fi}%
+        \nextboxdp\strutdepth
+        \flushnextbox
+      \fi
+      \extrasnapreset
+      \enablepresnapcorrection
+      \global\chardef\@@alignsnap\zerocount
+      \global\chardef\@@alignsnapbox\zerocount
+      \egroup}}
+
+\def\tracedgridamount#1#2%
+  {\startlayoutcomponent{gridsnaps}{grid snaps}%
+   \color[grid:four]{\vrule\!!width\nextboxwd\!!height#1\!!depth#2}%
+   \stoplayoutcomponent}
+
+\def\snaptomathgrid % probably not working ok, also kind of obsolete
+  {\ifgridsnapping
+     \dowithnextbox
+       {\blank[\v!line]\snaptogrid\vbox{\flushnextbox}\blank[\v!line]}
+     \vbox\bgroup
+       \forgetdisplayskips
+       \@EA\let\@EA\next
+   \fi}
+
+\def\topsnaptogrid
+  {\ifgridsnapping
+     \dowithnextbox
+       {\scratchdimen\nextboxht
+        \advance\scratchdimen -\strutht
+        \advance\scratchdimen \topskip
+        \nextboxht\scratchdimen
+        \nextboxdp\zeropoint
+        \flushnextbox
+        \kern\lineheight
+        \kern-\topskip
+        \nointerlineskip}
+       \hbox
+   \fi}
+
+% \def\centertogrid % meant for special situations
+%   {\ifgridsnapping
+%      \dowithnextboxcontent
+%        {\ignorespaces}
+%        {\bgroup
+%         \par
+%         \scratchdimen\nextboxht
+%         \advance\scratchdimen \nextboxdp
+%         \getnoflines\scratchdimen
+%         \setbox\nextbox\vbox to \noflines\lineheight
+%           {\forgetall
+%            \vskip\zeropoint \!!plus \nextboxht
+%            \copy\nextbox
+%            \kern.5\strutdp % VOORLOPIGE WAARDE
+%            \vskip\zeropoint \!!plus \nextboxdp}%
+%         \noindent\snaptogrid\vbox{\flushnextbox}%
+%         \egroup}
+%        \vbox % was \hbox
+%    \fi}
+
+% The next implementation is sub-optimal
+%
+% \def\centertogrid % usage: see ie pascal / stepcharts
+%   {\snaptogrid[\v!midden,.5\strutdp]\vbox}
+
+\def\centertogrid % meant for special situations
+  {\ifgridsnapping
+     \dowithnextboxcontent
+       {\ignorespaces}
+       {\bgroup
+        \par
+        \scratchdimen\nextboxht
+        \advance\scratchdimen \nextboxdp
+        \getnoflines\scratchdimen
+        \setbox\nextbox\vbox to \noflines\lineheight
+          {\forgetall
+           \vss
+           \topbaselinecorrection
+           \copy\nextbox
+           \botbaselinecorrection
+           \vss}%
+        \setbox\nextbox\hbox{\lower\strutdp\flushnextbox}%
+        \forgeteverypar % new per 3/4/2008, prevents duplicate pos nodes resulting in extra whitespace
+        \noindent\snaptogrid\vbox{\flushnextbox}%
+        \egroup}
+       \vbox % was \hbox
+   \fi}
+
+% testbed for \centertogrid
+%
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination
+%   {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination[2*2]
+%   {\framed{test}} {} {\framed{test}} {}
+%   {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination
+%   {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination[2*2]
+%   {\framed{test}} {} {\framed{test}} {}
+%   {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination[2*2]
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination[2*2]
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+
+\ifx\startbaselinecorrection\undefined \wait \fi % change order
+
+\let\normalstartbaselinecorrection=\startbaselinecorrection
+
+\def\startbaselinecorrection
+  {\ifgridsnapping
+     \centertogrid\bgroup
+     \let\stopbaselinecorrection\egroup
+   \else
+     \normalstartbaselinecorrection
+   \fi}
+
+\chardef\gridboxlinenomode\plusone
+\chardef\gridboxlinemode  \plusone % 0:nothing 1:all 2:lines 3:frame
+
+\def\gridboxvbox {\ifcase\gridboxlinemode\vbox\or\ruledvbox\or\vbox\or\ruledvbox\else\ruledvbox\fi}
+\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\testrulewidth}
+
+\def\setgridbox#1#2#3%
+  {\setbox#1\gridboxvbox to #3 % given size
+     {\forgetall
+      \resetteststrut
+      \offinterlineskip
+      \hsize#2%
+      \baselinerulefalse
+      \gridboxvbox % calculated size
+        {\getrawnoflines{#3}% \getnoflines{#3}%
+         \vskip\topskip
+         \vskip-\strutht
+         \scratchdimen#2\advance\scratchdimen \lineheight
+         \dorecurse\noflines
+           {\strut
+            \hskip-.5\lineheight
+            \ifcase\gridboxlinenomode\or
+              \rlap
+                {\hskip.2\bodyfontsize\hskip\scratchdimen
+                 \infofont\hbox to 1em{\hss\recurselevel}}%
+            \or
+              \llap
+                {\infofont\hbox to 1em{\hss\recurselevel}%
+                 \hskip.2\bodyfontsize}%
+            \fi
+            \vrule
+              \!!height \gridboxwidth
+              \!!depth  \gridboxwidth
+              \!!width  \scratchdimen
+            \par}}
+      \vfill}}
+
+%D Some intervention macros:
+
+\def\gridwarning#1{\message{[beware of #1 extra snap]}}
+
+\global\let\@@alignsnapamount\!!zeropoint
+\global\chardef\@@alignsnapdepth0
+
+\def\@@unknowngriddisplacement
+  {\global\chardef\@@alignsnapbox\plusthree
+   \global\let\@@alignsnapamount\commalistelement}
+
+\def\domoveongrid[#1]%
+  {\ifgridsnapping\doifsomething{#1}{\dodomoveongrid[#1]}\fi}
+
+\def\dodomoveongrid[#1]% some day : speed up
+  {\global\chardef\@@alignsnap\zerocount
+   \global\chardef\@@alignsnapbox\zerocount
+   \global\chardef\@@alignsnapdepth\zerocount
+   \global\chardef\@@alignsnapmethod\zerocount
+   \global\let\@@alignsnapamount\!!zeropoint
+   \donefalse
+   \expanded{\processallactionsinset[#1]}
+     [\v!standard=>,
+        \v!normal=>, % to be sure
+           \v!yes=>, % to be sure
+           \v!top=>\gridwarning+\positiveextrasnap\extrasnapbefore,
+        \v!bottom=>\gridwarning+\positiveextrasnap\extrasnapafter,
+          \v!both=>\positiveextrasnap\extrasnaparound,
+          -\v!top=>\gridwarning-\negativeextrasnap\extrasnapbefore,
+       -\v!bottom=>\gridwarning-\negativeextrasnap\extrasnapafter,
+         -\v!both=>\negativeextrasnap\extrasnaparound,
+          \v!text=>\global\chardef\@@alignsnapmethod\plusone, % accurate calculations
+          \v!page=>\global\chardef\@@alignsnap\plusone, % topskip
+          \v!high=>\global\chardef\@@alignsnap\plustwo,
+        \v!middle=>\global\chardef\@@alignsnap\plusthree,
+           \v!low=>\global\chardef\@@alignsnap\plusfour,
+           \v!fit=>\global\chardef\@@alignsnapbox\plusone, % new
+         \v!broad=>\global\chardef\@@alignsnapbox\plustwo, % new
+         \v!depth=>\global\chardef\@@alignsnapdepth\plusone, % new
+          \v!line=>\global\chardef\@@alignsnapbox\plusthree
+%                  \global\chardef\@@alignsnapdepth\plusone
+                   \global\chardef\@@alignsnap\plusfour,
+         \v!reset=>\positiveextrasnap\extrasnapreset,
+          \v!none=>\global\chardef\@@alignsnap\zerocount
+                   \global\chardef\@@alignsnapbox\zerocount,
+         \v!force=>, % turns on grid snapping even when not on
+       \s!default=>,
+       \s!unknown=>\@@unknowngriddisplacement]}
+
+\def\moveongrid
+  {\dosingleempty\domoveongrid}
+
+\def\doplaceongrid[#1]%
+  {\domoveongrid[#1]\snaptogrid\vbox}
+
+\def\placeongrid
+  {\dosingleempty\doplaceongrid}
+
+%D Snapping is rather robust as long as we use whole lines.
+%D Half lines of white space can however be handled when they
+%D come in pairs. The corrections needed when crossing page
+%D boundaries in the middle of such a pair, are handled by
+%D macros that are (named) sort of fuzzy. This fuzzy mechanism
+%D was written as an extension to the grid typesetting needed
+%D for typesetting (part of) the \MAPS.
+%D
+%D \starttyping
+%D \setuptyping
+%D   [before={\blank[halfline]},
+%D    after={\blank[halfline]}]
+%D \stoptyping
+
+\newif            \iffuzzyvskip
+\newif            \iffuzzysnapdone
+\newif            \iffuzzysnapping
+\newif            \iffuzzysnapped
+\chardef          \fuzzysnappedleft=0 % ==1 when fuzzybegin still open
+\newpersistentmark\fuzzymark % (!)
+\newcount         \fuzzymarker
+\newbox           \fuzzysnapbox
+\newbox           \fuzzysnapsplit
+
+\def\dosyncfuzzyvskip
+  {\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint
+     \bgroup      % - added 28/2/2003: check this, there was no -
+       \endgraf\forgetall\verticalstrut\nobreak\vskip-\struttotal
+     \egroup
+   \fi\fi\fi}
+
+\def\fuzzyvskip#1%
+  {\iffuzzysnapdone
+     \dosyncfuzzyvskip  % NEWER
+     \endfuzzysnapping
+     \vskip#1\relax
+     \global\fuzzysnapdonefalse
+   \else
+     \vskip#1\relax
+     \beginfuzzysnapping
+     \global\fuzzysnapdonetrue
+   \fi}
+
+\def\setfuzzymark#1#2#3% #1/#2 => error recovery
+  {\ifgridsnapping
+     \global\fuzzysnappingtrue
+     \global\advance\fuzzymarker \ifodd\fuzzymarker#1\else#2\fi
+     \nobreak
+     \ifshowfuzzyskips
+       \hbox{\color[grid:three]
+         {\llap{\infofont#3\vl\the\fuzzymarker}\nobreak
+          \vrule\!!width\hsize\!!height.1\lineheight}}
+       \nobreak
+     \fi
+    %[\the\fuzzymarker]
+    %\expandafter\fuzzymark\expandafter{\the\fuzzymarker}%
+     \expandafter\rawsetmark\expandafter\fuzzymark\expandafter{\the\fuzzymarker}%
+     \nobreak
+  \fi}
+
+\def\beginfuzzysnapping{\setfuzzymark21\v!start} % odd
+\def\endfuzzysnapping  {\setfuzzymark12\v!stop } % even
+
+\def\removelastfuzzyvskip
+  {\ifgridsnapping
+     \iffuzzysnapping
+       \ifdim\lastskip<\openlineheight
+       \else
+         \removelastskip
+       \fi
+     \else
+       \removelastskip
+     \fi
+   \else
+     \removelastskip
+   \fi}
+
+\def\docheckfuzzysnap#1%
+  {\bgroup
+   \dontcomplain
+   \setbox\fuzzysnapbox\copy#1\relax
+   \setbox\fuzzysnapsplit\vsplit\fuzzysnapbox to 1\lineheight
+   \let\topfuzzymark\empty % indeed here ... no real mark
+   \getsplitmarks\fuzzymark
+%   \ifcase0\topfuzzymark
+   \ifcase0\rawgetsplittopmark\fuzzymark
+     \global\chardef\fuzzysnappedleft\zerocount
+     \global\fuzzysnappedfalse
+%   \else\ifodd\topfuzzymark
+   \else\ifodd\rawgetsplittopmark\fuzzymark
+     \global\chardef\fuzzysnappedleft\plusone
+     \global\fuzzysnappedtrue
+   \else
+     \global\chardef\fuzzysnappedleft=2
+     \global\fuzzysnappedtrue
+   \fi\fi
+   \iffuzzysnapped \else
+     \doloop
+       {\ifvoid\fuzzysnapbox
+          \exitloop
+        \else
+          \setbox\fuzzysnapsplit=\vsplit\fuzzysnapbox to \lineheight
+         %\let\topfuzzymark=\empty % ... but not here
+          \getsplitmarks\fuzzymark
+%          \ifcase0\topfuzzymark
+          \ifcase0\rawgetsplittopmark\fuzzymark
+            % continue
+%          \else\ifodd\topfuzzymark
+          \else\ifodd\rawgetsplittopmark\fuzzymark
+            \exitloop
+          \else
+            \global\chardef\fuzzysnappedleft\plusone
+            \global\fuzzysnappedtrue
+            \exitloop
+          \fi\fi
+        \fi}%
+   \fi
+   \egroup}
+
+\def\getfuzzysnapcorrection#1%
+  {\global\let\presnapcorrection \relax
+   \global\let\postsnapcorrection\relax
+   \ifgridsnapping\iffuzzysnapping
+     \docheckfuzzysnap{#1}%
+     \iffuzzysnapped
+       \iftracegridsnapping
+         \gdef\presnapcorrection
+           {\color[grid:four]{\hrule\!!height.5\openlineheight\!!width\hsize}}%
+       \else
+         \gdef\presnapcorrection{\kern.5\openlineheight}%
+       \fi
+       \gdef\postsnapcorrection{\kern-.5\openlineheight}% get the height ok
+     \fi
+   \fi\fi}
+
+\def\fuzzysnappedbox#1#2% \box \unvbox
+  {\getfuzzysnapcorrection{#2}%
+   \presnapcorrection
+   #1#2%
+   \postsnapcorrection}
+
+\def\adaptfuzzypagegoal
+  {\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents
+     \scratchdimen\pagegoal
+     \advance\scratchdimen -.5\openlineheight
+     \global\pagegoal\scratchdimen
+     \global\advance\vsize -.5\openlineheight
+     \global\chardef\fuzzysnappedleft0
+   \fi\fi\fi}
+
+%D New, experimental, used in caption snapping:
+%D
+%D \starttyping
+%D \startcolumnset
+%D
+%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=top]
+%D
+%D \placefigure [lrtb] {\dorecurse{5}{green gras}}
+%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D \placefigure [lrtb] {\dorecurse{15}{green gras}}
+%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D
+%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=bottom]
+%D
+%D \placefigure [rltb] {\dorecurse{5}{green gras}}
+%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D \placefigure [rltb] {\dorecurse{15}{green gras}}
+%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D
+%D \input thuan
+%D
+%D \stopcolumnset
+%D \stoptyping
+
+\def\moveboxontogrid#1#2#3% box method firstlineht % experimental ! ! !
+  {\doifsomething{#2}
+     {\getnoflines{\ht#1}% no depth taken into account, depth preserved
+      \scratchdimen\noflines\lineheight
+      \advance\scratchdimen-\strutdp
+      \bgroup
+      \advance\scratchdimen-\onepoint % be a bit tolerant
+      \ifdim\scratchdimen>\ht#1\relax
+        \egroup
+        \doif{#2}\v!top   {\setbox#1\vbox to \scratchdimen{\vskip-#3\vskip\strutht\box#1\vfill}}%
+        \doif{#2}\v!bottom{\setbox#1\vbox to \scratchdimen{\vfill\box#1\removedepth}}%
+        \dp#1\strutdp
+      \else
+        \egroup
+        \ht#1\scratchdimen
+        \dp#1\strutdp
+      \fi}}
+
+%D New:
+
+\let\checkgridsnapping\relax
+
+\protect \endinput
diff --git a/tex/context/base/core-grd.mkiv b/tex/context/base/core-grd.mkiv
new file mode 100644
index 000000000..d6cc93735
--- /dev/null
+++ b/tex/context/base/core-grd.mkiv
@@ -0,0 +1,1074 @@
+%D \module
+%D   [       file=core-grd,
+%D        version=1998.03.10,
+%D          title=\CONTEXT\ Core Macros,
+%D       subtitle=Grid Snapping (Experimental),
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Grid Snapping}
+
+\unprotect
+
+%D Moved from supp-box:
+
+%D \macros
+%D  {startbaselinecorrection,baselinecorrection,
+%D   showbaselinecorrection,offbaselinecorrection}
+%D
+%D Spacing around ruled boxes can get pretty messed up. The
+%D next macro tries as good as possible to fix this.
+%D
+%D \startbuffer[1]
+%D \startbaselinecorrection
+%D \ruledhbox{Rule Brittanica}
+%D \stopbaselinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer[1]
+%D
+%D The macros put some white space around the box:
+%D
+%D \getbuffer[1]
+%D
+%D A simple alternative is \type {\baselinecorrection}, which
+%D only looks at the previous line.
+%D
+%D \startbuffer[2]
+%D \baselinecorrection
+%D \ruledhbox{Rule Brittanica}
+%D \baselinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer[2]
+%D
+%D This time the last preceding line gets a correction,%
+%D dependant on the depth.
+%D
+%D \getbuffer[2]
+%D
+%D One can make the correction visible by saying \type
+%D {\showbaselinecorrection}. Part of the correction is
+%D calculated from the dimensions of a~(. One can disble the
+%D correction by calling \type {\offbaselinecorrection}.
+%D
+%D When visualize the first example looks like:
+%D
+%D {\showbaselinecorrection\getbuffer[1]}
+%D
+%D and the second one comes out as:
+%D
+%D {\showbaselinecorrection\getbuffer[2]}
+
+% \definecolor[GridLineColor][red]
+% \definecolor[GridTextColor][blue]
+
+\let\thetopbaselinecorrection   \!!zeropoint
+\let\thebotbaselinecorrection   \!!zeropoint
+\let\thenegtopbaselinecorrection\!!zeropoint
+\let\thenegbotbaselinecorrection\!!zeropoint
+
+\definepalet
+  [grid]
+  [  one=red,
+     two=green,
+   three=blue,
+    four=gray]
+
+\def\setbaselinecorrections
+  {\setbox0\hbox{\setstrut\strut}%
+   \setbox2\hbox{(}%
+   \dimen0\ht0\advance\dimen0 -\ht2
+   \ifdim\dimen0<\zeropoint\dimen0\zeropoint\fi
+   \dimen2\dp0\advance\dimen2 -\dp2
+   \ifdim\dimen2<\zeropoint\dimen2\zeropoint\fi
+   \edef\thetopbaselinecorrection   {\the\dimen0}\dimen0-\dimen0
+   \edef\thebotbaselinecorrection   {\the\dimen2}\dimen2-\dimen2
+   \edef\thenegtopbaselinecorrection{\the\dimen0}%
+   \edef\thenegbotbaselinecorrection{\the\dimen2}}
+
+\def\dotopbaselinecorrection   {\kern\thetopbaselinecorrection}
+\def\dobotbaselinecorrection   {\kern\thebotbaselinecorrection}
+\def\donegtopbaselinecorrection{\kern\thenegtopbaselinecorrection}
+\def\donegbotbaselinecorrection{\kern\thenegbotbaselinecorrection}
+
+\def\showbaselinecorrection
+  {\def\dobaselinecorrection % visualization is not watertight!
+     {\bgroup
+\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
+      \setbox0\null
+      \wd0\hsize
+      \dp0\strutdp
+      \nointerlineskip
+      \forgetall
+      \ruledvbox{\box0}%
+      \egroup
+      \prevdepth\strutdp}%
+   \def\dotopbaselinecorrection
+     {\hrule\!!height\thetopbaselinecorrection}%
+   \def\dobotbaselinecorrection
+     {\hrule\!!height\thebotbaselinecorrection}}
+
+\def\dobaselinecorrection
+  {\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
+   \kern\strutdp
+   \prevdepth\strutdp}
+
+% \def\baselinecorrection
+%   {\endgraf
+%    \ifvmode
+%      \ifdim\prevdepth<\maxdimen
+%        \ifdim\prevdepth<\zeropoint \else
+%          \ifdim\prevdepth<\strutdp
+%            \dobaselinecorrection
+%          \fi
+%        \fi
+%      \fi
+%    \fi}
+
+\def\baselinecorrection
+  {\endgraf
+   \ifvmode
+     \ifdim\prevdepth<\maxdimen
+       \ifdim\prevdepth<\zeropoint \else
+         \ifdim\prevdepth<\strutdepth \relax
+           \pushlastnode
+           \dobaselinecorrection
+           \poplastnode
+         \fi
+       \fi
+     \fi
+   \fi}
+
+\def\pagebaselinecorrection
+  {\ifdim\pagegoal<\maxdimen
+     \ifdim\pagetotal>\lineheight % or \topskip
+       \scratchdimen\pagetotal
+       \advance\scratchdimen\lineheight
+       \ifdim\scratchdimen<\pagegoal
+         \baselinecorrection
+       \fi
+     \fi
+   \fi}
+
+% Beware, keep this one as it is, see for instance module
+% m-steps.tex, where we apply a \localhsize to the \vbox, in
+% order to follow narrower and side floats !
+
+% \def\startbaselinecorrection
+%   {\baselinecorrection
+%    \ifvmode
+%      \bgroup
+%      \setbox\scratchbox\vbox\bgroup
+%      \ignorespaces
+%      \let\stopbaselinecorrection\dostopbaselinecorrection
+%    \else
+%      \let\stopbaselinecorrection\relax
+%    \fi}
+
+% \def\dostopbaselinecorrection % I have to check columns yet.
+%   {\endgraf
+%    \egroup
+%    \topbaselinecorrection
+%    \box\scratchbox
+%    \botbaselinecorrection
+%    \egroup}
+
+% \let\stopbaselinecorrection=\relax
+
+\def\startbaselinecorrection
+  {\bgroup
+   \let\stopbaselinecorrection\egroup
+   \ifcase\baselinecorrectionmode
+   \or % normal
+     \baselinecorrection
+     \ifvmode
+       \setbox\scratchbox\vbox\bgroup\ignorespaces
+       \let\stopbaselinecorrection\donormalstopbaselinecorrection
+     \fi
+   \or % off
+   \or % force
+     \baselinecorrection
+     \ifvmode
+       \setbox\scratchbox\vbox\bgroup\ignorespaces
+       \let\stopbaselinecorrection\doforcedstopbaselinecorrection
+     \fi
+   \fi}
+
+\let\stopbaselinecorrection\relax
+
+\def\donormalstopbaselinecorrection % I have to check columns yet.
+  {\egroup
+   \topbaselinecorrection
+   \box\scratchbox
+   \botbaselinecorrection
+   \egroup}
+
+\def\doforcedstopbaselinecorrection % I have to check columns yet.
+  {\egroup
+   \forcedtopbaselinecorrection
+   \box\scratchbox
+   \forcedbotbaselinecorrection
+   \egroup}
+
+%D We do a bit more checking than needed. The pageborder check
+%D is not needed, but I want to look the visualization as good
+%D as possible too.
+
+% \def\offbaselinecorrection % Can be used inside correction.
+%   {\def\startbaselinecorrection{\bgroup\let\stopbaselinecorrection\egroup}}
+
+\chardef\baselinecorrectionmode\plusone
+
+\def\onbaselinecorrection   {\chardef\baselinecorrectionmode\plusone  }
+\def\offbaselinecorrection  {\chardef\baselinecorrectionmode\plustwo  }
+\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree}
+
+%D \macros
+%D  {topbaselinecorrection,botbaselinecorrection}
+%D
+%D The actual top and bottom corrections are implemented as:
+
+% \def\topbaselinecorrection
+%   {\ifvmode \ifdim\pagegoal<\maxdimen
+%      \bgroup
+%      \setbaselinecorrections
+%      \whitespace
+%      \nointerlineskip
+%      \dotopbaselinecorrection
+%      \egroup
+%    \fi \fi}
+
+
+\def\topbaselinecorrection
+  {\ifvmode \ifdim\pagegoal<\maxdimen
+     \forcedtopbaselinecorrection
+   \fi \fi}
+
+\def\forcedtopbaselinecorrection
+  {\ifvmode
+     \bgroup
+     \setbaselinecorrections
+     \whitespace
+     \nointerlineskip
+     \dotopbaselinecorrection
+     \egroup
+   \fi}
+
+\def\botbaselinecorrection
+  {\ifvmode
+     \bgroup
+     \setbaselinecorrections
+     \dobotbaselinecorrection
+     \allowbreak % new, otherwise problems when many in a row
+     \prevdepth\strutdp
+     \egroup
+   \fi}
+
+\let\forcedbotbaselinecorrection\botbaselinecorrection
+
+%D Still very experimental and therefore undocumented.
+
+\newif\ifgridsnapping  % UNDER DEVELOPMENT, USE WITH CARE
+\newif\ifforcepresnap  \forcepresnaptrue  % false in mixed single/double
+\newif\ifstrutsnapping \strutsnappingtrue % sometimes handy to be false
+
+\def\positiveextrasnap {\gdef\extrasnapsign{+}}
+\def\negativeextrasnap {\gdef\extrasnapsign{-}}
+
+\def\extrasnapreset  {\global\chardef\@@extrasnap0
+                      \positiveextrasnap}
+\def\extrasnapbefore {\global\chardef\@@extrasnap1 }
+\def\extrasnaparound {\global\chardef\@@extrasnap2 }
+\def\extrasnapafter  {\global\chardef\@@extrasnap3 }
+
+\def\enablepresnapcorrection  {\global\chardef\@@presnap\zerocount}
+\def\disablepresnapcorrection {\global\chardef\@@presnap\plusone}
+
+\extrasnapreset \enablepresnapcorrection
+
+\newif\iftracegridsnapping
+\newif\ifshowgridboxes
+\newif\ifshowfuzzyskips
+
+\let\showgridboxes\showgridboxestrue
+
+\def\showgridsnapping
+  {\tracegridsnappingtrue
+   \showgridboxestrue}
+
+\chardef\@@alignsnap      =0
+\chardef\@@alignsnapbox   =0
+\chardef\@@alignsnapmethod=0
+
+\let\presnapskip \!!zeropoint  \def\presnap {-}
+\let\postsnapskip\!!zeropoint  \let\postsnap\presnap
+
+\newcount\currentgridsnap
+
+\def\tracedsnapping
+  {\iftracegridsnapping
+     \llap
+       {\setlayoutcomponentattribute\v!grid\v!test
+        \hbox \layoutcomponentboxattribute
+          {\infofont
+           \global\advance\currentgridsnap\plusone
+           \color[grid:three]
+             {\vl\presnapskip
+              \vl\presnap
+              \vl\postsnap
+              \ifcase\@@alignsnapbox\relax\vl\ifcase\@@extrasnap00\or\extrasnapsign0\or\extrasnapsign\extrasnapsign\or0\extrasnapsign\fi\fi
+              \vl\the\currentgridsnap\vl}}}%
+   \fi}
+
+\def\snaptogrid% [#1]#2 -> #2 == \hbox|\vbox
+  {\dosingleempty\dosnaptogrid}
+
+% \def\dosnaptogrid[#1]%
+%   {\ifgridsnapping
+%      \iffirstargument\doifsomething{#1}{\verplaatsopgrid[#1]}\fi
+%      \expandafter\dodosnaptogrid
+%    \fi}
+
+% \def\dosnaptogrid[#1]%
+%   {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up
+%    \ifgridsnapping
+%      \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi
+%      \expandafter\dodosnaptogrid
+%    \fi}
+
+\def\dosnaptogrid[#1]%
+  {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up
+   \doifinsetelse\v!force{#1}%
+     {\moveongrid[#1]%
+      \dodosnaptogrid}
+     {\ifgridsnapping
+        \doifsomething{#1}{\moveongrid[#1]}%
+        \expandafter\dodosnaptogrid
+      \fi}}
+
+% \def\forcedpresnapcorrection % test this on 'details'
+%   {\ifforcepresnap
+%      \ifvmode \else \par \fi % new
+%      % we don't want top of page space  when 'top' option
+%      %\verticalstrut\nobreak\vskip-\struttotal
+%      %\verticalstrut\vskip-\struttotal
+%      % nobreak really needed
+%      \allowbreak\verticalstrut\nobreak\vskip-\struttotal
+%      %\ifdim\pagetotal>\topskip \else
+%        % eigenlijk signal
+%        %\writestatus{grid}{removing dummy at top of page}%
+%        %\bgroup
+%        %\output{\setbox\scratchbox\box255}%
+%        %\penalty\outputpenalty
+%        %\egroup
+%      %\fi
+%    \fi}
+
+\def\forcedpresnapcorrection % test this on 'details'
+  {\ifforcepresnap
+     \ifvmode \else \par \fi % new
+     % we don't want top of page space  when 'top' option
+     % \verticalstrut\nobreak\vskip-\struttotal
+     % \verticalstrut\vskip-\struttotal
+     % \nobreak really needed
+     % \dosomebreak\allowbreak % no: spoils heads, so only under know situation, not in snapper
+     \verticalstrut
+     \nobreak
+     \vskip-\struttotal
+     %\ifdim\pagetotal>\topskip \else
+       % eigenlijk signal
+       %\writestatus{grid}{removing dummy at top of page}%
+       %\bgroup
+       %\output{\setbox\scratchbox\box255}%
+       %\penalty\outputpenalty
+       %\egroup
+     %\fi
+   \fi}
+
+\def\setgridtracebox#1[#2]% % maybe reverse the order
+  {\setbox\nextbox#1%
+     {\hbox
+        {\hbox to \zeropoint
+           {\setlayoutcomponentattribute\v!grid\v!test
+            \color[grid:#2]{\ruledhbox \layoutcomponentboxattribute {\fakebox\nextbox}}%
+            \hss}%
+         \flushnextbox}}}
+
+\newif\ifboxedsnapping \boxedsnappingtrue
+
+\chardef\depthsnapmethod \plusone % downward compatible, minus one line
+\chardef\heightsnapmethod\plusone % downward compatible, minus one line
+
+\def\dodosnaptogrid
+  {\dowithnextbox
+     {\bgroup
+      \ifcase\@@alignsnapmethod \or
+        % we're dealing with text with a possible big depth/height
+        \chardef\depthsnapmethod \plustwo
+        \chardef\heightsnapmethod\plustwo
+      \fi
+      \ifdim\nextboxht<\textheight % handle special case (like page fig)
+        \ifcase\@@alignsnapbox\relax
+          \ifcase\@@alignsnap\else % 1=top 2=high 3=middle 4=low
+            \ifshowgridboxes
+              \setgridtracebox\hbox[two]%
+            \fi
+           %\getnoflines{\nextboxht}%
+            \getnoflines\nextboxht
+            \setbox\nextbox\vbox to \noflines\lineheight
+              {\ifnum\@@alignsnap=1 \kern\lineheight\kern-\topskip\fi
+               \ifnum\@@alignsnap>2 \vfill\fi
+               \flushnextbox
+             \ifnum\@@alignsnap<4 \vfill\fi}%
+          \fi
+          \ifshowgridboxes
+            \setgridtracebox\hbox[three]%
+          \fi
+          \forgetall
+          \par
+          \ifvbox\nextbox
+            \setbox\nextbox\hbox{\flushnextbox}% don't ask
+          \fi
+          \scratchskip\lastskip
+          \edef\presnapskip{\the\lastskip}%
+          % mixing single/double columns sometimes goes wrong,
+          % check 'som' document
+          \ifinsidecolumns
+            \forcepresnaptrue
+          \fi
+          \forcedpresnapcorrection
+          \ifdim\nextboxht>\strutht
+            \scratchdimen\nextboxht
+            \ifcase\@@presnap\relax
+              \ifdim\scratchskip>\zeropoint\relax
+                \scratchcounter\scratchskip
+                \advance\scratchcounter -\openlineheight
+                \ifnum\scratchcounter<0
+                  \scratchcounter-\scratchcounter
+                \fi
+                \ifnum\scratchcounter<10 % \lastkip is about \openlineheight
+                  \advance\scratchdimen -\openstrutdepth
+                  \edef\presnapskip{*\presnapskip}%
+                \else\ifdim\scratchskip>\openlineheight
+                                      %<\openlineheight \else
+                  \advance\scratchdimen -\openstrutdepth
+                  \edef\presnapskip{*\presnapskip}%
+                \fi\fi
+              \fi
+            \fi
+          % \getnoflines\scratchdimen % maybe raw ?
+          % \advance\noflines -1
+            \ifcase\heightsnapmethod
+              % raw
+            \or
+              \advance\scratchdimen-\lineheight  % tight (default)
+            \or
+              \advance\scratchdimen-\strutheight % fit (text)
+            \or
+              \advance\scratchdimen-\strutheight % tolerant
+              \advance\scratchdimen-\roundingeps
+            \fi
+            \getnoflines\scratchdimen
+            \ifnum\noflines>0
+              \scratchdimen\noflines\lineheight
+            \else
+              \scratchdimen\zeropoint
+            \fi
+          \else
+            \scratchdimen\zeropoint
+          \fi
+          \ifnum\@@extrasnap=1 \advance\scratchdimen \extrasnapsign  \lineheight \fi
+          \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi
+          \edef\presnap{\the\scratchdimen}%
+          \ifstrutsnapping
+            \ifboxedsnapping
+              \getrawnoflines\scratchdimen
+              \advance\scratchdimen-\noflines\lineheight
+              \vskip\scratchdimen % disappears at top of page
+              \dorecurse\noflines{\verticalstrut\nobreak}%
+            \else \ifdim\scratchdimen=\zeropoint
+              % nothing to skip
+            \else % disappears at top of page
+              \vskip\scratchdimen
+            \fi \fi
+          \fi
+          \ifdim\nextboxdp>\strutdp
+          % \getnoflines\nextboxdp
+          % \advance\noflines \minusone
+            \scratchdimen\nextboxdp\relax
+            \ifcase\depthsnapmethod
+              % raw
+            \or
+              \advance\scratchdimen-\lineheight % tight (default)
+            \or
+              \advance\scratchdimen-\strutdepth % fit (text)
+            \or
+              \advance\scratchdimen-\strutdepth % tolerant
+              \advance\scratchdimen-\roundingeps
+            \fi
+            \getnoflines\scratchdimen
+            \ifnum\noflines>0
+              \scratchdimen\noflines\lineheight
+            \else
+              \scratchdimen\zeropoint
+            \fi
+          \else
+            \scratchdimen\zeropoint
+          \fi
+          \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi
+          \ifnum\@@extrasnap=3 \advance\scratchdimen \extrasnapsign  \lineheight \fi
+          \edef\postsnap{\the\scratchdimen}%
+          \ifstrutsnapping
+            \nextboxht\strutht
+            \nextboxdp\strutdp
+          \else
+            \scratchdimen\presnap
+            \advance\scratchdimen \strutht
+            \nextboxht\scratchdimen
+            \scratchdimen\postsnap
+            \advance\scratchdimen \strutdp
+            \nextboxdp\scratchdimen
+          \fi
+          \hbox{\tracedsnapping\flushnextbox}%
+          \ifstrutsnapping
+            \ifdim\scratchdimen=\zeropoint\else\vskip\scratchdimen\fi
+          \fi
+        \else
+          \scratchdimen\nextboxht\relax
+          \ifcase\@@alignsnapbox
+            % can't happen here
+          \or
+            \getrawnoflines\scratchdimen
+          \else
+            \getnoflines   \scratchdimen
+          \fi
+          \scratchdimen\noflines\lineheight\relax
+          \advance\scratchdimen-\strutdepth
+          % spoils the whole game (fit/broad/line)
+          % \ifnum\pagetotal>\zeropoint \else % disable this as option
+          %   \advance\scratchdimen-\strutheight
+          %   \advance\scratchdimen+\topskip
+          % \fi
+          \dimen0=\scratchdimen
+          \dimen2=\strutdepth
+          \ifshowgridboxes
+            \setgridtracebox\hbox[two]%
+          \fi
+          \nextboxdp\strutdp
+          \dimen4=\nextboxht
+          \dimen6=\nextboxdp
+          \iftracegridsnapping
+            \setbox\scratchbox\hbox
+              {\scratchdimen\@@alignsnapamount\relax
+               \ifdim\scratchdimen<\zeropoint
+                 \tracedgridamount\zeropoint{-\scratchdimen}%
+               \else
+                 \tracedgridamount\scratchdimen\zeropoint
+               \fi}%
+            \smashbox\scratchbox
+            \setbox\nextbox\hbox{\box\scratchbox\flushnextbox}%
+          \fi
+          \setbox\nextbox\hbox
+            {\scratchdimen\@@alignsnapamount\relax
+             \ifcase\@@alignsnapdepth\or
+               % don't change this ever !
+               \ifdim\dimen0<\lineheight
+                 % otherwise it is ok, but ending up inside
+                 % the next paragraph is seldom what we want,
+                 % so we move one line up
+                 \advance\scratchdimen-\lineheight
+                 \advance\scratchdimen\strutheight
+               \else
+                 % otherwise we can move down to the
+                 % baseline
+                 \advance\scratchdimen\dimen6 % == \strutdepth
+               \fi
+             \fi
+             \lower\scratchdimen\flushnextbox}%
+          \nextboxht\dimen4
+          \nextboxdp\dimen6
+          \ifnum\@@alignsnap<4 % 4 = regel
+            \setbox\nextbox\vbox to \scratchdimen
+              {\forgetall
+               \ifnum\@@alignsnap>2 \vfill\fi % 3 4
+               \flushnextbox
+               \nointerlineskip % \offinterlineskip
+               \ifnum\@@alignsnap<4 \vfill\fi % 2 3
+               \kern\zeropoint}%
+          \fi
+          \ifshowgridboxes
+            \setgridtracebox\vbox[three]%
+          \fi
+          \scratchdimen\@@alignsnapamount
+          \edef\presnapskip{\the\scratchdimen}%
+          \ifnum\@@alignsnap>2 \def\presnap {+}\fi
+          \ifnum\@@alignsnap<4 \def\postsnap{+}\fi
+          \setbox\nextbox\hbox{\tracedsnapping\flushnextbox}%
+          \par
+          \nextboxht\dimen0
+          \nextboxdp\dimen2
+          \forcedpresnapcorrection
+          \nointerlineskip
+          \flushnextbox
+        \fi
+      \else
+        \setbox\nextbox\vbox to \textheight
+          {\ifdim\nextboxdp=\zeropoint
+             \hbox{\lower\strutdepth\flushnextbox}
+           \else % this branch is yet untested
+             \vss
+             \hbox{\lower\nextboxdp\flushnextbox}
+             \vskip-\strutdepth
+           \fi}%
+        \nextboxdp\strutdepth
+        \flushnextbox
+      \fi
+      \extrasnapreset
+      \enablepresnapcorrection
+      \global\chardef\@@alignsnap\zerocount
+      \global\chardef\@@alignsnapbox\zerocount
+      \egroup}}
+
+\def\tracedgridamount#1#2%
+  {\startcolor[grid:four]%
+   \setlayoutcomponentattribute\v!grid\v!test
+   \hbox \layoutcomponentboxattribute{\vrule\!!width\nextboxwd\!!height#1\!!depth#2}%
+   \stopcolor}
+
+\def\snaptomathgrid % probably not working ok, also kind of obsolete
+  {\ifgridsnapping
+     \dowithnextbox
+       {\blank[\v!line]\snaptogrid\vbox{\flushnextbox}\blank[\v!line]}
+     \vbox\bgroup
+       \forgetdisplayskips
+       \@EA\let\@EA\next
+   \fi}
+
+\def\topsnaptogrid
+  {\ifgridsnapping
+     \dowithnextbox
+       {\scratchdimen\nextboxht
+        \advance\scratchdimen -\strutht
+        \advance\scratchdimen \topskip
+        \nextboxht\scratchdimen
+        \nextboxdp\zeropoint
+        \flushnextbox
+        \kern\lineheight
+        \kern-\topskip
+        \nointerlineskip}
+       \hbox
+   \fi}
+
+% \def\centertogrid % meant for special situations
+%   {\ifgridsnapping
+%      \dowithnextboxcontent
+%        {\ignorespaces}
+%        {\bgroup
+%         \par
+%         \scratchdimen\nextboxht
+%         \advance\scratchdimen \nextboxdp
+%         \getnoflines\scratchdimen
+%         \setbox\nextbox\vbox to \noflines\lineheight
+%           {\forgetall
+%            \vskip\zeropoint \!!plus \nextboxht
+%            \copy\nextbox
+%            \kern.5\strutdp % VOORLOPIGE WAARDE
+%            \vskip\zeropoint \!!plus \nextboxdp}%
+%         \noindent\snaptogrid\vbox{\flushnextbox}%
+%         \egroup}
+%        \vbox % was \hbox
+%    \fi}
+
+% The next implementation is sub-optimal
+%
+% \def\centertogrid % usage: see ie pascal / stepcharts
+%   {\snaptogrid[\v!midden,.5\strutdp]\vbox}
+
+\def\centertogrid % meant for special situations
+  {\ifgridsnapping
+     \dowithnextboxcontent
+       {\ignorespaces}
+       {\bgroup
+        \par
+        \scratchdimen\nextboxht
+        \advance\scratchdimen \nextboxdp
+        \getnoflines\scratchdimen
+        \setbox\nextbox\vbox to \noflines\lineheight
+          {\forgetall
+           \vss
+           \topbaselinecorrection
+           \copy\nextbox
+           \botbaselinecorrection
+           \vss}%
+        \setbox\nextbox\hbox{\lower\strutdp\flushnextbox}%
+        \forgeteverypar % new per 3/4/2008, prevents duplicate pos nodes resulting in extra whitespace
+        \noindent\snaptogrid\vbox{\flushnextbox}%
+        \egroup}
+       \vbox % was \hbox
+   \fi}
+
+% testbed for \centertogrid
+%
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination
+%   {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination[2*2]
+%   {\framed{test}} {} {\framed{test}} {}
+%   {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination
+%   {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination[2*2]
+%   {\framed{test}} {} {\framed{test}} {}
+%   {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination[2*2]
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination[2*2]
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+
+\ifx\startbaselinecorrection\undefined \wait \fi % change order
+
+\let\normalstartbaselinecorrection=\startbaselinecorrection
+
+\def\startbaselinecorrection
+  {\ifgridsnapping
+     \centertogrid\bgroup
+     \let\stopbaselinecorrection\egroup
+   \else
+     \normalstartbaselinecorrection
+   \fi}
+
+\chardef\gridboxlinenomode\plusone
+\chardef\gridboxlinemode  \plusone % 0:nothing 1:all 2:lines 3:frame
+
+\def\gridboxvbox {\ifcase\gridboxlinemode\vbox\or\ruledvbox\or\vbox\or\ruledvbox\else\ruledvbox\fi}
+\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\testrulewidth}
+
+\def\setgridbox#1#2#3%
+  {\setbox#1\gridboxvbox to #3 % given size
+     {\forgetall
+      \resetteststrut
+      \offinterlineskip
+      \hsize#2%
+      \baselinerulefalse
+      \gridboxvbox % calculated size
+        {\getrawnoflines{#3}% \getnoflines{#3}%
+         \vskip\topskip
+         \vskip-\strutht
+         \scratchdimen#2\advance\scratchdimen \lineheight
+         \dorecurse\noflines
+           {\strut
+            \hskip-.5\lineheight
+            \ifcase\gridboxlinenomode\or
+              \rlap
+                {\hskip.2\bodyfontsize\hskip\scratchdimen
+                 \infofont\hbox to 1em{\hss\recurselevel}}%
+            \or
+              \llap
+                {\infofont\hbox to 1em{\hss\recurselevel}%
+                 \hskip.2\bodyfontsize}%
+            \fi
+            \vrule
+              \!!height \gridboxwidth
+              \!!depth  \gridboxwidth
+              \!!width  \scratchdimen
+            \par}}
+      \vfill}}
+
+%D Some intervention macros:
+
+\def\gridwarning#1{\message{[beware of #1 extra snap]}}
+
+\global\let\@@alignsnapamount\!!zeropoint
+\global\chardef\@@alignsnapdepth0
+
+\def\@@unknowngriddisplacement
+  {\global\chardef\@@alignsnapbox\plusthree
+   \global\let\@@alignsnapamount\commalistelement}
+
+\def\domoveongrid[#1]%
+  {\ifgridsnapping\doifsomething{#1}{\dodomoveongrid[#1]}\fi}
+
+\def\dodomoveongrid[#1]% some day : speed up
+  {\global\chardef\@@alignsnap\zerocount
+   \global\chardef\@@alignsnapbox\zerocount
+   \global\chardef\@@alignsnapdepth\zerocount
+   \global\chardef\@@alignsnapmethod\zerocount
+   \global\let\@@alignsnapamount\!!zeropoint
+   \donefalse
+   \expanded{\processallactionsinset[#1]}
+     [\v!standard=>,
+        \v!normal=>, % to be sure
+           \v!yes=>, % to be sure
+           \v!top=>\gridwarning+\positiveextrasnap\extrasnapbefore,
+        \v!bottom=>\gridwarning+\positiveextrasnap\extrasnapafter,
+          \v!both=>\positiveextrasnap\extrasnaparound,
+          -\v!top=>\gridwarning-\negativeextrasnap\extrasnapbefore,
+       -\v!bottom=>\gridwarning-\negativeextrasnap\extrasnapafter,
+         -\v!both=>\negativeextrasnap\extrasnaparound,
+          \v!text=>\global\chardef\@@alignsnapmethod\plusone, % accurate calculations
+          \v!page=>\global\chardef\@@alignsnap\plusone, % topskip
+          \v!high=>\global\chardef\@@alignsnap\plustwo,
+        \v!middle=>\global\chardef\@@alignsnap\plusthree,
+           \v!low=>\global\chardef\@@alignsnap\plusfour,
+           \v!fit=>\global\chardef\@@alignsnapbox\plusone, % new
+         \v!broad=>\global\chardef\@@alignsnapbox\plustwo, % new
+         \v!depth=>\global\chardef\@@alignsnapdepth\plusone, % new
+          \v!line=>\global\chardef\@@alignsnapbox\plusthree
+%                  \global\chardef\@@alignsnapdepth\plusone
+                   \global\chardef\@@alignsnap\plusfour,
+         \v!reset=>\positiveextrasnap\extrasnapreset,
+          \v!none=>\global\chardef\@@alignsnap\zerocount
+                   \global\chardef\@@alignsnapbox\zerocount,
+         \v!force=>, % turns on grid snapping even when not on
+       \s!default=>,
+       \s!unknown=>\@@unknowngriddisplacement]}
+
+\def\moveongrid
+  {\dosingleempty\domoveongrid}
+
+\def\doplaceongrid[#1]%
+  {\domoveongrid[#1]\snaptogrid\vbox}
+
+\def\placeongrid
+  {\dosingleempty\doplaceongrid}
+
+%D Snapping is rather robust as long as we use whole lines.
+%D Half lines of white space can however be handled when they
+%D come in pairs. The corrections needed when crossing page
+%D boundaries in the middle of such a pair, are handled by
+%D macros that are (named) sort of fuzzy. This fuzzy mechanism
+%D was written as an extension to the grid typesetting needed
+%D for typesetting (part of) the \MAPS.
+%D
+%D \starttyping
+%D \setuptyping
+%D   [before={\blank[halfline]},
+%D    after={\blank[halfline]}]
+%D \stoptyping
+
+\newif            \iffuzzyvskip
+\newif            \iffuzzysnapdone
+\newif            \iffuzzysnapping
+\newif            \iffuzzysnapped
+\chardef          \fuzzysnappedleft=0 % ==1 when fuzzybegin still open
+\newpersistentmark\fuzzymark % (!)
+\newcount         \fuzzymarker
+\newbox           \fuzzysnapbox
+\newbox           \fuzzysnapsplit
+
+\def\dosyncfuzzyvskip
+  {\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint
+     \bgroup      % - added 28/2/2003: check this, there was no -
+       \endgraf\forgetall\verticalstrut\nobreak\vskip-\struttotal
+     \egroup
+   \fi\fi\fi}
+
+\def\fuzzyvskip#1%
+  {\iffuzzysnapdone
+     \dosyncfuzzyvskip  % NEWER
+     \endfuzzysnapping
+     \vskip#1\relax
+     \global\fuzzysnapdonefalse
+   \else
+     \vskip#1\relax
+     \beginfuzzysnapping
+     \global\fuzzysnapdonetrue
+   \fi}
+
+\def\setfuzzymark#1#2#3% #1/#2 => error recovery
+  {\ifgridsnapping
+     \global\fuzzysnappingtrue
+     \global\advance\fuzzymarker \ifodd\fuzzymarker#1\else#2\fi
+     \nobreak
+     \ifshowfuzzyskips
+       \hbox{\color[grid:three]
+         {\llap{\infofont#3\vl\the\fuzzymarker}\nobreak
+          \vrule\!!width\hsize\!!height.1\lineheight}}
+       \nobreak
+     \fi
+    %[\the\fuzzymarker]
+    %\expandafter\fuzzymark\expandafter{\the\fuzzymarker}%
+     \expandafter\rawsetmark\expandafter\fuzzymark\expandafter{\the\fuzzymarker}%
+     \nobreak
+  \fi}
+
+\def\beginfuzzysnapping{\setfuzzymark21\v!start} % odd
+\def\endfuzzysnapping  {\setfuzzymark12\v!stop } % even
+
+\def\removelastfuzzyvskip
+  {\ifgridsnapping
+     \iffuzzysnapping
+       \ifdim\lastskip<\openlineheight
+       \else
+         \removelastskip
+       \fi
+     \else
+       \removelastskip
+     \fi
+   \else
+     \removelastskip
+   \fi}
+
+\def\docheckfuzzysnap#1%
+  {\bgroup
+   \dontcomplain
+   \setbox\fuzzysnapbox\copy#1\relax
+   \setbox\fuzzysnapsplit\vsplit\fuzzysnapbox to 1\lineheight
+   \let\topfuzzymark\empty % indeed here ... no real mark
+   \getsplitmarks\fuzzymark
+%   \ifcase0\topfuzzymark
+   \ifcase0\rawgetsplittopmark\fuzzymark
+     \global\chardef\fuzzysnappedleft\zerocount
+     \global\fuzzysnappedfalse
+%   \else\ifodd\topfuzzymark
+   \else\ifodd\rawgetsplittopmark\fuzzymark
+     \global\chardef\fuzzysnappedleft\plusone
+     \global\fuzzysnappedtrue
+   \else
+     \global\chardef\fuzzysnappedleft=2
+     \global\fuzzysnappedtrue
+   \fi\fi
+   \iffuzzysnapped \else
+     \doloop
+       {\ifvoid\fuzzysnapbox
+          \exitloop
+        \else
+          \setbox\fuzzysnapsplit=\vsplit\fuzzysnapbox to \lineheight
+         %\let\topfuzzymark=\empty % ... but not here
+          \getsplitmarks\fuzzymark
+%          \ifcase0\topfuzzymark
+          \ifcase0\rawgetsplittopmark\fuzzymark
+            % continue
+%          \else\ifodd\topfuzzymark
+          \else\ifodd\rawgetsplittopmark\fuzzymark
+            \exitloop
+          \else
+            \global\chardef\fuzzysnappedleft\plusone
+            \global\fuzzysnappedtrue
+            \exitloop
+          \fi\fi
+        \fi}%
+   \fi
+   \egroup}
+
+\def\getfuzzysnapcorrection#1%
+  {\global\let\presnapcorrection \relax
+   \global\let\postsnapcorrection\relax
+   \ifgridsnapping\iffuzzysnapping
+     \docheckfuzzysnap{#1}%
+     \iffuzzysnapped
+       \iftracegridsnapping
+         \gdef\presnapcorrection
+           {\color[grid:four]{\hrule\!!height.5\openlineheight\!!width\hsize}}%
+       \else
+         \gdef\presnapcorrection{\kern.5\openlineheight}%
+       \fi
+       \gdef\postsnapcorrection{\kern-.5\openlineheight}% get the height ok
+     \fi
+   \fi\fi}
+
+\def\fuzzysnappedbox#1#2% \box \unvbox
+  {\getfuzzysnapcorrection{#2}%
+   \presnapcorrection
+   #1#2%
+   \postsnapcorrection}
+
+\def\adaptfuzzypagegoal
+  {\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents
+     \scratchdimen\pagegoal
+     \advance\scratchdimen -.5\openlineheight
+     \global\pagegoal\scratchdimen
+     \global\advance\vsize -.5\openlineheight
+     \global\chardef\fuzzysnappedleft0
+   \fi\fi\fi}
+
+%D New, experimental, used in caption snapping:
+%D
+%D \starttyping
+%D \startcolumnset
+%D
+%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=top]
+%D
+%D \placefigure [lrtb] {\dorecurse{5}{green gras}}
+%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D \placefigure [lrtb] {\dorecurse{15}{green gras}}
+%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D
+%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=bottom]
+%D
+%D \placefigure [rltb] {\dorecurse{5}{green gras}}
+%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D \placefigure [rltb] {\dorecurse{15}{green gras}}
+%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D
+%D \input thuan
+%D
+%D \stopcolumnset
+%D \stoptyping
+
+\def\moveboxontogrid#1#2#3% box method firstlineht % experimental ! ! !
+  {\doifsomething{#2}
+     {\getnoflines{\ht#1}% no depth taken into account, depth preserved
+      \scratchdimen\noflines\lineheight
+      \advance\scratchdimen-\strutdp
+      \bgroup
+      \advance\scratchdimen-\onepoint % be a bit tolerant
+      \ifdim\scratchdimen>\ht#1\relax
+        \egroup
+        \doif{#2}\v!top   {\setbox#1\vbox to \scratchdimen{\vskip-#3\vskip\strutht\box#1\vfill}}%
+        \doif{#2}\v!bottom{\setbox#1\vbox to \scratchdimen{\vfill\box#1\removedepth}}%
+        \dp#1\strutdp
+      \else
+        \egroup
+        \ht#1\scratchdimen
+        \dp#1\strutdp
+      \fi}}
+
+%D New:
+
+\let\checkgridsnapping\relax
+
+\protect \endinput
diff --git a/tex/context/base/core-grd.tex b/tex/context/base/core-grd.tex
deleted file mode 100644
index 249e2e430..000000000
--- a/tex/context/base/core-grd.tex
+++ /dev/null
@@ -1,1074 +0,0 @@
-%D \module
-%D   [       file=core-grd,
-%D        version=1998.03.10,
-%D          title=\CONTEXT\ Core Macros,
-%D       subtitle=Grid Snapping (Experimental),
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Grid Snapping}
-
-\unprotect
-
-%D Moved from supp-box:
-
-%D \macros
-%D  {startbaselinecorrection,baselinecorrection,
-%D   showbaselinecorrection,offbaselinecorrection}
-%D
-%D Spacing around ruled boxes can get pretty messed up. The
-%D next macro tries as good as possible to fix this.
-%D
-%D \startbuffer[1]
-%D \startbaselinecorrection
-%D \ruledhbox{Rule Brittanica}
-%D \stopbaselinecorrection
-%D \stopbuffer
-%D
-%D \typebuffer[1]
-%D
-%D The macros put some white space around the box:
-%D
-%D \getbuffer[1]
-%D
-%D A simple alternative is \type {\baselinecorrection}, which
-%D only looks at the previous line.
-%D
-%D \startbuffer[2]
-%D \baselinecorrection
-%D \ruledhbox{Rule Brittanica}
-%D \baselinecorrection
-%D \stopbuffer
-%D
-%D \typebuffer[2]
-%D
-%D This time the last preceding line gets a correction,%
-%D dependant on the depth.
-%D
-%D \getbuffer[2]
-%D
-%D One can make the correction visible by saying \type
-%D {\showbaselinecorrection}. Part of the correction is
-%D calculated from the dimensions of a~(. One can disble the
-%D correction by calling \type {\offbaselinecorrection}.
-%D
-%D When visualize the first example looks like:
-%D
-%D {\showbaselinecorrection\getbuffer[1]}
-%D
-%D and the second one comes out as:
-%D
-%D {\showbaselinecorrection\getbuffer[2]}
-
-% \definecolor[GridLineColor][red]
-% \definecolor[GridTextColor][blue]
-
-\definepalet
-  [grid]
-  [  one=red,
-     two=green,
-   three=blue,
-    four=gray]
-
-\def\setbaselinecorrections
-  {\setbox0\hbox{\setstrut\strut}%
-   \setbox2\hbox{(}%
-   \dimen0\ht0\advance\dimen0 -\ht2
-   \ifdim\dimen0<\zeropoint\dimen0\zeropoint\fi
-   \dimen2\dp0\advance\dimen2 -\dp2
-   \ifdim\dimen2<\zeropoint\dimen2\zeropoint\fi
-   \edef\thetopbaselinecorrection   {\the\dimen0}\dimen0-\dimen0
-   \edef\thebotbaselinecorrection   {\the\dimen2}\dimen2-\dimen2
-   \edef\thenegtopbaselinecorrection{\the\dimen0}%
-   \edef\thenegbotbaselinecorrection{\the\dimen2}}
-
-\def\dotopbaselinecorrection   {\kern\thetopbaselinecorrection}
-\def\dobotbaselinecorrection   {\kern\thebotbaselinecorrection}
-\def\donegtopbaselinecorrection{\kern\thenegtopbaselinecorrection}
-\def\donegbotbaselinecorrection{\kern\thenegbotbaselinecorrection}
-
-\def\showbaselinecorrection
-  {\def\dobaselinecorrection % visualization is not watertight!
-     {\bgroup
-\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
-      \setbox0\null
-      \wd0\hsize
-      \dp0\strutdp
-      \nointerlineskip
-      \forgetall
-      \ruledvbox{\box0}%
-      \egroup
-      \prevdepth\strutdp}%
-   \def\dotopbaselinecorrection
-     {\hrule\!!height\thetopbaselinecorrection}%
-   \def\dobotbaselinecorrection
-     {\hrule\!!height\thebotbaselinecorrection}}
-
-\def\dobaselinecorrection
-  {\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
-   \kern\strutdp
-   \prevdepth\strutdp}
-
-% \def\baselinecorrection
-%   {\endgraf
-%    \ifvmode
-%      \ifdim\prevdepth<\maxdimen
-%        \ifdim\prevdepth<\zeropoint \else
-%          \ifdim\prevdepth<\strutdp
-%            \dobaselinecorrection
-%          \fi
-%        \fi
-%      \fi
-%    \fi}
-
-\def\baselinecorrection
-  {\endgraf
-   \ifvmode
-     \ifdim\prevdepth<\maxdimen
-       \ifdim\prevdepth<\zeropoint \else
-         \ifdim\prevdepth<\strutdepth \relax
-           \pushlastnode
-           \dobaselinecorrection
-           \poplastnode
-         \fi
-       \fi
-     \fi
-   \fi}
-
-\def\pagebaselinecorrection
-  {\ifdim\pagegoal<\maxdimen
-     \ifdim\pagetotal>\lineheight % or \topskip
-       \scratchdimen\pagetotal
-       \advance\scratchdimen\lineheight
-       \ifdim\scratchdimen<\pagegoal
-         \baselinecorrection
-       \fi
-     \fi
-   \fi}
-
-% Beware, keep this one as it is, see for instance module
-% m-steps.tex, where we apply a \localhsize to the \vbox, in
-% order to follow narrower and side floats !
-
-% \def\startbaselinecorrection
-%   {\baselinecorrection
-%    \ifvmode
-%      \bgroup
-%      \setbox\scratchbox\vbox\bgroup
-%      \ignorespaces
-%      \let\stopbaselinecorrection\dostopbaselinecorrection
-%    \else
-%      \let\stopbaselinecorrection\relax
-%    \fi}
-
-% \def\dostopbaselinecorrection % I have to check columns yet.
-%   {\endgraf
-%    \egroup
-%    \topbaselinecorrection
-%    \box\scratchbox
-%    \botbaselinecorrection
-%    \egroup}
-
-% \let\stopbaselinecorrection=\relax
-
-\def\startbaselinecorrection
-  {\bgroup
-   \let\stopbaselinecorrection\egroup
-   \ifcase\baselinecorrectionmode
-   \or % normal
-     \baselinecorrection
-     \ifvmode
-       \setbox\scratchbox\vbox\bgroup\ignorespaces
-       \let\stopbaselinecorrection\donormalstopbaselinecorrection
-     \fi
-   \or % off
-   \or % force
-     \baselinecorrection
-     \ifvmode
-       \setbox\scratchbox\vbox\bgroup\ignorespaces
-       \let\stopbaselinecorrection\doforcedstopbaselinecorrection
-     \fi
-   \fi}
-
-\let\stopbaselinecorrection\relax
-
-\def\donormalstopbaselinecorrection % I have to check columns yet.
-  {\egroup
-   \topbaselinecorrection
-   \box\scratchbox
-   \botbaselinecorrection
-   \egroup}
-
-\def\doforcedstopbaselinecorrection % I have to check columns yet.
-  {\egroup
-   \forcedtopbaselinecorrection
-   \box\scratchbox
-   \forcedbotbaselinecorrection
-   \egroup}
-
-%D We do a bit more checking than needed. The pageborder check
-%D is not needed, but I want to look the visualization as good
-%D as possible too.
-
-% \def\offbaselinecorrection % Can be used inside correction.
-%   {\def\startbaselinecorrection{\bgroup\let\stopbaselinecorrection\egroup}}
-
-\chardef\baselinecorrectionmode\plusone
-
-\def\onbaselinecorrection   {\chardef\baselinecorrectionmode\plusone  }
-\def\offbaselinecorrection  {\chardef\baselinecorrectionmode\plustwo  }
-\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree}
-
-%D \macros
-%D  {topbaselinecorrection,botbaselinecorrection}
-%D
-%D The actual top and bottom corrections are implemented as:
-
-% \def\topbaselinecorrection
-%   {\ifvmode \ifdim\pagegoal<\maxdimen
-%      \bgroup
-%      \setbaselinecorrections
-%      \whitespace
-%      \nointerlineskip
-%      \dotopbaselinecorrection
-%      \egroup
-%    \fi \fi}
-
-
-\def\topbaselinecorrection
-  {\ifvmode \ifdim\pagegoal<\maxdimen
-     \forcedtopbaselinecorrection
-   \fi \fi}
-
-\def\forcedtopbaselinecorrection
-  {\ifvmode
-     \bgroup
-     \setbaselinecorrections
-     \whitespace
-     \nointerlineskip
-     \dotopbaselinecorrection
-     \egroup
-   \fi}
-
-\def\botbaselinecorrection
-  {\ifvmode
-     \bgroup
-     \setbaselinecorrections
-     \dobotbaselinecorrection
-     \allowbreak % new, otherwise problems when many in a row
-     \prevdepth\strutdp
-     \egroup
-   \fi}
-
-\let\forcedbotbaselinecorrection\botbaselinecorrection
-
-%D Still very experimental and therefore undocumented.
-
-\newif\ifgridsnapping  % UNDER DEVELOPMENT, USE WITH CARE
-\newif\ifforcepresnap  \forcepresnaptrue  % false in mixed single/double
-\newif\ifstrutsnapping \strutsnappingtrue % sometimes handy to be false
-
-\def\positiveextrasnap {\gdef\extrasnapsign{+}}
-\def\negativeextrasnap {\gdef\extrasnapsign{-}}
-
-\def\extrasnapreset  {\global\chardef\@@extrasnap0
-                      \positiveextrasnap}
-\def\extrasnapbefore {\global\chardef\@@extrasnap1 }
-\def\extrasnaparound {\global\chardef\@@extrasnap2 }
-\def\extrasnapafter  {\global\chardef\@@extrasnap3 }
-
-\def\enablepresnapcorrection  {\global\chardef\@@presnap\zerocount}
-\def\disablepresnapcorrection {\global\chardef\@@presnap\plusone}
-
-\extrasnapreset \enablepresnapcorrection
-
-\newif\iftracegridsnapping
-\newif\ifshowgridboxes
-\newif\ifshowfuzzyskips
-
-\let\showgridboxes\showgridboxestrue
-
-\def\showgridsnapping
-  {\tracegridsnappingtrue
-   \showgridboxestrue}
-
-\chardef\@@alignsnap      =0
-\chardef\@@alignsnapbox   =0
-\chardef\@@alignsnapmethod=0
-
-\let\presnapskip \!!zeropoint  \def\presnap {-}
-\let\postsnapskip\!!zeropoint  \let\postsnap\presnap
-
-\newcount\currentgridsnap
-
-\def\tracedsnapping
-  {\iftracegridsnapping
-     \llap
-       {\startlayoutcomponent{gridsnaps}{grid snaps}%
-        \infofont
-        \global\advance\currentgridsnap\plusone
-        \color[grid:three]{\vl\presnapskip
-                    \vl\presnap
-                    \vl\postsnap
-                    \ifcase\@@alignsnapbox\relax
-                      \vl\ifcase\@@extrasnap
-                              00\or
-                 \extrasnapsign0\or
-    \extrasnapsign\extrasnapsign\or
-                 0\extrasnapsign\fi
-                    \fi
-                    \vl\the\currentgridsnap\vl}%
-        \stoplayoutcomponent}%
-   \fi}
-
-\def\snaptogrid% [#1]#2 -> #2 == \hbox|\vbox
-  {\dosingleempty\dosnaptogrid}
-
-% \def\dosnaptogrid[#1]%
-%   {\ifgridsnapping
-%      \iffirstargument\doifsomething{#1}{\verplaatsopgrid[#1]}\fi
-%      \expandafter\dodosnaptogrid
-%    \fi}
-
-% \def\dosnaptogrid[#1]%
-%   {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up
-%    \ifgridsnapping
-%      \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi
-%      \expandafter\dodosnaptogrid
-%    \fi}
-
-\def\dosnaptogrid[#1]%
-  {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up
-   \doifinsetelse\v!force{#1}%
-     {\moveongrid[#1]%
-      \dodosnaptogrid}
-     {\ifgridsnapping
-        \doifsomething{#1}{\moveongrid[#1]}%
-        \expandafter\dodosnaptogrid
-      \fi}}
-
-% \def\forcedpresnapcorrection % test this on 'details'
-%   {\ifforcepresnap
-%      \ifvmode \else \par \fi % new
-%      % we don't want top of page space  when 'top' option
-%      %\verticalstrut\nobreak\vskip-\struttotal
-%      %\verticalstrut\vskip-\struttotal
-%      % nobreak really needed
-%      \allowbreak\verticalstrut\nobreak\vskip-\struttotal
-%      %\ifdim\pagetotal>\topskip \else
-%        % eigenlijk signal
-%        %\writestatus{grid}{removing dummy at top of page}%
-%        %\bgroup
-%        %\output{\setbox\scratchbox\box255}%
-%        %\penalty\outputpenalty
-%        %\egroup
-%      %\fi
-%    \fi}
-
-\def\forcedpresnapcorrection % test this on 'details'
-  {\ifforcepresnap
-     \ifvmode \else \par \fi % new
-     % we don't want top of page space  when 'top' option
-     % \verticalstrut\nobreak\vskip-\struttotal
-     % \verticalstrut\vskip-\struttotal
-     % \nobreak really needed
-     % \dosomebreak\allowbreak % no: spoils heads, so only under know situation, not in snapper
-     \verticalstrut
-     \nobreak
-     \vskip-\struttotal
-     %\ifdim\pagetotal>\topskip \else
-       % eigenlijk signal
-       %\writestatus{grid}{removing dummy at top of page}%
-       %\bgroup
-       %\output{\setbox\scratchbox\box255}%
-       %\penalty\outputpenalty
-       %\egroup
-     %\fi
-   \fi}
-
-\def\setgridtracebox#1[#2]% % maybe reverse the order
-  {\setbox\nextbox#1%
-     {\hbox
-        {\hbox to \zeropoint
-           {\startlayoutcomponent{gridsnaps}{grid snaps}%
-            \color[grid:#2]{\ruledhbox{\fakebox\nextbox}}%
-            \stoplayoutcomponent
-            \hss}%
-         \flushnextbox}}}
-
-\newif\ifboxedsnapping \boxedsnappingtrue
-
-\chardef\depthsnapmethod \plusone % downward compatible, minus one line
-\chardef\heightsnapmethod\plusone % downward compatible, minus one line
-
-\def\dodosnaptogrid
-  {\dowithnextbox
-     {\bgroup
-      \ifcase\@@alignsnapmethod \or
-        % we're dealing with text with a possible big depth/height
-        \chardef\depthsnapmethod \plustwo
-        \chardef\heightsnapmethod\plustwo
-      \fi
-      \ifdim\nextboxht<\textheight % handle special case (like page fig)
-        \ifcase\@@alignsnapbox\relax
-          \ifcase\@@alignsnap\else % 1=top 2=high 3=middle 4=low
-            \ifshowgridboxes
-              \setgridtracebox\hbox[two]%
-            \fi
-           %\getnoflines{\nextboxht}%
-            \getnoflines\nextboxht
-            \setbox\nextbox\vbox to \noflines\lineheight
-              {\ifnum\@@alignsnap=1 \kern\lineheight\kern-\topskip\fi
-               \ifnum\@@alignsnap>2 \vfill\fi
-               \flushnextbox
-             \ifnum\@@alignsnap<4 \vfill\fi}%
-          \fi
-          \ifshowgridboxes
-            \setgridtracebox\hbox[three]%
-          \fi
-          \forgetall
-          \par
-          \ifvbox\nextbox
-            \setbox\nextbox\hbox{\flushnextbox}% don't ask
-          \fi
-          \scratchskip\lastskip
-          \edef\presnapskip{\the\lastskip}%
-          % mixing single/double columns sometimes goes wrong,
-          % check 'som' document
-          \ifinsidecolumns
-            \forcepresnaptrue
-          \fi
-          \forcedpresnapcorrection
-          \ifdim\nextboxht>\strutht
-            \scratchdimen\nextboxht
-            \ifcase\@@presnap\relax
-              \ifdim\scratchskip>\zeropoint\relax
-                \scratchcounter\scratchskip
-                \advance\scratchcounter -\openlineheight
-                \ifnum\scratchcounter<0
-                  \scratchcounter-\scratchcounter
-                \fi
-                \ifnum\scratchcounter<10 % \lastkip is about \openlineheight
-                  \advance\scratchdimen -\openstrutdepth
-                  \edef\presnapskip{*\presnapskip}%
-                \else\ifdim\scratchskip>\openlineheight
-                                      %<\openlineheight \else
-                  \advance\scratchdimen -\openstrutdepth
-                  \edef\presnapskip{*\presnapskip}%
-                \fi\fi
-              \fi
-            \fi
-          % \getnoflines\scratchdimen % maybe raw ?
-          % \advance\noflines -1
-            \ifcase\heightsnapmethod
-              % raw
-            \or
-              \advance\scratchdimen-\lineheight  % tight (default)
-            \or
-              \advance\scratchdimen-\strutheight % fit (text)
-            \or
-              \advance\scratchdimen-\strutheight % tolerant
-              \advance\scratchdimen-\roundingeps
-            \fi
-            \getnoflines\scratchdimen
-            \ifnum\noflines>0
-              \scratchdimen\noflines\lineheight
-            \else
-              \scratchdimen\zeropoint
-            \fi
-          \else
-            \scratchdimen\zeropoint
-          \fi
-          \ifnum\@@extrasnap=1 \advance\scratchdimen \extrasnapsign  \lineheight \fi
-          \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi
-          \edef\presnap{\the\scratchdimen}%
-          \ifstrutsnapping
-            \ifboxedsnapping
-              \getrawnoflines\scratchdimen
-              \advance\scratchdimen-\noflines\lineheight
-              \vskip\scratchdimen % disappears at top of page
-              \dorecurse\noflines{\verticalstrut\nobreak}%
-            \else \ifdim\scratchdimen=\zeropoint
-              % nothing to skip
-            \else % disappears at top of page
-              \vskip\scratchdimen
-            \fi \fi
-          \fi
-          \ifdim\nextboxdp>\strutdp
-          % \getnoflines\nextboxdp
-          % \advance\noflines \minusone
-            \scratchdimen\nextboxdp\relax
-            \ifcase\depthsnapmethod
-              % raw
-            \or
-              \advance\scratchdimen-\lineheight % tight (default)
-            \or
-              \advance\scratchdimen-\strutdepth % fit (text)
-            \or
-              \advance\scratchdimen-\strutdepth % tolerant
-              \advance\scratchdimen-\roundingeps
-            \fi
-            \getnoflines\scratchdimen
-            \ifnum\noflines>0
-              \scratchdimen\noflines\lineheight
-            \else
-              \scratchdimen\zeropoint
-            \fi
-          \else
-            \scratchdimen\zeropoint
-          \fi
-          \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi
-          \ifnum\@@extrasnap=3 \advance\scratchdimen \extrasnapsign  \lineheight \fi
-          \edef\postsnap{\the\scratchdimen}%
-          \ifstrutsnapping
-            \nextboxht\strutht
-            \nextboxdp\strutdp
-          \else
-            \scratchdimen\presnap
-            \advance\scratchdimen \strutht
-            \nextboxht\scratchdimen
-            \scratchdimen\postsnap
-            \advance\scratchdimen \strutdp
-            \nextboxdp\scratchdimen
-          \fi
-          \hbox{\tracedsnapping\flushnextbox}%
-          \ifstrutsnapping
-            \ifdim\scratchdimen=\zeropoint\else\vskip\scratchdimen\fi
-          \fi
-        \else
-          \scratchdimen\nextboxht\relax
-          \ifcase\@@alignsnapbox
-            % can't happen here
-          \or
-            \getrawnoflines\scratchdimen
-          \else
-            \getnoflines   \scratchdimen
-          \fi
-          \scratchdimen\noflines\lineheight\relax
-          \advance\scratchdimen-\strutdepth
-          % spoils the whole game (fit/broad/line)
-          % \ifnum\pagetotal>\zeropoint \else % disable this as option
-          %   \advance\scratchdimen-\strutheight
-          %   \advance\scratchdimen+\topskip
-          % \fi
-          \dimen0=\scratchdimen
-          \dimen2=\strutdepth
-          \ifshowgridboxes
-            \setgridtracebox\hbox[two]%
-          \fi
-          \nextboxdp\strutdp
-          \dimen4=\nextboxht
-          \dimen6=\nextboxdp
-          \iftracegridsnapping
-            \setbox\scratchbox\hbox
-              {\scratchdimen\@@alignsnapamount\relax
-               \ifdim\scratchdimen<\zeropoint
-                 \tracedgridamount\zeropoint{-\scratchdimen}%
-               \else
-                 \tracedgridamount\scratchdimen\zeropoint
-               \fi}%
-            \smashbox\scratchbox
-            \setbox\nextbox\hbox{\box\scratchbox\flushnextbox}%
-          \fi
-          \setbox\nextbox\hbox
-            {\scratchdimen\@@alignsnapamount\relax
-             \ifcase\@@alignsnapdepth\or
-               % don't change this ever !
-               \ifdim\dimen0<\lineheight
-                 % otherwise it is ok, but ending up inside
-                 % the next paragraph is seldom what we want,
-                 % so we move one line up
-                 \advance\scratchdimen-\lineheight
-                 \advance\scratchdimen\strutheight
-               \else
-                 % otherwise we can move down to the
-                 % baseline
-                 \advance\scratchdimen\dimen6 % == \strutdepth
-               \fi
-             \fi
-             \lower\scratchdimen\flushnextbox}%
-          \nextboxht\dimen4
-          \nextboxdp\dimen6
-          \ifnum\@@alignsnap<4 % 4 = regel
-            \setbox\nextbox\vbox to \scratchdimen
-              {\forgetall
-               \ifnum\@@alignsnap>2 \vfill\fi % 3 4
-               \flushnextbox
-               \nointerlineskip % \offinterlineskip
-               \ifnum\@@alignsnap<4 \vfill\fi % 2 3
-               \kern\zeropoint}%
-          \fi
-          \ifshowgridboxes
-            \setgridtracebox\vbox[three]%
-          \fi
-          \scratchdimen\@@alignsnapamount
-          \edef\presnapskip{\the\scratchdimen}%
-          \ifnum\@@alignsnap>2 \def\presnap {+}\fi
-          \ifnum\@@alignsnap<4 \def\postsnap{+}\fi
-          \setbox\nextbox\hbox{\tracedsnapping\flushnextbox}%
-          \par
-          \nextboxht\dimen0
-          \nextboxdp\dimen2
-          \forcedpresnapcorrection
-          \nointerlineskip
-          \flushnextbox
-        \fi
-      \else
-        \setbox\nextbox\vbox to \textheight
-          {\ifdim\nextboxdp=\zeropoint
-             \hbox{\lower\strutdepth\flushnextbox}
-           \else % this branch is yet untested
-             \vss
-             \hbox{\lower\nextboxdp\flushnextbox}
-             \vskip-\strutdepth
-           \fi}%
-        \nextboxdp\strutdepth
-        \flushnextbox
-      \fi
-      \extrasnapreset
-      \enablepresnapcorrection
-      \global\chardef\@@alignsnap\zerocount
-      \global\chardef\@@alignsnapbox\zerocount
-      \egroup}}
-
-\def\tracedgridamount#1#2%
-  {\startlayoutcomponent{gridsnaps}{grid snaps}%
-   \color[grid:four]{\vrule\!!width\nextboxwd\!!height#1\!!depth#2}%
-   \stoplayoutcomponent}
-
-\def\snaptomathgrid % probably not working ok, also kind of obsolete
-  {\ifgridsnapping
-     \dowithnextbox
-       {\blank[\v!line]\snaptogrid\vbox{\flushnextbox}\blank[\v!line]}
-     \vbox\bgroup
-       \forgetdisplayskips
-       \@EA\let\@EA\next
-   \fi}
-
-\def\topsnaptogrid
-  {\ifgridsnapping
-     \dowithnextbox
-       {\scratchdimen\nextboxht
-        \advance\scratchdimen -\strutht
-        \advance\scratchdimen \topskip
-        \nextboxht\scratchdimen
-        \nextboxdp\zeropoint
-        \flushnextbox
-        \kern\lineheight
-        \kern-\topskip
-        \nointerlineskip}
-       \hbox
-   \fi}
-
-% \def\centertogrid % meant for special situations
-%   {\ifgridsnapping
-%      \dowithnextboxcontent
-%        {\ignorespaces}
-%        {\bgroup
-%         \par
-%         \scratchdimen\nextboxht
-%         \advance\scratchdimen \nextboxdp
-%         \getnoflines\scratchdimen
-%         \setbox\nextbox\vbox to \noflines\lineheight
-%           {\forgetall
-%            \vskip\zeropoint \!!plus \nextboxht
-%            \copy\nextbox
-%            \kern.5\strutdp % VOORLOPIGE WAARDE
-%            \vskip\zeropoint \!!plus \nextboxdp}%
-%         \noindent\snaptogrid\vbox{\flushnextbox}%
-%         \egroup}
-%        \vbox % was \hbox
-%    \fi}
-
-% The next implementation is sub-optimal
-%
-% \def\centertogrid % usage: see ie pascal / stepcharts
-%   {\snaptogrid[\v!midden,.5\strutdp]\vbox}
-
-\def\centertogrid % meant for special situations
-  {\ifgridsnapping
-     \dowithnextboxcontent
-       {\ignorespaces}
-       {\bgroup
-        \par
-        \scratchdimen\nextboxht
-        \advance\scratchdimen \nextboxdp
-        \getnoflines\scratchdimen
-        \setbox\nextbox\vbox to \noflines\lineheight
-          {\forgetall
-           \vss
-           \topbaselinecorrection
-           \copy\nextbox
-           \botbaselinecorrection
-           \vss}%
-        \setbox\nextbox\hbox{\lower\strutdp\flushnextbox}%
-        \forgeteverypar % new per 3/4/2008, prevents duplicate pos nodes resulting in extra whitespace
-        \noindent\snaptogrid\vbox{\flushnextbox}%
-        \egroup}
-       \vbox % was \hbox
-   \fi}
-
-% testbed for \centertogrid
-%
-% \strut Bruggetje
-% \startlinecorrection
-% \startcombination
-%   {\framed{test}} {} {\framed{test}} {}
-% \stopcombination
-% \stoplinecorrection
-% \strut Bruggetje
-% \startlinecorrection
-% \startcombination[2*2]
-%   {\framed{test}} {} {\framed{test}} {}
-%   {\framed{test}} {} {\framed{test}} {}
-% \stopcombination
-% \stoplinecorrection
-% \strut Bruggetje
-% \startlinecorrection[blank]
-% \startcombination
-%   {\framed{test}} {} {\framed{test}} {}
-% \stopcombination
-% \stoplinecorrection
-% \strut Bruggetje
-% \startlinecorrection[blank]
-% \startcombination[2*2]
-%   {\framed{test}} {} {\framed{test}} {}
-%   {\framed{test}} {} {\framed{test}} {}
-% \stopcombination
-% \stoplinecorrection
-% \strut Bruggetje
-% \startlinecorrection
-% \startcombination
-%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
-% \stopcombination
-% \stoplinecorrection
-% \strut Bruggetje
-% \startlinecorrection
-% \startcombination[2*2]
-%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
-%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
-% \stopcombination
-% \stoplinecorrection
-% \strut Bruggetje
-% \startlinecorrection[blank]
-% \startcombination
-%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
-% \stopcombination
-% \stoplinecorrection
-% \strut Bruggetje
-% \startlinecorrection[blank]
-% \startcombination[2*2]
-%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
-%   {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
-% \stopcombination
-% \stoplinecorrection
-
-\ifx\startbaselinecorrection\undefined \wait \fi % change order
-
-\let\normalstartbaselinecorrection=\startbaselinecorrection
-
-\def\startbaselinecorrection
-  {\ifgridsnapping
-     \centertogrid\bgroup
-     \let\stopbaselinecorrection\egroup
-   \else
-     \normalstartbaselinecorrection
-   \fi}
-
-\chardef\gridboxlinenomode\plusone
-\chardef\gridboxlinemode  \plusone % 0:nothing 1:all 2:lines 3:frame
-
-\def\gridboxvbox {\ifcase\gridboxlinemode\vbox\or\ruledvbox\or\vbox\or\ruledvbox\else\ruledvbox\fi}
-\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\testrulewidth}
-
-\def\setgridbox#1#2#3%
-  {\setbox#1\gridboxvbox to #3 % given size
-     {\forgetall
-      \resetteststrut
-      \offinterlineskip
-      \hsize#2%
-      \baselinerulefalse
-      \gridboxvbox % calculated size
-        {\getrawnoflines{#3}% \getnoflines{#3}%
-         \vskip\topskip
-         \vskip-\strutht
-         \scratchdimen#2\advance\scratchdimen \lineheight
-         \dorecurse\noflines
-           {\strut
-            \hskip-.5\lineheight
-            \ifcase\gridboxlinenomode\or
-              \rlap
-                {\hskip.2\bodyfontsize\hskip\scratchdimen
-                 \infofont\hbox to 1em{\hss\recurselevel}}%
-            \or
-              \llap
-                {\infofont\hbox to 1em{\hss\recurselevel}%
-                 \hskip.2\bodyfontsize}%
-            \fi
-            \vrule
-              \!!height \gridboxwidth
-              \!!depth  \gridboxwidth
-              \!!width  \scratchdimen
-            \par}}
-      \vfill}}
-
-%D Some intervention macros:
-
-\def\gridwarning#1{\message{[beware of #1 extra snap]}}
-
-\global\let\@@alignsnapamount\!!zeropoint
-\global\chardef\@@alignsnapdepth0
-
-\def\@@unknowngriddisplacement
-  {\global\chardef\@@alignsnapbox\plusthree
-   \global\let\@@alignsnapamount\commalistelement}
-
-\def\domoveongrid[#1]%
-  {\ifgridsnapping\doifsomething{#1}{\dodomoveongrid[#1]}\fi}
-
-\def\dodomoveongrid[#1]% some day : speed up
-  {\global\chardef\@@alignsnap\zerocount
-   \global\chardef\@@alignsnapbox\zerocount
-   \global\chardef\@@alignsnapdepth\zerocount
-   \global\chardef\@@alignsnapmethod\zerocount
-   \global\let\@@alignsnapamount\!!zeropoint
-   \donefalse
-   \expanded{\processallactionsinset[#1]}
-     [\v!standard=>,
-        \v!normal=>, % to be sure
-           \v!yes=>, % to be sure
-           \v!top=>\gridwarning+\positiveextrasnap\extrasnapbefore,
-        \v!bottom=>\gridwarning+\positiveextrasnap\extrasnapafter,
-          \v!both=>\positiveextrasnap\extrasnaparound,
-          -\v!top=>\gridwarning-\negativeextrasnap\extrasnapbefore,
-       -\v!bottom=>\gridwarning-\negativeextrasnap\extrasnapafter,
-         -\v!both=>\negativeextrasnap\extrasnaparound,
-          \v!text=>\global\chardef\@@alignsnapmethod\plusone, % accurate calculations
-          \v!page=>\global\chardef\@@alignsnap\plusone, % topskip
-          \v!high=>\global\chardef\@@alignsnap\plustwo,
-        \v!middle=>\global\chardef\@@alignsnap\plusthree,
-           \v!low=>\global\chardef\@@alignsnap\plusfour,
-           \v!fit=>\global\chardef\@@alignsnapbox\plusone, % new
-         \v!broad=>\global\chardef\@@alignsnapbox\plustwo, % new
-         \v!depth=>\global\chardef\@@alignsnapdepth\plusone, % new
-          \v!line=>\global\chardef\@@alignsnapbox\plusthree
-%                  \global\chardef\@@alignsnapdepth\plusone
-                   \global\chardef\@@alignsnap\plusfour,
-         \v!reset=>\positiveextrasnap\extrasnapreset,
-          \v!none=>\global\chardef\@@alignsnap\zerocount
-                   \global\chardef\@@alignsnapbox\zerocount,
-         \v!force=>, % turns on grid snapping even when not on
-       \s!default=>,
-       \s!unknown=>\@@unknowngriddisplacement]}
-
-\def\moveongrid
-  {\dosingleempty\domoveongrid}
-
-\def\doplaceongrid[#1]%
-  {\domoveongrid[#1]\snaptogrid\vbox}
-
-\def\placeongrid
-  {\dosingleempty\doplaceongrid}
-
-%D Snapping is rather robust as long as we use whole lines.
-%D Half lines of white space can however be handled when they
-%D come in pairs. The corrections needed when crossing page
-%D boundaries in the middle of such a pair, are handled by
-%D macros that are (named) sort of fuzzy. This fuzzy mechanism
-%D was written as an extension to the grid typesetting needed
-%D for typesetting (part of) the \MAPS.
-%D
-%D \starttyping
-%D \setuptyping
-%D   [before={\blank[halfline]},
-%D    after={\blank[halfline]}]
-%D \stoptyping
-
-\newif            \iffuzzyvskip
-\newif            \iffuzzysnapdone
-\newif            \iffuzzysnapping
-\newif            \iffuzzysnapped
-\chardef          \fuzzysnappedleft=0 % ==1 when fuzzybegin still open
-\newpersistentmark\fuzzymark % (!)
-\newcount         \fuzzymarker
-\newbox           \fuzzysnapbox
-\newbox           \fuzzysnapsplit
-
-\def\dosyncfuzzyvskip
-  {\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint
-     \bgroup      % - added 28/2/2003: check this, there was no -
-       \endgraf\forgetall\verticalstrut\nobreak\vskip-\struttotal
-     \egroup
-   \fi\fi\fi}
-
-\def\fuzzyvskip#1%
-  {\iffuzzysnapdone
-     \dosyncfuzzyvskip  % NEWER
-     \endfuzzysnapping
-     \vskip#1\relax
-     \global\fuzzysnapdonefalse
-   \else
-     \vskip#1\relax
-     \beginfuzzysnapping
-     \global\fuzzysnapdonetrue
-   \fi}
-
-\def\setfuzzymark#1#2#3% #1/#2 => error recovery
-  {\ifgridsnapping
-     \global\fuzzysnappingtrue
-     \global\advance\fuzzymarker \ifodd\fuzzymarker#1\else#2\fi
-     \nobreak
-     \ifshowfuzzyskips
-       \hbox{\color[grid:three]
-         {\llap{\infofont#3\vl\the\fuzzymarker}\nobreak
-          \vrule\!!width\hsize\!!height.1\lineheight}}
-       \nobreak
-     \fi
-    %[\the\fuzzymarker]
-    %\expandafter\fuzzymark\expandafter{\the\fuzzymarker}%
-     \expandafter\rawsetmark\expandafter\fuzzymark\expandafter{\the\fuzzymarker}%
-     \nobreak
-  \fi}
-
-\def\beginfuzzysnapping{\setfuzzymark21\v!start} % odd
-\def\endfuzzysnapping  {\setfuzzymark12\v!stop } % even
-
-\def\removelastfuzzyvskip
-  {\ifgridsnapping
-     \iffuzzysnapping
-       \ifdim\lastskip<\openlineheight
-       \else
-         \removelastskip
-       \fi
-     \else
-       \removelastskip
-     \fi
-   \else
-     \removelastskip
-   \fi}
-
-\def\docheckfuzzysnap#1%
-  {\bgroup
-   \dontcomplain
-   \setbox\fuzzysnapbox\copy#1\relax
-   \setbox\fuzzysnapsplit\vsplit\fuzzysnapbox to 1\lineheight
-   \let\topfuzzymark\empty % indeed here ... no real mark
-   \getsplitmarks\fuzzymark
-%   \ifcase0\topfuzzymark
-   \ifcase0\rawgetsplittopmark\fuzzymark
-     \global\chardef\fuzzysnappedleft\zerocount
-     \global\fuzzysnappedfalse
-%   \else\ifodd\topfuzzymark
-   \else\ifodd\rawgetsplittopmark\fuzzymark
-     \global\chardef\fuzzysnappedleft\plusone
-     \global\fuzzysnappedtrue
-   \else
-     \global\chardef\fuzzysnappedleft=2
-     \global\fuzzysnappedtrue
-   \fi\fi
-   \iffuzzysnapped \else
-     \doloop
-       {\ifvoid\fuzzysnapbox
-          \exitloop
-        \else
-          \setbox\fuzzysnapsplit=\vsplit\fuzzysnapbox to \lineheight
-         %\let\topfuzzymark=\empty % ... but not here
-          \getsplitmarks\fuzzymark
-%          \ifcase0\topfuzzymark
-          \ifcase0\rawgetsplittopmark\fuzzymark
-            % continue
-%          \else\ifodd\topfuzzymark
-          \else\ifodd\rawgetsplittopmark\fuzzymark
-            \exitloop
-          \else
-            \global\chardef\fuzzysnappedleft\plusone
-            \global\fuzzysnappedtrue
-            \exitloop
-          \fi\fi
-        \fi}%
-   \fi
-   \egroup}
-
-\def\getfuzzysnapcorrection#1%
-  {\global\let\presnapcorrection \relax
-   \global\let\postsnapcorrection\relax
-   \ifgridsnapping\iffuzzysnapping
-     \docheckfuzzysnap{#1}%
-     \iffuzzysnapped
-       \iftracegridsnapping
-         \gdef\presnapcorrection
-           {\color[grid:four]{\hrule\!!height.5\openlineheight\!!width\hsize}}%
-       \else
-         \gdef\presnapcorrection{\kern.5\openlineheight}%
-       \fi
-       \gdef\postsnapcorrection{\kern-.5\openlineheight}% get the height ok
-     \fi
-   \fi\fi}
-
-\def\fuzzysnappedbox#1#2% \box \unvbox
-  {\getfuzzysnapcorrection{#2}%
-   \presnapcorrection
-   #1#2%
-   \postsnapcorrection}
-
-\def\adaptfuzzypagegoal
-  {\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents
-     \scratchdimen\pagegoal
-     \advance\scratchdimen -.5\openlineheight
-     \global\pagegoal\scratchdimen
-     \global\advance\vsize -.5\openlineheight
-     \global\chardef\fuzzysnappedleft0
-   \fi\fi\fi}
-
-%D New, experimental, used in caption snapping:
-%D
-%D \starttyping
-%D \startcolumnset
-%D
-%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=top]
-%D
-%D \placefigure [lrtb] {\dorecurse{5}{green gras}}
-%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
-%D \placefigure [lrtb] {\dorecurse{15}{green gras}}
-%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
-%D
-%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=bottom]
-%D
-%D \placefigure [rltb] {\dorecurse{5}{green gras}}
-%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
-%D \placefigure [rltb] {\dorecurse{15}{green gras}}
-%D   {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
-%D
-%D \input thuan
-%D
-%D \stopcolumnset
-%D \stoptyping
-
-\def\moveboxontogrid#1#2#3% box method firstlineht % experimental ! ! !
-  {\doifsomething{#2}
-     {\getnoflines{\ht#1}% no depth taken into account, depth preserved
-      \scratchdimen\noflines\lineheight
-      \advance\scratchdimen-\strutdp
-      \bgroup
-      \advance\scratchdimen-\onepoint % be a bit tolerant
-      \ifdim\scratchdimen>\ht#1\relax
-        \egroup
-        \doif{#2}\v!top   {\setbox#1\vbox to \scratchdimen{\vskip-#3\vskip\strutht\box#1\vfill}}%
-        \doif{#2}\v!bottom{\setbox#1\vbox to \scratchdimen{\vfill\box#1\removedepth}}%
-        \dp#1\strutdp
-      \else
-        \egroup
-        \ht#1\scratchdimen
-        \dp#1\strutdp
-      \fi}}
-
-%D New:
-
-\let\checkgridsnapping\relax
-
-\protect \endinput
diff --git a/tex/context/base/core-ini.mkii b/tex/context/base/core-ini.mkii
new file mode 100644
index 000000000..69edf9735
--- /dev/null
+++ b/tex/context/base/core-ini.mkii
@@ -0,0 +1,67 @@
+%D \module
+%D   [       file=core-ini,
+%D        version=2003.12.01,
+%D          title=\CONTEXT\ Core Macros,
+%D       subtitle=Additional Initialization,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / 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
+
+\appendtoks \flushnotes                  \to \everypar
+\appendtoks \synchronizesidefloats       \to \everypar
+
+\appendtoks \checkinlinedirection        \to \everypar
+
+\appendtoks \checkindentation            \to \everypar
+\appendtoks \showparagraphnumber         \to \everypar
+\appendtoks \flushmargincontents         \to \everypar
+\appendtoks \flushcommentanchors         \to \everypar
+\appendtoks \synchronizenotes            \to \everypar
+\appendtoks \OTRSETshowstatus            \to \everypar
+\appendtoks \flushpostponedbookmark      \to \everypar
+\appendtoks \registerparoptions          \to \everypar
+\appendtoks \flushsyncpositions          \to \everypar
+\appendtoks \flushpostponednodedata      \to \everypar
+\appendtoks \dohandlerepeatdelimitedtext \to \everypar
+\appendtoks \insertparagraphintro        \to \everypar
+
+\appendtoks \flushpostponedbookmark      \to \neverypar
+\appendtoks \flushpostponedbookmark      \to \everylistentry
+
+\appendtoks \flushnotes                  \to \everydisplay
+\appendtoks \adjustsidefloatdisplaylines \to \everydisplay
+
+\appendtoks \flushsyncpositions          \to \everyheadstart
+
+\appendtoks \flushsyncresets             \to \everyendoftextbody
+
+\appendtoks \ignorespaces                \to \everybeginofpar
+
+\appendtoks \removeunwantedspaces        \to \everyendofpar
+%appendtoks \strut                       \to \everyendofpar % option ?
+\appendtoks \flushsyncresets             \to \everyendofpar
+\appendtoks \setlastlinewidth            \to \everyendofpar % must happen before endgraf
+\appendtoks \endgraf                     \to \everyendofpar
+
+% Todo: verbatim, xml, tex, move code to here
+
+\ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+\appendtoks \catcode`|=\@@active \let|\normalcompound \to \everyTEXinputmode
+\appendtoks \catcode`|=\@@letter                      \to \everyXMLinputmode
+
+\protect \endinput
diff --git a/tex/context/base/core-ini.mkiv b/tex/context/base/core-ini.mkiv
new file mode 100644
index 000000000..69edf9735
--- /dev/null
+++ b/tex/context/base/core-ini.mkiv
@@ -0,0 +1,67 @@
+%D \module
+%D   [       file=core-ini,
+%D        version=2003.12.01,
+%D          title=\CONTEXT\ Core Macros,
+%D       subtitle=Additional Initialization,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / 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
+
+\appendtoks \flushnotes                  \to \everypar
+\appendtoks \synchronizesidefloats       \to \everypar
+
+\appendtoks \checkinlinedirection        \to \everypar
+
+\appendtoks \checkindentation            \to \everypar
+\appendtoks \showparagraphnumber         \to \everypar
+\appendtoks \flushmargincontents         \to \everypar
+\appendtoks \flushcommentanchors         \to \everypar
+\appendtoks \synchronizenotes            \to \everypar
+\appendtoks \OTRSETshowstatus            \to \everypar
+\appendtoks \flushpostponedbookmark      \to \everypar
+\appendtoks \registerparoptions          \to \everypar
+\appendtoks \flushsyncpositions          \to \everypar
+\appendtoks \flushpostponednodedata      \to \everypar
+\appendtoks \dohandlerepeatdelimitedtext \to \everypar
+\appendtoks \insertparagraphintro        \to \everypar
+
+\appendtoks \flushpostponedbookmark      \to \neverypar
+\appendtoks \flushpostponedbookmark      \to \everylistentry
+
+\appendtoks \flushnotes                  \to \everydisplay
+\appendtoks \adjustsidefloatdisplaylines \to \everydisplay
+
+\appendtoks \flushsyncpositions          \to \everyheadstart
+
+\appendtoks \flushsyncresets             \to \everyendoftextbody
+
+\appendtoks \ignorespaces                \to \everybeginofpar
+
+\appendtoks \removeunwantedspaces        \to \everyendofpar
+%appendtoks \strut                       \to \everyendofpar % option ?
+\appendtoks \flushsyncresets             \to \everyendofpar
+\appendtoks \setlastlinewidth            \to \everyendofpar % must happen before endgraf
+\appendtoks \endgraf                     \to \everyendofpar
+
+% Todo: verbatim, xml, tex, move code to here
+
+\ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+\appendtoks \catcode`|=\@@active \let|\normalcompound \to \everyTEXinputmode
+\appendtoks \catcode`|=\@@letter                      \to \everyXMLinputmode
+
+\protect \endinput
diff --git a/tex/context/base/core-ini.tex b/tex/context/base/core-ini.tex
deleted file mode 100644
index 69edf9735..000000000
--- a/tex/context/base/core-ini.tex
+++ /dev/null
@@ -1,67 +0,0 @@
-%D \module
-%D   [       file=core-ini,
-%D        version=2003.12.01,
-%D          title=\CONTEXT\ Core Macros,
-%D       subtitle=Additional Initialization,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / 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
-
-\appendtoks \flushnotes                  \to \everypar
-\appendtoks \synchronizesidefloats       \to \everypar
-
-\appendtoks \checkinlinedirection        \to \everypar
-
-\appendtoks \checkindentation            \to \everypar
-\appendtoks \showparagraphnumber         \to \everypar
-\appendtoks \flushmargincontents         \to \everypar
-\appendtoks \flushcommentanchors         \to \everypar
-\appendtoks \synchronizenotes            \to \everypar
-\appendtoks \OTRSETshowstatus            \to \everypar
-\appendtoks \flushpostponedbookmark      \to \everypar
-\appendtoks \registerparoptions          \to \everypar
-\appendtoks \flushsyncpositions          \to \everypar
-\appendtoks \flushpostponednodedata      \to \everypar
-\appendtoks \dohandlerepeatdelimitedtext \to \everypar
-\appendtoks \insertparagraphintro        \to \everypar
-
-\appendtoks \flushpostponedbookmark      \to \neverypar
-\appendtoks \flushpostponedbookmark      \to \everylistentry
-
-\appendtoks \flushnotes                  \to \everydisplay
-\appendtoks \adjustsidefloatdisplaylines \to \everydisplay
-
-\appendtoks \flushsyncpositions          \to \everyheadstart
-
-\appendtoks \flushsyncresets             \to \everyendoftextbody
-
-\appendtoks \ignorespaces                \to \everybeginofpar
-
-\appendtoks \removeunwantedspaces        \to \everyendofpar
-%appendtoks \strut                       \to \everyendofpar % option ?
-\appendtoks \flushsyncresets             \to \everyendofpar
-\appendtoks \setlastlinewidth            \to \everyendofpar % must happen before endgraf
-\appendtoks \endgraf                     \to \everyendofpar
-
-% Todo: verbatim, xml, tex, move code to here
-
-\ifx\normalcompound\undefined \let\normalcompound=| \fi
-
-\appendtoks \catcode`|=\@@active \let|\normalcompound \to \everyTEXinputmode
-\appendtoks \catcode`|=\@@letter                      \to \everyXMLinputmode
-
-\protect \endinput
diff --git a/tex/context/base/core-ins.tex b/tex/context/base/core-ins.tex
deleted file mode 100644
index 069153434..000000000
--- a/tex/context/base/core-ins.tex
+++ /dev/null
@@ -1,103 +0,0 @@
-%D \module
-%D   [       file=core-ins,
-%D        version=2002.04.16,
-%D          title=\CONTEXT\ Insertion Macros,
-%D       subtitle=Insertions,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / 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.
-
-\unprotect
-
-\newtoks\@@insertionlist
-
-\def\processinsertions{\the\@@insertionlist}
-
-\let\doprocessinsert\gobbleoneargument
-
-%\def\installinsertion#1%
-%  {\ifx#1\undefined
-%     \newinsert#1%
-%     \count#1\plusthousand
-%     \skip #1\zeropoint
-%     \dimen#1\maxdimen
-%     \appendtoks\doprocessinsert#1\to\@@insertionlist
-%   \fi}
-
-\def\installinsertion#1%
-  {\ifx#1\undefined
-     \let#1\relax
-   \fi
-   \ifx#1\relax % permits \csname...\endcsname
-     \newinsert#1%
-     \count#1\plusthousand
-     \skip #1\zeropoint
-     \dimen#1\maxdimen
-     \appendtoks\doprocessinsert#1\to\@@insertionlist
-   \fi}
-
-
-\def\synchronizeinsertions
-  {\def\doprocessinsert##1{\ifvoid##1\else\insert##1{\unvbox##1}\fi}%
-   \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
-   \fi}
-
-\def\restoreinsertionbox#1%
-  {\ifvoid\backupinsertion#1\else % if void, we keep the content
-     \global\setbox#1\box\backupinsertion#1%
-   \fi}
-
-\def\eraseinsertionbackup#1%
-  {\global\setbox\backupinsertion#1\emptybox}
-
-\def\saveinsertiondata#1%
-  {\global\skip \backupinsertion#1\skip #1%
-   \global\count\backupinsertion#1\count#1%
-   \global\dimen\backupinsertion#1\dimen#1}
-
-\def\restoreinsertiondata#1%
-  {\global\skip #1\skip \backupinsertion#1%
-   \global\count#1\count\backupinsertion#1%
-   \global\dimen#1\dimen\backupinsertion#1}
-
-%D Auxiliary macros:
-
-\def\addinsertionheight#1\to#2%
-  {\ifvoid#1\else
-     \advance#2 1\skip#1\relax
-     \advance#2  \ht  #1\relax
-   \fi}
-
-\protect \endinput
diff --git a/tex/context/base/core-job.mkiv b/tex/context/base/core-job.mkiv
index 84877eb3f..7231ac383 100644
--- a/tex/context/base/core-job.mkiv
+++ b/tex/context/base/core-job.mkiv
@@ -63,8 +63,7 @@
 \def\doloadexamodes  [#1]{\ctxlua{commands.loadexamodes("#1")}}
 
 \def\registerfileinfo[#1#2]#3% geen \showmessage ?
-  {\writestatus\m!systems{#1#2 file #3 at line \the\inputlineno}%
-   \immediatewriteutility{f #1 {#3}}}
+  {\writestatus\m!systems{#1#2 file #3 at line \the\inputlineno}}
 
 \ifx\preloadfonts   \undefined \let\preloadfonts   \relax \fi
 \ifx\preloadspecials\undefined \let\preloadspecials\relax \fi
@@ -92,19 +91,6 @@
         \bgroup\disableXML\loadallsystemfiles\f!errfilename\donothing\egroup
       \to\everygoodbye}}
 
-%D Loading of \type {cont-usr.tex} (edited by the user)
-%D and \type {cont-fmt.tex} (generated by texexec).
-
-% \def\loaduserspecifications
-%   {% this used to be the file where users can tune their system, especially patterns
-%    \readsysfile\f!usrfilename{\showmessage\m!systems2\f!usrfilename}\donothing
-%    % this one took care of user preferences (fonts, messages) but lm made this obsolete
-%    \readjobfile\f!fmtfilename{\showmessage\m!systems2\f!fmtfilename}\donothing
-%    % from now on we preload all patterns (only in mkii)
-%    \preloadallpatterns}
-
-\let\loaduserspecifications\relax
-
 %D We don't want multiple jobfiles to interfere.
 
 \def\loadoptionfile
@@ -189,9 +175,6 @@
 \def\donotexecutefile#1%
   {}
 
-\def\verwerkfile#1 %
-  {\doexecutefile{#1}}
-
 \def\useenvironment[#1]% maybe commalist
   {\environment #1 \relax}
 
@@ -300,7 +283,7 @@
 
 % NOT TOEVOEGEN: \the\everytrace
 
-\neverypar=\emptytoks
+\neverypar\emptytoks
 
 % \appendtoks \flushnotes                     \to \everypar
 % \appendtoks \synchronizesidefloats          \to \everypar
@@ -313,8 +296,6 @@
 % \appendtoks \flushnotes                     \to \everydisplay
 % \appendtoks \adjustsidefloatdisplaylines    \to \everydisplay
 
-% soon, when pdftex 1.22 is out in the field:
-
 \chardef\systemcommandmode\zerocount % 0=unknown 1=disabled 2=enabled
 
 \def\checksystemcommandmode
@@ -331,22 +312,4 @@
      \writestatus\m!systems{system commands are enabled}%
    \fi}
 
-% \ifx\etexversion\undefined \else \ifnum\etexversion<202
-%   \prependtoks
-%      \writestatus\m!systems{eTeX version \number\etexversion\space -> too old (bugs)}%
-%      \writeline
-%   \to \everyjob
-% \fi \fi
-
-% \ifx\pdftexversion\undefined \else \ifnum\number\pdftexversion<120
-%   \prependtoks
-%      \writestatus\m!systems{pdfTeX version \number\pdftexversion\space -> please update}%
-%      \writeline
-%   \to \everyjob
-% \fi \fi
-
-% Default-instellingen (verborgen)
-
-\resetutilities
-
 \protect \endinput
diff --git a/tex/context/base/core-lme.tex b/tex/context/base/core-lme.tex
deleted file mode 100644
index 69dc3b7b2..000000000
--- a/tex/context/base/core-lme.tex
+++ /dev/null
@@ -1,55 +0,0 @@
-%D \module
-%D   [       file=core-lme,
-%D        version=2006.08.14,
-%D          title=\CONTEXT\ Core Macros,
-%D       subtitle=LAst Minute Extensions,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Last Minute Extensions}
-
-%D Things that depend on too much other things.
-
-\unprotect
-
-%D Probably obsolete, depends on \type {\checksidefloat}. May disappear.
-
-\def\checkframedtext
-  {\ifinsidefloat
-     \localhsize\hsize
-   \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle
-   % \strut            % rather clean way to invoke the sidefloat OTR
-   % \setbox0=\lastbox % and get the widths set, so from now on we
-   % \setlocalhsize    % can have framed texts alongside sidefloats
-     \checksidefloat
-     \setlocalhsize
-   \else
-     \localhsize\hsize
-   \fi\fi}
-
-%D For my eyes only:
-
-\newcount\nofprofiled
-
-\def\profilemacro#1%
-  {\nofprofiled\zerocount
-   \letvalue{\string#1\string#1}#1%
-   \appendtoks
-     \normalwritestatus\m!systems{profile \string#1: \number\nofprofiled}%
-   \to \everystoptext
-   \unexpanded\def#1%
-     {\global\advance\nofprofiled\plusone
-      \csname\string#1\string#1\endcsname}}
-
-%D Some plain goodies, they may be moved to \type {m-plain.tex} some day.
-
-\ifx\hang      \undefined \def\hang        {\hangindent\parindent} \fi
-\ifx\textindent\undefined \def\textindent#1{\indent\llap{#1\enspace}\ignorespaces} \fi
-\ifx\narrower  \undefined \def\narrower    {\advance\leftskip \parindent\advance\rightskip\parindent} \fi
-
-\protect \endinput
diff --git a/tex/context/base/core-lnt.tex b/tex/context/base/core-lnt.tex
deleted file mode 100644
index ae3200e7a..000000000
--- a/tex/context/base/core-lnt.tex
+++ /dev/null
@@ -1,197 +0,0 @@
-%D \module
-%D   [       file=core-lnt,
-%D        version=2002.05.10,
-%D          title=\CONTEXT\ Core Macros,
-%D       subtitle=Line Notes,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Line Notes}
-
-%D This module loads on top of the footnote and line numbering macros.
-
-\unprotect
-
-\newcounter\linenotecounter
-\newtoks   \collectedlinenotes
-\newif     \iftracelinenotes
-
-\appendtoks
-  \the\collectedlinenotes
-\to \everylinenumber
-
-\appendtoks
-  \global\collectedlinenotes\emptytoks
-\to \beforeeverylinenumbering
-
-\def\dohandlelinenote#1#2#3%
-  {\bgroup
-   \expanded{\beforesplitstring#2}\at--\to\linenotelinenumber
-   \ifnum\linenotelinenumber=\linenumber\relax
-    % todo: \onlyfootnote{#2}{#3}% == configurable
-    % \setupnote[#1][\c!numbercommand=\gobbleoneargument]%
-    % \setnotetext[#1]{\rawreference\s!fnt{\s!fnt:f:\number\internalnotereference}{}#2: #3}%
-      \def\linenotelinenumber##1{#2}%
-      \setupnote[#1][\c!numbercommand=\linenotelinenumber,\c!textcommand=\gobbleoneargument]%
-      \setnote[#1]{#3}%
-   \fi
-   \egroup}
-
-\def\dotracedlinenote#1%
-  {\iftracelinenotes
-     \hbox to \zeropoint
-       {\forgetall
-        \localcolortrue
-        \hsize\zeropoint
-        \hss
-        \vbox to \strutheight{\llap{\red\infofont\setstrut\linenotecounter}\vss}%
-        {\color[blue]{\vl}}%
-        \vbox to \strutheight{\rlap{\red\infofont\setstrut#1}\vss}%
-        \hss}%
-      \prewordbreak
-   \fi}
-
-\def\dolinenote#1#2%
-  {\doglobal\increment\linenotecounter
-   \doifreferencefoundelse{\??rr:\linenotecounter}%
-     {\expanded{\doglobal\noexpand\appendtoks\noexpand\dohandlelinenote
-        {#1}{\currenttextreference}}{#2}\to\collectedlinenotes}
-     \donothing
-   \dotracedlinenote\empty
-   \expanded{\someline[\??rr:\linenotecounter]}}
-
-\def\dostartlinenote#1[#2]#3%
-  {\doifreferencefoundelse{\??rr:#2}%
-     {\expanded{\doglobal\noexpand\appendtoks\noexpand\dohandlelinenote
-        {#1}{\currenttextreference}}{#3}\to\collectedlinenotes}
-     \donothing
-   \dotracedlinenote{#2}%
-   \startline[\??rr:#2]}
-
-\def\dostoplinenote#1[#2]%
-  {\stopline[\??rr:#2]}
-
-% defining them
-
-\def\definelinenote
-  {\dodoubleempty\dodefinelinenote}
-
-\def\dodefinelinenote[#1][#2]%
-  {\definenote[#1][#2]%
-   \setvalue        {#1}{\dolinenote     {#1}}%
-   \setvalue{\e!start#1}{\dostartlinenote{#1}}%
-   \setvalue{\e!stop #1}{\dostoplinenote {#1}}}
-
-\def\setuplinenote % convenient
-  {\setupnote}
-
-% We predefine one, namely \type {\linenote} cum suis.
-
-\definelinenote[\v!linenote]
-
-% \startbuffer[test]
-% \startlinenumbering[100]
-% test \linenote {oeps} test test test test test test
-% test \startlinenote [well] {oeps} test test test test test test
-% test \linenote {oeps} test test test test test test
-% test \linenote {oeps} test test test test test test
-% test \linenote {oeps} test test test test test test
-% test \linenote {oeps} test test test test test test
-% test \stoplinenote [well] test test test test test test
-% \stoplinenumbering
-% \stopbuffer
-%
-% \setupnotedefinition[linenote] [location=serried,distance=.5em]
-%
-% {\typebuffer[test] \getbuffer[test]} \page
-%
-% \startbuffer[setup]
-% \setuplinenumbering
-%   [align=left]
-% \stopbuffer
-%
-% {\typebuffer[setup] \getbuffer[setup,test]} \page
-%
-% \startbuffer[setup]
-% \setuplinenumbering
-%   [width=1em,
-%    align=left]
-% \stopbuffer
-%
-% {\typebuffer[setup] \getbuffer[setup,test]} \page
-%
-% \startbuffer[setup]
-% \setuplinenumbering
-%   [width=2em,
-%    distance=.5em,
-%    align=left]
-% \stopbuffer
-%
-% {\typebuffer[setup] \getbuffer[setup,test]} \page
-%
-% \startbuffer[setup]
-% \setuplinenumbering
-%   [width=2em,
-%    align=middle]
-% \stopbuffer
-%
-% {\typebuffer[setup] \getbuffer[setup,test]} \page
-%
-% \startbuffer[setup]
-% \setuplinenumbering
-%   [conversion=romannumerals,
-%    start=1,
-%    step=1,
-%    location=text,
-%    style=slanted,
-%    color=blue,
-%    width=1.5em]
-% \stopbuffer
-%
-% {\typebuffer[setup] \startnarrower\getbuffer[setup,test]\stopnarrower} \page
-%
-% \startbuffer[setup]
-% \setuplinenumbering
-%   [width=4em,
-%    left=--,
-%    right=--,
-%    align=middle]
-% \stopbuffer
-%
-% {\typebuffer[setup] \getbuffer[setup,test]} \page
-%
-% \startbuffer[setup-1]
-% \setuplinenumbering
-%   [style=\bfxx,
-%    command=\WatchThis]
-% \stopbuffer
-%
-% \startbuffer[setup-2]
-% \def\WatchThis#1%
-%   {\ifodd\linenumber
-%      \definecolor[linecolor][red]%
-%    \else
-%      \definecolor[linecolor][green]%
-%    \fi
-%    \inframed
-%      [offset=1pt,frame=off,background=color,backgroundcolor=linecolor]
-%      {#1}}
-% \stopbuffer
-%
-% {\typebuffer[setup-1,setup-2] \getbuffer[setup-1,setup-2,test]} \page
-%
-% \startbuffer[setup-1]
-% \setuplinenumbering
-%   [location=inright,
-%    style=\bfxx,
-%    command=\WatchThis]
-% \stopbuffer
-%
-% {\typebuffer[setup-1] \getbuffer[setup-1,setup-2,test]} \page
-
-\protect \endinput
diff --git a/tex/context/base/core-mak.tex b/tex/context/base/core-mak.tex
deleted file mode 100644
index 574fb9756..000000000
--- a/tex/context/base/core-mak.tex
+++ /dev/null
@@ -1,84 +0,0 @@
-%D \module
-%D   [       file=core-mak,
-%D        version=1997.10.05,
-%D          title=\CONTEXT\ Core Macros,
-%D       subtitle=General Makeup Commands,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / General Makeup Commands}
-
-\unprotect
-
-% \definieerplaats[naam][instellingen]
-% \stelplaatsin[naam][instellingen]
-% \plaats[[instellingen]]
-%
-% - still undocumented and also not in setupb yet
-% - kan ook intern/direct (scheelt duplicatie), zie \framedtext
-
-\def\dodefineplacement[#1][#2]%
-  {\getparameters
-     [\??pl#1]
-     [\c!left=\hss,
-      \c!right=\hss,
-      \c!linecorrection=\v!off,
-      \c!depthcorrection=\v!off,
-      \c!margin=\v!standard,
-      \c!grid=\v!middle,
-      %\c!before=,
-      %\c!after=,
-      #2]%
-   \setvalue{\e!place#1}{\doplacement[\??pl#1]}}
-
-\def\defineplacement
-  {\dodoubleempty\dodefineplacement}
-
-\def\setupplacement
-  {\dodoubleempty\dosetupplacement}
-
-\def\dosetupplacement[#1]%
-  {\dodoubleempty\getparameters[\??pl#1]}
-
-\def\doplacement
-  {\dodoubleempty\dodoplacement}
-
-\def\dodoplacement[#1][#2]% correctie moet mooier
-  {\bgroup
-   \dowithnextboxcontent
-     {\forgetall}
-     {\setlocalhsize
-      \getparameters[#1][#2]%
-      \getvalue{#1\c!before}%
-      \begingroup
-      \positioningparfalse
-      \setbox\nextbox\hbox to \localhsize
-        {\getvalue{#1\c!left}%
-         \flushnextbox
-         \getvalue{#1\c!right}}%
-      \ifinsidefloat \else
-        \addlocalbackgroundtobox\nextbox
-      \fi
-      \ifgridsnapping
-        \doifundefined{#1\c!grid}{\letvalue{#1\c!grid}\v!middle}%
-        % unchecked
-        \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
-        \snaptogrid[\getvalue{#1\c!grid}]\hbox{\flushnextbox}%
-      \else
-        \doifvalue{#1\c!linecorrection}\v!on \startbaselinecorrection
-        \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
-        \flushnextbox
-        \doifvalue{#1\c!depthcorrection}\v!on\baselinecorrection
-        \doifvalue{#1\c!linecorrection }\v!on\stopbaselinecorrection
-      \fi
-      \endgroup
-      \getvalue{#1\c!after}%
-      \egroup}
-   \vbox}
-
-\protect \endinput
diff --git a/tex/context/base/core-mis.mkii b/tex/context/base/core-mis.mkii
index e860a537a..e61adee25 100644
--- a/tex/context/base/core-mis.mkii
+++ b/tex/context/base/core-mis.mkii
@@ -196,6 +196,72 @@
    \c!inbetween={\blank[\v!medium]},
    \c!after=\blank]
 
+% \definieerplaats[naam][instellingen]
+% \stelplaatsin[naam][instellingen]
+% \plaats[[instellingen]]
+%
+% - still undocumented and also not in setupb yet
+% - kan ook intern/direct (scheelt duplicatie), zie \framedtext
+
+\def\dodefineplacement[#1][#2]%
+  {\getparameters
+     [\??pl#1]
+     [\c!left=\hss,
+      \c!right=\hss,
+      \c!linecorrection=\v!off,
+      \c!depthcorrection=\v!off,
+      \c!margin=\v!standard,
+      \c!grid=\v!middle,
+      %\c!before=,
+      %\c!after=,
+      #2]%
+   \setvalue{\e!place#1}{\doplacement[\??pl#1]}}
+
+\def\defineplacement
+  {\dodoubleempty\dodefineplacement}
+
+\def\setupplacement
+  {\dodoubleempty\dosetupplacement}
+
+\def\dosetupplacement[#1]%
+  {\dodoubleempty\getparameters[\??pl#1]}
+
+\def\doplacement
+  {\dodoubleempty\dodoplacement}
+
+\def\dodoplacement[#1][#2]% correctie moet mooier
+  {\bgroup
+   \dowithnextboxcontent
+     {\forgetall}
+     {\setlocalhsize
+      \getparameters[#1][#2]%
+      \getvalue{#1\c!before}%
+      \begingroup
+      \positioningparfalse
+      \setbox\nextbox\hbox to \localhsize
+        {\getvalue{#1\c!left}%
+         \flushnextbox
+         \getvalue{#1\c!right}}%
+      \ifinsidefloat \else
+        \addlocalbackgroundtobox\nextbox
+      \fi
+      \ifgridsnapping
+        \doifundefined{#1\c!grid}{\letvalue{#1\c!grid}\v!middle}%
+        % unchecked
+        \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
+        \snaptogrid[\getvalue{#1\c!grid}]\hbox{\flushnextbox}%
+      \else
+        \doifvalue{#1\c!linecorrection}\v!on \startbaselinecorrection
+        \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
+        \flushnextbox
+        \doifvalue{#1\c!depthcorrection}\v!on\baselinecorrection
+        \doifvalue{#1\c!linecorrection }\v!on\stopbaselinecorrection
+      \fi
+      \endgroup
+      \getvalue{#1\c!after}%
+      \egroup}
+   \vbox}
+
 % Te zijner tijd [plaats=boven,onder,midden] implementeren,
 % in dat geval moet eerst de maximale hoogte worden bepaald.
 %
diff --git a/tex/context/base/core-mis.mkiv b/tex/context/base/core-mis.mkiv
index 96d3bd2cd..88a027c02 100644
--- a/tex/context/base/core-mis.mkiv
+++ b/tex/context/base/core-mis.mkiv
@@ -44,16 +44,16 @@
 %appendtoks        \def\executesynonym#1#2#3#4{#3}\to\simplifiedcommands
 %appendtoks             \def\executesort#1#2#3{#3}\to\simplifiedcommands
 
-\appendtoks                                       \def\ { }\to\simplifiedcommands
-\appendtoks  \def\type#1{\letterbackslash\strippedcsname#1}\to\simplifiedcommands
-\appendtoks                  \def\tex#1{\letterbackslash#1}\to\simplifiedcommands
-\appendtoks                                   \def\TeX{TeX}\to\simplifiedcommands
-\appendtoks                           \def\ConTeXt{ConTeXt}\to\simplifiedcommands
-\appendtoks                         \def\MetaPost{MetaPost}\to\simplifiedcommands
-\appendtoks                         \def\MetaFont{MetaFont}\to\simplifiedcommands
-\appendtoks                           \def\MetaFun{MetaFun}\to\simplifiedcommands
-%appendtoks                                       \def||{-}\to\simplifiedcommands
-\appendtoks         \def|#1|{\ifx#1\empty\empty-\else#1\fi}\to\simplifiedcommands
+\appendtoks                                              \def\ { }\to\simplifiedcommands
+\appendtoks  \def\type#1{\letterbackslash\checkedstrippedcsname#1}\to\simplifiedcommands
+\appendtoks                         \def\tex#1{\letterbackslash#1}\to\simplifiedcommands
+\appendtoks                                          \def\TeX{TeX}\to\simplifiedcommands
+\appendtoks                                  \def\ConTeXt{ConTeXt}\to\simplifiedcommands
+\appendtoks                                \def\MetaPost{MetaPost}\to\simplifiedcommands
+\appendtoks                                \def\MetaFont{MetaFont}\to\simplifiedcommands
+\appendtoks                                  \def\MetaFun{MetaFun}\to\simplifiedcommands
+%appendtoks                                              \def||{-}\to\simplifiedcommands
+\appendtoks                \def|#1|{\ifx#1\empty\empty-\else#1\fi}\to\simplifiedcommands
 
 \appendtoks\let\buildtextaccent\secondoftwoarguments\to\simplifiedcommands
 
@@ -196,6 +196,72 @@
    \c!inbetween={\blank[\v!medium]},
    \c!after=\blank]
 
+% \definieerplaats[naam][instellingen]
+% \stelplaatsin[naam][instellingen]
+% \plaats[[instellingen]]
+%
+% - still undocumented and also not in setupb yet
+% - kan ook intern/direct (scheelt duplicatie), zie \framedtext
+
+\def\dodefineplacement[#1][#2]%
+  {\getparameters
+     [\??pl#1]
+     [\c!left=\hss,
+      \c!right=\hss,
+      \c!linecorrection=\v!off,
+      \c!depthcorrection=\v!off,
+      \c!margin=\v!standard,
+      \c!grid=\v!middle,
+      %\c!before=,
+      %\c!after=,
+      #2]%
+   \setvalue{\e!place#1}{\doplacement[\??pl#1]}}
+
+\def\defineplacement
+  {\dodoubleempty\dodefineplacement}
+
+\def\setupplacement
+  {\dodoubleempty\dosetupplacement}
+
+\def\dosetupplacement[#1]%
+  {\dodoubleempty\getparameters[\??pl#1]}
+
+\def\doplacement
+  {\dodoubleempty\dodoplacement}
+
+\def\dodoplacement[#1][#2]% correctie moet mooier
+  {\bgroup
+   \dowithnextboxcontent
+     {\forgetall}
+     {\setlocalhsize
+      \getparameters[#1][#2]%
+      \getvalue{#1\c!before}%
+      \begingroup
+      \positioningparfalse
+      \setbox\nextbox\hbox to \localhsize
+        {\getvalue{#1\c!left}%
+         \flushnextbox
+         \getvalue{#1\c!right}}%
+      \ifinsidefloat \else
+        \addlocalbackgroundtobox\nextbox
+      \fi
+      \ifgridsnapping
+        \doifundefined{#1\c!grid}{\letvalue{#1\c!grid}\v!middle}%
+        % unchecked
+        \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
+        \snaptogrid[\getvalue{#1\c!grid}]\hbox{\flushnextbox}%
+      \else
+        \doifvalue{#1\c!linecorrection}\v!on \startbaselinecorrection
+        \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
+        \flushnextbox
+        \doifvalue{#1\c!depthcorrection}\v!on\baselinecorrection
+        \doifvalue{#1\c!linecorrection }\v!on\stopbaselinecorrection
+      \fi
+      \endgroup
+      \getvalue{#1\c!after}%
+      \egroup}
+   \vbox}
+
 % Te zijner tijd [plaats=boven,onder,midden] implementeren,
 % in dat geval moet eerst de maximale hoogte worden bepaald.
 %
@@ -1654,13 +1720,11 @@
 
 \def\afterbothpairedboxes
   {\setbox\secondpairedbox\vbox
-     {% \localstartcolor[\@@ldcolor]% does not work yet
-        \ifnum\@@ldn>1
-          \rigidcolumnbalance\nextbox
-        \else
-          \flushnextbox
-        \fi
-      }% \localstopcolor}%
+     {\ifnum\@@ldn>1
+        \rigidcolumnbalance\nextbox
+      \else
+        \flushnextbox
+      \fi}%
    \ifnum\pairedlocationa<2\hbox\else\vbox\fi\bgroup % hide vsize
    \forgetall
    \ifnum\pairedlocationa<2
@@ -1836,101 +1900,9 @@
         \afterassignment\next\let\nexttoken=}
   \hbox}
 
-% stupid version, does not align top stuff when captions,
-% keep as example
-%
-% \def\dodocombination
-%   {\vbox
-%      {\forgetall % \setupwhitespace[\v!none]%
-%       \let\next\vbox
-%       \ExpandFirstAfter\processallactionsinset
-%         [\combinationparameter\c!location]
-%         [   \v!top=>\let\next\tbox,
-%          \v!middle=>\let\next\halfwaybox]%
-%       \next{\copy0}%
-%       \ifdim\ht2>\zeropoint % beter dan \wd2, nu \strut mogelijk
-%         \combinationparameter\c!inbetween
-%         %\vtop % wrong code
-%         %  {\nointerlineskip  % recently added
-%         %   \hsize\wd0
-%         %   \setupalign[\combinationparameter\c!align]%  % \raggedcenter
-%         %   \begstrut\unhbox2\endstrut}%
-%         \box2
-%       \fi}%
-%    \ifnum\totcombination>\plusone
-%      \global\advance\totcombination\minusone
-%      \global\advance\horcombination\minusone
-%      \ifnum\horcombination=\zerocount
-%        \def\next
-%          {\cr\noalign
-%             {\forgetall % \setupwhitespace[\v!geen]% no
-%              \nointerlineskip
-%              \combinationparameter\c!before
-%              \combinationparameter\c!after
-%              \vss
-%              \nointerlineskip}%
-%           \global\horcombination\maxhorcombination\relax
-%           \docombination}%
-%      \else
-%        \def\next
-%          {&&&\hskip\combinationparameter\c!distance&\docombination}%
-%      \fi
-%    \else
-%      \def\next
-%        {\cr\egroup}%
-%    \fi
-%    \next}
-
-% \def\dodocombination
-%   {\vbox
-%      {\forgetall % \setupwhitespace[\v!none]%
-%       \let\next\vbox
-%       \ExpandFirstAfter\processallactionsinset
-%         [\combinationparameter\c!plaats]
-%         [   \v!top=>\let\next\tbox,
-%          \v!middle=>\let\next\halfwaybox]%
-%       \next{\copy0}%
-%       % we need to save the caption for a next alignment line
-%       \saveoncombinationstack2}%
-%    \ifnum\totcombination>\plusone
-%      \global\advance\totcombination\minusone
-%      \global\advance\horcombination\minusone
-%      \ifnum\horcombination=\zerocount
-%        \def\next
-%          {\cr
-%           \flushcombinationstack
-%           \noalign
-%             {\forgetall % \setupwhitespace[\v!none]% no
-%              \global\setbox\combinationstack\emptybox
-%              \nointerlineskip
-%              \combinationparameter\c!after
-%              \combinationparameter\c!before
-%              \vss
-%              \nointerlineskip}%
-%           \global\horcombination\maxhorcombination\relax
-%           \docombination}%
-%      \else
-%        \def\next
-%          {&&&\hskip\combinationparameter\c!distance&\docombination}%
-%      \fi
-%    \else
-%      \def\next
-%        {\cr
-%         \flushcombinationstack
-%         \egroup}%
-%    \fi
-%    \next}
-
 \def\depthonlybox
   {\dowithnextbox{\vtop{\hsize\wd\nextbox\kern\zeropoint\box\nextbox}}\vbox}
 
-% \def\boxwithstrutheight
-%   {\dowithnextbox
-%      {\scratchdimen\strutheight
-%       \advance\scratchdimen-\nextboxht
-%       \hbox{\raise\scratchdimen\box\nextbox}}%
-%      \vbox}
-
 \def\dodocombination
   {\vbox
      {\forgetall % \setupwhitespace[\v!none]%
@@ -2088,56 +2060,6 @@
 \def\placeontopofeachother{\placerelativetoeachother\halign\hss}
 \def\placesidebyside      {\placerelativetoeachother\valign\vss}
 
-% this will be replaced or go away, never used
-
-\def\douseexternalfiles[#1][#2]%
-  {\getparameters
-     [\??fi#1]
-     [\c!file=,
-      \c!bodyfont=,
-      \c!option=,
-      #2]}
-
-\def\useexternalfiles
-  {\dodoubleargument\douseexternalfiles}
-
-\def\dostelexternefilesin[#1][#2]%
-  {\doifundefinedelse{\??fi#1\c!file}
-     {\useexternalfiles[#1][#2]}
-     {\getparameters[\??fi#1][#2]}}
-
-\def\stelexternefilesin
-  {\dodoubleargument\dostelexternefilesin}
-
-\def\verwerkexternefile#1#2#3%
-  {\bgroup
-   \getparameters[\??fi#1][\c!file=,#3]%
-   \doinputonce{\getvalue{\??fi#1\c!file}}%
-   \ExpandFirstAfter\switchtobodyfont[\getvalue{\??fi#1\c!bodyfont}]%
-   \readsysfile{#2}  % beter: loc of fix gebied
-     \donothing
-     {\showmessage\m!systems{41}{#2,#1}}%
-   \egroup}
-
-\def\douseexternalfile[#1][#2][#3][#4]%
-  {\stelexternefilesin[#1][]%
-   \doinputonce{\getvalue{\??fi#1\c!file}}%
-   \doifelsenothing{#2}
-     {\setvalue{#3}{\verwerkexternefile{#1}{#3}{#4}}}
-     {\setvalue{#2}{\verwerkexternefile{#1}{#3}{#4}}}}
-
-\def\useexternalfile
-  {\doquadrupleargument\douseexternalfile}
-
-\useexternalfiles
-  [pictex]
-  [\c!bodyfont=\v!small,
-   \c!file=pictex]
-
-\useexternalfiles
-  [table]
-  [\c!file=table]
-
 %D A couple of examples, demonstrating how the depth is
 %D taken care of:
 %D
diff --git a/tex/context/base/core-par.mkii b/tex/context/base/core-par.mkii
new file mode 100644
index 000000000..0b283b294
--- /dev/null
+++ b/tex/context/base/core-par.mkii
@@ -0,0 +1,300 @@
+%D \module
+%D   [       file=core-par,
+%D        version=1997.03.31,
+%D          title=\CONTEXT\ Core Macros,
+%D       subtitle=Paragraph Tricks,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Pararaph Tricks}
+
+\unprotect
+
+% \ifprocesspreviousparagraphs
+%
+% \nofskippedparagraphs
+% \paragraphnumber
+% \nofparagraphs
+%
+% \dosetparagraph
+% \doresetparagraph
+% \dobeforeparagraph
+% \doafterparagraph
+% \dobeforeskipparagraph
+% \doafterskipparagraph
+%
+% \pushparagraphs\endcommand       alle alineas tot \endcommand laden
+% \pushmoreparagraphs\endcommand   alle alineas tot \endcommand toevoegen
+% \popparagraphs                   alle alineas oproepen
+% \popparagraphs[a,b,c]            enkele alineas oproepen [geen]
+%
+% tzt een optionele prefix:
+%
+% \pushparagraphs[xxx]\endcommand  alle alineas tot \endcommand laden
+% \popparagraphs[xxx]              alle alineas oproepen
+% \popparagraphs[xxx][a,b,c]       enkele alineas oproepen
+%
+% \numberparagraphs
+% \numberparagraphlines
+% \resetparagraphlines
+
+\newif\ifprocesspreviousparagraphs  % public
+\newif\ifprocessallparagraphs       % private
+
+\newcounter\totalnofparagraphs       % private
+\newcounter\globalparagraphnumber    % private
+\newcounter\discardedparagraphs      % private
+\newcounter\mostrecentparagraphtotal % public
+
+\let\dosetparagraph        = \relax % public
+\let\doresetparagraph      = \relax % public
+\let\dobeforeparagraph     = \relax % public
+\let\doafterparagraph      = \relax % public
+\let\dobeforeskipparagraph = \relax % public
+\let\doafterskipparagraph  = \relax % public
+
+\def\paragraphnumber      {} % public
+\def\nofparagraphs        {} % public
+\def\nofskippedparagraphs {} % public
+
+\def\paragraphprefix {paragraph} % private
+
+% voorlopig, wordt nog class
+
+\def\resetparagraphlines
+  {\global\linenumber\plusone}
+
+\def\numberparagraphs % instelbaar maken en slimmer ivm breedte regelnummer !!!!!
+  {\processpreviousparagraphstrue
+   \def\dosetparagraph
+     {\bgroup
+      \resetparagraphlines
+      \EveryPar
+        {\strut\inleftmargin{\tf{\tx\paragraphnumber}\kern2em}%
+         \ignorespaces}}%
+   \def\doresetparagraph
+     {\resetparagraphlines
+      \egroup}}
+
+\def\numberparagraphlines
+  {\processpreviousparagraphstrue
+   \def\dosetparagraph
+     {\resetparagraphlines}%
+   \def\doresetparagraph
+     {\resetparagraphlines}%
+   \def\dobeforeparagraph
+     {\startlinenumbering[\v!continue]}%
+   \def\doafterparagraph
+     {\stoplinenumbering}%
+   \def\dobeforeskipparagraph
+     {\stoplinenumbering
+      \let\paragraphnumber\relax}%
+   \def\doafterskipparagraph
+     {\startlinenumbering[\v!continue]}}
+
+\long\def\directpushparagraph#1%
+  {\doglobal\increment\totalnofparagraphs
+   \ifnum\totalnofparagraphs>0\nofskippedparagraphs\relax
+     \setgvalue{\paragraphprefix\totalnofparagraphs}{#1}%
+   \else
+     \setgvalue{\paragraphprefix\totalnofparagraphs}{\skipparagraph#1\par}%
+    \fi}
+
+\long\def\directskipparagraph#1%
+  {\doglobal\increment\totalnofparagraphs
+   \setgvalue{\paragraphprefix\totalnofparagraphs}{\skipparagraph#1\par}}
+
+\def\dopushparagraphs#1%
+  {\global\let\mostrecentparagraphtotal\totalnofparagraphs
+   \ifx#1\undefined
+     \let#1\relax
+   \fi
+   \defconvertedargument\asciia{#1}%
+   \defconvertedargument\asciib{ }% % lege regel
+   \def\dopushparagraph##1\par
+     {\defconvertedargument\asciic{##1}%
+      \doifelse\asciic\asciia
+        {#1}
+        {\doifsomething\asciic % lege paragraaf
+           {\doifnot\asciic\asciib
+              {\directpushparagraph{#1}}}%
+         \dopushparagraph}}%
+   \dopushparagraph}
+
+\def\pushparagraphs
+  {\doglobal\newcounter\totalnofparagraphs
+   \dopushparagraphs}
+
+\def\pushmoreparagraphs
+  {\dopushparagraphs}
+
+\def\dododopopparagraph#1% no grouping, i.v.m. sidefloats
+  {\ifnum#1>\totalnofparagraphs\relax
+   \else
+     \let\paragraphnumber\globalparagraphnumber
+     \decrement(\paragraphnumber,\discardedparagraphs)%
+     \dobeforeparagraph
+     \ifhmode\indentation\fi\getvalue{\paragraphprefix#1}\par
+     \doafterparagraph
+   \fi}
+
+\long\def\skipparagraph#1\par
+  {\doglobal\increment\discardedparagraphs
+   \ifprocessallparagraphs
+     \dobeforeskipparagraph
+     \ifhmode\indentation\fi#1\par
+     \doafterskipparagraph
+   \fi}
+
+\def\dodopopparagraph
+  {\dododopopparagraph}
+
+\def\dodoprocessparagraph#1%
+  {\ifprocesspreviousparagraphs
+     \bgroup
+     \setbox0\vbox{\dododopopparagraph{#1}}%
+     \egroup
+   \fi}
+
+\def\processpreviousparagraphs[#1]% process previous ones
+  {\ifprocesspreviousparagraphs
+     \bgroup
+     \getfromcommacommand[#1][1]% tzt snelle \..command.. testen
+     \let\totalnofparagraphs\commalistelement
+     \decrement\totalnofparagraphs
+     \let\dodopopparagraph\dodoprocessparagraph
+     \popparagraphs
+     \egroup
+   \fi}
+
+\def\dopopparagraphs[#1]%
+  {\doifnotinset{#1}{\v!none,0}
+     {\dosetparagraph
+      \doglobal\newcounter\globalparagraphnumber
+      \doglobal\newcounter\discardedparagraphs
+      \doifelse{#1}{}
+        {\processallparagraphstrue}
+        {\processallparagraphsfalse}%
+      \def\dopopparagraph
+        {\doglobal\increment\globalparagraphnumber
+         \ifnum\globalparagraphnumber>\totalnofparagraphs\relax
+           \let\dopopparagraph\relax
+         \else\ifprocessallparagraphs
+           \ifnum\globalparagraphnumber>\mostrecentparagraphtotal\relax
+             \dodopopparagraph\globalparagraphnumber
+           \else
+             \dodoprocessparagraph\globalparagraphnumber
+           \fi
+         \else
+           \let\paragraphnumber\globalparagraphnumber
+           \decrement(\paragraphnumber,\discardedparagraphs)%
+           \ExpandBothAfter\doifinsetelse{\paragraphnumber}{#1}
+             {\dodopopparagraph\globalparagraphnumber}
+             {\dodoprocessparagraph\globalparagraphnumber}%
+         \fi\fi
+         \dopopparagraph}%
+      \dopopparagraph
+      \doresetparagraph}}
+
+\def\popparagraphs
+  {\dosingleempty\dopopparagraphs}
+
+\def\countparagraphs
+  {\popparagraphs[\!!maxcard]%
+   \global\let\nofparagraphs\totalnofparagraphs
+   \doglobal\decrement(\nofparagraphs,\discardedparagraphs)}
+
+% \showframe
+%
+% \numberparagraphlines
+% \numberparagraphs
+%
+% \def\nofskippedparagraphs{1}
+%
+% \pushparagraphs\ThatsIt
+%
+% \ruledbaseline eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste
+%
+% \ruledbaseline eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste
+%
+% \ruledbaseline tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede
+%
+% \skipparagraph \ruledbaseline skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped
+%
+% \ruledbaseline derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+%
+% \skipparagraph \ruledbaseline skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped
+%
+% \ruledbaseline vierde vierde vierde vierde vierde vierde
+% vierde vierde vierde vierde vierde vierde vierde vierde
+% vierde vierde vierde vierde vierde vierde vierde vierde
+% vierde vierde vierde vierde
+%
+% \ruledbaseline vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde
+%
+% \skipparagraph \ruledbaseline skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped
+%
+% \ThatsIt
+%
+% \popparagraphs
+%
+% \countparagraphs
+%
+% \blanko[2*groot]
+%
+% nofparagraphs:~\nofparagraphs
+%
+% \pagina
+%
+% \popparagraphs[1]
+% \popparagraphs[2]
+% \popparagraphs[3]
+% \popparagraphs[4]
+% \popparagraphs[5]
+%
+% \pagina
+%
+% \ruledvbox{\popparagraphs[1,2,3,4,5]}
+%
+% \pagina
+
+\protect \endinput
diff --git a/tex/context/base/core-par.tex b/tex/context/base/core-par.tex
deleted file mode 100644
index 0b283b294..000000000
--- a/tex/context/base/core-par.tex
+++ /dev/null
@@ -1,300 +0,0 @@
-%D \module
-%D   [       file=core-par,
-%D        version=1997.03.31,
-%D          title=\CONTEXT\ Core Macros,
-%D       subtitle=Paragraph Tricks,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Pararaph Tricks}
-
-\unprotect
-
-% \ifprocesspreviousparagraphs
-%
-% \nofskippedparagraphs
-% \paragraphnumber
-% \nofparagraphs
-%
-% \dosetparagraph
-% \doresetparagraph
-% \dobeforeparagraph
-% \doafterparagraph
-% \dobeforeskipparagraph
-% \doafterskipparagraph
-%
-% \pushparagraphs\endcommand       alle alineas tot \endcommand laden
-% \pushmoreparagraphs\endcommand   alle alineas tot \endcommand toevoegen
-% \popparagraphs                   alle alineas oproepen
-% \popparagraphs[a,b,c]            enkele alineas oproepen [geen]
-%
-% tzt een optionele prefix:
-%
-% \pushparagraphs[xxx]\endcommand  alle alineas tot \endcommand laden
-% \popparagraphs[xxx]              alle alineas oproepen
-% \popparagraphs[xxx][a,b,c]       enkele alineas oproepen
-%
-% \numberparagraphs
-% \numberparagraphlines
-% \resetparagraphlines
-
-\newif\ifprocesspreviousparagraphs  % public
-\newif\ifprocessallparagraphs       % private
-
-\newcounter\totalnofparagraphs       % private
-\newcounter\globalparagraphnumber    % private
-\newcounter\discardedparagraphs      % private
-\newcounter\mostrecentparagraphtotal % public
-
-\let\dosetparagraph        = \relax % public
-\let\doresetparagraph      = \relax % public
-\let\dobeforeparagraph     = \relax % public
-\let\doafterparagraph      = \relax % public
-\let\dobeforeskipparagraph = \relax % public
-\let\doafterskipparagraph  = \relax % public
-
-\def\paragraphnumber      {} % public
-\def\nofparagraphs        {} % public
-\def\nofskippedparagraphs {} % public
-
-\def\paragraphprefix {paragraph} % private
-
-% voorlopig, wordt nog class
-
-\def\resetparagraphlines
-  {\global\linenumber\plusone}
-
-\def\numberparagraphs % instelbaar maken en slimmer ivm breedte regelnummer !!!!!
-  {\processpreviousparagraphstrue
-   \def\dosetparagraph
-     {\bgroup
-      \resetparagraphlines
-      \EveryPar
-        {\strut\inleftmargin{\tf{\tx\paragraphnumber}\kern2em}%
-         \ignorespaces}}%
-   \def\doresetparagraph
-     {\resetparagraphlines
-      \egroup}}
-
-\def\numberparagraphlines
-  {\processpreviousparagraphstrue
-   \def\dosetparagraph
-     {\resetparagraphlines}%
-   \def\doresetparagraph
-     {\resetparagraphlines}%
-   \def\dobeforeparagraph
-     {\startlinenumbering[\v!continue]}%
-   \def\doafterparagraph
-     {\stoplinenumbering}%
-   \def\dobeforeskipparagraph
-     {\stoplinenumbering
-      \let\paragraphnumber\relax}%
-   \def\doafterskipparagraph
-     {\startlinenumbering[\v!continue]}}
-
-\long\def\directpushparagraph#1%
-  {\doglobal\increment\totalnofparagraphs
-   \ifnum\totalnofparagraphs>0\nofskippedparagraphs\relax
-     \setgvalue{\paragraphprefix\totalnofparagraphs}{#1}%
-   \else
-     \setgvalue{\paragraphprefix\totalnofparagraphs}{\skipparagraph#1\par}%
-    \fi}
-
-\long\def\directskipparagraph#1%
-  {\doglobal\increment\totalnofparagraphs
-   \setgvalue{\paragraphprefix\totalnofparagraphs}{\skipparagraph#1\par}}
-
-\def\dopushparagraphs#1%
-  {\global\let\mostrecentparagraphtotal\totalnofparagraphs
-   \ifx#1\undefined
-     \let#1\relax
-   \fi
-   \defconvertedargument\asciia{#1}%
-   \defconvertedargument\asciib{ }% % lege regel
-   \def\dopushparagraph##1\par
-     {\defconvertedargument\asciic{##1}%
-      \doifelse\asciic\asciia
-        {#1}
-        {\doifsomething\asciic % lege paragraaf
-           {\doifnot\asciic\asciib
-              {\directpushparagraph{#1}}}%
-         \dopushparagraph}}%
-   \dopushparagraph}
-
-\def\pushparagraphs
-  {\doglobal\newcounter\totalnofparagraphs
-   \dopushparagraphs}
-
-\def\pushmoreparagraphs
-  {\dopushparagraphs}
-
-\def\dododopopparagraph#1% no grouping, i.v.m. sidefloats
-  {\ifnum#1>\totalnofparagraphs\relax
-   \else
-     \let\paragraphnumber\globalparagraphnumber
-     \decrement(\paragraphnumber,\discardedparagraphs)%
-     \dobeforeparagraph
-     \ifhmode\indentation\fi\getvalue{\paragraphprefix#1}\par
-     \doafterparagraph
-   \fi}
-
-\long\def\skipparagraph#1\par
-  {\doglobal\increment\discardedparagraphs
-   \ifprocessallparagraphs
-     \dobeforeskipparagraph
-     \ifhmode\indentation\fi#1\par
-     \doafterskipparagraph
-   \fi}
-
-\def\dodopopparagraph
-  {\dododopopparagraph}
-
-\def\dodoprocessparagraph#1%
-  {\ifprocesspreviousparagraphs
-     \bgroup
-     \setbox0\vbox{\dododopopparagraph{#1}}%
-     \egroup
-   \fi}
-
-\def\processpreviousparagraphs[#1]% process previous ones
-  {\ifprocesspreviousparagraphs
-     \bgroup
-     \getfromcommacommand[#1][1]% tzt snelle \..command.. testen
-     \let\totalnofparagraphs\commalistelement
-     \decrement\totalnofparagraphs
-     \let\dodopopparagraph\dodoprocessparagraph
-     \popparagraphs
-     \egroup
-   \fi}
-
-\def\dopopparagraphs[#1]%
-  {\doifnotinset{#1}{\v!none,0}
-     {\dosetparagraph
-      \doglobal\newcounter\globalparagraphnumber
-      \doglobal\newcounter\discardedparagraphs
-      \doifelse{#1}{}
-        {\processallparagraphstrue}
-        {\processallparagraphsfalse}%
-      \def\dopopparagraph
-        {\doglobal\increment\globalparagraphnumber
-         \ifnum\globalparagraphnumber>\totalnofparagraphs\relax
-           \let\dopopparagraph\relax
-         \else\ifprocessallparagraphs
-           \ifnum\globalparagraphnumber>\mostrecentparagraphtotal\relax
-             \dodopopparagraph\globalparagraphnumber
-           \else
-             \dodoprocessparagraph\globalparagraphnumber
-           \fi
-         \else
-           \let\paragraphnumber\globalparagraphnumber
-           \decrement(\paragraphnumber,\discardedparagraphs)%
-           \ExpandBothAfter\doifinsetelse{\paragraphnumber}{#1}
-             {\dodopopparagraph\globalparagraphnumber}
-             {\dodoprocessparagraph\globalparagraphnumber}%
-         \fi\fi
-         \dopopparagraph}%
-      \dopopparagraph
-      \doresetparagraph}}
-
-\def\popparagraphs
-  {\dosingleempty\dopopparagraphs}
-
-\def\countparagraphs
-  {\popparagraphs[\!!maxcard]%
-   \global\let\nofparagraphs\totalnofparagraphs
-   \doglobal\decrement(\nofparagraphs,\discardedparagraphs)}
-
-% \showframe
-%
-% \numberparagraphlines
-% \numberparagraphs
-%
-% \def\nofskippedparagraphs{1}
-%
-% \pushparagraphs\ThatsIt
-%
-% \ruledbaseline eerste eerste eerste eerste eerste eerste
-% eerste eerste eerste eerste eerste eerste eerste eerste
-% eerste eerste eerste eerste eerste eerste eerste eerste
-% eerste eerste eerste eerste eerste eerste eerste eerste
-% eerste eerste eerste eerste eerste eerste eerste eerste
-% eerste eerste eerste eerste eerste
-%
-% \ruledbaseline eerste eerste eerste eerste eerste eerste
-% eerste eerste eerste eerste eerste eerste eerste eerste
-% eerste eerste eerste eerste eerste eerste eerste eerste
-% eerste eerste eerste eerste eerste eerste eerste eerste
-% eerste eerste eerste eerste eerste eerste eerste eerste
-% eerste eerste eerste eerste eerste
-%
-% \ruledbaseline tweede tweede tweede tweede tweede tweede
-% tweede tweede tweede tweede tweede tweede tweede tweede
-% tweede tweede tweede tweede tweede tweede tweede tweede
-% tweede tweede tweede tweede tweede tweede tweede tweede
-% tweede tweede tweede tweede tweede tweede tweede tweede
-% tweede tweede tweede tweede tweede tweede tweede tweede
-% tweede tweede tweede tweede tweede
-%
-% \skipparagraph \ruledbaseline skipped skipped skipped
-% skipped skipped skipped skipped skipped skipped skipped
-% skipped skipped skipped skipped skipped skipped skipped
-% skipped skipped
-%
-% \ruledbaseline derde derde derde derde derde derde derde
-% derde derde derde derde derde derde derde derde derde derde
-% derde derde derde derde derde derde derde derde derde derde
-% derde derde derde derde derde derde derde derde derde derde
-% derde derde derde derde derde derde derde derde derde derde
-% derde derde derde derde derde derde derde derde derde derde
-%
-% \skipparagraph \ruledbaseline skipped skipped skipped
-% skipped skipped skipped skipped skipped skipped skipped
-% skipped skipped skipped skipped skipped skipped skipped
-% skipped skipped skipped
-%
-% \ruledbaseline vierde vierde vierde vierde vierde vierde
-% vierde vierde vierde vierde vierde vierde vierde vierde
-% vierde vierde vierde vierde vierde vierde vierde vierde
-% vierde vierde vierde vierde
-%
-% \ruledbaseline vijfde vijfde vijfde vijfde vijfde vijfde
-% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
-% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
-% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
-% vijfde vijfde vijfde
-%
-% \skipparagraph \ruledbaseline skipped skipped skipped
-% skipped skipped skipped skipped skipped skipped skipped
-% skipped skipped skipped skipped skipped skipped skipped
-% skipped skipped skipped
-%
-% \ThatsIt
-%
-% \popparagraphs
-%
-% \countparagraphs
-%
-% \blanko[2*groot]
-%
-% nofparagraphs:~\nofparagraphs
-%
-% \pagina
-%
-% \popparagraphs[1]
-% \popparagraphs[2]
-% \popparagraphs[3]
-% \popparagraphs[4]
-% \popparagraphs[5]
-%
-% \pagina
-%
-% \ruledvbox{\popparagraphs[1,2,3,4,5]}
-%
-% \pagina
-
-\protect \endinput
diff --git a/tex/context/base/core-spa.lua b/tex/context/base/core-spa.lua
index 0f308b19c..0e33bf609 100644
--- a/tex/context/base/core-spa.lua
+++ b/tex/context/base/core-spa.lua
@@ -25,7 +25,7 @@ local trace_vspacing         = false  trackers.register("nodes.vspacing",
 local has_attribute      = node.has_attribute
 local unset_attribute    = node.unset_attribute
 local set_attribute      = node.set_attribute
-local slide_node_list    = node.slide
+local find_node_tail     = node.tail
 local free_node          = node.free
 local copy_node          = node.copy
 local traverse_nodes     = node.traverse
@@ -35,6 +35,7 @@ local remove_node        = nodes.remove
 local make_penalty_node  = nodes.penalty
 local count_nodes        = nodes.count
 local node_ids_to_string = nodes.ids_to_string
+local hpack_node         = node.hpack
 
 local glyph   = node.id("glyph")
 local penalty = node.id("penalty")
@@ -42,6 +43,7 @@ local kern    = node.id("kern")
 local glue    = node.id('glue')
 local hlist   = node.id('hlist')
 local vlist   = node.id('vlist')
+local adjust  = node.id('adjust')
 
 vspacing = vspacing or { }
 
@@ -550,7 +552,7 @@ local function collapser(head,where,what,trace) -- maybe also pass tail
             current = current.next
         end
     end
-    local tail = slide_node_list(head) -- still needed, check previous code ?
+    local tail = find_node_tail(head) -- still needed, check previous code ?
     if trace then trace_info("stop analyzing",where,what) end
     --~ if natural_penalty and (not penalty_data or natural_penalty > penalty_data) then
     --~     penalty_data = natural_penalty
@@ -596,7 +598,7 @@ function nodes.handle_page_spacing(where)
     local newhead = texlists.contrib_head
     if newhead then
         statistics.starttiming(vspacing)
-        local newtail = slide_node_list(newhead)
+        local newtail = find_node_tail(newhead)
         local flush = false
         for n in traverse_nodes(newhead) do
             local id = n.id
@@ -655,7 +657,7 @@ local ignore = table.tohash {
 function nodes.handle_vbox_spacing(head,where)
     if head and not ignore[where] and head.next then
         statistics.starttiming(vspacing)
-        head = collapser(slide_node_list(head),"vbox",where,trace_vbox_vspacing)
+        head = collapser(head,"vbox",where,trace_vbox_vspacing)
         statistics.stoptiming(vspacing)
     end
     return head
@@ -679,3 +681,54 @@ function vspacing.disable()
     callback.register('vpack_filter', nil)
     callback.register('buildpage_filter', nil)
 end
+
+-- we will split this module
+
+local attribute = attributes.private('graphicvadjust')
+
+--~ local hlist = node.id('hlist')
+--~ local vlist = node.id('vlist')
+
+--~ local remove_node   = nodes.remove
+--~ local hpack_node    = node.hpack
+--~ local has_attribute = node.has_attribute
+
+function nodes.repackage_graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only
+    if groupcode == "" then -- mvl only
+        local h, p, done = head, nil, false
+        while h do
+            local id = h.id
+            if id == hlist or id == vlist then
+                local a = has_attribute(h,attribute)
+                if a then
+                    if p then
+                        local n
+                        head, h, n = remove_node(head,h)
+                        local pl = p.list
+                        if n.width ~= 0 then
+                            n = hpack_node(n,0,'exactly')
+                        end
+                        if pl then
+                            pl.prev = n
+                            n.next = pl
+                        end
+                        p.list = n
+                        done = true
+                    else
+                        -- can't happen
+                    end
+                else
+                    p = h
+                    h = h.next
+                end
+            else
+                h = h.next
+            end
+        end
+        return head, done
+    else
+        return head, false
+    end
+end
+
+--~ tasks.appendaction("finalizers", "lists", "nodes.repackage_graphicvadjust")
diff --git a/tex/context/base/core-spa.mkii b/tex/context/base/core-spa.mkii
index 356b2cbe3..7c97bcc9c 100644
--- a/tex/context/base/core-spa.mkii
+++ b/tex/context/base/core-spa.mkii
@@ -298,32 +298,34 @@
 
 \def\defineblankmethod[#1]#2{\setvalue{\??bo\??bo#1}{#2}}
 
-\defineblankmethod       [\v!big] {\addblankskip+\bigskipamount      \openlineheight}
-\defineblankmethod      [-\v!big] {\addblankskip-\bigskipamount      \openlineheight}
-\defineblankmethod    [\v!medium] {\addblankskip+\medskipamount   {.5\openlineheight}}
-\defineblankmethod   [-\v!medium] {\addblankskip-\medskipamount   {.5\openlineheight}}
-\defineblankmethod     [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}}
-\defineblankmethod    [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}}
-\defineblankmethod     [\v!white] {\addblankskip+\parskip            \openlineheight}
-\defineblankmethod    [-\v!white] {\addblankskip-\parskip            \openlineheight}
-\defineblankmethod      [\v!line] {\addblankskip+\openlineheight     \openlineheight}
-\defineblankmethod     [-\v!line] {\addblankskip-\openlineheight     \openlineheight}
-
-\defineblankmethod   [\v!formula] {\global\advance\blankskip\medskipamount}
-\defineblankmethod   [\v!nowhite] {\global\blanknowhitetrue}
-\defineblankmethod   [\v!disable] {\global\blankdisabletrue}
-\defineblankmethod     [\v!force] {\global\blankforcetrue}
-\defineblankmethod     [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi}
-\defineblankmethod     [\v!reset] {\global\blankresettrue}
-\defineblankmethod  [\v!flexible] {\global\localblankflexibletrue}
-\defineblankmethod     [\v!fixed] {\global\localblankfixedtrue}
-\defineblankmethod      [\v!back] {\global\blankgobacktrue} % {\geenblanko}
-\defineblankmethod  [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi
-                                   \global\advance\blankskip .5\lineheight}
-
-\defineblankmethod      [\v!none] {\global\blankresettrue}
-\defineblankmethod  [\v!joinedup] {\ifvmode\nointerlineskip\fi}
-
+\defineblankmethod        [\v!big] {\addblankskip+\bigskipamount      \openlineheight}
+\defineblankmethod       [-\v!big] {\addblankskip-\bigskipamount      \openlineheight}
+\defineblankmethod     [\v!medium] {\addblankskip+\medskipamount   {.5\openlineheight}}
+\defineblankmethod    [-\v!medium] {\addblankskip-\medskipamount   {.5\openlineheight}}
+\defineblankmethod      [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}}
+\defineblankmethod     [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}}
+\defineblankmethod      [\v!white] {\addblankskip+\parskip            \openlineheight}
+\defineblankmethod     [-\v!white] {\addblankskip-\parskip            \openlineheight}
+\defineblankmethod       [\v!line] {\addblankskip+\openlineheight     \openlineheight}
+\defineblankmethod      [-\v!line] {\addblankskip-\openlineheight     \openlineheight}
+
+\defineblankmethod    [\v!formula] {\global\advance\blankskip\medskipamount}
+\defineblankmethod    [\v!nowhite] {\global\blanknowhitetrue}
+\defineblankmethod    [\v!disable] {\global\blankdisabletrue}
+\defineblankmethod      [\v!force] {\global\blankforcetrue}
+\defineblankmethod      [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi}
+\defineblankmethod      [\v!reset] {\global\blankresettrue}
+\defineblankmethod   [\v!flexible] {\global\localblankflexibletrue}
+\defineblankmethod      [\v!fixed] {\global\localblankfixedtrue}
+\defineblankmethod       [\v!back] {\global\blankgobacktrue} % {\geenblanko}
+\defineblankmethod   [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi
+                                    \global\advance\blankskip .5\lineheight}
+\defineblankmethod       [\v!none] {\global\blankresettrue}
+\defineblankmethod   [\v!joinedup] {\ifvmode\nointerlineskip\fi}
+\defineblankmethod[\v!synchronize] {\verticalstrut\vskip-2\lineheight\verticalstrut}
+
+% \vtop{\blank[synchronize]\blank[line]test}
+
 \defineblankmethod    [\v!always] {\redowhitespace} % experimental
 
 % happens often, so we speed this up:
@@ -4571,10 +4573,9 @@
    \gdef\afterfirstobeyedline % tzt two pass, net als opsomming
      {\gdef\afterfirstobeyedline
         {\nobreak
-         \global\let\afterfirstobeyedline\relax}}%
+         \doifnot\@@rgoption\v!packed{\global\let\afterfirstobeyedline\relax}}}%
    \def\obeyedline
      {\par
-      \afterfirstobeyedline
       \futurelet\next\dobetweenthelines}%
    \activatespacehandler\@@rgspace
    \GotoPar}
@@ -4585,10 +4586,13 @@
    \@@rgafter}
 
 \def\dobetweenthelines
-  {\doifmeaningelse\next\obeyedline\@@rginbetween\donothing}
+  {\doifmeaningelse\next\obeyedline
+    {\@@rginbetween}
+    {\afterfirstobeyedline}}
 
 \setuplines
-  [\c!before=\blank,
+  [\c!option=,
+   \c!before=\blank,
    \c!after=\blank,
    \c!inbetween=\blank,
    \c!indenting=\v!no,
diff --git a/tex/context/base/core-spa.mkiv b/tex/context/base/core-spa.mkiv
index fbc949349..ad59f7779 100644
--- a/tex/context/base/core-spa.mkiv
+++ b/tex/context/base/core-spa.mkiv
@@ -30,13 +30,12 @@
 \let   \baselinecorrection      \relax
 \let   \offbaselinecorrection   \relax
 
-\appendtoks \spacing                  1\to \everybodyfont
+\appendtoks \spacing\plusone           \to \everybodyfont
 \appendtoks \presetnormallineheight    \to \everybodyfont
 \appendtoks \setnormalbaselines        \to \everybodyfont % check if redundant
 \appendtoks \setstrut                  \to \everybodyfont % check if redundant
 \appendtoks \settopskip                \to \everybodyfont
 \appendtoks \setmaxdepth               \to \everybodyfont
-%appendtoks \spacing                  1\to \everybodyfont
 \appendtoks \simplesetupindenting      \to \everybodyfont
 \appendtoks \simplesetupblank          \to \everybodyfont
 \appendtoks \simplesetupwhitespace     \to \everybodyfont
@@ -87,7 +86,7 @@
 \global\let\carriedoverpar\relax
 
 \def\carryoverpar#1%
-  {\expanded     % \scratchtoks{#1}%
+  {\normalexpanded     % \scratchtoks{#1}%
      {\noexpand#1% \the\scratchtoks
       \hangindent\the\hangindent
       \hangafter \the\hangafter
@@ -284,32 +283,34 @@
 
 \def\defineblankmethod[#1]#2{\setvalue{\??bo\??bo#1}{#2}}
 
-\defineblankmethod       [\v!big] {\addblankskip+\bigskipamount      \openlineheight}
-\defineblankmethod      [-\v!big] {\addblankskip-\bigskipamount      \openlineheight}
-\defineblankmethod    [\v!medium] {\addblankskip+\medskipamount   {.5\openlineheight}}
-\defineblankmethod   [-\v!medium] {\addblankskip-\medskipamount   {.5\openlineheight}}
-\defineblankmethod     [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}}
-\defineblankmethod    [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}}
-\defineblankmethod     [\v!white] {\addblankskip+\parskip            \openlineheight}
-\defineblankmethod    [-\v!white] {\addblankskip-\parskip            \openlineheight}
-\defineblankmethod      [\v!line] {\addblankskip+\openlineheight     \openlineheight}
-\defineblankmethod     [-\v!line] {\addblankskip-\openlineheight     \openlineheight}
-
-\defineblankmethod   [\v!formula] {\global\advance\blankskip\medskipamount}
-\defineblankmethod   [\v!nowhite] {\global\blanknowhitetrue}
-\defineblankmethod   [\v!disable] {\global\blankdisabletrue}
-\defineblankmethod     [\v!force] {\global\blankforcetrue}
-\defineblankmethod     [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi}
-\defineblankmethod     [\v!reset] {\global\blankresettrue}
-\defineblankmethod  [\v!flexible] {\global\localblankflexibletrue}
-\defineblankmethod     [\v!fixed] {\global\localblankfixedtrue}
-\defineblankmethod      [\v!back] {\global\blankgobacktrue} % {\geenblanko}
-\defineblankmethod  [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi
-                                   \global\advance\blankskip .5\lineheight}
-
-\defineblankmethod      [\v!none] {\global\blankresettrue}
-\defineblankmethod  [\v!joinedup] {\ifvmode\nointerlineskip\fi}
-
+\defineblankmethod        [\v!big] {\addblankskip+\bigskipamount      \openlineheight}
+\defineblankmethod       [-\v!big] {\addblankskip-\bigskipamount      \openlineheight}
+\defineblankmethod     [\v!medium] {\addblankskip+\medskipamount   {.5\openlineheight}}
+\defineblankmethod    [-\v!medium] {\addblankskip-\medskipamount   {.5\openlineheight}}
+\defineblankmethod      [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}}
+\defineblankmethod     [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}}
+\defineblankmethod      [\v!white] {\addblankskip+\parskip            \openlineheight}
+\defineblankmethod     [-\v!white] {\addblankskip-\parskip            \openlineheight}
+\defineblankmethod       [\v!line] {\addblankskip+\openlineheight     \openlineheight}
+\defineblankmethod      [-\v!line] {\addblankskip-\openlineheight     \openlineheight}
+
+\defineblankmethod    [\v!formula] {\global\advance\blankskip\medskipamount}
+\defineblankmethod    [\v!nowhite] {\global\blanknowhitetrue}
+\defineblankmethod    [\v!disable] {\global\blankdisabletrue}
+\defineblankmethod      [\v!force] {\global\blankforcetrue}
+\defineblankmethod      [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi}
+\defineblankmethod      [\v!reset] {\global\blankresettrue}
+\defineblankmethod   [\v!flexible] {\global\localblankflexibletrue}
+\defineblankmethod      [\v!fixed] {\global\localblankfixedtrue}
+\defineblankmethod       [\v!back] {\global\blankgobacktrue} % {\geenblanko}
+\defineblankmethod   [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi
+                                    \global\advance\blankskip .5\lineheight}
+\defineblankmethod       [\v!none] {\global\blankresettrue}
+\defineblankmethod   [\v!joinedup] {\ifvmode\nointerlineskip\fi}
+\defineblankmethod[\v!synchronize] {\verticalstrut\vskip-2\lineheight\verticalstrut}
+
+% \vtop{\blank[synchronize]\blank[line]test}
+
 \defineblankmethod    [\v!always] {\redowhitespace} % experimental
 
 % happens often, so we speed this up:
@@ -443,7 +444,7 @@
 \else\ifcsname\??bo\ascii\endcsname % user def / slow
   \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax
 \else
-  \expanded{\rawprocesscommalist[#1]}\doblank
+  \rawprocesscommacommand[#1]\doblank
 \fi\fi
 %
    \relax % to be sure
@@ -642,13 +643,11 @@
   {\ifgridsnapping
      \blankflexiblefalse
    \else
-     \ExpandFirstAfter\processallactionsinset
-       [#1]
+     \normalexpanded{\noexpand\processallactionsinset[#1]}
        [ \v!flexible=>\blankflexibletrue,
             \v!fixed=>\blankflexiblefalse]%
    \fi
-   \ExpandFirstAfter\processallactionsinset
-     [#1]
+   \normalexpanded{\noexpand\processallactionsinset[#1]}
      [ \v!flexible=>\dosetupblank\appliedblankskip,
           \v!fixed=>\dosetupblank\appliedblankskip,
            \v!line=>\edef\appliedblankskip{\linedistance}%
@@ -698,17 +697,22 @@
 \def\defineblank
   {\dodoubleargument\dodefineblank}
 
-\def\savecurrentblank
-  {\edef\restorecurrentblank
-     {\bigskipamount\the\bigskipamount
-      \medskipamount\the\medskipamount
-      \smallskipamount\the\smallskipamount
-      \noexpand\def\noexpand\currentblank{\currentblank}%
-      \ifblankflexible
-        \noexpand\blankflexibletrue
-      \else
-        \noexpand\blankflexiblefalse
-      \fi}}
+% \def\savecurrentblank
+%   {\edef\restorecurrentblank
+%      {\bigskipamount\the\bigskipamount
+%       \medskipamount\the\medskipamount
+%       \smallskipamount\the\smallskipamount
+%       \noexpand\def\noexpand\currentblank{\currentblank}%
+%       \ifblankflexible
+%         \noexpand\blankflexibletrue
+%       \else
+%         \noexpand\blankflexiblefalse
+%       \fi}}
+
+\def\savecurrentblank   {\edef\savedcurrentblank{\currentblank}}
+\def\restorecurrentblank{\edef\currentblank{\savedcurrentblank}}
+
+\def\savedcurrentblank{\currentblank}
 
 %D Now.
 
@@ -764,11 +768,12 @@
       \toggleindentation}}
 
 \def\docomplexsetupindentingA#1%
-  {\edefconvertedargument\!!stringa{#1}%
-   \doifundefined{\??in:\!!stringa}%
-     {\edef\currentindentation{#1}%
-      \let\normalindentation\currentindentation
-      \simplesetupindenting}}
+  {\edefconvertedargument\!!stringa{#1}% can this be doen differently now?
+   \ifcsname\??in:\!!stringa\endcsname \else
+     \edef\currentindentation{#1}%
+     \let\normalindentation\currentindentation
+     \simplesetupindenting
+   \fi}
 
 \def\docomplexsetupindentingB#1%
   {\edefconvertedargument\!!stringa{#1}% catch #1=\somedimen
@@ -1070,25 +1075,23 @@
 \def\fixedspaces
   {\letcatcodecommand \ctxcatcodes `\~ \fixedspace}
 
-\def\removeunwantedspaces
-  {\ifhmode % we also need to unskip 0pt skips
-     \unskip\unskip\unskip\unskip\unskip
-     \unskip\unskip\unskip\unskip\unskip
-   \fi}
-
 \appendtoks\let~\space\to\simplifiedcommands
 
-% still not fixed in aleph / luatex
-%
 % \def\removeunwantedspaces
-%   {\ifhmode \ifnum\lastnodetype=\@@gluenode
-%       \unskip \@EAEAEA\removeunwantedspaces
-%    \fi \fi}
+%   {\ifhmode % we also need to unskip 0pt skips
+%      \unskip\unskip\unskip\unskip\unskip
+%      \unskip\unskip\unskip\unskip\unskip
+%    \fi}
 
-%D For old time sake, will disappear soon.
+\def\removeunwantedspaces
+  {\ifhmode
+     \expandafter \doremoveunwantedspace
+   \fi}
 
-\let\hardespatie\fixedspace
-\let\geenspatie \nospace
+\def\doremoveunwantedspace
+  {\ifnum\lastnodetype=\@@gluenode
+     \unskip \expandafter\doremoveunwantedspace
+   \fi}
 
 % \startbuffer
 % \startlines \tt \fixedspaces
@@ -1367,16 +1370,21 @@
      \vskip\parskip
    \fi}
 
-\def\savecurrentwhitespace
-  {\edef\restorecurrentwhitespace
-     {\ctxparskip\the\ctxparskip
-      \parskip\the\parskip
-      \noexpand\def\noexpand\currentwhitespace{\currentwhitespace}%
-      \ifconditional\flexiblewhitespace
-        \noexpand\settrue\flexiblewhitespace
-      \else
-        \noexpand\setfalse\flexiblewhitespace
-      \fi}}
+% \def\savecurrentwhitespace
+%   {\edef\restorecurrentwhitespace
+%      {\ctxparskip\the\ctxparskip
+%       \parskip\the\parskip
+%       \noexpand\def\noexpand\currentwhitespace{\currentwhitespace}%
+%       \ifconditional\flexiblewhitespace
+%         \noexpand\settrue\flexiblewhitespace
+%       \else
+%         \noexpand\setfalse\flexiblewhitespace
+%       \fi}}
+
+\def\savecurrentwhitespace   {\edef\savedcurrentwhitespace{\currentwhitespace}}
+\def\restorecurrentwhitespace{\edef\currentwhitespace{\savedcurrentwhitespace}}
+
+\def\savedcurrentwhitespace{\currentwhitespace}
 
 % deze variant is nodig binnen \startopelkaar
 % steeds testen:
@@ -1403,6 +1411,37 @@
 \def\noblanko
   {\dosingleempty\nonoblanko}
 
+% I'm not sure if the restore is still needed. Anyway, when we do
+% restore, we get a parskip someplace in the output that will push
+% the content off page (\vbox to pageheight{skip smashed-box}) so
+% we have now disabled this hack. If it is introduced again it needs
+% to be more controlled. Test case:
+%
+% \setupwhitespace[big]
+% \starttext
+%     \startcolumns[n=2]\dorecurse{200}{test\crlf}\stopcolumns
+% \stoptext
+%
+% \def\saveouterspacing
+%   {\savecurrentblank
+%    \savecurrentwhitespace
+%    \def\restoreouterspacing
+%      {\restorecurrentblank
+%       \restorecurrentwhitespace}}
+%
+% \let\restoreouterspacing\relax
+% \let\saveouterspacing   \relax % mult-ini: i will look into it when needed
+%
+% let's test this (restore before we restore the global bodyfont):
+
+\def\saveouterspacing
+  {\savecurrentblank
+   \savecurrentwhitespace}
+
+\def\restoreouterspacing
+  {\restorecurrentblank
+   \restorecurrentwhitespace}
+
 % De onderstaande macro handelt ook de situatie dat er geen
 % tekst tussen \start ... \stop is geplaatst. Daartoe wordt de
 % laatste skip over de lege tekst heen gehaald. Dit komt goed
@@ -1562,7 +1601,7 @@
 \def\strutdepth             {0pt}
 \def\strutwidth             {0pt}
 
-\def\spacingfactor          {1}
+\let\spacingfactor          \plusone
 
 \def\topskipfactor          {1.0}
 \def\maxdepthfactor         {0.5}
@@ -1653,13 +1692,11 @@
 
 \def\spacing#1%
   {\ifgridsnapping
-     \ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{#1}\fi
-     \edef\spacingfactor{1}%
+    %\ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{\withoutpt\the\dimexpr#1\points\relax}\fi
+     \let\spacingfactor\plusone
    \else
      \edef\spacingfactor{#1}%
    \fi
-  %\setspacingfactor\systemtopskipfactor \topskipfactor {#1}% why no \spacingfactor ?
-  %\setspacingfactor\systemmaxdepthfactor\maxdepthfactor{#1}% why no \spacingfactor ?
    \edef\systemtopskipfactor {\withoutpt\the\dimexpr#1\dimexpr\topskipfactor \points}%
    \edef\systemmaxdepthfactor{\withoutpt\the\dimexpr#1\dimexpr\maxdepthfactor\points}%
    \setnormalbaselines
@@ -1697,9 +1734,8 @@
 
   \newbox\strutbox
 
-  \setbox\strutbox=\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint}
+  \setbox\strutbox\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint}
 
- %\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
   \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
 
 \fi
@@ -1709,39 +1745,50 @@
 % The double \hbox construction enables us to \backtrack
 % boxes.
 
+\let\strutht\undefined \newdimen\strutht
+\let\strutdp\undefined \newdimen\strutdp
+
 \unexpanded\def\setstrut
-  {% height
-   \edef\strutheight
-     {\the\dimexpr\spacingfactor\dimexpr
-        \ifdim\minimumstrutheight>\zeropoint
-          \minimumstrutheight
-        \else
-          \strutheightfactor\dimexpr\normallineheight
-        \fi}%
-   % depth
-   \edef\strutdepth
-     {\the\dimexpr
-        \ifgridsnapping
-          \ifdim\minimumstrutdepth>\zeropoint
-            \minimumstrutdepth
-          \else
-            \normallineheight-\strutheight
-          \fi
-        \else
-          \spacingfactor\dimexpr
-            \ifdim\minimumstrutdepth>\zeropoint
-              \minimumstrutdepth
-            \else
-              \strutdepthfactor\dimexpr\normallineheight
-            \fi
-        \fi}%
-   % finish
+  {\ifgridsnapping
+     \setstrutgridyes
+   \else
+     \setstrutgridnop
+   \fi}
+
+\unexpanded\def\setstrutgridyes
+  {\strutht\spacingfactor\dimexpr
+     \ifdim\minimumstrutheight>\zeropoint
+       \minimumstrutheight
+     \else
+       \strutheightfactor\dimexpr\normallineheight
+     \fi
+   \strutdp\dimexpr
+     \ifdim\minimumstrutdepth>\zeropoint
+       \minimumstrutdepth
+     \else
+       \normallineheight-\strutht
+     \fi
+   \dosetstrut}
+
+\unexpanded\def\setstrutgridnop
+  {\strutht\spacingfactor\dimexpr
+     \ifdim\minimumstrutheight>\zeropoint
+       \minimumstrutheight
+     \else
+       \strutheightfactor\dimexpr\normallineheight
+     \fi
+   \strutdp\spacingfactor\dimexpr
+       \ifdim\minimumstrutdepth>\zeropoint
+         \minimumstrutdepth
+       \else
+         \strutdepthfactor\dimexpr\normallineheight
+       \fi
    \dosetstrut}
 
 \unexpanded\def\setcharstrut#1%
   {\setbox\strutbox\normalhbox{#1}%
-   \edef\strutheight{\the\strutht}%
-   \edef\strutdepth {\the\strutdp}%
+   \strutht\ht\strutbox
+   \strutdp\dp\strutbox
    \dosetstrut}
 
 \unexpanded\def\setfontstrut
@@ -1771,28 +1818,50 @@
 
 \def\dosetstrut
   {\let\strut\normalstrut
+   \edef\strutheight{\the\strutht}%
+   \edef\strutdepth {\the\strutdp}%
    \ifdim\strutwidth=\zeropoint
-       \setbox\strutbox\normalhbox
-         {\vrule
-            \!!width \zeropoint
-            \!!height\strutheight
-            \!!depth \strutdepth}%
+      \dosetstruthide
    \else
-       \setbox\strutbox\normalhbox
-         {\normalhbox to \zeropoint
-            {% \hss % new, will be option
-             \vrule
-               \!!width \strutwidth
-               \!!height\strutheight
-               \!!depth \strutdepth
-             \hss}}%
+      \dosetstrutvide
    \fi
    \struttotal\dimexpr\strutht+\strutdp\relax}
 
+\def\dosetstruthide
+  {\setbox\strutbox\normalhbox
+     {\vrule
+        \!!width \zeropoint
+        \!!height\strutht
+        \!!depth \strutdp}}
+
+\def\dosetstrutvide
+  {\setbox\strutbox\normalhbox
+     {\normalhbox to \zeropoint
+        {% \hss % new, will be option
+         \vrule
+           \!!width \strutwidth
+           \!!height\strutht
+           \!!depth \strutdp
+         \hss}}}
+
 %D The dimen \type {\struttotal} holds the exact size of the
 %D strut; occasionally a one scaled point difference can show
 %D up with the lineheight.
 
+% experiment
+
+\newbox\emptystrutbox \setbox\emptystrutbox\hbox{}
+
+\def\dosetstruthide
+  {\setbox\strutbox\copy\emptystrutbox
+   \ht\strutbox\strutht
+   \dp\strutbox\strutdp}
+
+\def\strut{\relax\dontleavehmode\copy\strutbox} % still callbacks for \hbox{\strut}
+
+
+\let\normalstrut\strut
+
 %D Sometimes a capstrut comes in handy
 %D
 %D \starttabulate[|Tl|l|l|]
@@ -1828,9 +1897,9 @@
   {\begingroup
    \setbox\scratchbox\copy\strutbox
    \setstrut
-   \ifdim\ht\strutbox>\autostrutfactor\ht\scratchbox
+   \ifdim\strutht>\autostrutfactor\ht\scratchbox
      \endgroup \setstrut
-   \else\ifdim\dp\strutbox>\autostrutfactor\dp\scratchbox
+   \else\ifdim\strutdp>\autostrutfactor\dp\scratchbox
      \endgroup \setstrut
    \else
      \endgroup
@@ -1938,15 +2007,21 @@
 
 %D My own one:
 
+\def\dopushinterlineskip
+  {\edef\oninterlineskip
+     {\baselineskip\the\baselineskip
+      \lineskip\the\lineskip
+      \lineskiplimit\the\lineskiplimit
+      \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}}
+
+\def\nopushinterlineskip
+  {\let\oninterlineskip\setnormalbaselines}
+
 \def\offinterlineskip
   {\ifdim\baselineskip>\zeropoint
-     \edef\oninterlineskip
-       {\baselineskip\the\baselineskip
-        \lineskip\the\lineskip
-        \lineskiplimit\the\lineskiplimit
-        \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}%
+     \dopushinterlineskip
    \else
-     \let\oninterlineskip\setnormalbaselines
+     \nopushinterlineskip
    \fi
    \normaloffinterlineskip}
 
@@ -2135,6 +2210,20 @@
    \let\effectiveleftskip \@@effectiveleftskip
    \let\effectiverightskip\@@effectiverightskip}
 
+% We will not use bodydir and pagedir so we disable them. That way we get
+% normal hyperlink support.
+
+\let\@@bodydir\normalbodydir
+\let\@@pagedir\normalpagedir
+
+\unexpanded\def\bodydir{\afterassignment\do@@bodydir\@@bodydir} \let\normalbodydir\bodydir
+\unexpanded\def\pagedir{\afterassignment\do@@pagedir\@@pagedir} \let\normalpagedir\pagedir
+
+\def\do@@bodydir{\@@bodydir TLT\relax}
+\def\do@@pagedir{\@@pagedir TLT\relax}
+
+% This will become a more advanced layout controller soon:
+
 \unexpanded\def\lefttoright{\textdir TLT\pardir TLT\relax}
 \unexpanded\def\righttoleft{\textdir TRT\pardir TRT\relax}
 
@@ -2185,7 +2274,7 @@
        \v!center=>\def\raggedbox{\doalignedline\v!middle}]}
 
 \def\dosetraggedcommand#1%
-  {\expanded{\dodosetraggedcommand{#1}}}
+  {\normalexpanded{\noexpand\dodosetraggedcommand{#1}}}
 
 \newtoks\everyraggedcommand
 
@@ -2369,7 +2458,7 @@
 \appendtoks \forgetparindent    \to \everyforgetall
 \appendtoks \forgetbothskips    \to \everyforgetall
 \appendtoks \forgetspacing      \to \everyforgetall % i.v.m. funny spacing in pagebody
-\appendtoks \spacing\!!plusone  \to \everyforgetall % new per 10/08/2004, else problems in otr / !! needed
+\appendtoks \spacing\plusone    \to \everyforgetall % new per 10/08/2004, else problems in otr / !! needed
 \appendtoks \everypar\emptytoks \to \everyforgetall % indeed!
 
 \def\localvbox#1#%
@@ -3352,14 +3441,12 @@
 
 \def\dosetuptolerance[#1]%
   {\doifinsetelse\v!vertical{#1}%
-     {\ExpandFirstAfter\processallactionsinset
-        [#1]
+     {\normalexpanded{\noexpand\processallactionsinset[#1]}
         [  \v!verystrict=>\def\bottomtolerance{},
                \v!strict=>\def\bottomtolerance{.050},
              \v!tolerant=>\def\bottomtolerance{.075},
          \v!verytolerant=>\def\bottomtolerance{.100}]}%
-     {\ExpandFirstAfter\processallactionsinset
-        [#1]
+     {\normalexpanded{\noexpand\processallactionsinset[#1]}
         [     \v!stretch=>\emergencystretch\bodyfontsize,
                 \v!space=>\spaceskip.5em\!!plus.25em\!!minus.25em\relax,
            \v!verystrict=>\tolerance 200,
@@ -3884,29 +3971,28 @@
 
 \let\normalvadjust\vadjust
 
-% test this prikkels/pascal margin text before heads (mode
-% 1) as well as uitwerkingen (mode 2)
-
-%chardef\graphicvadjustmode=0 % fake
-%chardef\graphicvadjustmode=1 % normal
-\chardef\graphicvadjustmode=2 % normal + compensate (== default)
-
-\def\graphicvadjust % bad, those low level color calls here
+% \def\graphicvadjust % bad, those low level color calls here
+%   {\dowithnextboxcontent
+%      {\forgetall}
+%      {\normalvadjust
+%         {\unvbox\nextbox
+%          % corrects for one line paragraphs
+%          \nointerlineskip
+%          \kern-\struttotal
+%          \nointerlineskip
+%          \verticalstrut}}%
+%      \vbox}
+
+\def\graphicvadjust % nasty bidi handling
   {\dowithnextboxcontent
      {\forgetall}
-     {\ifcase\graphicvadjustmode \@EA \fakedvadjust \else \@EA\normalvadjust \fi
-        {\dostartgraphicgroup % don't ask
-         \localstarttextcolor
-         \unvbox\nextbox
-         \localstoptextcolor  % don't ask
-         \dostopgraphicgroup
-         \ifcase\graphicvadjustmode \or \or
-           % corrects for one line paragraphs
-           \nointerlineskip
-           \kern-\struttotal
-           \nointerlineskip
-           \verticalstrut
-         \fi}}%
+     {\vadjust{\vbox attr \graphicvadjustattribute \plusone
+        {\unvbox\nextbox
+         % corrects for one line paragraphs
+         \nointerlineskip
+         \kern-\struttotal
+         \nointerlineskip
+         \verticalstrut}}}%
      \vbox}
 
 %D This works only in a properly strutted line, and is meant
@@ -4029,10 +4115,9 @@
    \gdef\afterfirstobeyedline % tzt two pass, net als opsomming
      {\gdef\afterfirstobeyedline
         {\nobreak
-         \global\let\afterfirstobeyedline\relax}}%
+         \doifnot\@@rgoption\v!packed{\global\let\afterfirstobeyedline\relax}}}%
    \def\obeyedline
      {\par
-      \afterfirstobeyedline
       \futurelet\next\dobetweenthelines}%
    \activatespacehandler\@@rgspace
    \GotoPar}
@@ -4043,10 +4128,13 @@
    \@@rgafter}
 
 \def\dobetweenthelines
-  {\doifmeaningelse\next\obeyedline\@@rginbetween\donothing}
+  {\doifmeaningelse\next\obeyedline
+    {\@@rginbetween}
+    {\afterfirstobeyedline}}
 
 \setuplines
-  [\c!before=\blank,
+  [\c!option=,
+   \c!before=\blank,
    \c!after=\blank,
    \c!inbetween=\blank,
    \c!indenting=\v!no,
diff --git a/tex/context/base/core-stg.mkii b/tex/context/base/core-stg.mkii
new file mode 100644
index 000000000..429e1e894
--- /dev/null
+++ b/tex/context/base/core-stg.mkii
@@ -0,0 +1,72 @@
+%D \module
+%D   [       file=core-stg,
+%D        version=2006.08.16,
+%D          title=\CONTEXT\ Core Macros,
+%D       subtitle=Strategies,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 is a prelude to strategies. It is rather old code
+%D used in a project many years ago. Use with care since I
+%D will pick up this thread. (moved from cont-new)
+
+\unprotect
+
+\def\s!strategy{strategy}
+
+\def\currentstrategypass    {1}
+\def\currentstrategyvariable{0}
+\def\maximumstrategypass    {8}
+
+\newconditional\strategypassneeded
+\newconditional\strategypassforced
+
+\definetwopasslist{\s!strategy}
+
+\def\registerstrategypass
+  {\ifnum\currentstrategypass>\maximumstrategypass \else
+     \ifconditional\strategypassforced
+       \doglobal\increment\currentstrategypass
+     \else%\ifconditional\strategypassneeded
+       %\doglobal\increment\currentstrategypass
+     \fi%\fi
+   \fi
+   \savecurrentvalue\currentstrategypass{\currentstrategypass}}
+
+\appendtoks \registerstrategypass \to \everybye % \everylastshipout
+
+\def\setstrategyvariable#1#2% key value
+  {%\doifnotstrategyvariable{#1}{\global\settrue\strategypassneeded}%
+   \doglobal\increment\currentstrategyvariable
+   \savetaggedtwopassdata{\s!strategy}{\currentstrategyvariable}{#1}{#2}}
+
+\def\doifstrategyvariableelse#1#2#3%
+  {\getstrategyvariable{#1}\iftwopassdatafound#2\else#3\fi}
+
+\def\getstrategyvariable#1% key
+  {\findtwopassdata{\s!strategy}{#1}%
+   \setxvalue{\s!strategy:#1}{\twopassdata}}
+
+\def\retainstrategyvariable#1% key
+  {\expanded{\setstrategyvariable{#1}{\strategyvariable{#1}}}}
+
+\def\strategyvariable#1% key
+  {\csname\s!strategy:#1\endcsname}
+
+\let\stratvar\strategyvariable
+
+\def\forcestrategy{\global\settrue \strategypassforced}
+\def\abortstrategy{\global\setfalse\strategypassforced}
+
+\def\doifstrategyvariableelse#1#2#3%
+  {\getstrategyvariable{#1}\iftwopassdatafound#2\else#3\fi}
+
+\def\doifstrategyvariable   #1#2{\doifstrategyvariableelse{#1}{#2}{}}
+\def\doifnotstrategyvariable#1#2{\doifstrategyvariableelse{#1}{}{#2}}
+
+\protect \endinput
diff --git a/tex/context/base/core-stg.tex b/tex/context/base/core-stg.tex
deleted file mode 100644
index 429e1e894..000000000
--- a/tex/context/base/core-stg.tex
+++ /dev/null
@@ -1,72 +0,0 @@
-%D \module
-%D   [       file=core-stg,
-%D        version=2006.08.16,
-%D          title=\CONTEXT\ Core Macros,
-%D       subtitle=Strategies,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 is a prelude to strategies. It is rather old code
-%D used in a project many years ago. Use with care since I
-%D will pick up this thread. (moved from cont-new)
-
-\unprotect
-
-\def\s!strategy{strategy}
-
-\def\currentstrategypass    {1}
-\def\currentstrategyvariable{0}
-\def\maximumstrategypass    {8}
-
-\newconditional\strategypassneeded
-\newconditional\strategypassforced
-
-\definetwopasslist{\s!strategy}
-
-\def\registerstrategypass
-  {\ifnum\currentstrategypass>\maximumstrategypass \else
-     \ifconditional\strategypassforced
-       \doglobal\increment\currentstrategypass
-     \else%\ifconditional\strategypassneeded
-       %\doglobal\increment\currentstrategypass
-     \fi%\fi
-   \fi
-   \savecurrentvalue\currentstrategypass{\currentstrategypass}}
-
-\appendtoks \registerstrategypass \to \everybye % \everylastshipout
-
-\def\setstrategyvariable#1#2% key value
-  {%\doifnotstrategyvariable{#1}{\global\settrue\strategypassneeded}%
-   \doglobal\increment\currentstrategyvariable
-   \savetaggedtwopassdata{\s!strategy}{\currentstrategyvariable}{#1}{#2}}
-
-\def\doifstrategyvariableelse#1#2#3%
-  {\getstrategyvariable{#1}\iftwopassdatafound#2\else#3\fi}
-
-\def\getstrategyvariable#1% key
-  {\findtwopassdata{\s!strategy}{#1}%
-   \setxvalue{\s!strategy:#1}{\twopassdata}}
-
-\def\retainstrategyvariable#1% key
-  {\expanded{\setstrategyvariable{#1}{\strategyvariable{#1}}}}
-
-\def\strategyvariable#1% key
-  {\csname\s!strategy:#1\endcsname}
-
-\let\stratvar\strategyvariable
-
-\def\forcestrategy{\global\settrue \strategypassforced}
-\def\abortstrategy{\global\setfalse\strategypassforced}
-
-\def\doifstrategyvariableelse#1#2#3%
-  {\getstrategyvariable{#1}\iftwopassdatafound#2\else#3\fi}
-
-\def\doifstrategyvariable   #1#2{\doifstrategyvariableelse{#1}{#2}{}}
-\def\doifnotstrategyvariable#1#2{\doifstrategyvariableelse{#1}{}{#2}}
-
-\protect \endinput
diff --git a/tex/context/base/core-sys.mkiv b/tex/context/base/core-sys.mkiv
index 073c29b66..28ef1e520 100644
--- a/tex/context/base/core-sys.mkiv
+++ b/tex/context/base/core-sys.mkiv
@@ -283,6 +283,9 @@
 %D processaction alternative on an string of average length.
 %D Since this feature is used in XML processing, it made sense
 %D to support this faster alternative. It's installable as well.
+%D
+%D We keep this around for \MKII\ \XML\ but it's not used in \MKIV\
+%D code as expansion is controlled in another way there.
 
 \def\installexpander#1#2#3% changed, no longer \convert..\to...
   {\setvalue{\s!do\c!expansion#1l}{#2}%
@@ -315,12 +318,8 @@
 \installexpander\v!strict  \defreducedargument   \gdefreducedargument
 \installexpander {utf}     \defreducedtoutf      \gdefreducedtoutf
 
-%installexpander {xml}    {see xtag-ext}
-
 \def\dodefconvertedmeaning#1#2#3% watch the double expansion !
   {\bgroup
-     \honorunexpanded
-     \convertencodedtokens % can be overloaded
      \xdef\@@globalexpanded{#3}%
      \xdef\@@globalexpanded{\@@globalexpanded}%
    \egroup
@@ -337,44 +336,6 @@
 
 \def\defreducedargument {\dodefreducedargument\edef}
 \def\gdefreducedargument{\dodefreducedargument\xdef}
-
-% \setupindex[expansion=utf]\index{\eacute}
-
-\def\dodefreducedtoutf#1#2#3%
-  {\begingroup
-   \reducetocoding[uc]%
-   \let\uchar\uchartoutf
-   \let\unicodechar\numbertoutf
-   \edef\ascii{#3}%
-   \expandafter\endgroup\expandafter#1\expandafter#2\expandafter{\ascii}}
-
-\def\defreducedtoutf {\dodefreducedtoutf\edef}
-\def\gdefreducedtoutf{\dodefreducedtoutf\xdef}
-
-% old syntax:
-
-\def\convertmeaning#1\to#2% watch the double expansion !
-  {\bgroup
-     \honorunexpanded
-     \convertencodedtokens % can be overloaded
-     \xdef\@@globalexpanded{#1}%
-     \xdef\@@globalexpanded{\@@globalexpanded}%
-   \egroup
-   \defconvertedcommand#2\@@globalexpanded}
-
-\def\reduceargument#1\to#2%
-  {\begingroup
-   \reducetocoding[raw]%
-   \edef\ascii{#1}%
-   \expandafter\endgroup\expandafter\edef\expandafter#2\expandafter{\ascii}}
-
-\def\reducetoutf#1\to#2%
-  {\begingroup
-   \reducetocoding[uc]%
-   \let\uchar\uchartoutf
-   \let\unicodechar\numbertoutf
-   \edef\ascii{#1}%
-   \expandafter\endgroup\expandafter\edef\expandafter#2\expandafter{\ascii}}
 
 \startruntimeluacode
     \ctxlua {
diff --git a/tex/context/base/core-two.lua b/tex/context/base/core-two.lua
index 5749d406d..50c356f7b 100644
--- a/tex/context/base/core-two.lua
+++ b/tex/context/base/core-two.lua
@@ -48,6 +48,14 @@ function jobpasses.savetagged(id,tag,str)
     jti[tag] = str
 end
 
+function jobpasses.getcollected(id)
+    return collected[id] or { }
+end
+
+function jobpasses.gettobesaved(id)
+    return allocate(id)
+end
+
 function jobpasses.get(id)
     local jti = collected[id]
     if jti and #jti > 0 then
diff --git a/tex/context/base/core-two.mkiv b/tex/context/base/core-two.mkiv
index f7dbd4c91..98d396d08 100644
--- a/tex/context/base/core-two.mkiv
+++ b/tex/context/base/core-two.mkiv
@@ -71,9 +71,6 @@
 
 \unprotect
 
-\let\alltwopasslists\empty
-\let\twopassentry   \empty
-\let\twopassentry   \gobblethreearguments % permits loading a MK II file
 \let\twopassdatalist\empty
 
 \newif\iftwopassdatafound
diff --git a/tex/context/base/core-uti.mkii b/tex/context/base/core-uti.mkii
index b348ba358..5b8f66f50 100644
--- a/tex/context/base/core-uti.mkii
+++ b/tex/context/base/core-uti.mkii
@@ -208,29 +208,32 @@
     \fi
 \to \everybeforeutilityread
 
-\edef\testbytesequence
-  {\rawcharacter{7}%
-   \rawcharacter{27}%
-   %rawcharacter{227}% invalid in xetex, which expects utf
-   \rawcharacter{195}\rawcharacter{128}} % valid utf code
-
-\def\thisisbytesequence#1%
-  {\ifx\testbytesequence\empty\else
-     \defconvertedcommand\testbytesequence\testbytesequence
-     \defconvertedargument\ascii{#1}%
-     \ifx\testbytesequence\ascii \else
-       \writestatus\m!systems{possible problem with 8 bit output}%
-     \fi
-   \fi
-   \global\let\thisisbytesequence\gobbleoneargument}
-
-\ifnum\texengine=\xetexengine
-    \let\testbytesequence\empty
-\fi
+% \edef\testbytesequence
+%   {\rawcharacter{7}%
+%    \rawcharacter{27}%
+%    %rawcharacter{227}% invalid in xetex, which expects utf
+%    \rawcharacter{195}\rawcharacter{128}} % valid utf code
+%
+% \def\thisisbytesequence#1%
+%   {\ifx\testbytesequence\empty\else
+%      \defconvertedcommand\testbytesequence\testbytesequence
+%      \defconvertedargument\ascii{#1}%
+%      \ifx\testbytesequence\ascii \else
+%        \writestatus\m!systems{possible problem with 8 bit output}%
+%      \fi
+%    \fi
+%    \global\let\thisisbytesequence\gobbleoneargument}
+%
+% \ifnum\texengine=\xetexengine
+%     \let\testbytesequence\empty
+% \fi
+%
+% \appendtoks
+%   \immediatewriteutilitycommand{\thisisbytesequence{\testbytesequence}}%
+% \to \everyopenutilities
 
-\appendtoks
-  \immediatewriteutilitycommand{\thisisbytesequence{\testbytesequence}}%
-\to \everyopenutilities
+\let\testbytesequence  \empty             % keep this
+\let\thisisbytesequence\gobbleoneargument % keep this
 
 \long\def\doutilities#1#2#3#4#5% % introduceren in utility file
   {\resetutilities
diff --git a/tex/context/base/core-uti.mkiv b/tex/context/base/core-uti.mkiv
index 77cf91dd9..29e6342be 100644
--- a/tex/context/base/core-uti.mkiv
+++ b/tex/context/base/core-uti.mkiv
@@ -11,8 +11,6 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-%D Most will disappear!
-
 \writestatus{loading}{ConTeXt Core Macros / Utility File Handling}
 
 \unprotect
@@ -22,23 +20,16 @@
 \def\savecurrentvalue#1#2%
   {\ctxlua{jobvariables.save("\strippedcsname#1","#2")}}
 
-\let\initializevariable\gobbletwoarguments % mkii/mkiv
-\let\thisisbytesequence\gobbleoneargument
-
 \appendtoks
-    \globallet\initializevariable\gobbletwoarguments
-\to \everyafterutilityread
-
-\appendtoks
-    \ctxlua{storage.dump()}%
+    \ctxlua{storage.dump()}% will move to lua
 \to \everydump
 
 \appendtoks
-    \ctxlua{storage.finalize()}%
+    \ctxlua{storage.finalize()}% will move to lua
 \to \everyfinalizeluacode
 
 \appendtoks
-    \ctxlua{nodes.cleanup_reserved()}%
+    \ctxlua{nodes.cleanup_reserved()}% will move to lua
 \to \everydump
 
 \appendtoks
@@ -60,37 +51,14 @@
 %     }%
 % \to \everystarttext
 
-% keep this for a while
-
-\newif\ifutilitydone
-\newif\ifdoinpututilities
-\newif\ifunprotectutilities
-
-\let\writeutility                \gobbleoneargument
-\let\writeutilitycommand         \gobbleoneargument
-\let\immediatewriteutility       \gobbleoneargument
-\let\immediatewriteutilitycommand\gobbleoneargument
-\let\cwriteutility               \gobbleoneargument
-\let\cwriteutilitycommand        \gobbleoneargument
-\let\checkedutility              \secondoftwoarguments
-\let\doutilities                 \gobblefivearguments
-\let\abortutilitygeneration      \relax
-
-\newtoks \everyopenutilities     \let\openutilities \relax
-\newtoks \everycloseutilities    \let\closeutilities\relax
-\newtoks \everycheckutilities    \let\checkutilities\relax
-\newtoks \utilityresetlist
-
-\def\addutilityreset#1{\@EA\appendtoks\csname\s!reset#1\endcsname\to\utilityresetlist}
-\def\resetutilities   {\the\utilityresetlist}
-
-\def\currentutilityfilename{\jobname}
-
-\prependtoks \resetutilities \to \everyjob
+%D Some styles might use these use these commands:
 
-\def\installprogram      {\dosingleempty\doinstallprogram}
-\def\doinstallprogram[#1]{\gobbleoneargument}
-\def\installedprogram[#1]{}
-\let\installplugin       \gobblethreearguments
+\newif \ifutilitydone
+\let   \checkutilities         \relax
+\let   \currentutilityfilename \jobname
+\def   \installprogram         {\dosingleempty\doinstallprogram}
+\def   \doinstallprogram   [#1]{\gobbleoneargument}
+\def   \installedprogram   [#1]{}
+\let   \installplugin          \gobblethreearguments
 
 \protect \endinput
diff --git a/tex/context/base/core-var.mkii b/tex/context/base/core-var.mkii
new file mode 100644
index 000000000..4de1b8718
--- /dev/null
+++ b/tex/context/base/core-var.mkii
@@ -0,0 +1,286 @@
+%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 / Hans Hagen \& Ton Otten}]
+%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 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
+
+\def\cleanupfeatures{\the\everycleanupfeatures}
+\def\forgetall      {\the\everyforgetall}
+
+%D Page building:
+
+\newtoks \everybeforepagebody
+\newtoks \everyafterpagebody
+
+\let \everypagebody \everybeforepagebody % backward compatible
+
+%D Multipass:
+
+\newtoks \everybeforeutilityread
+\newtoks \everyafterutilityread
+
+%D Floats:
+
+\newtoks \everyinsidefloat
+
+%D Sectioning:
+
+\newtoks \everyheadstart
+
+%D Par building (experimental, used in xml  .. 
)
+
+\newtoks \everybeginofpar
+\newtoks \everyendofpar
+%newtoks \everyparflush
+
+\def\bpar{\the\everybeginofpar\ignorespaces} % may interfere with \everypar
+\def\epar{\ifhmode\removeunwantedspaces\the\everyendofpar\fi} % 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
+
+%D Math:
+
+\newtoks \everybeforedisplayformula
+\newtoks \everymathematics
+
+\prependtoks \the\everymathematics \to \everymath
+\prependtoks \the\everymathematics \to \everydisplay
+
+%D Tables
+
+\newtoks \everytable
+
+%D State mess:
+
+\newtoks \everypushsomestate
+\newtoks \everypopsomestate
+
+\def\pushsomestates{\the\everypushsomestate}
+\def\popsomestates {\the\everypopsomestate }
+
+%D More generic (used to be pushcolor etc)
+
+\newtoks\everypushproperties
+\newtoks\everypopproperties
+\newtoks\everypopsplitproperties
+
+\newtoks\everystarttextproperties
+\newtoks\everystoptextproperties
+
+\def\pushproperties     {\the\everypushproperties}
+\def\popproperties      {\the\everypopproperties}
+\def\popsplitproperties {\the\everypopsplitproperties}
+
+\def\starttextproperties{\the\everystarttextproperties}
+\def\stoptextproperties {\the\everystoptextproperties}
+
+%D This is pretty important (esp since we now ignore shipouts).
+%D Actually we should nil all writes, marks, specials.
+
+\appendtoks \globallet\popproperties     \relax \to \everylastshipout
+\appendtoks \globallet\popsplitproperties\relax \to \everylastshipout
+
+%D \macros
+%D   {defineinputmode,setinputmode}
+%D
+%D New. Some work needs to be done.
+
+% not in mkiv
+
+\def\defineinputmode[#1]{\@EA\newtoks\csname every#1inputmode\endcsname}
+\def\setinputmode   [#1]{\the\executeifdefined{every#1inputmode}\emptytoks}
+
+\defineinputmode [TEX]
+\defineinputmode [XML]
+
+\setinputmode    [TEX]
+
+%D \macros
+%D   {trialtypesetting}
+%D
+%D We disable trial typesetting in the output routine,
+%D just to be sure.
+
+\newif\iftrialtypesetting
+
+\prependtoks \trialtypesettingfalse \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.
+
+\ifx\protectionlevel\undefined \newcount\protectionlevel \fi
+
+\newif\ifproductionrun
+
+\appendtoks \productionruntrue \to \everydump
+
+\appendtoks \ifcase\protectionlevel\else\reportunprotection\fi \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
+
+\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
+
+\def\defineselector{\dodoubleargument\dodefineselector}
+\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\startlayoutcomponent\gobbletwoarguments
+\let\stoplayoutcomponent \relax
+
+%D Concepts:
+
+\chardef\conceptmode\zerocount
+
+\def\doifconcepttracing
+  {\ifnum\conceptmode>\plustwo
+     \expandafter\firstofoneargument
+   \else
+     \expandafter\gobbleoneargument
+   \fi}
+
+\protect \endinput
diff --git a/tex/context/base/core-var.mkiv b/tex/context/base/core-var.mkiv
new file mode 100644
index 000000000..9a0b190d8
--- /dev/null
+++ b/tex/context/base/core-var.mkiv
@@ -0,0 +1,275 @@
+%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 / Hans Hagen \& Ton Otten}]
+%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 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
+
+\def\cleanupfeatures{\the\everycleanupfeatures}
+\def\forgetall      {\the\everyforgetall}
+
+%D Page building:
+
+\newtoks \everybeforepagebody
+\newtoks \everyafterpagebody
+
+\let \everypagebody \everybeforepagebody % backward compatible
+
+%D Multipass:
+
+\newtoks \everybeforeutilityread
+\newtoks \everyafterutilityread
+
+%D Floats:
+
+\newtoks \everyinsidefloat
+
+%D Sectioning:
+
+\newtoks \everyheadstart
+
+%D Par building (experimental, used in xml  .. 
)
+
+\newtoks \everybeginofpar
+\newtoks \everyendofpar
+%newtoks \everyparflush
+
+\def\bpar{\the\everybeginofpar\ignorespaces} % may interfere with \everypar
+\def\epar{\ifhmode\removeunwantedspaces\the\everyendofpar\fi} % 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
+
+%D Math:
+
+\newtoks \everybeforedisplayformula
+\newtoks \everymathematics
+
+\prependtoks \the\everymathematics \to \everymath
+\prependtoks \the\everymathematics \to \everydisplay
+
+%D Tables
+
+\newtoks \everytable
+
+%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
+
+\def\starttextproperties{\the\everystarttextproperties}
+\def\stoptextproperties {\the\everystoptextproperties}
+
+%D \macros
+%D   {defineinputmode,setinputmode}
+%D
+%D New. Some work needs to be done.
+
+% not in mkiv
+
+\def\defineinputmode[#1]{\@EA\newtoks\csname every#1inputmode\endcsname}
+\def\setinputmode   [#1]{\the\executeifdefined{every#1inputmode}\emptytoks}
+
+\defineinputmode [TEX]
+\defineinputmode [XML]
+
+\setinputmode    [TEX]
+
+%D \macros
+%D   {trialtypesetting}
+%D
+%D We disable trial typesetting in the output routine,
+%D just to be sure.
+
+\newif\iftrialtypesetting
+
+\prependtoks \trialtypesettingfalse \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.
+
+\ifx\protectionlevel\undefined \newcount\protectionlevel \fi
+
+\newif\ifproductionrun
+
+\appendtoks \productionruntrue \to \everydump
+
+\appendtoks \ifcase\protectionlevel\else\reportunprotection\fi \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
+
+\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
+
+\def\defineselector{\dodoubleargument\dodefineselector}
+\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\startlayoutcomponent         \gobbletwoarguments % obsolete
+\let\stoplayoutcomponent          \relax              % obsolete
+\let\setlayoutcomponentattribute  \gobbletwoarguments
+\let\resetlayoutcomponentattribute\relax
+\let\layoutcomponentboxattribute  \empty
+
+%D Concepts:
+
+\chardef\conceptmode\zerocount
+
+\def\doifconcepttracing
+  {\ifnum\conceptmode>\plustwo
+     \expandafter\firstofoneargument
+   \else
+     \expandafter\gobbleoneargument
+   \fi}
+
+\protect \endinput
diff --git a/tex/context/base/core-var.tex b/tex/context/base/core-var.tex
deleted file mode 100644
index 4de1b8718..000000000
--- a/tex/context/base/core-var.tex
+++ /dev/null
@@ -1,286 +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 / Hans Hagen \& Ton Otten}]
-%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 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
-
-\def\cleanupfeatures{\the\everycleanupfeatures}
-\def\forgetall      {\the\everyforgetall}
-
-%D Page building:
-
-\newtoks \everybeforepagebody
-\newtoks \everyafterpagebody
-
-\let \everypagebody \everybeforepagebody % backward compatible
-
-%D Multipass:
-
-\newtoks \everybeforeutilityread
-\newtoks \everyafterutilityread
-
-%D Floats:
-
-\newtoks \everyinsidefloat
-
-%D Sectioning:
-
-\newtoks \everyheadstart
-
-%D Par building (experimental, used in xml  .. 
)
-
-\newtoks \everybeginofpar
-\newtoks \everyendofpar
-%newtoks \everyparflush
-
-\def\bpar{\the\everybeginofpar\ignorespaces} % may interfere with \everypar
-\def\epar{\ifhmode\removeunwantedspaces\the\everyendofpar\fi} % 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
-
-%D Math:
-
-\newtoks \everybeforedisplayformula
-\newtoks \everymathematics
-
-\prependtoks \the\everymathematics \to \everymath
-\prependtoks \the\everymathematics \to \everydisplay
-
-%D Tables
-
-\newtoks \everytable
-
-%D State mess:
-
-\newtoks \everypushsomestate
-\newtoks \everypopsomestate
-
-\def\pushsomestates{\the\everypushsomestate}
-\def\popsomestates {\the\everypopsomestate }
-
-%D More generic (used to be pushcolor etc)
-
-\newtoks\everypushproperties
-\newtoks\everypopproperties
-\newtoks\everypopsplitproperties
-
-\newtoks\everystarttextproperties
-\newtoks\everystoptextproperties
-
-\def\pushproperties     {\the\everypushproperties}
-\def\popproperties      {\the\everypopproperties}
-\def\popsplitproperties {\the\everypopsplitproperties}
-
-\def\starttextproperties{\the\everystarttextproperties}
-\def\stoptextproperties {\the\everystoptextproperties}
-
-%D This is pretty important (esp since we now ignore shipouts).
-%D Actually we should nil all writes, marks, specials.
-
-\appendtoks \globallet\popproperties     \relax \to \everylastshipout
-\appendtoks \globallet\popsplitproperties\relax \to \everylastshipout
-
-%D \macros
-%D   {defineinputmode,setinputmode}
-%D
-%D New. Some work needs to be done.
-
-% not in mkiv
-
-\def\defineinputmode[#1]{\@EA\newtoks\csname every#1inputmode\endcsname}
-\def\setinputmode   [#1]{\the\executeifdefined{every#1inputmode}\emptytoks}
-
-\defineinputmode [TEX]
-\defineinputmode [XML]
-
-\setinputmode    [TEX]
-
-%D \macros
-%D   {trialtypesetting}
-%D
-%D We disable trial typesetting in the output routine,
-%D just to be sure.
-
-\newif\iftrialtypesetting
-
-\prependtoks \trialtypesettingfalse \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.
-
-\ifx\protectionlevel\undefined \newcount\protectionlevel \fi
-
-\newif\ifproductionrun
-
-\appendtoks \productionruntrue \to \everydump
-
-\appendtoks \ifcase\protectionlevel\else\reportunprotection\fi \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
-
-\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
-
-\def\defineselector{\dodoubleargument\dodefineselector}
-\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\startlayoutcomponent\gobbletwoarguments
-\let\stoplayoutcomponent \relax
-
-%D Concepts:
-
-\chardef\conceptmode\zerocount
-
-\def\doifconcepttracing
-  {\ifnum\conceptmode>\plustwo
-     \expandafter\firstofoneargument
-   \else
-     \expandafter\gobbleoneargument
-   \fi}
-
-\protect \endinput
diff --git a/tex/context/base/enco-032.mkii b/tex/context/base/enco-032.mkii
new file mode 100644
index 000000000..d7e15126c
--- /dev/null
+++ b/tex/context/base/enco-032.mkii
@@ -0,0 +1,82 @@
+%D \module
+%D   [     file=enco-032,
+%D      version=2006.03.30,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Unicode Goodies,
+%D       author={Taco Hoekwater},
+%D         date=\currentdate,
+%D    copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+% unicode table 32 (= hex 20)
+
+\startencoding [default]
+
+  \definecommand unic@threeperemspace          {\hskip .33333em }
+  \definecommand unic@fourperemspace           {\hskip .25em    }
+  \definecommand unic@sixperemspace            {\hskip .16667em }
+  \definecommand unic@figurespace              {\hphantom{0}}
+  \definecommand unic@punctuationspace         {\hphantom{,}}
+  \definecommand unic@hairspace                {\hskip .08333em }
+  \definecommand unic@zerowidthspace           {\hskip 0em plus 1sp }
+  \definecommand unic@zerowidthjoiner          {\kern  0em }
+  \definecommand unic@zerowidthnonjoiner       {\hskip 0em }
+
+  \definecommand unic@quotedblleftreversed     {\mirror{\quotedblright}}
+  \definecommand unic@quoteleftreversed        {\mirror{\quoteright}}
+
+  \definecommand unic@onedotleader             {{\periods[1]}}
+  \definecommand unic@twodotleader             {{\periods[2]}}
+  \definecommand unic@hyphenationpoint         {.\allowbreak }
+
+  \definecommand unic@doubleexclamationmark    {!!}
+  \definecommand unic@exclamationquestionmark  {!?}
+  \definecommand unic@questionexclamationmark  {?!}
+  \definecommand unic@doublequestionmark       {??}
+
+  \definecommand unic@reversedpilcrowsign      {\mirror{\P}}
+  \definecommand unic@reversedsemicolon        {\mirror{;}}
+
+  \definecommand unic@superscriptzero          {\high{0}}
+  \definecommand unic@superscripti             {\high{i}}
+  \definecommand unic@superscriptfour          {\high{4}}
+  \definecommand unic@superscriptfive          {\high{5}}
+  \definecommand unic@superscriptsix           {\high{6}}
+  \definecommand unic@superscriptseven         {\high{7}}
+  \definecommand unic@superscripteight         {\high{8}}
+  \definecommand unic@superscriptnine          {\high{9}}
+  \definecommand unic@superscriptplus          {\high{+}}
+  \definecommand unic@superscriptminus         {\high{\textminus}}
+  \definecommand unic@superscriptequals        {\high{=}}
+  \definecommand unic@superscriptleft          {\high{(}}
+  \definecommand unic@superscriptright         {\high{)}}
+  \definecommand unic@superscriptn             {\high{n}}
+  \definecommand unic@subscriptzero            {\low{0}}
+  \definecommand unic@subscriptone             {\low{1}}
+  \definecommand unic@subscripttwo             {\low{2}}
+  \definecommand unic@subscriptthree           {\low{3}}
+  \definecommand unic@subscriptfour            {\low{4}}
+  \definecommand unic@subscriptfive            {\low{5}}
+  \definecommand unic@subscriptsix             {\low{6}}
+  \definecommand unic@subscriptseven           {\low{7}}
+  \definecommand unic@subscripteight           {\low{8}}
+  \definecommand unic@subscriptnine            {\low{9}}
+  \definecommand unic@subscriptplus            {\low{+}}
+  \definecommand unic@subscriptminus           {\low{\textminus}}
+  \definecommand unic@subscriptequals          {\low{=}}
+  \definecommand unic@subscriptleft            {\low{(}}
+  \definecommand unic@subscriptright           {\low{)}}
+  \definecommand unic@subscripta               {\low{a}}
+  \definecommand unic@subscripte               {\low{e}}
+  \definecommand unic@subscripto               {\low{o}}
+  \definecommand unic@subscriptx               {\low{x}}
+  \definecommand unic@subscriptschwa           {\low{\schwa}}
+
+\stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/enco-032.tex b/tex/context/base/enco-032.tex
deleted file mode 100644
index d7e15126c..000000000
--- a/tex/context/base/enco-032.tex
+++ /dev/null
@@ -1,82 +0,0 @@
-%D \module
-%D   [     file=enco-032,
-%D      version=2006.03.30,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Unicode Goodies,
-%D       author={Taco Hoekwater},
-%D         date=\currentdate,
-%D    copyright=PRAGMA]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\unprotect
-
-% unicode table 32 (= hex 20)
-
-\startencoding [default]
-
-  \definecommand unic@threeperemspace          {\hskip .33333em }
-  \definecommand unic@fourperemspace           {\hskip .25em    }
-  \definecommand unic@sixperemspace            {\hskip .16667em }
-  \definecommand unic@figurespace              {\hphantom{0}}
-  \definecommand unic@punctuationspace         {\hphantom{,}}
-  \definecommand unic@hairspace                {\hskip .08333em }
-  \definecommand unic@zerowidthspace           {\hskip 0em plus 1sp }
-  \definecommand unic@zerowidthjoiner          {\kern  0em }
-  \definecommand unic@zerowidthnonjoiner       {\hskip 0em }
-
-  \definecommand unic@quotedblleftreversed     {\mirror{\quotedblright}}
-  \definecommand unic@quoteleftreversed        {\mirror{\quoteright}}
-
-  \definecommand unic@onedotleader             {{\periods[1]}}
-  \definecommand unic@twodotleader             {{\periods[2]}}
-  \definecommand unic@hyphenationpoint         {.\allowbreak }
-
-  \definecommand unic@doubleexclamationmark    {!!}
-  \definecommand unic@exclamationquestionmark  {!?}
-  \definecommand unic@questionexclamationmark  {?!}
-  \definecommand unic@doublequestionmark       {??}
-
-  \definecommand unic@reversedpilcrowsign      {\mirror{\P}}
-  \definecommand unic@reversedsemicolon        {\mirror{;}}
-
-  \definecommand unic@superscriptzero          {\high{0}}
-  \definecommand unic@superscripti             {\high{i}}
-  \definecommand unic@superscriptfour          {\high{4}}
-  \definecommand unic@superscriptfive          {\high{5}}
-  \definecommand unic@superscriptsix           {\high{6}}
-  \definecommand unic@superscriptseven         {\high{7}}
-  \definecommand unic@superscripteight         {\high{8}}
-  \definecommand unic@superscriptnine          {\high{9}}
-  \definecommand unic@superscriptplus          {\high{+}}
-  \definecommand unic@superscriptminus         {\high{\textminus}}
-  \definecommand unic@superscriptequals        {\high{=}}
-  \definecommand unic@superscriptleft          {\high{(}}
-  \definecommand unic@superscriptright         {\high{)}}
-  \definecommand unic@superscriptn             {\high{n}}
-  \definecommand unic@subscriptzero            {\low{0}}
-  \definecommand unic@subscriptone             {\low{1}}
-  \definecommand unic@subscripttwo             {\low{2}}
-  \definecommand unic@subscriptthree           {\low{3}}
-  \definecommand unic@subscriptfour            {\low{4}}
-  \definecommand unic@subscriptfive            {\low{5}}
-  \definecommand unic@subscriptsix             {\low{6}}
-  \definecommand unic@subscriptseven           {\low{7}}
-  \definecommand unic@subscripteight           {\low{8}}
-  \definecommand unic@subscriptnine            {\low{9}}
-  \definecommand unic@subscriptplus            {\low{+}}
-  \definecommand unic@subscriptminus           {\low{\textminus}}
-  \definecommand unic@subscriptequals          {\low{=}}
-  \definecommand unic@subscriptleft            {\low{(}}
-  \definecommand unic@subscriptright           {\low{)}}
-  \definecommand unic@subscripta               {\low{a}}
-  \definecommand unic@subscripte               {\low{e}}
-  \definecommand unic@subscripto               {\low{o}}
-  \definecommand unic@subscriptx               {\low{x}}
-  \definecommand unic@subscriptschwa           {\low{\schwa}}
-
-\stopencoding
-
-\protect \endinput
diff --git a/tex/context/base/enco-037.mkii b/tex/context/base/enco-037.mkii
new file mode 100644
index 000000000..d9fc653b2
--- /dev/null
+++ b/tex/context/base/enco-037.mkii
@@ -0,0 +1,276 @@
+%D \module
+%D   [       file=enco-037,
+%D        version=2006.02.13,
+%D          title=\CONTEXT\ \UNICODE\ Macros,
+%D       subtitle=Encoding for vector 37,
+%D         author=Luigi Scarso,
+%D           date=\currentdate,
+%D      copyright={PRAGMA}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startencoding[default]
+
+\definecharacter UnicodeLightHorizontal                             {\uchar{37}{000}} %%BOX DRAWINGS LIGHT HORIZONTAL
+\definecharacter UnicodeHeavyHorizontal                             {\uchar{37}{001}} %%BOX DRAWINGS HEAVY HORIZONTAL
+\definecharacter UnicodeLightVertical                               {\uchar{37}{002}} %%BOX DRAWINGS LIGHT VERTICAL
+\definecharacter UnicodeHeavyVertical                               {\uchar{37}{003}} %%BOX DRAWINGS HEAVY VERTICAL
+\definecharacter UnicodeLightTripleDashHorizontal                   {\uchar{37}{004}} %%BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+\definecharacter UnicodeHeavyTripleDashHorizontal                   {\uchar{37}{005}} %%BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+\definecharacter UnicodeLightTripleDashVertical                     {\uchar{37}{006}} %%BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+\definecharacter UnicodeHeavyTripleDashVertical                     {\uchar{37}{007}} %%BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+\definecharacter UnicodeLightQuadrupleDashHorizontal                {\uchar{37}{008}} %%BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+\definecharacter UnicodeHeavyQuadrupleDashHorizontal                {\uchar{37}{009}} %%BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+\definecharacter UnicodeLightQuadrupleDashVertical                  {\uchar{37}{010}} %%BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+\definecharacter UnicodeHeavyQuadrupleDashVertical                  {\uchar{37}{011}} %%BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+\definecharacter UnicodeLightDownAndRight                           {\uchar{37}{012}} %%BOX DRAWINGS LIGHT DOWN AND RIGHT
+\definecharacter UnicodeDownLightAndRightHeavy                      {\uchar{37}{013}} %%BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+\definecharacter UnicodeDownHeavyAndRightLight                      {\uchar{37}{014}} %%BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+\definecharacter UnicodeHeavyDownAndRight                           {\uchar{37}{015}} %%BOX DRAWINGS HEAVY DOWN AND RIGHT
+\definecharacter UnicodeLightDownAndLeft                            {\uchar{37}{016}} %%BOX DRAWINGS LIGHT DOWN AND LEFT
+\definecharacter UnicodeDownLightAndLeftHeavy                       {\uchar{37}{017}} %%BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+\definecharacter UnicodeDownHeavyAndLeftLight                       {\uchar{37}{018}} %%BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+\definecharacter UnicodeHeavyDownAndLeft                            {\uchar{37}{019}} %%BOX DRAWINGS HEAVY DOWN AND LEFT
+\definecharacter UnicodeLightUpAndRight                             {\uchar{37}{020}} %%BOX DRAWINGS LIGHT UP AND RIGHT
+\definecharacter UnicodeUpLightAndRightHeavy                        {\uchar{37}{021}} %%BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+\definecharacter UnicodeUpHeavyAndRightLight                        {\uchar{37}{022}} %%BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+\definecharacter UnicodeHeavyUpAndRight                             {\uchar{37}{023}} %%BOX DRAWINGS HEAVY UP AND RIGHT
+\definecharacter UnicodeLightUpAndLeft                              {\uchar{37}{024}} %%BOX DRAWINGS LIGHT UP AND LEFT
+\definecharacter UnicodeUpLightAndLeftHeavy                         {\uchar{37}{025}} %%BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+\definecharacter UnicodeUpHeavyAndLeftLight                         {\uchar{37}{026}} %%BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+\definecharacter UnicodeHeavyUpAndLeft                              {\uchar{37}{027}} %%BOX DRAWINGS HEAVY UP AND LEFT
+\definecharacter UnicodeLightVerticalAndRight                       {\uchar{37}{028}} %%BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+\definecharacter UnicodeVerticalLightAndRightHeavy                  {\uchar{37}{029}} %%BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+\definecharacter UnicodeUpHeavyAndRightDownLight                    {\uchar{37}{030}} %%BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+\definecharacter UnicodeDownHeavyAndRightUpLight                    {\uchar{37}{031}} %%BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+\definecharacter UnicodeVerticalHeavyAndRightLight                  {\uchar{37}{032}} %%BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+\definecharacter UnicodeDownLightAndRightUpHeavy                    {\uchar{37}{033}} %%BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+\definecharacter UnicodeUpLightAndRightDownHeavy                    {\uchar{37}{034}} %%BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+\definecharacter UnicodeHeavyVerticalAndRight                       {\uchar{37}{035}} %%BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+\definecharacter UnicodeLightVerticalAndLeft                        {\uchar{37}{036}} %%BOX DRAWINGS LIGHT VERTICAL AND LEFT
+\definecharacter UnicodeVerticalLightAndLeftHeavy                   {\uchar{37}{037}} %%BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+\definecharacter UnicodeUpHeavyAndLeftDownLight                     {\uchar{37}{038}} %%BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+\definecharacter UnicodeDownHeavyAndLeftUpLight                     {\uchar{37}{039}} %%BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+\definecharacter UnicodeVerticalHeavyAndLeftLight                   {\uchar{37}{040}} %%BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+\definecharacter UnicodeDownLightAndLeftUpHeavy                     {\uchar{37}{041}} %%BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+\definecharacter UnicodeUpLightAndLeftDownHeavy                     {\uchar{37}{042}} %%BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+\definecharacter UnicodeHeavyVerticalAndLeft                        {\uchar{37}{043}} %%BOX DRAWINGS HEAVY VERTICAL AND LEFT
+\definecharacter UnicodeLightDownAndHorizontal                      {\uchar{37}{044}} %%BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+\definecharacter UnicodeLeftHeavyAndRightDownLight                  {\uchar{37}{045}} %%BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+\definecharacter UnicodeRightHeavyAndLeftDownLight                  {\uchar{37}{046}} %%BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+\definecharacter UnicodeDownLightAndHorizontalHeavy                 {\uchar{37}{047}} %%BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+\definecharacter UnicodeDownHeavyAndHorizontalLight                 {\uchar{37}{048}} %%BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+\definecharacter UnicodeRightLightAndLeftDownHeavy                  {\uchar{37}{049}} %%BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+\definecharacter UnicodeLeftLightAndRightDownHeavy                  {\uchar{37}{050}} %%BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+\definecharacter UnicodeHeavyDownAndHorizontal                      {\uchar{37}{051}} %%BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+\definecharacter UnicodeLightUpAndHorizontal                        {\uchar{37}{052}} %%BOX DRAWINGS LIGHT UP AND HORIZONTAL
+\definecharacter UnicodeLeftHeavyAndRightUpLight                    {\uchar{37}{053}} %%BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+\definecharacter UnicodeRightHeavyAndLeftUpLight                    {\uchar{37}{054}} %%BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+\definecharacter UnicodeUpLightAndHorizontalHeavy                   {\uchar{37}{055}} %%BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+\definecharacter UnicodeUpHeavyAndHorizontalLight                   {\uchar{37}{056}} %%BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+\definecharacter UnicodeRightLightAndLeftUpHeavy                    {\uchar{37}{057}} %%BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+\definecharacter UnicodeLeftLightAndRightUpHeavy                    {\uchar{37}{058}} %%BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+\definecharacter UnicodeHeavyUpAndHorizontal                        {\uchar{37}{059}} %%BOX DRAWINGS HEAVY UP AND HORIZONTAL
+\definecharacter UnicodeLightVerticalAndHorizontal                  {\uchar{37}{060}} %%BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+\definecharacter UnicodeLeftHeavyAndRightVerticalLight              {\uchar{37}{061}} %%BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+\definecharacter UnicodeRightHeavyAndLeftVerticalLight              {\uchar{37}{062}} %%BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+\definecharacter UnicodeVerticalLightAndHorizontalHeavy             {\uchar{37}{063}} %%BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+\definecharacter UnicodeUpHeavyAndDownHorizontalLight               {\uchar{37}{064}} %%BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+\definecharacter UnicodeDownHeavyAndUpHorizontalLight               {\uchar{37}{065}} %%BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+\definecharacter UnicodeVerticalHeavyAndHorizontalLight             {\uchar{37}{066}} %%BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+\definecharacter UnicodeLeftUpHeavyAndRightDownLight                {\uchar{37}{067}} %%BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+\definecharacter UnicodeRightUpHeavyAndLeftDownLight                {\uchar{37}{068}} %%BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+\definecharacter UnicodeLeftDownHeavyAndRightUpLight                {\uchar{37}{069}} %%BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+\definecharacter UnicodeRightDownHeavyAndLeftUpLight                {\uchar{37}{070}} %%BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+\definecharacter UnicodeDownLightAndUpHorizontalHeavy               {\uchar{37}{071}} %%BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+\definecharacter UnicodeUpLightAndDownHorizontalHeavy               {\uchar{37}{072}} %%BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+\definecharacter UnicodeRightLightAndLeftVerticalHeavy              {\uchar{37}{073}} %%BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+\definecharacter UnicodeLeftLightAndRightVerticalHeavy              {\uchar{37}{074}} %%BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+\definecharacter UnicodeHeavyVerticalAndHorizontal                  {\uchar{37}{075}} %%BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+\definecharacter UnicodeLightDoubleDashHorizontal                   {\uchar{37}{076}} %%BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+\definecharacter UnicodeHeavyDoubleDashHorizontal                   {\uchar{37}{077}} %%BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+\definecharacter UnicodeLightDoubleDashVertical                     {\uchar{37}{078}} %%BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+\definecharacter UnicodeHeavyDoubleDashVertical                     {\uchar{37}{079}} %%BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+\definecharacter UnicodeDoubleHorizontal                            {\uchar{37}{080}} %%BOX DRAWINGS DOUBLE HORIZONTAL
+\definecharacter UnicodeDoubleVertical                              {\uchar{37}{081}} %%BOX DRAWINGS DOUBLE VERTICAL
+\definecharacter UnicodeDownSingleAndRightDouble                    {\uchar{37}{082}} %%BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+\definecharacter UnicodeDownDoubleAndRightSingle                    {\uchar{37}{083}} %%BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+\definecharacter UnicodeDoubleDownAndRight                          {\uchar{37}{084}} %%BOX DRAWINGS DOUBLE DOWN AND RIGHT
+\definecharacter UnicodeDownSingleAndLeftDouble                     {\uchar{37}{085}} %%BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+\definecharacter UnicodeDownDoubleAndLeftSingle                     {\uchar{37}{086}} %%BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+\definecharacter UnicodeDoubleDownAndLeft                           {\uchar{37}{087}} %%BOX DRAWINGS DOUBLE DOWN AND LEFT
+\definecharacter UnicodeUpSingleAndRightDouble                      {\uchar{37}{088}} %%BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+\definecharacter UnicodeUpDoubleAndRightSingle                      {\uchar{37}{089}} %%BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+\definecharacter UnicodeDoubleUpAndRight                            {\uchar{37}{090}} %%BOX DRAWINGS DOUBLE UP AND RIGHT
+\definecharacter UnicodeUpSingleAndLeftDouble                       {\uchar{37}{091}} %%BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+\definecharacter UnicodeUpDoubleAndLeftSingle                       {\uchar{37}{092}} %%BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+\definecharacter UnicodeDoubleUpAndLeft                             {\uchar{37}{093}} %%BOX DRAWINGS DOUBLE UP AND LEFT
+\definecharacter UnicodeVerticalSingleAndRightDouble                {\uchar{37}{094}} %%BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+\definecharacter UnicodeVerticalDoubleAndRightSingle                {\uchar{37}{095}} %%BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+\definecharacter UnicodeDoubleVerticalAndRight                      {\uchar{37}{096}} %%BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+\definecharacter UnicodeVerticalSingleAndLeftDouble                 {\uchar{37}{097}} %%BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+\definecharacter UnicodeVerticalDoubleAndLeftSingle                 {\uchar{37}{098}} %%BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+\definecharacter UnicodeDoubleVerticalAndLeft                       {\uchar{37}{099}} %%BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+\definecharacter UnicodeDownSingleAndHorizontalDouble               {\uchar{37}{100}} %%BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+\definecharacter UnicodeDownDoubleAndHorizontalSingle               {\uchar{37}{101}} %%BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+\definecharacter UnicodeDoubleDownAndHorizontal                     {\uchar{37}{102}} %%BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+\definecharacter UnicodeUpSingleAndHorizontalDouble                 {\uchar{37}{103}} %%BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+\definecharacter UnicodeUpDoubleAndHorizontalSingle                 {\uchar{37}{104}} %%BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+\definecharacter UnicodeDoubleUpAndHorizontal                       {\uchar{37}{105}} %%BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+\definecharacter UnicodeVerticalSingleAndHorizontalDouble           {\uchar{37}{106}} %%BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+\definecharacter UnicodeVerticalDoubleAndHorizontalSingle           {\uchar{37}{107}} %%BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+\definecharacter UnicodeDoubleVerticalAndHorizontal                 {\uchar{37}{108}} %%BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+\definecharacter UnicodeLightArcDownAndRight                        {\uchar{37}{109}} %%BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+\definecharacter UnicodeLightArcDownAndLeft                         {\uchar{37}{110}} %%BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+\definecharacter UnicodeLightArcUpAndLeft                           {\uchar{37}{111}} %%BOX DRAWINGS LIGHT ARC UP AND LEFT
+\definecharacter UnicodeLightArcUpAndRight                          {\uchar{37}{112}} %%BOX DRAWINGS LIGHT ARC UP AND RIGHT
+\definecharacter UnicodeLightDiagonalUpperRightToLowerLeft          {\uchar{37}{113}} %%BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+\definecharacter UnicodeLightDiagonalUpperLeftToLowerRight          {\uchar{37}{114}} %%BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+\definecharacter UnicodeLightDiagonalCross                          {\uchar{37}{115}} %%BOX DRAWINGS LIGHT DIAGONAL CROSS
+\definecharacter UnicodeLightLeft                                   {\uchar{37}{116}} %%BOX DRAWINGS LIGHT LEFT
+\definecharacter UnicodeLightUp                                     {\uchar{37}{117}} %%BOX DRAWINGS LIGHT UP
+\definecharacter UnicodeLightRight                                  {\uchar{37}{118}} %%BOX DRAWINGS LIGHT RIGHT
+\definecharacter UnicodeLightDown                                   {\uchar{37}{119}} %%BOX DRAWINGS LIGHT DOWN
+\definecharacter UnicodeHeavyLeft                                   {\uchar{37}{120}} %%BOX DRAWINGS HEAVY LEFT
+\definecharacter UnicodeHeavyUp                                     {\uchar{37}{121}} %%BOX DRAWINGS HEAVY UP
+\definecharacter UnicodeHeavyRight                                  {\uchar{37}{122}} %%BOX DRAWINGS HEAVY RIGHT
+\definecharacter UnicodeHeavyDown                                   {\uchar{37}{123}} %%BOX DRAWINGS HEAVY DOWN
+\definecharacter UnicodeLightLeftAndHeavyRight                      {\uchar{37}{124}} %%BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+\definecharacter UnicodeLightUpAndHeavyDown                         {\uchar{37}{125}} %%BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+\definecharacter UnicodeHeavyLeftAndLightRight                      {\uchar{37}{126}} %%BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+\definecharacter UnicodeHeavyUpAndLightDown                         {\uchar{37}{127}} %%BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+\definecharacter UnicodeUpperHalfBlock                              {\uchar{37}{128}} %%UPPER HALF BLOCK
+\definecharacter UnicodeLowerOneEighthBlock                         {\uchar{37}{129}} %%LOWER ONE EIGHTH BLOCK
+\definecharacter UnicodeLowerOneQuarterBlock                        {\uchar{37}{130}} %%LOWER ONE QUARTER BLOCK
+\definecharacter UnicodeLowerThreeEighthsBlock                      {\uchar{37}{131}} %%LOWER THREE EIGHTHS BLOCK
+\definecharacter UnicodeLowerHalfBlock                              {\uchar{37}{132}} %%LOWER HALF BLOCK
+\definecharacter UnicodeLowerFiveEighthsBlock                       {\uchar{37}{133}} %%LOWER FIVE EIGHTHS BLOCK
+\definecharacter UnicodeLowerThreeQuartersBlock                     {\uchar{37}{134}} %%LOWER THREE QUARTERS BLOCK
+\definecharacter UnicodeLowerSevenEighthsBlock                      {\uchar{37}{135}} %%LOWER SEVEN EIGHTHS BLOCK
+\definecharacter UnicodeFullBlock                                   {\uchar{37}{136}} %%FULL BLOCK
+\definecharacter UnicodeLeftSevenEighthsBlock                       {\uchar{37}{137}} %%LEFT SEVEN EIGHTHS BLOCK
+\definecharacter UnicodeLeftThreeQuartersBlock                      {\uchar{37}{138}} %%LEFT THREE QUARTERS BLOCK
+\definecharacter UnicodeLeftFiveEighthsBlock                        {\uchar{37}{139}} %%LEFT FIVE EIGHTHS BLOCK
+\definecharacter UnicodeLeftHalfBlock                               {\uchar{37}{140}} %%LEFT HALF BLOCK
+\definecharacter UnicodeLeftThreeEighthsBlock                       {\uchar{37}{141}} %%LEFT THREE EIGHTHS BLOCK
+\definecharacter UnicodeLeftOneQuarterBlock                         {\uchar{37}{142}} %%LEFT ONE QUARTER BLOCK
+\definecharacter UnicodeLeftOneEighthBlock                          {\uchar{37}{143}} %%LEFT ONE EIGHTH BLOCK
+\definecharacter UnicodeRightHalfBlock                              {\uchar{37}{144}} %%RIGHT HALF BLOCK
+\definecharacter UnicodeLightShade                                  {\uchar{37}{145}} %%LIGHT SHADE
+\definecharacter UnicodeMediumShade                                 {\uchar{37}{146}} %%MEDIUM SHADE
+\definecharacter UnicodeDarkShade                                   {\uchar{37}{147}} %%DARK SHADE
+\definecharacter UnicodeUpperOneEighthBlock                         {\uchar{37}{148}} %%UPPER ONE EIGHTH BLOCK
+\definecharacter UnicodeRightOneEighthBlock                         {\uchar{37}{149}} %%RIGHT ONE EIGHTH BLOCK
+\definecharacter UnicodeQuadrantLowerLeft                           {\uchar{37}{150}} %%[Unassigned U+2596]
+\definecharacter UnicodeQuadrantLowerRight                          {\uchar{37}{151}} %%[Unassigned U+2597]
+\definecharacter UnicodeQuadrantUpperLeft                           {\uchar{37}{152}} %%[Unassigned U+2598]
+\definecharacter UnicodeQuadrantUpperLeftAndLowerLeftAndLowerRight  {\uchar{37}{153}} %%[Unassigned U+2599]
+\definecharacter UnicodeQuadrantUpperLeftAndLowerRight              {\uchar{37}{154}} %%[Unassigned U+259A]
+\definecharacter UnicodeQuadrantUpperLeftAndUpperRightandLowerLeft  {\uchar{37}{155}} %%[Unassigned U+259B]
+\definecharacter UnicodeQuadrantUpperLeftAndUpperRightAndLowerRight {\uchar{37}{156}} %%[Unassigned U+259C]
+\definecharacter UnicodeQuadrantUpperRight                          {\uchar{37}{157}} %%[Unassigned U+259D]
+\definecharacter UnicodeQuadrantUpperRightAndLowerLeft              {\uchar{37}{158}} %%[Unassigned U+259E]
+\definecharacter UnicodeQuadrantUpperRightAndLowerLeftAndLowerRight {\uchar{37}{159}} %%[Unassigned U+259F]
+\definecharacter UnicodeBlackSquare                                 {\uchar{37}{160}} %%BLACK SQUARE
+\definecharacter UnicodeWhiteSquare                                 {\uchar{37}{161}} %%WHITE SQUARE
+\definecharacter UnicodeWhiteSquareWithRoundedCorners               {\uchar{37}{162}} %%WHITE SQUARE WITH ROUNDED CORNERS
+\definecharacter UnicodeWhiteSquareContainingBlackSmallSquare       {\uchar{37}{163}} %%WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+\definecharacter UnicodeSquareWithHorizontalFill                    {\uchar{37}{164}} %%SQUARE WITH HORIZONTAL FILL
+\definecharacter UnicodeSquareWithVerticalFill                      {\uchar{37}{165}} %%SQUARE WITH VERTICAL FILL
+\definecharacter UnicodeSquareWithOrthogonalCrosshatchFill          {\uchar{37}{166}} %%SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+\definecharacter UnicodeSquareWithUpperLeftToLowerRightFill         {\uchar{37}{167}} %%SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+\definecharacter UnicodeSquareWithUpperRightToLowerLeftFill         {\uchar{37}{168}} %%SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+\definecharacter UnicodeSquareWithDiagonalCrosshatchFill            {\uchar{37}{169}} %%SQUARE WITH DIAGONAL CROSSHATCH FILL
+\definecharacter UnicodeBlackSmallSquare                            {\uchar{37}{170}} %%BLACK SMALL SQUARE
+\definecharacter UnicodeWhiteSmallSquare                            {\uchar{37}{171}} %%WHITE SMALL SQUARE
+\definecharacter UnicodeBlackRectangle                              {\uchar{37}{172}} %%BLACK RECTANGLE
+\definecharacter UnicodeWhiteRectangle                              {\uchar{37}{173}} %%WHITE RECTANGLE
+\definecharacter UnicodeBlackVerticalRectangle                      {\uchar{37}{174}} %%BLACK VERTICAL RECTANGLE
+\definecharacter UnicodeWhiteVerticalRectangle                      {\uchar{37}{175}} %%WHITE VERTICAL RECTANGLE
+\definecharacter UnicodeBlackParallelogram                          {\uchar{37}{176}} %%BLACK PARALLELOGRAM
+\definecharacter UnicodeWhiteParallelogram                          {\uchar{37}{177}} %%WHITE PARALLELOGRAM
+\definecharacter UnicodeBlackUpPointingTriangle                     {\uchar{37}{178}} %%BLACK UP-POINTING TRIANGLE
+\definecharacter UnicodeWhiteUpPointingTriangle                     {\uchar{37}{179}} %%WHITE UP-POINTING TRIANGLE
+\definecharacter UnicodeBlackUpPointingSmallTriangle                {\uchar{37}{180}} %%BLACK UP-POINTING SMALL TRIANGLE
+\definecharacter UnicodeWhiteUpPointingSmallTriangle                {\uchar{37}{181}} %%WHITE UP-POINTING SMALL TRIANGLE
+\definecharacter UnicodeBlackRightPointingTriangle                  {\uchar{37}{182}} %%BLACK RIGHT-POINTING TRIANGLE
+\definecharacter UnicodeWhiteRightPointingTriangle                  {\uchar{37}{183}} %%WHITE RIGHT-POINTING TRIANGLE
+\definecharacter UnicodeBlackRightPointingSmallTriangle             {\uchar{37}{184}} %%BLACK RIGHT-POINTING SMALL TRIANGLE
+\definecharacter UnicodeWhiteRightPointingSmallTriangle             {\uchar{37}{185}} %%WHITE RIGHT-POINTING SMALL TRIANGLE
+\definecharacter UnicodeBlackRightPointingPointer                   {\uchar{37}{186}} %%BLACK RIGHT-POINTING POINTER
+\definecharacter UnicodeWhiteRightPointingPointer                   {\uchar{37}{187}} %%WHITE RIGHT-POINTING POINTER
+\definecharacter UnicodeBlackDownPointingTriangle                   {\uchar{37}{188}} %%BLACK DOWN-POINTING TRIANGLE
+\definecharacter UnicodeWhiteDownPointingTriangle                   {\uchar{37}{189}} %%WHITE DOWN-POINTING TRIANGLE
+\definecharacter UnicodeBlackDownPointingSmallTriangle              {\uchar{37}{190}} %%BLACK DOWN-POINTING SMALL TRIANGLE
+\definecharacter UnicodeWhiteDownPointingSmallTriangle              {\uchar{37}{191}} %%WHITE DOWN-POINTING SMALL TRIANGLE
+\definecharacter UnicodeBlackLeftPointingTriangle                   {\uchar{37}{192}} %%BLACK LEFT-POINTING TRIANGLE
+\definecharacter UnicodeWhiteLeftPointingTriangle                   {\uchar{37}{193}} %%WHITE LEFT-POINTING TRIANGLE
+\definecharacter UnicodeBlackLeftPointingSmallTriangle              {\uchar{37}{194}} %%BLACK LEFT-POINTING SMALL TRIANGLE
+\definecharacter UnicodeWhiteLeftPointingSmallTriangle              {\uchar{37}{195}} %%WHITE LEFT-POINTING SMALL TRIANGLE
+\definecharacter UnicodeBlackLeftPointingPointer                    {\uchar{37}{196}} %%BLACK LEFT-POINTING POINTER
+\definecharacter UnicodeWhiteLeftPointingPointer                    {\uchar{37}{197}} %%WHITE LEFT-POINTING POINTER
+\definecharacter UnicodeBlackDiamond                                {\uchar{37}{198}} %%BLACK DIAMOND
+\definecharacter UnicodeWhiteDiamond                                {\uchar{37}{199}} %%WHITE DIAMOND
+\definecharacter UnicodeWhiteDiamondContainingBlackSmallDiamond     {\uchar{37}{200}} %%WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+\definecharacter UnicodeFisheye                                     {\uchar{37}{201}} %%FISHEYE
+\definecharacter UnicodeLozenge                                     {\uchar{37}{202}} %%LOZENGE
+\definecharacter UnicodeWhiteCircle                                 {\uchar{37}{203}} %%WHITE CIRCLE
+\definecharacter UnicodeDottedCircle                                {\uchar{37}{204}} %%DOTTED CIRCLE
+\definecharacter UnicodeCircleWithVerticalFill                      {\uchar{37}{205}} %%CIRCLE WITH VERTICAL FILL
+\definecharacter UnicodeBullseye                                    {\uchar{37}{206}} %%BULLSEYE
+\definecharacter UnicodeBlackCircle                                 {\uchar{37}{207}} %%BLACK CIRCLE
+\definecharacter UnicodeCircleWithLeftHalfBlack                     {\uchar{37}{208}} %%CIRCLE WITH LEFT HALF BLACK
+\definecharacter UnicodeCircleWithRightHalfBlack                    {\uchar{37}{209}} %%CIRCLE WITH RIGHT HALF BLACK
+\definecharacter UnicodeCircleWithLowerHalfBlack                    {\uchar{37}{210}} %%CIRCLE WITH LOWER HALF BLACK
+\definecharacter UnicodeCircleWithUpperHalfBlack                    {\uchar{37}{211}} %%CIRCLE WITH UPPER HALF BLACK
+\definecharacter UnicodeCircleWithUpperRightQuadrantBlack           {\uchar{37}{212}} %%CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+\definecharacter UnicodeCircleWithAllButUpperLeftQuadrantBlack      {\uchar{37}{213}} %%CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+\definecharacter UnicodeLeftHalfBlackCircle                         {\uchar{37}{214}} %%LEFT HALF BLACK CIRCLE
+\definecharacter UnicodeRightHalfBlackCircle                        {\uchar{37}{215}} %%RIGHT HALF BLACK CIRCLE
+\definecharacter UnicodeInverseBullet                               {\uchar{37}{216}} %%INVERSE BULLET
+\definecharacter UnicodeInverseWhiteCircle                          {\uchar{37}{217}} %%INVERSE WHITE CIRCLE
+\definecharacter UnicodeUpperHalfInverseWhiteCircle                 {\uchar{37}{218}} %%UPPER HALF INVERSE WHITE CIRCLE
+\definecharacter UnicodeLowerHalfInverseWhiteCircle                 {\uchar{37}{219}} %%LOWER HALF INVERSE WHITE CIRCLE
+\definecharacter UnicodeUpperLeftQuadrantCircularArc                {\uchar{37}{220}} %%UPPER LEFT QUADRANT CIRCULAR ARC
+\definecharacter UnicodeUpperRightQuadrantCircularArc               {\uchar{37}{221}} %%UPPER RIGHT QUADRANT CIRCULAR ARC
+\definecharacter UnicodeLowerRightQuadrantCircularArc               {\uchar{37}{222}} %%LOWER RIGHT QUADRANT CIRCULAR ARC
+\definecharacter UnicodeLowerLeftQuadrantCircularArc                {\uchar{37}{223}} %%LOWER LEFT QUADRANT CIRCULAR ARC
+\definecharacter UnicodeUpperHalfCircle                             {\uchar{37}{224}} %%UPPER HALF CIRCLE
+\definecharacter UnicodeLowerHalfCircle                             {\uchar{37}{225}} %%LOWER HALF CIRCLE
+\definecharacter UnicodeBlackLowerRightTriangle                     {\uchar{37}{226}} %%BLACK LOWER RIGHT TRIANGLE
+\definecharacter UnicodeBlackLowerLeftTriangle                      {\uchar{37}{227}} %%BLACK LOWER LEFT TRIANGLE
+\definecharacter UnicodeBlackUpperLeftTriangle                      {\uchar{37}{228}} %%BLACK UPPER LEFT TRIANGLE
+\definecharacter UnicodeBlackUpperRightTriangle                     {\uchar{37}{229}} %%BLACK UPPER RIGHT TRIANGLE
+\definecharacter UnicodeWhiteBullet                                 {\uchar{37}{230}} %%WHITE BULLET
+\definecharacter UnicodeSquareWithLeftHalfBlack                     {\uchar{37}{231}} %%SQUARE WITH LEFT HALF BLACK
+\definecharacter UnicodeSquareWithRightHalfBlack                    {\uchar{37}{232}} %%SQUARE WITH RIGHT HALF BLACK
+\definecharacter UnicodeSquareWithUpperLeftDiagonalHalfBlack        {\uchar{37}{233}} %%SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+\definecharacter UnicodeSquareWithLowerRightDiagonalHalfBlack       {\uchar{37}{234}} %%SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+\definecharacter UnicodeWhiteSquareWithVerticalBisectingLine        {\uchar{37}{235}} %%WHITE SQUARE WITH VERTICAL BISECTING LINE
+\definecharacter UnicodeWhiteUpPointingTriangleWithDot              {\uchar{37}{236}} %%WHITE UP-POINTING TRIANGLE WITH DOT
+\definecharacter UnicodeUpPointingTriangleWithLeftHalfBlack         {\uchar{37}{237}} %%UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+\definecharacter UnicodeUpPointingTriangleWithRightHalfBlack        {\uchar{37}{238}} %%UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+\definecharacter UnicodeLargeCircle                                 {\uchar{37}{239}} %%LARGE CIRCLE
+\definecharacter UnicodeWhiteSquareWithUpperLeftQuadrant            {\uchar{37}{240}} %%WHITE SQUARE WITH UPPER LEFT QUADRANT
+\definecharacter UnicodeWhiteSquareWithLowerLeftQuadrant            {\uchar{37}{241}} %%WHITE SQUARE WITH LOWER LEFT QUADRANT
+\definecharacter UnicodeWhiteSquareWithLowerRightQuadrant           {\uchar{37}{242}} %%WHITE SQUARE WITH LOWER RIGHT QUADRANT
+\definecharacter UnicodeWhiteSquareWithUpperRightQuadrant           {\uchar{37}{243}} %%WHITE SQUARE WITH UPPER RIGHT QUADRANT
+\definecharacter UnicodeWhiteCircleWithUpperLeftQuadrant            {\uchar{37}{244}} %%WHITE CIRCLE WITH UPPER LEFT QUADRANT
+\definecharacter UnicodeWhiteCircleWithLowerLeftQuadrant            {\uchar{37}{245}} %%WHITE CIRCLE WITH LOWER LEFT QUADRANT
+\definecharacter UnicodeWhiteCircleWithLowerRightQuadrant           {\uchar{37}{246}} %%WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+\definecharacter UnicodeWhiteCircleWithUpperRightQuadrant           {\uchar{37}{247}} %%WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+\definecharacter UnicodeUpperLeftTriangle                           {\uchar{37}{248}} %%[Unassigned U+25F8]
+\definecharacter UnicodeUpperRightTriangle                          {\uchar{37}{249}} %%[Unassigned U+25F9]
+\definecharacter UnicodeLowerLeftTriangle                           {\uchar{37}{250}} %%[Unassigned U+25FA]
+\definecharacter UnicodeWhiteMediumSquare                           {\uchar{37}{251}} %%[Unassigned U+25FB]
+\definecharacter UnicodeBlackMediumSquare                           {\uchar{37}{252}} %%[Unassigned U+25FC]
+\definecharacter UnicodeWhiteMediumSmallSquare                      {\uchar{37}{253}} %%[Unassigned U+25FD]
+\definecharacter UnicodeBlackMediumSmallSquare                      {\uchar{37}{254}} %%[Unassigned U+25FE]
+\definecharacter UnicodeLowerRightTriangle                          {\uchar{37}{255}} %%[Unassigned U+25FF]
+
+\stopencoding
+
+\endinput
+
diff --git a/tex/context/base/enco-037.tex b/tex/context/base/enco-037.tex
deleted file mode 100644
index d9fc653b2..000000000
--- a/tex/context/base/enco-037.tex
+++ /dev/null
@@ -1,276 +0,0 @@
-%D \module
-%D   [       file=enco-037,
-%D        version=2006.02.13,
-%D          title=\CONTEXT\ \UNICODE\ Macros,
-%D       subtitle=Encoding for vector 37,
-%D         author=Luigi Scarso,
-%D           date=\currentdate,
-%D      copyright={PRAGMA}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\startencoding[default]
-
-\definecharacter UnicodeLightHorizontal                             {\uchar{37}{000}} %%BOX DRAWINGS LIGHT HORIZONTAL
-\definecharacter UnicodeHeavyHorizontal                             {\uchar{37}{001}} %%BOX DRAWINGS HEAVY HORIZONTAL
-\definecharacter UnicodeLightVertical                               {\uchar{37}{002}} %%BOX DRAWINGS LIGHT VERTICAL
-\definecharacter UnicodeHeavyVertical                               {\uchar{37}{003}} %%BOX DRAWINGS HEAVY VERTICAL
-\definecharacter UnicodeLightTripleDashHorizontal                   {\uchar{37}{004}} %%BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
-\definecharacter UnicodeHeavyTripleDashHorizontal                   {\uchar{37}{005}} %%BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
-\definecharacter UnicodeLightTripleDashVertical                     {\uchar{37}{006}} %%BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
-\definecharacter UnicodeHeavyTripleDashVertical                     {\uchar{37}{007}} %%BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
-\definecharacter UnicodeLightQuadrupleDashHorizontal                {\uchar{37}{008}} %%BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
-\definecharacter UnicodeHeavyQuadrupleDashHorizontal                {\uchar{37}{009}} %%BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
-\definecharacter UnicodeLightQuadrupleDashVertical                  {\uchar{37}{010}} %%BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
-\definecharacter UnicodeHeavyQuadrupleDashVertical                  {\uchar{37}{011}} %%BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
-\definecharacter UnicodeLightDownAndRight                           {\uchar{37}{012}} %%BOX DRAWINGS LIGHT DOWN AND RIGHT
-\definecharacter UnicodeDownLightAndRightHeavy                      {\uchar{37}{013}} %%BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
-\definecharacter UnicodeDownHeavyAndRightLight                      {\uchar{37}{014}} %%BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
-\definecharacter UnicodeHeavyDownAndRight                           {\uchar{37}{015}} %%BOX DRAWINGS HEAVY DOWN AND RIGHT
-\definecharacter UnicodeLightDownAndLeft                            {\uchar{37}{016}} %%BOX DRAWINGS LIGHT DOWN AND LEFT
-\definecharacter UnicodeDownLightAndLeftHeavy                       {\uchar{37}{017}} %%BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
-\definecharacter UnicodeDownHeavyAndLeftLight                       {\uchar{37}{018}} %%BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
-\definecharacter UnicodeHeavyDownAndLeft                            {\uchar{37}{019}} %%BOX DRAWINGS HEAVY DOWN AND LEFT
-\definecharacter UnicodeLightUpAndRight                             {\uchar{37}{020}} %%BOX DRAWINGS LIGHT UP AND RIGHT
-\definecharacter UnicodeUpLightAndRightHeavy                        {\uchar{37}{021}} %%BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
-\definecharacter UnicodeUpHeavyAndRightLight                        {\uchar{37}{022}} %%BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
-\definecharacter UnicodeHeavyUpAndRight                             {\uchar{37}{023}} %%BOX DRAWINGS HEAVY UP AND RIGHT
-\definecharacter UnicodeLightUpAndLeft                              {\uchar{37}{024}} %%BOX DRAWINGS LIGHT UP AND LEFT
-\definecharacter UnicodeUpLightAndLeftHeavy                         {\uchar{37}{025}} %%BOX DRAWINGS UP LIGHT AND LEFT HEAVY
-\definecharacter UnicodeUpHeavyAndLeftLight                         {\uchar{37}{026}} %%BOX DRAWINGS UP HEAVY AND LEFT LIGHT
-\definecharacter UnicodeHeavyUpAndLeft                              {\uchar{37}{027}} %%BOX DRAWINGS HEAVY UP AND LEFT
-\definecharacter UnicodeLightVerticalAndRight                       {\uchar{37}{028}} %%BOX DRAWINGS LIGHT VERTICAL AND RIGHT
-\definecharacter UnicodeVerticalLightAndRightHeavy                  {\uchar{37}{029}} %%BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
-\definecharacter UnicodeUpHeavyAndRightDownLight                    {\uchar{37}{030}} %%BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
-\definecharacter UnicodeDownHeavyAndRightUpLight                    {\uchar{37}{031}} %%BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
-\definecharacter UnicodeVerticalHeavyAndRightLight                  {\uchar{37}{032}} %%BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
-\definecharacter UnicodeDownLightAndRightUpHeavy                    {\uchar{37}{033}} %%BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
-\definecharacter UnicodeUpLightAndRightDownHeavy                    {\uchar{37}{034}} %%BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
-\definecharacter UnicodeHeavyVerticalAndRight                       {\uchar{37}{035}} %%BOX DRAWINGS HEAVY VERTICAL AND RIGHT
-\definecharacter UnicodeLightVerticalAndLeft                        {\uchar{37}{036}} %%BOX DRAWINGS LIGHT VERTICAL AND LEFT
-\definecharacter UnicodeVerticalLightAndLeftHeavy                   {\uchar{37}{037}} %%BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
-\definecharacter UnicodeUpHeavyAndLeftDownLight                     {\uchar{37}{038}} %%BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
-\definecharacter UnicodeDownHeavyAndLeftUpLight                     {\uchar{37}{039}} %%BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
-\definecharacter UnicodeVerticalHeavyAndLeftLight                   {\uchar{37}{040}} %%BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
-\definecharacter UnicodeDownLightAndLeftUpHeavy                     {\uchar{37}{041}} %%BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
-\definecharacter UnicodeUpLightAndLeftDownHeavy                     {\uchar{37}{042}} %%BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
-\definecharacter UnicodeHeavyVerticalAndLeft                        {\uchar{37}{043}} %%BOX DRAWINGS HEAVY VERTICAL AND LEFT
-\definecharacter UnicodeLightDownAndHorizontal                      {\uchar{37}{044}} %%BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
-\definecharacter UnicodeLeftHeavyAndRightDownLight                  {\uchar{37}{045}} %%BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
-\definecharacter UnicodeRightHeavyAndLeftDownLight                  {\uchar{37}{046}} %%BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
-\definecharacter UnicodeDownLightAndHorizontalHeavy                 {\uchar{37}{047}} %%BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
-\definecharacter UnicodeDownHeavyAndHorizontalLight                 {\uchar{37}{048}} %%BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
-\definecharacter UnicodeRightLightAndLeftDownHeavy                  {\uchar{37}{049}} %%BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
-\definecharacter UnicodeLeftLightAndRightDownHeavy                  {\uchar{37}{050}} %%BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
-\definecharacter UnicodeHeavyDownAndHorizontal                      {\uchar{37}{051}} %%BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
-\definecharacter UnicodeLightUpAndHorizontal                        {\uchar{37}{052}} %%BOX DRAWINGS LIGHT UP AND HORIZONTAL
-\definecharacter UnicodeLeftHeavyAndRightUpLight                    {\uchar{37}{053}} %%BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
-\definecharacter UnicodeRightHeavyAndLeftUpLight                    {\uchar{37}{054}} %%BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
-\definecharacter UnicodeUpLightAndHorizontalHeavy                   {\uchar{37}{055}} %%BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
-\definecharacter UnicodeUpHeavyAndHorizontalLight                   {\uchar{37}{056}} %%BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
-\definecharacter UnicodeRightLightAndLeftUpHeavy                    {\uchar{37}{057}} %%BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
-\definecharacter UnicodeLeftLightAndRightUpHeavy                    {\uchar{37}{058}} %%BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
-\definecharacter UnicodeHeavyUpAndHorizontal                        {\uchar{37}{059}} %%BOX DRAWINGS HEAVY UP AND HORIZONTAL
-\definecharacter UnicodeLightVerticalAndHorizontal                  {\uchar{37}{060}} %%BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
-\definecharacter UnicodeLeftHeavyAndRightVerticalLight              {\uchar{37}{061}} %%BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
-\definecharacter UnicodeRightHeavyAndLeftVerticalLight              {\uchar{37}{062}} %%BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
-\definecharacter UnicodeVerticalLightAndHorizontalHeavy             {\uchar{37}{063}} %%BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
-\definecharacter UnicodeUpHeavyAndDownHorizontalLight               {\uchar{37}{064}} %%BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
-\definecharacter UnicodeDownHeavyAndUpHorizontalLight               {\uchar{37}{065}} %%BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
-\definecharacter UnicodeVerticalHeavyAndHorizontalLight             {\uchar{37}{066}} %%BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
-\definecharacter UnicodeLeftUpHeavyAndRightDownLight                {\uchar{37}{067}} %%BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
-\definecharacter UnicodeRightUpHeavyAndLeftDownLight                {\uchar{37}{068}} %%BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
-\definecharacter UnicodeLeftDownHeavyAndRightUpLight                {\uchar{37}{069}} %%BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
-\definecharacter UnicodeRightDownHeavyAndLeftUpLight                {\uchar{37}{070}} %%BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
-\definecharacter UnicodeDownLightAndUpHorizontalHeavy               {\uchar{37}{071}} %%BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
-\definecharacter UnicodeUpLightAndDownHorizontalHeavy               {\uchar{37}{072}} %%BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
-\definecharacter UnicodeRightLightAndLeftVerticalHeavy              {\uchar{37}{073}} %%BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
-\definecharacter UnicodeLeftLightAndRightVerticalHeavy              {\uchar{37}{074}} %%BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
-\definecharacter UnicodeHeavyVerticalAndHorizontal                  {\uchar{37}{075}} %%BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
-\definecharacter UnicodeLightDoubleDashHorizontal                   {\uchar{37}{076}} %%BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
-\definecharacter UnicodeHeavyDoubleDashHorizontal                   {\uchar{37}{077}} %%BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
-\definecharacter UnicodeLightDoubleDashVertical                     {\uchar{37}{078}} %%BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
-\definecharacter UnicodeHeavyDoubleDashVertical                     {\uchar{37}{079}} %%BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
-\definecharacter UnicodeDoubleHorizontal                            {\uchar{37}{080}} %%BOX DRAWINGS DOUBLE HORIZONTAL
-\definecharacter UnicodeDoubleVertical                              {\uchar{37}{081}} %%BOX DRAWINGS DOUBLE VERTICAL
-\definecharacter UnicodeDownSingleAndRightDouble                    {\uchar{37}{082}} %%BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
-\definecharacter UnicodeDownDoubleAndRightSingle                    {\uchar{37}{083}} %%BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
-\definecharacter UnicodeDoubleDownAndRight                          {\uchar{37}{084}} %%BOX DRAWINGS DOUBLE DOWN AND RIGHT
-\definecharacter UnicodeDownSingleAndLeftDouble                     {\uchar{37}{085}} %%BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
-\definecharacter UnicodeDownDoubleAndLeftSingle                     {\uchar{37}{086}} %%BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
-\definecharacter UnicodeDoubleDownAndLeft                           {\uchar{37}{087}} %%BOX DRAWINGS DOUBLE DOWN AND LEFT
-\definecharacter UnicodeUpSingleAndRightDouble                      {\uchar{37}{088}} %%BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
-\definecharacter UnicodeUpDoubleAndRightSingle                      {\uchar{37}{089}} %%BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
-\definecharacter UnicodeDoubleUpAndRight                            {\uchar{37}{090}} %%BOX DRAWINGS DOUBLE UP AND RIGHT
-\definecharacter UnicodeUpSingleAndLeftDouble                       {\uchar{37}{091}} %%BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
-\definecharacter UnicodeUpDoubleAndLeftSingle                       {\uchar{37}{092}} %%BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
-\definecharacter UnicodeDoubleUpAndLeft                             {\uchar{37}{093}} %%BOX DRAWINGS DOUBLE UP AND LEFT
-\definecharacter UnicodeVerticalSingleAndRightDouble                {\uchar{37}{094}} %%BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
-\definecharacter UnicodeVerticalDoubleAndRightSingle                {\uchar{37}{095}} %%BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
-\definecharacter UnicodeDoubleVerticalAndRight                      {\uchar{37}{096}} %%BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
-\definecharacter UnicodeVerticalSingleAndLeftDouble                 {\uchar{37}{097}} %%BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
-\definecharacter UnicodeVerticalDoubleAndLeftSingle                 {\uchar{37}{098}} %%BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
-\definecharacter UnicodeDoubleVerticalAndLeft                       {\uchar{37}{099}} %%BOX DRAWINGS DOUBLE VERTICAL AND LEFT
-\definecharacter UnicodeDownSingleAndHorizontalDouble               {\uchar{37}{100}} %%BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
-\definecharacter UnicodeDownDoubleAndHorizontalSingle               {\uchar{37}{101}} %%BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
-\definecharacter UnicodeDoubleDownAndHorizontal                     {\uchar{37}{102}} %%BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
-\definecharacter UnicodeUpSingleAndHorizontalDouble                 {\uchar{37}{103}} %%BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
-\definecharacter UnicodeUpDoubleAndHorizontalSingle                 {\uchar{37}{104}} %%BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
-\definecharacter UnicodeDoubleUpAndHorizontal                       {\uchar{37}{105}} %%BOX DRAWINGS DOUBLE UP AND HORIZONTAL
-\definecharacter UnicodeVerticalSingleAndHorizontalDouble           {\uchar{37}{106}} %%BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
-\definecharacter UnicodeVerticalDoubleAndHorizontalSingle           {\uchar{37}{107}} %%BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
-\definecharacter UnicodeDoubleVerticalAndHorizontal                 {\uchar{37}{108}} %%BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
-\definecharacter UnicodeLightArcDownAndRight                        {\uchar{37}{109}} %%BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
-\definecharacter UnicodeLightArcDownAndLeft                         {\uchar{37}{110}} %%BOX DRAWINGS LIGHT ARC DOWN AND LEFT
-\definecharacter UnicodeLightArcUpAndLeft                           {\uchar{37}{111}} %%BOX DRAWINGS LIGHT ARC UP AND LEFT
-\definecharacter UnicodeLightArcUpAndRight                          {\uchar{37}{112}} %%BOX DRAWINGS LIGHT ARC UP AND RIGHT
-\definecharacter UnicodeLightDiagonalUpperRightToLowerLeft          {\uchar{37}{113}} %%BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
-\definecharacter UnicodeLightDiagonalUpperLeftToLowerRight          {\uchar{37}{114}} %%BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
-\definecharacter UnicodeLightDiagonalCross                          {\uchar{37}{115}} %%BOX DRAWINGS LIGHT DIAGONAL CROSS
-\definecharacter UnicodeLightLeft                                   {\uchar{37}{116}} %%BOX DRAWINGS LIGHT LEFT
-\definecharacter UnicodeLightUp                                     {\uchar{37}{117}} %%BOX DRAWINGS LIGHT UP
-\definecharacter UnicodeLightRight                                  {\uchar{37}{118}} %%BOX DRAWINGS LIGHT RIGHT
-\definecharacter UnicodeLightDown                                   {\uchar{37}{119}} %%BOX DRAWINGS LIGHT DOWN
-\definecharacter UnicodeHeavyLeft                                   {\uchar{37}{120}} %%BOX DRAWINGS HEAVY LEFT
-\definecharacter UnicodeHeavyUp                                     {\uchar{37}{121}} %%BOX DRAWINGS HEAVY UP
-\definecharacter UnicodeHeavyRight                                  {\uchar{37}{122}} %%BOX DRAWINGS HEAVY RIGHT
-\definecharacter UnicodeHeavyDown                                   {\uchar{37}{123}} %%BOX DRAWINGS HEAVY DOWN
-\definecharacter UnicodeLightLeftAndHeavyRight                      {\uchar{37}{124}} %%BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
-\definecharacter UnicodeLightUpAndHeavyDown                         {\uchar{37}{125}} %%BOX DRAWINGS LIGHT UP AND HEAVY DOWN
-\definecharacter UnicodeHeavyLeftAndLightRight                      {\uchar{37}{126}} %%BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
-\definecharacter UnicodeHeavyUpAndLightDown                         {\uchar{37}{127}} %%BOX DRAWINGS HEAVY UP AND LIGHT DOWN
-\definecharacter UnicodeUpperHalfBlock                              {\uchar{37}{128}} %%UPPER HALF BLOCK
-\definecharacter UnicodeLowerOneEighthBlock                         {\uchar{37}{129}} %%LOWER ONE EIGHTH BLOCK
-\definecharacter UnicodeLowerOneQuarterBlock                        {\uchar{37}{130}} %%LOWER ONE QUARTER BLOCK
-\definecharacter UnicodeLowerThreeEighthsBlock                      {\uchar{37}{131}} %%LOWER THREE EIGHTHS BLOCK
-\definecharacter UnicodeLowerHalfBlock                              {\uchar{37}{132}} %%LOWER HALF BLOCK
-\definecharacter UnicodeLowerFiveEighthsBlock                       {\uchar{37}{133}} %%LOWER FIVE EIGHTHS BLOCK
-\definecharacter UnicodeLowerThreeQuartersBlock                     {\uchar{37}{134}} %%LOWER THREE QUARTERS BLOCK
-\definecharacter UnicodeLowerSevenEighthsBlock                      {\uchar{37}{135}} %%LOWER SEVEN EIGHTHS BLOCK
-\definecharacter UnicodeFullBlock                                   {\uchar{37}{136}} %%FULL BLOCK
-\definecharacter UnicodeLeftSevenEighthsBlock                       {\uchar{37}{137}} %%LEFT SEVEN EIGHTHS BLOCK
-\definecharacter UnicodeLeftThreeQuartersBlock                      {\uchar{37}{138}} %%LEFT THREE QUARTERS BLOCK
-\definecharacter UnicodeLeftFiveEighthsBlock                        {\uchar{37}{139}} %%LEFT FIVE EIGHTHS BLOCK
-\definecharacter UnicodeLeftHalfBlock                               {\uchar{37}{140}} %%LEFT HALF BLOCK
-\definecharacter UnicodeLeftThreeEighthsBlock                       {\uchar{37}{141}} %%LEFT THREE EIGHTHS BLOCK
-\definecharacter UnicodeLeftOneQuarterBlock                         {\uchar{37}{142}} %%LEFT ONE QUARTER BLOCK
-\definecharacter UnicodeLeftOneEighthBlock                          {\uchar{37}{143}} %%LEFT ONE EIGHTH BLOCK
-\definecharacter UnicodeRightHalfBlock                              {\uchar{37}{144}} %%RIGHT HALF BLOCK
-\definecharacter UnicodeLightShade                                  {\uchar{37}{145}} %%LIGHT SHADE
-\definecharacter UnicodeMediumShade                                 {\uchar{37}{146}} %%MEDIUM SHADE
-\definecharacter UnicodeDarkShade                                   {\uchar{37}{147}} %%DARK SHADE
-\definecharacter UnicodeUpperOneEighthBlock                         {\uchar{37}{148}} %%UPPER ONE EIGHTH BLOCK
-\definecharacter UnicodeRightOneEighthBlock                         {\uchar{37}{149}} %%RIGHT ONE EIGHTH BLOCK
-\definecharacter UnicodeQuadrantLowerLeft                           {\uchar{37}{150}} %%[Unassigned U+2596]
-\definecharacter UnicodeQuadrantLowerRight                          {\uchar{37}{151}} %%[Unassigned U+2597]
-\definecharacter UnicodeQuadrantUpperLeft                           {\uchar{37}{152}} %%[Unassigned U+2598]
-\definecharacter UnicodeQuadrantUpperLeftAndLowerLeftAndLowerRight  {\uchar{37}{153}} %%[Unassigned U+2599]
-\definecharacter UnicodeQuadrantUpperLeftAndLowerRight              {\uchar{37}{154}} %%[Unassigned U+259A]
-\definecharacter UnicodeQuadrantUpperLeftAndUpperRightandLowerLeft  {\uchar{37}{155}} %%[Unassigned U+259B]
-\definecharacter UnicodeQuadrantUpperLeftAndUpperRightAndLowerRight {\uchar{37}{156}} %%[Unassigned U+259C]
-\definecharacter UnicodeQuadrantUpperRight                          {\uchar{37}{157}} %%[Unassigned U+259D]
-\definecharacter UnicodeQuadrantUpperRightAndLowerLeft              {\uchar{37}{158}} %%[Unassigned U+259E]
-\definecharacter UnicodeQuadrantUpperRightAndLowerLeftAndLowerRight {\uchar{37}{159}} %%[Unassigned U+259F]
-\definecharacter UnicodeBlackSquare                                 {\uchar{37}{160}} %%BLACK SQUARE
-\definecharacter UnicodeWhiteSquare                                 {\uchar{37}{161}} %%WHITE SQUARE
-\definecharacter UnicodeWhiteSquareWithRoundedCorners               {\uchar{37}{162}} %%WHITE SQUARE WITH ROUNDED CORNERS
-\definecharacter UnicodeWhiteSquareContainingBlackSmallSquare       {\uchar{37}{163}} %%WHITE SQUARE CONTAINING BLACK SMALL SQUARE
-\definecharacter UnicodeSquareWithHorizontalFill                    {\uchar{37}{164}} %%SQUARE WITH HORIZONTAL FILL
-\definecharacter UnicodeSquareWithVerticalFill                      {\uchar{37}{165}} %%SQUARE WITH VERTICAL FILL
-\definecharacter UnicodeSquareWithOrthogonalCrosshatchFill          {\uchar{37}{166}} %%SQUARE WITH ORTHOGONAL CROSSHATCH FILL
-\definecharacter UnicodeSquareWithUpperLeftToLowerRightFill         {\uchar{37}{167}} %%SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
-\definecharacter UnicodeSquareWithUpperRightToLowerLeftFill         {\uchar{37}{168}} %%SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
-\definecharacter UnicodeSquareWithDiagonalCrosshatchFill            {\uchar{37}{169}} %%SQUARE WITH DIAGONAL CROSSHATCH FILL
-\definecharacter UnicodeBlackSmallSquare                            {\uchar{37}{170}} %%BLACK SMALL SQUARE
-\definecharacter UnicodeWhiteSmallSquare                            {\uchar{37}{171}} %%WHITE SMALL SQUARE
-\definecharacter UnicodeBlackRectangle                              {\uchar{37}{172}} %%BLACK RECTANGLE
-\definecharacter UnicodeWhiteRectangle                              {\uchar{37}{173}} %%WHITE RECTANGLE
-\definecharacter UnicodeBlackVerticalRectangle                      {\uchar{37}{174}} %%BLACK VERTICAL RECTANGLE
-\definecharacter UnicodeWhiteVerticalRectangle                      {\uchar{37}{175}} %%WHITE VERTICAL RECTANGLE
-\definecharacter UnicodeBlackParallelogram                          {\uchar{37}{176}} %%BLACK PARALLELOGRAM
-\definecharacter UnicodeWhiteParallelogram                          {\uchar{37}{177}} %%WHITE PARALLELOGRAM
-\definecharacter UnicodeBlackUpPointingTriangle                     {\uchar{37}{178}} %%BLACK UP-POINTING TRIANGLE
-\definecharacter UnicodeWhiteUpPointingTriangle                     {\uchar{37}{179}} %%WHITE UP-POINTING TRIANGLE
-\definecharacter UnicodeBlackUpPointingSmallTriangle                {\uchar{37}{180}} %%BLACK UP-POINTING SMALL TRIANGLE
-\definecharacter UnicodeWhiteUpPointingSmallTriangle                {\uchar{37}{181}} %%WHITE UP-POINTING SMALL TRIANGLE
-\definecharacter UnicodeBlackRightPointingTriangle                  {\uchar{37}{182}} %%BLACK RIGHT-POINTING TRIANGLE
-\definecharacter UnicodeWhiteRightPointingTriangle                  {\uchar{37}{183}} %%WHITE RIGHT-POINTING TRIANGLE
-\definecharacter UnicodeBlackRightPointingSmallTriangle             {\uchar{37}{184}} %%BLACK RIGHT-POINTING SMALL TRIANGLE
-\definecharacter UnicodeWhiteRightPointingSmallTriangle             {\uchar{37}{185}} %%WHITE RIGHT-POINTING SMALL TRIANGLE
-\definecharacter UnicodeBlackRightPointingPointer                   {\uchar{37}{186}} %%BLACK RIGHT-POINTING POINTER
-\definecharacter UnicodeWhiteRightPointingPointer                   {\uchar{37}{187}} %%WHITE RIGHT-POINTING POINTER
-\definecharacter UnicodeBlackDownPointingTriangle                   {\uchar{37}{188}} %%BLACK DOWN-POINTING TRIANGLE
-\definecharacter UnicodeWhiteDownPointingTriangle                   {\uchar{37}{189}} %%WHITE DOWN-POINTING TRIANGLE
-\definecharacter UnicodeBlackDownPointingSmallTriangle              {\uchar{37}{190}} %%BLACK DOWN-POINTING SMALL TRIANGLE
-\definecharacter UnicodeWhiteDownPointingSmallTriangle              {\uchar{37}{191}} %%WHITE DOWN-POINTING SMALL TRIANGLE
-\definecharacter UnicodeBlackLeftPointingTriangle                   {\uchar{37}{192}} %%BLACK LEFT-POINTING TRIANGLE
-\definecharacter UnicodeWhiteLeftPointingTriangle                   {\uchar{37}{193}} %%WHITE LEFT-POINTING TRIANGLE
-\definecharacter UnicodeBlackLeftPointingSmallTriangle              {\uchar{37}{194}} %%BLACK LEFT-POINTING SMALL TRIANGLE
-\definecharacter UnicodeWhiteLeftPointingSmallTriangle              {\uchar{37}{195}} %%WHITE LEFT-POINTING SMALL TRIANGLE
-\definecharacter UnicodeBlackLeftPointingPointer                    {\uchar{37}{196}} %%BLACK LEFT-POINTING POINTER
-\definecharacter UnicodeWhiteLeftPointingPointer                    {\uchar{37}{197}} %%WHITE LEFT-POINTING POINTER
-\definecharacter UnicodeBlackDiamond                                {\uchar{37}{198}} %%BLACK DIAMOND
-\definecharacter UnicodeWhiteDiamond                                {\uchar{37}{199}} %%WHITE DIAMOND
-\definecharacter UnicodeWhiteDiamondContainingBlackSmallDiamond     {\uchar{37}{200}} %%WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
-\definecharacter UnicodeFisheye                                     {\uchar{37}{201}} %%FISHEYE
-\definecharacter UnicodeLozenge                                     {\uchar{37}{202}} %%LOZENGE
-\definecharacter UnicodeWhiteCircle                                 {\uchar{37}{203}} %%WHITE CIRCLE
-\definecharacter UnicodeDottedCircle                                {\uchar{37}{204}} %%DOTTED CIRCLE
-\definecharacter UnicodeCircleWithVerticalFill                      {\uchar{37}{205}} %%CIRCLE WITH VERTICAL FILL
-\definecharacter UnicodeBullseye                                    {\uchar{37}{206}} %%BULLSEYE
-\definecharacter UnicodeBlackCircle                                 {\uchar{37}{207}} %%BLACK CIRCLE
-\definecharacter UnicodeCircleWithLeftHalfBlack                     {\uchar{37}{208}} %%CIRCLE WITH LEFT HALF BLACK
-\definecharacter UnicodeCircleWithRightHalfBlack                    {\uchar{37}{209}} %%CIRCLE WITH RIGHT HALF BLACK
-\definecharacter UnicodeCircleWithLowerHalfBlack                    {\uchar{37}{210}} %%CIRCLE WITH LOWER HALF BLACK
-\definecharacter UnicodeCircleWithUpperHalfBlack                    {\uchar{37}{211}} %%CIRCLE WITH UPPER HALF BLACK
-\definecharacter UnicodeCircleWithUpperRightQuadrantBlack           {\uchar{37}{212}} %%CIRCLE WITH UPPER RIGHT QUADRANT BLACK
-\definecharacter UnicodeCircleWithAllButUpperLeftQuadrantBlack      {\uchar{37}{213}} %%CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
-\definecharacter UnicodeLeftHalfBlackCircle                         {\uchar{37}{214}} %%LEFT HALF BLACK CIRCLE
-\definecharacter UnicodeRightHalfBlackCircle                        {\uchar{37}{215}} %%RIGHT HALF BLACK CIRCLE
-\definecharacter UnicodeInverseBullet                               {\uchar{37}{216}} %%INVERSE BULLET
-\definecharacter UnicodeInverseWhiteCircle                          {\uchar{37}{217}} %%INVERSE WHITE CIRCLE
-\definecharacter UnicodeUpperHalfInverseWhiteCircle                 {\uchar{37}{218}} %%UPPER HALF INVERSE WHITE CIRCLE
-\definecharacter UnicodeLowerHalfInverseWhiteCircle                 {\uchar{37}{219}} %%LOWER HALF INVERSE WHITE CIRCLE
-\definecharacter UnicodeUpperLeftQuadrantCircularArc                {\uchar{37}{220}} %%UPPER LEFT QUADRANT CIRCULAR ARC
-\definecharacter UnicodeUpperRightQuadrantCircularArc               {\uchar{37}{221}} %%UPPER RIGHT QUADRANT CIRCULAR ARC
-\definecharacter UnicodeLowerRightQuadrantCircularArc               {\uchar{37}{222}} %%LOWER RIGHT QUADRANT CIRCULAR ARC
-\definecharacter UnicodeLowerLeftQuadrantCircularArc                {\uchar{37}{223}} %%LOWER LEFT QUADRANT CIRCULAR ARC
-\definecharacter UnicodeUpperHalfCircle                             {\uchar{37}{224}} %%UPPER HALF CIRCLE
-\definecharacter UnicodeLowerHalfCircle                             {\uchar{37}{225}} %%LOWER HALF CIRCLE
-\definecharacter UnicodeBlackLowerRightTriangle                     {\uchar{37}{226}} %%BLACK LOWER RIGHT TRIANGLE
-\definecharacter UnicodeBlackLowerLeftTriangle                      {\uchar{37}{227}} %%BLACK LOWER LEFT TRIANGLE
-\definecharacter UnicodeBlackUpperLeftTriangle                      {\uchar{37}{228}} %%BLACK UPPER LEFT TRIANGLE
-\definecharacter UnicodeBlackUpperRightTriangle                     {\uchar{37}{229}} %%BLACK UPPER RIGHT TRIANGLE
-\definecharacter UnicodeWhiteBullet                                 {\uchar{37}{230}} %%WHITE BULLET
-\definecharacter UnicodeSquareWithLeftHalfBlack                     {\uchar{37}{231}} %%SQUARE WITH LEFT HALF BLACK
-\definecharacter UnicodeSquareWithRightHalfBlack                    {\uchar{37}{232}} %%SQUARE WITH RIGHT HALF BLACK
-\definecharacter UnicodeSquareWithUpperLeftDiagonalHalfBlack        {\uchar{37}{233}} %%SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
-\definecharacter UnicodeSquareWithLowerRightDiagonalHalfBlack       {\uchar{37}{234}} %%SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
-\definecharacter UnicodeWhiteSquareWithVerticalBisectingLine        {\uchar{37}{235}} %%WHITE SQUARE WITH VERTICAL BISECTING LINE
-\definecharacter UnicodeWhiteUpPointingTriangleWithDot              {\uchar{37}{236}} %%WHITE UP-POINTING TRIANGLE WITH DOT
-\definecharacter UnicodeUpPointingTriangleWithLeftHalfBlack         {\uchar{37}{237}} %%UP-POINTING TRIANGLE WITH LEFT HALF BLACK
-\definecharacter UnicodeUpPointingTriangleWithRightHalfBlack        {\uchar{37}{238}} %%UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
-\definecharacter UnicodeLargeCircle                                 {\uchar{37}{239}} %%LARGE CIRCLE
-\definecharacter UnicodeWhiteSquareWithUpperLeftQuadrant            {\uchar{37}{240}} %%WHITE SQUARE WITH UPPER LEFT QUADRANT
-\definecharacter UnicodeWhiteSquareWithLowerLeftQuadrant            {\uchar{37}{241}} %%WHITE SQUARE WITH LOWER LEFT QUADRANT
-\definecharacter UnicodeWhiteSquareWithLowerRightQuadrant           {\uchar{37}{242}} %%WHITE SQUARE WITH LOWER RIGHT QUADRANT
-\definecharacter UnicodeWhiteSquareWithUpperRightQuadrant           {\uchar{37}{243}} %%WHITE SQUARE WITH UPPER RIGHT QUADRANT
-\definecharacter UnicodeWhiteCircleWithUpperLeftQuadrant            {\uchar{37}{244}} %%WHITE CIRCLE WITH UPPER LEFT QUADRANT
-\definecharacter UnicodeWhiteCircleWithLowerLeftQuadrant            {\uchar{37}{245}} %%WHITE CIRCLE WITH LOWER LEFT QUADRANT
-\definecharacter UnicodeWhiteCircleWithLowerRightQuadrant           {\uchar{37}{246}} %%WHITE CIRCLE WITH LOWER RIGHT QUADRANT
-\definecharacter UnicodeWhiteCircleWithUpperRightQuadrant           {\uchar{37}{247}} %%WHITE CIRCLE WITH UPPER RIGHT QUADRANT
-\definecharacter UnicodeUpperLeftTriangle                           {\uchar{37}{248}} %%[Unassigned U+25F8]
-\definecharacter UnicodeUpperRightTriangle                          {\uchar{37}{249}} %%[Unassigned U+25F9]
-\definecharacter UnicodeLowerLeftTriangle                           {\uchar{37}{250}} %%[Unassigned U+25FA]
-\definecharacter UnicodeWhiteMediumSquare                           {\uchar{37}{251}} %%[Unassigned U+25FB]
-\definecharacter UnicodeBlackMediumSquare                           {\uchar{37}{252}} %%[Unassigned U+25FC]
-\definecharacter UnicodeWhiteMediumSmallSquare                      {\uchar{37}{253}} %%[Unassigned U+25FD]
-\definecharacter UnicodeBlackMediumSmallSquare                      {\uchar{37}{254}} %%[Unassigned U+25FE]
-\definecharacter UnicodeLowerRightTriangle                          {\uchar{37}{255}} %%[Unassigned U+25FF]
-
-\stopencoding
-
-\endinput
-
diff --git a/tex/context/base/enco-acc.mkii b/tex/context/base/enco-acc.mkii
new file mode 100644
index 000000000..e02536be6
--- /dev/null
+++ b/tex/context/base/enco-acc.mkii
@@ -0,0 +1,139 @@
+%D \module
+%D   [     file=enco-acc,
+%D      version=2000.20.12, % split from base file
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Composed Characters Commands,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=Hans Hagen \& Ton Otten]
+%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 Although it is technically possible to redefine the commands
+%D that are responsible for building composed characters, this
+%D is seldom needed, since they map onto named glyphs. The
+%D meaning of these names glyphs may change, although their
+%D visual appearance seldom will.
+
+\startencoding[default]
+
+\defineaccent ^ A {\Acircumflex}   \defineaccent ^ a {\acircumflex}
+\defineaccent ^ C {\Ccircumflex}   \defineaccent ^ c {\ccircumflex}
+\defineaccent ^ E {\Ecircumflex}   \defineaccent ^ e {\ecircumflex}
+\defineaccent ^ G {\Gcircumflex}   \defineaccent ^ g {\gcircumflex}
+\defineaccent ^ H {\Hcircumflex}   \defineaccent ^ h {\hcircumflex}
+\defineaccent ^ I {\Icircumflex}   \defineaccent ^ i {\icircumflex}  \defineaccent ^ {\i} {\icircumflex}
+\defineaccent ^ J {\Jcircumflex}   \defineaccent ^ j {\jcircumflex}  \defineaccent ^ {\j} {\jcircumflex}
+\defineaccent ^ O {\Ocircumflex}   \defineaccent ^ o {\ocircumflex}
+\defineaccent ^ S {\Scircumflex}   \defineaccent ^ s {\scircumflex}
+\defineaccent ^ U {\Ucircumflex}   \defineaccent ^ u {\ucircumflex}
+\defineaccent ^ W {\Wcircumflex}   \defineaccent ^ w {\wcircumflex}
+\defineaccent ^ Y {\Ycircumflex}   \defineaccent ^ y {\ycircumflex}
+
+\defineaccent ` A {\Agrave}        \defineaccent ` a {\agrave}
+\defineaccent ` E {\Egrave}        \defineaccent ` e {\egrave}
+\defineaccent ` I {\Igrave}        \defineaccent ` i {\igrave}       \defineaccent ` {\i} {\igrave}
+\defineaccent ` O {\Ograve}        \defineaccent ` o {\ograve}
+\defineaccent ` U {\Ugrave}        \defineaccent ` u {\ugrave}
+\defineaccent ` Y {\Ygrave}        \defineaccent ` y {\ygrave}
+
+\defineaccent ~ A {\Atilde}        \defineaccent ~ a {\atilde}
+\defineaccent ~ I {\Itilde}        \defineaccent ~ i {\itilde}       \defineaccent ~ {\i} {\itilde}
+\defineaccent ~ O {\Otilde}        \defineaccent ~ o {\otilde}
+\defineaccent ~ U {\Utilde}        \defineaccent ~ u {\utilde}
+
+\defineaccent " A {\Adiaeresis}    \defineaccent " a {\adiaeresis}
+\defineaccent " E {\Ediaeresis}    \defineaccent " e {\ediaeresis}
+\defineaccent " I {\Idiaeresis}    \defineaccent " i {\idiaeresis}   \defineaccent " {\i} {\idiaeresis}
+\defineaccent " O {\Odiaeresis}    \defineaccent " o {\odiaeresis}
+\defineaccent " U {\Udiaeresis}    \defineaccent " u {\udiaeresis}
+\defineaccent " Y {\Ydiaeresis}    \defineaccent " y {\ydiaeresis}
+
+\defineaccent ' A {\Aacute}        \defineaccent ' a {\aacute}
+\defineaccent ' C {\Cacute}        \defineaccent ' c {\cacute}
+\defineaccent ' E {\Eacute}        \defineaccent ' e {\eacute}
+\defineaccent ' I {\Iacute}        \defineaccent ' i {\iacute}       \defineaccent ' {\i} {\iacute}
+\defineaccent ' L {\Lacute}        \defineaccent ' l {\lacute}
+\defineaccent ' N {\Nacute}        \defineaccent ' n {\nacute}
+\defineaccent ' O {\Oacute}        \defineaccent ' o {\oacute}
+\defineaccent ' R {\Racute}        \defineaccent ' r {\racute}
+\defineaccent ' S {\Sacute}        \defineaccent ' s {\sacute}
+\defineaccent ' U {\Uacute}        \defineaccent ' u {\uacute}
+\defineaccent ' Y {\Yacute}        \defineaccent ' y {\yacute}
+\defineaccent ' Z {\Zacute}        \defineaccent ' z {\zacute}
+
+\defineaccent . C {\Cdotaccent}    \defineaccent . c {\cdotaccent}
+\defineaccent . E {\Edotaccent}    \defineaccent . e {\edotaccent}
+\defineaccent . G {\Gdotaccent}    \defineaccent . g {\gdotaccent}
+\defineaccent . I {\Idotaccent}    \defineaccent . i {\idotaccent}   \defineaccent . {\i} {\idotaccent}
+\defineaccent . Z {\Zdotaccent}    \defineaccent . z {\zdotaccent}
+
+\defineaccent = A {\Amacron}       \defineaccent = a {\amacron}
+\defineaccent = E {\Emacron}       \defineaccent = e {\emacron}
+\defineaccent = I {\Imacron}       \defineaccent = i {\imacron}      \defineaccent = {\i} {\imacron}
+\defineaccent = O {\Omacron}       \defineaccent = o {\omacron}
+\defineaccent = U {\Umacron}       \defineaccent = u {\umacron}
+
+\defineaccent c C {\Ccedilla}      \defineaccent c c {\ccedilla}
+\defineaccent c K {\Kcedilla}      \defineaccent c k {\kcedilla}
+\defineaccent c L {\Lcedilla}      \defineaccent c l {\lcedilla}
+\defineaccent c N {\Ncedilla}      \defineaccent c n {\ncedilla}
+\defineaccent c R {\Rcedilla}      \defineaccent c r {\rcedilla}
+\defineaccent c S {\Scedilla}      \defineaccent c s {\scedilla}
+\defineaccent c T {\Tcedilla}      \defineaccent c t {\tcedilla}
+
+\defineaccent H O {\Ohungarumlaut} \defineaccent H o {\ohungarumlaut}
+\defineaccent H u {\uhungarumlaut} \defineaccent H U {\Uhungarumlaut}
+
+\defineaccent k A {\Aogonek}       \defineaccent k a {\aogonek}
+\defineaccent k E {\Eogonek}       \defineaccent k e {\eogonek}
+\defineaccent k I {\Iogonek}       \defineaccent k i {\iogonek}
+\defineaccent k U {\Uogonek}       \defineaccent k u {\uogonek}
+
+\defineaccent r A {\Aring}         \defineaccent r a {\aring}
+\defineaccent r U {\Uring}         \defineaccent r u {\uring}
+
+\defineaccent u A {\Abreve}        \defineaccent u a {\abreve}
+\defineaccent u E {\Ebreve}        \defineaccent u e {\ebreve}
+\defineaccent u G {\Gbreve}        \defineaccent u g {\gbreve}
+\defineaccent u I {\Ibreve}        \defineaccent u i {\ibreve}       \defineaccent u {\i} {\ibreve}
+\defineaccent u O {\Obreve}        \defineaccent u o {\obreve}
+\defineaccent u U {\Ubreve}        \defineaccent u u {\ubreve}
+
+\defineaccent v C {\Ccaron}        \defineaccent v c {\ccaron}
+\defineaccent v D {\Dcaron}        \defineaccent v d {\dcaron}
+\defineaccent v E {\Ecaron}        \defineaccent v e {\ecaron}
+\defineaccent v L {\Lcaron}        \defineaccent v l {\lcaron}
+\defineaccent v N {\Ncaron}        \defineaccent v n {\ncaron}
+\defineaccent v R {\Rcaron}        \defineaccent v r {\rcaron}
+\defineaccent v S {\Scaron}        \defineaccent v s {\scaron}
+\defineaccent v T {\Tcaron}        \defineaccent v t {\tcaron}
+\defineaccent v Z {\Zcaron}        \defineaccent v z {\zcaron}
+
+\stopencoding
+
+\startencoding[default]
+
+% vietnamese: if needed, \useencoding[enco-vna]
+
+\stopencoding
+
+% For Tobias Burnus, who wants:
+%
+% \starttypen
+% \setupinteraction[state=start]
+% \setupinteractionscreen[option=bookmark]
+% \placebookmarks[chapter]
+%
+% \starttext \chapter{F\"ur Na\"ive und Na\"\i ve} \stoptext
+% \stoptypen
+
+\startencoding[default]
+
+  \defineaccent " {\i} {\idiaeresis}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-acc.tex b/tex/context/base/enco-acc.tex
deleted file mode 100644
index e02536be6..000000000
--- a/tex/context/base/enco-acc.tex
+++ /dev/null
@@ -1,139 +0,0 @@
-%D \module
-%D   [     file=enco-acc,
-%D      version=2000.20.12, % split from base file
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Composed Characters Commands,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=Hans Hagen \& Ton Otten]
-%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 Although it is technically possible to redefine the commands
-%D that are responsible for building composed characters, this
-%D is seldom needed, since they map onto named glyphs. The
-%D meaning of these names glyphs may change, although their
-%D visual appearance seldom will.
-
-\startencoding[default]
-
-\defineaccent ^ A {\Acircumflex}   \defineaccent ^ a {\acircumflex}
-\defineaccent ^ C {\Ccircumflex}   \defineaccent ^ c {\ccircumflex}
-\defineaccent ^ E {\Ecircumflex}   \defineaccent ^ e {\ecircumflex}
-\defineaccent ^ G {\Gcircumflex}   \defineaccent ^ g {\gcircumflex}
-\defineaccent ^ H {\Hcircumflex}   \defineaccent ^ h {\hcircumflex}
-\defineaccent ^ I {\Icircumflex}   \defineaccent ^ i {\icircumflex}  \defineaccent ^ {\i} {\icircumflex}
-\defineaccent ^ J {\Jcircumflex}   \defineaccent ^ j {\jcircumflex}  \defineaccent ^ {\j} {\jcircumflex}
-\defineaccent ^ O {\Ocircumflex}   \defineaccent ^ o {\ocircumflex}
-\defineaccent ^ S {\Scircumflex}   \defineaccent ^ s {\scircumflex}
-\defineaccent ^ U {\Ucircumflex}   \defineaccent ^ u {\ucircumflex}
-\defineaccent ^ W {\Wcircumflex}   \defineaccent ^ w {\wcircumflex}
-\defineaccent ^ Y {\Ycircumflex}   \defineaccent ^ y {\ycircumflex}
-
-\defineaccent ` A {\Agrave}        \defineaccent ` a {\agrave}
-\defineaccent ` E {\Egrave}        \defineaccent ` e {\egrave}
-\defineaccent ` I {\Igrave}        \defineaccent ` i {\igrave}       \defineaccent ` {\i} {\igrave}
-\defineaccent ` O {\Ograve}        \defineaccent ` o {\ograve}
-\defineaccent ` U {\Ugrave}        \defineaccent ` u {\ugrave}
-\defineaccent ` Y {\Ygrave}        \defineaccent ` y {\ygrave}
-
-\defineaccent ~ A {\Atilde}        \defineaccent ~ a {\atilde}
-\defineaccent ~ I {\Itilde}        \defineaccent ~ i {\itilde}       \defineaccent ~ {\i} {\itilde}
-\defineaccent ~ O {\Otilde}        \defineaccent ~ o {\otilde}
-\defineaccent ~ U {\Utilde}        \defineaccent ~ u {\utilde}
-
-\defineaccent " A {\Adiaeresis}    \defineaccent " a {\adiaeresis}
-\defineaccent " E {\Ediaeresis}    \defineaccent " e {\ediaeresis}
-\defineaccent " I {\Idiaeresis}    \defineaccent " i {\idiaeresis}   \defineaccent " {\i} {\idiaeresis}
-\defineaccent " O {\Odiaeresis}    \defineaccent " o {\odiaeresis}
-\defineaccent " U {\Udiaeresis}    \defineaccent " u {\udiaeresis}
-\defineaccent " Y {\Ydiaeresis}    \defineaccent " y {\ydiaeresis}
-
-\defineaccent ' A {\Aacute}        \defineaccent ' a {\aacute}
-\defineaccent ' C {\Cacute}        \defineaccent ' c {\cacute}
-\defineaccent ' E {\Eacute}        \defineaccent ' e {\eacute}
-\defineaccent ' I {\Iacute}        \defineaccent ' i {\iacute}       \defineaccent ' {\i} {\iacute}
-\defineaccent ' L {\Lacute}        \defineaccent ' l {\lacute}
-\defineaccent ' N {\Nacute}        \defineaccent ' n {\nacute}
-\defineaccent ' O {\Oacute}        \defineaccent ' o {\oacute}
-\defineaccent ' R {\Racute}        \defineaccent ' r {\racute}
-\defineaccent ' S {\Sacute}        \defineaccent ' s {\sacute}
-\defineaccent ' U {\Uacute}        \defineaccent ' u {\uacute}
-\defineaccent ' Y {\Yacute}        \defineaccent ' y {\yacute}
-\defineaccent ' Z {\Zacute}        \defineaccent ' z {\zacute}
-
-\defineaccent . C {\Cdotaccent}    \defineaccent . c {\cdotaccent}
-\defineaccent . E {\Edotaccent}    \defineaccent . e {\edotaccent}
-\defineaccent . G {\Gdotaccent}    \defineaccent . g {\gdotaccent}
-\defineaccent . I {\Idotaccent}    \defineaccent . i {\idotaccent}   \defineaccent . {\i} {\idotaccent}
-\defineaccent . Z {\Zdotaccent}    \defineaccent . z {\zdotaccent}
-
-\defineaccent = A {\Amacron}       \defineaccent = a {\amacron}
-\defineaccent = E {\Emacron}       \defineaccent = e {\emacron}
-\defineaccent = I {\Imacron}       \defineaccent = i {\imacron}      \defineaccent = {\i} {\imacron}
-\defineaccent = O {\Omacron}       \defineaccent = o {\omacron}
-\defineaccent = U {\Umacron}       \defineaccent = u {\umacron}
-
-\defineaccent c C {\Ccedilla}      \defineaccent c c {\ccedilla}
-\defineaccent c K {\Kcedilla}      \defineaccent c k {\kcedilla}
-\defineaccent c L {\Lcedilla}      \defineaccent c l {\lcedilla}
-\defineaccent c N {\Ncedilla}      \defineaccent c n {\ncedilla}
-\defineaccent c R {\Rcedilla}      \defineaccent c r {\rcedilla}
-\defineaccent c S {\Scedilla}      \defineaccent c s {\scedilla}
-\defineaccent c T {\Tcedilla}      \defineaccent c t {\tcedilla}
-
-\defineaccent H O {\Ohungarumlaut} \defineaccent H o {\ohungarumlaut}
-\defineaccent H u {\uhungarumlaut} \defineaccent H U {\Uhungarumlaut}
-
-\defineaccent k A {\Aogonek}       \defineaccent k a {\aogonek}
-\defineaccent k E {\Eogonek}       \defineaccent k e {\eogonek}
-\defineaccent k I {\Iogonek}       \defineaccent k i {\iogonek}
-\defineaccent k U {\Uogonek}       \defineaccent k u {\uogonek}
-
-\defineaccent r A {\Aring}         \defineaccent r a {\aring}
-\defineaccent r U {\Uring}         \defineaccent r u {\uring}
-
-\defineaccent u A {\Abreve}        \defineaccent u a {\abreve}
-\defineaccent u E {\Ebreve}        \defineaccent u e {\ebreve}
-\defineaccent u G {\Gbreve}        \defineaccent u g {\gbreve}
-\defineaccent u I {\Ibreve}        \defineaccent u i {\ibreve}       \defineaccent u {\i} {\ibreve}
-\defineaccent u O {\Obreve}        \defineaccent u o {\obreve}
-\defineaccent u U {\Ubreve}        \defineaccent u u {\ubreve}
-
-\defineaccent v C {\Ccaron}        \defineaccent v c {\ccaron}
-\defineaccent v D {\Dcaron}        \defineaccent v d {\dcaron}
-\defineaccent v E {\Ecaron}        \defineaccent v e {\ecaron}
-\defineaccent v L {\Lcaron}        \defineaccent v l {\lcaron}
-\defineaccent v N {\Ncaron}        \defineaccent v n {\ncaron}
-\defineaccent v R {\Rcaron}        \defineaccent v r {\rcaron}
-\defineaccent v S {\Scaron}        \defineaccent v s {\scaron}
-\defineaccent v T {\Tcaron}        \defineaccent v t {\tcaron}
-\defineaccent v Z {\Zcaron}        \defineaccent v z {\zcaron}
-
-\stopencoding
-
-\startencoding[default]
-
-% vietnamese: if needed, \useencoding[enco-vna]
-
-\stopencoding
-
-% For Tobias Burnus, who wants:
-%
-% \starttypen
-% \setupinteraction[state=start]
-% \setupinteractionscreen[option=bookmark]
-% \placebookmarks[chapter]
-%
-% \starttext \chapter{F\"ur Na\"ive und Na\"\i ve} \stoptext
-% \stoptypen
-
-\startencoding[default]
-
-  \defineaccent " {\i} {\idiaeresis}
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-agr.mkii b/tex/context/base/enco-agr.mkii
new file mode 100644
index 000000000..cfd86dfd3
--- /dev/null
+++ b/tex/context/base/enco-agr.mkii
@@ -0,0 +1,364 @@
+%D \module
+%D   [       file=enco-agr,
+%D        version=2005.02.20,
+%D          title=\CONTEXT\ \UNICODE\ Macros,
+%D       subtitle=Ancient Greek,
+%D         author=Thomas A. Schmitz,
+%D           date=\currentdate]
+
+\startmapping[agr]
+
+    \definecasemaps 13 to  64 lc   0 uc 0
+    \definecasemaps 65 to  66 lc +32 uc 0
+    \definecasemaps 67 to  67 lc   0 uc 0
+    \definecasemaps 68 to  85 lc +32 uc 0
+    \definecasemaps 86 to  86 lc   0 uc 0
+    \definecasemaps 87 to  90 lc +32 uc 0
+    \definecasemaps 91 to 255 lc   0 uc 0
+
+\stopmapping
+
+\startencoding[agr]
+
+\definecharacter greeksigmalunate                    1
+\definecharacter endash                              2
+\definecharacter emdash                              3
+\definecharacter apostrophe                          4
+\definecharacter greekaltbeta                        5
+\definecharacter epih                                6
+
+\definecharacter textbraceleft                       8
+\definecharacter textbraceright                      9
+\definecharacter textbreve                          10
+
+\definecharacter greekSigmalunate                   13
+\definecharacter greekIotadialytika                 14
+\definecharacter greekUpsilondialytika              15
+
+\definecharacter greekepsilonperispomeni            18
+\definecharacter greekomicronperispomeni            19
+\definecharacter greekepsilondasiaperispomeni       20
+\definecharacter greekomicrondasiaperispomeni       21
+\definecharacter greekepsilonpsiliperispomeni       22
+\definecharacter greekomicronpsiliperispomeni       23
+\definecharacter greekiotadialytikaperispomeni      24
+\definecharacter greekupsilondialytikaperispomeni   25
+\definecharacter greekdialytikaperispomeni          26
+
+\definecharacter textbottomdot                      33
+\definecharacter greeksampi                         34
+\definecharacter greekdigamma                       35
+\definecharacter greekstigma                        36
+\definecharacter greeknumkoppa                      37
+\definecharacter greekkoppa                         38
+\definecharacter guilsingleright                    39
+
+\definecharacter textdag                            43
+
+\definecharacter greekoxia                          47
+
+\definecharacter greekanoteleia  	                59
+\definecharacter greekdasia                         60
+
+\definecharacter greekpsili                         62
+\definecharacter greekquestionmark                  63
+\definecharacter dialytika                          64
+\definecharacter greekAlpha                         65
+\definecharacter greekBeta                          66
+\definecharacter greekomegaiotasub                  67
+\definecharacter greekDelta                         68
+\definecharacter greekEpsilon                       69
+\definecharacter greekPhi                           70
+\definecharacter greekGamma                         71
+\definecharacter greekEta                           72
+\definecharacter greekIota                          73
+\definecharacter greekTheta                         74
+\definecharacter greekKappa                         75
+\definecharacter greekLambda                        76
+\definecharacter greekMu                            77
+\definecharacter greekNu                            78
+\definecharacter greekOmicron                       79
+\definecharacter greekPi                            80
+\definecharacter greekChi                           81
+\definecharacter greekRho                           82
+\definecharacter greekSigma                         83
+\definecharacter greekTau                           84
+\definecharacter greekUpsilon                       85
+\definecharacter greeketaiotasub                    86
+\definecharacter greekOmega                         87
+\definecharacter greekXi                            88
+\definecharacter greekPsi                           89
+\definecharacter greekZeta                          90
+\definecharacter bracketleft                        91
+\definecharacter greekvaria                         92
+\definecharacter bracketright                       93
+\definecharacter greekperispomeni                   94
+
+\definecharacter guilsingleleft                     96
+
+% the above is a quote character
+\definecharacter greekalpha                         97
+\definecharacter greekbeta                          98
+\definecharacter greekfinalsigma                    99
+\definecharacter greekdelta                        100
+\definecharacter greekepsilon                      101
+\definecharacter greekphi                          102
+\definecharacter greekgamma                        103
+\definecharacter greeketa                          104
+\definecharacter greekiota                         105
+\definecharacter greektheta                        106
+\definecharacter greekkappa                        107
+\definecharacter greeklambda                       108
+\definecharacter greekmu                           109
+\definecharacter greeknu                           110
+\definecharacter greekomicron                      111
+\definecharacter greekpi                           112
+\definecharacter greekchi                          113
+\definecharacter greekrho                          114
+\definecharacter greeksigma                        115
+\definecharacter greektau                          116
+\definecharacter greekupsilon                      117
+\definecharacter greekalphaiotasub                 118
+\definecharacter greekomega                        119
+\definecharacter greekxi                           120
+\definecharacter greekpsi                          121
+\definecharacter greekzeta                         122
+\definecharacter floorleft                         123
+\definecharacter textbar                           124
+\definecharacter floorright                        125
+\definecharacter greekperispomeni                  126
+
+\definecharacter quotedblleft                      128
+\definecharacter quotedblright                     129
+\definecharacter exclam                            130
+\definecharacter greekiotadasia                    131
+\definecharacter greekiotapsili                    132
+\definecharacter greekiotaoxia                     133
+\definecharacter greekiotadasiatonos               134
+\definecharacter greekiotapsilitonos               135
+\definecharacter greekiotavaria                    136
+\definecharacter greekiotadasiavaria               137
+\definecharacter greekiotapsilivaria               138
+\definecharacter greekiotaperispomeni              139
+\definecharacter greekiotadasiaperispomeni         140
+\definecharacter greekiotapsiliperispomeni         141
+\definecharacter greekiotadialytika                142
+\definecharacter greekiotadialytikatonos           143
+\definecharacter greekiotadialytikavaria           144
+\definecharacter greekdasiaperispomeni             145
+\definecharacter greekpsiliperispomeni             146
+\definecharacter greekdasiatonos                   147
+\definecharacter greekpsilitonos                   148
+\definecharacter greekdasiavaria                   149
+\definecharacter greekpsilivaria                   150
+\definecharacter greekdialytikatonos               151
+\definecharacter greekepsilondasia                 152
+\definecharacter greekepsilonpsili                 153
+\definecharacter greekepsilonoxia                  154
+\definecharacter greekepsilondasiatonos            155
+\definecharacter greekepsilonpsilitonos            156
+\definecharacter greekepsilonvaria                 157
+\definecharacter greekepsilondasiavaria            158
+\definecharacter greekepsilonpsilivaria            159
+\definecharacter greekdialytikavaria	           160
+\definecharacter greekalphadasia                   161
+\definecharacter greekalphapsili                   162
+\definecharacter greekalphaoxia                    163
+\definecharacter greekalphadasiatonos              164
+\definecharacter greekalphapsilitonos              165
+\definecharacter greekalphavaria                   166
+\definecharacter greekalphadasiavaria              167
+\definecharacter greekalphapsilivaria              168
+\definecharacter greekalphaperispomeni             169
+\definecharacter greekalphadasiaperispomeni        170
+\definecharacter greekalphapsiliperispomeni        171
+\definecharacter greekalphaiotasubdasia            172
+\definecharacter greekalphaiotasubpsili            173
+\definecharacter greekalphaiotasubtonos            174
+\definecharacter greekalphaiotasubdasiatonos       175
+\definecharacter greekalphaiotasubpsilitonos       176
+\definecharacter greekalphaiotasubvaria            177
+\definecharacter greekalphaiotasubdasiavaria       178
+\definecharacter greekalphaiotasubpsilivaria       179
+\definecharacter greekalphaiotasubperispomeni      180
+\definecharacter greekalphaiotasubdasiaperispomeni 181
+\definecharacter greekalphaiotasubpsiliperispomeni 182
+\definecharacter greekrhodasia                     183
+\definecharacter greekrhopsili                     184
+\definecharacter greeketadasia                     185
+\definecharacter greeketapsili                     186
+\definecharacter greeketaoxia                      187
+\definecharacter greeketadasiatonos                188
+\definecharacter greeketapsilitonos                189
+\definecharacter greeketavaria                     190
+\definecharacter greeketadasiavaria                191
+\definecharacter greeketapsilivaria                192
+\definecharacter greeketaperispomeni               193
+\definecharacter greeketadasiaperispomeni          194
+\definecharacter greeketapsiliperispomeni          195
+\definecharacter textslash                         196
+\definecharacter greeketaiotasubdasia              197
+\definecharacter greeketaiotasubpsili              198
+\definecharacter greeketaiotasubtonos              199
+\definecharacter greeketaiotasubdasiatonos         200
+\definecharacter greeketaiotasubpsilitonos         201
+\definecharacter greeketaiotasubvaria              202
+\definecharacter greeketaiotasubdasiavaria         203
+\definecharacter greeketaiotasubpsilivaria         204
+\definecharacter greeketaiotasubperispomeni        205
+\definecharacter greeketaiotasubdasiaperispomeni   206
+\definecharacter greeketaiotasubpsiliperispomeni   207
+\definecharacter greekomicrondasia                 208
+\definecharacter greekomicronpsili                 209
+\definecharacter greekomicronoxia                  210
+\definecharacter greekomicrondasiatonos            211
+\definecharacter greekomicronpsilitonos            212
+\definecharacter greekomicronvaria                 213
+\definecharacter greekomicrondasiavaria            214
+\definecharacter greekomicronpsilivaria            215
+\definecharacter greekupsilondasia                 216
+\definecharacter greekupsilonpsili                 217
+\definecharacter greekupsilonoxia                  218
+\definecharacter greekupsilondasiatonos            219
+\definecharacter greekupsilonpsilitonos            220
+\definecharacter greekupsilonvaria                 221
+\definecharacter greekupsilondasiavaria            222
+\definecharacter greekupsilonpsilivaria            223
+\definecharacter greekupsilonperispomeni           224
+\definecharacter greekupsilondasiaperispomeni      225
+\definecharacter greekupsilonpsiliperispomeni      226
+\definecharacter greekupsilondiaeresis             227
+\definecharacter greekupsilondialytikatonos        228
+\definecharacter greekupsilondialytikavaria        229
+\definecharacter greekomegadasia                   230
+\definecharacter greekomegapsili                   231
+\definecharacter greekomegaoxia                    232
+\definecharacter greekomegadasiatonos              233
+\definecharacter greekomegapsilitonos              234
+\definecharacter greekomegavaria                   235
+\definecharacter greekomegadasiavaria              236
+\definecharacter greekomegapsilivaria              237
+\definecharacter greekomegaperispomeni             238
+\definecharacter greekomegadasiaperispomeni        239
+\definecharacter greekomegapsiliperispomeni        240
+\definecharacter greekomegaiotasubdasia            241
+\definecharacter greekomegaiotasubpsili            242
+\definecharacter greekomegaiotasubtonos            243
+\definecharacter greekomegaiotasubdasiatonos       244
+\definecharacter greekomegaiotasubpsilitonos       245
+\definecharacter greekomegaiotasubvaria            246
+\definecharacter greekomegaiotasubdasiavaria       247
+\definecharacter greekomegaiotasubpsilivaria       248
+\definecharacter greekomegaiotasubperispomeni      249
+\definecharacter greekomegaiotasubdasiaperispomeni 250
+\definecharacter greekomegaiotasubpsiliperispomeni 251
+\definecharacter greeknumeralsign                  254
+\definecharacter greeknumeralsignlower             255
+
+\stopencoding
+
+\startencoding[default]
+
+\definecharacter greekAlphapsili                   {\greekpsili \greekAlpha}
+\definecharacter greekAlphadasia                   {\greekdasia \greekAlpha}
+\definecharacter greekAlphapsilivaria              {\greekpsilivaria \greekAlpha}
+\definecharacter greekAlphadasiavaria              {\greekdasiavaria \greekAlpha}
+\definecharacter greekAlphapsilitonos              {\greekpsilitonos \greekAlpha}
+\definecharacter greekAlphadasiatonos              {\greekdasiatonos \greekAlpha}
+\definecharacter greekAlphapsiliperispomeni        {\greekpsiliperispomeni \greekAlpha}
+\definecharacter greekAlphadasiaperispomeni        {\greekdasiaperispomeni \greekAlpha}
+\definecharacter greekEpsilonpsili                 {\greekpsili \greekEpsilon}
+\definecharacter greekEpsilondasia                 {\greekdasia \greekEpsilon}
+\definecharacter greekEpsilonpsilivaria            {\greekpsilivaria \greekEpsilon}
+\definecharacter greekEpsilondasiavaria            {\greekdasiavaria \greekEpsilon}
+\definecharacter greekEpsilonpsilitonos            {\greekpsilitonos \greekEpsilon}
+\definecharacter greekEpsilondasiatonos            {\greekdasiatonos \greekEpsilon}
+\definecharacter greekEtapsili                     {\greekpsili \greekEta}
+\definecharacter greekEtadasia                     {\greekdasia \greekEta}
+\definecharacter greekEtapsilivaria                {\greekpsilivaria \greekEta}
+\definecharacter greekEtadasiavaria                {\greekdasiavaria \greekEta}
+\definecharacter greekEtapsilitonos                {\greekpsilitonos \greekEta}
+\definecharacter greekEtadasiatonos                {\greekdasiatonos \greekEta}
+\definecharacter greekEtapsiliperispomeni          {\greekpsiliperispomeni \greekEta}
+\definecharacter greekEtadasiaperispomeni          {\greekdasiaperispomeni \greekEta}
+\definecharacter greekIotapsili                    {\greekpsili \greekIota}
+\definecharacter greekIotadasia                    {\greekdasia \greekIota}
+\definecharacter greekIotapsilivaria               {\greekpsilivaria \greekIota}
+\definecharacter greekIotadasiavaria               {\greekdasiavaria \greekIota}
+\definecharacter greekIotapsilitonos               {\greekpsilitonos \greekIota}
+\definecharacter greekIotadasiatonos               {\greekdasiatonos \greekIota}
+\definecharacter greekIotapsiliperispomeni         {\greekpsiliperispomeni \greekIota}
+\definecharacter greekIotadasiaperispomeni         {\greekdasiaperispomeni \greekIota}
+\definecharacter greekOmicronpsili                 {\greekpsili \greekOmicron}
+\definecharacter greekOmicrondasia                 {\greekdasia \greekOmicron}
+\definecharacter greekOmicronpsilivaria            {\greekpsilivaria \greekOmicron}
+\definecharacter greekOmicrondasiavaria            {\greekdasiavaria \greekOmicron}
+\definecharacter greekOmicronpsilitonos            {\greekpsilitonos \greekOmicron}
+\definecharacter greekOmicrondasiatonos            {\greekdasiatonos \greekOmicron}
+\definecharacter greekUpsilondasia                 {\greekdasia \greekUpsilon}
+\definecharacter greekUpsilondasiavaria            {\greekdasiavaria \greekUpsilon}
+\definecharacter greekUpsilondasiatonos            {\greekdasiatonos \greekUpsilon}
+\definecharacter greekUpsilondasiaperispomeni      {\greekdasiaperispomeni \greekUpsilon}
+\definecharacter greekOmegapsili                   {\greekpsili \greekOmega}
+\definecharacter greekOmegadasia                   {\greekdasia \greekOmega}
+\definecharacter greekOmegapsilivaria              {\greekpsilivaria \greekOmega}
+\definecharacter greekOmegadasiavaria              {\greekdasiavaria \greekOmega}
+\definecharacter greekOmegapsilitonos              {\greekpsilitonos \greekOmega}
+\definecharacter greekOmegadasiatonos              {\greekdasiatonos \greekOmega}
+\definecharacter greekOmegapsiliperispomeni        {\greekpsiliperispomeni \greekOmega}
+\definecharacter greekOmegadasiaperispomeni        {\greekdasiaperispomeni \greekOmega}
+\definecharacter greekAlphaiotasubpsili            {\greekpsili \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubdasia            {\greekdasia \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubpsilivaria       {\greekpsilivaria \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubdasiavaria       {\greekdasiavaria \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubpsilitonos       {\greekpsilitonos \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubdasiatonos       {\greekdasiatonos \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubpsiliperispomeni {\greekpsiliperispomeni \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubdasiaperispomeni {\greekdasiaperispomeni \greekAlpha \greekiota}
+\definecharacter greekEtaiotasubpsili              {\greekpsili \greekEta \greekiota}
+\definecharacter greekEtaiotasubdasia              {\greekdasia \greekEta \greekiota}
+\definecharacter greekEtaiotasubpsilivaria         {\greekpsilivaria \greekEta \greekiota}
+\definecharacter greekEtaiotasubdasiavaria         {\greekdasiavaria \greekEta \greekiota}
+\definecharacter greekEtaiotasubpsilitonos         {\greekpsilitonos \greekEta \greekiota}
+\definecharacter greekEtaiotasubdasiatonos         {\greekdasiatonos \greekEta \greekiota}
+\definecharacter greekEtaiotasubpsiliperispomeni   {\greekpsiliperispomeni \greekEta \greekiota}
+\definecharacter greekEtaiotasubdasiaperispomeni   {\greekdasiaperispomeni \greekEta \greekiota}
+\definecharacter greekOmegaiotasubpsili            {\greekpsili \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubdasia            {\greekdasia \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubpsilivaria       {\greekpsilivaria \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubdasiavaria       {\greekdasiavaria \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubpsilitonos       {\greekpsilitonos \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubdasiatonos       {\greekdasiatonos \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubpsiliperispomeni {\greekpsiliperispomeni \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubdasiaperispomeni {\greekdasiaperispomeni \greekOmega \greekiota}
+\definecharacter greekAlphavaria                   {\greekvaria \greekAlpha}
+\definecharacter greekAlphaoxia                    {\greekoxia \greekAlpha}
+\definecharacter greekAlphaiotasub                 {\greekAlpha \greekiota}
+\definecharacter greekEpsilonvaria                 {\greekvaria \greekEpsilon}
+\definecharacter greekEpsilonoxia                  {\greekoxia \greekEpsilon}
+\definecharacter greekEtavaria                     {\greekvaria \greekEta}
+\definecharacter greekEtaoxia                      {\greekoxia \greekEta}
+\definecharacter greekEtaiotasub                   {\greekEta \greekiota}
+\definecharacter greekIotavaria                    {\greekvaria \greekIota}
+\definecharacter greekIotaoxia                     {\greekoxia \greekIota}
+\definecharacter greekUpsilonvaria                 {\greekvaria \greekUpsilon}
+\definecharacter greekUpsilonoxia                  {\greekoxia \greekUpsilon}
+\definecharacter greekOmicronvaria                 {\greekvaria \greekOmicron}
+\definecharacter greekOmicronoxia                  {\greekoxia \greekOmicron}
+\definecharacter greekOmegavaria                   {\greekvaria \greekOmega}
+\definecharacter greekOmegaoxia                    {\greekoxia \greekOmega}
+\definecharacter greekOmegaiotasub                 {\greekOmega \greekiota}
+\definecharacter greekRhodasia                     {\greekdasia \greekRho}
+\definecharacter digamma                           {\greekdigamma}
+\definecharacter sampi                             {\greeksampi}
+\definecharacter stigma                            {\greekstigma}
+\definecharacter koppa                             {\greeknumkoppa}
+\definecharacter lunars                            {\greeksigmalunate}
+\definecharacter lunarS                            {\greekSigmalunate}
+\definecharacter halfbraceleft                     {\floorleft}
+\definecharacter halfbraceright                    {\floorright}
+\definecharacter crux                              {\textdag}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-agr.tex b/tex/context/base/enco-agr.tex
deleted file mode 100644
index cfd86dfd3..000000000
--- a/tex/context/base/enco-agr.tex
+++ /dev/null
@@ -1,364 +0,0 @@
-%D \module
-%D   [       file=enco-agr,
-%D        version=2005.02.20,
-%D          title=\CONTEXT\ \UNICODE\ Macros,
-%D       subtitle=Ancient Greek,
-%D         author=Thomas A. Schmitz,
-%D           date=\currentdate]
-
-\startmapping[agr]
-
-    \definecasemaps 13 to  64 lc   0 uc 0
-    \definecasemaps 65 to  66 lc +32 uc 0
-    \definecasemaps 67 to  67 lc   0 uc 0
-    \definecasemaps 68 to  85 lc +32 uc 0
-    \definecasemaps 86 to  86 lc   0 uc 0
-    \definecasemaps 87 to  90 lc +32 uc 0
-    \definecasemaps 91 to 255 lc   0 uc 0
-
-\stopmapping
-
-\startencoding[agr]
-
-\definecharacter greeksigmalunate                    1
-\definecharacter endash                              2
-\definecharacter emdash                              3
-\definecharacter apostrophe                          4
-\definecharacter greekaltbeta                        5
-\definecharacter epih                                6
-
-\definecharacter textbraceleft                       8
-\definecharacter textbraceright                      9
-\definecharacter textbreve                          10
-
-\definecharacter greekSigmalunate                   13
-\definecharacter greekIotadialytika                 14
-\definecharacter greekUpsilondialytika              15
-
-\definecharacter greekepsilonperispomeni            18
-\definecharacter greekomicronperispomeni            19
-\definecharacter greekepsilondasiaperispomeni       20
-\definecharacter greekomicrondasiaperispomeni       21
-\definecharacter greekepsilonpsiliperispomeni       22
-\definecharacter greekomicronpsiliperispomeni       23
-\definecharacter greekiotadialytikaperispomeni      24
-\definecharacter greekupsilondialytikaperispomeni   25
-\definecharacter greekdialytikaperispomeni          26
-
-\definecharacter textbottomdot                      33
-\definecharacter greeksampi                         34
-\definecharacter greekdigamma                       35
-\definecharacter greekstigma                        36
-\definecharacter greeknumkoppa                      37
-\definecharacter greekkoppa                         38
-\definecharacter guilsingleright                    39
-
-\definecharacter textdag                            43
-
-\definecharacter greekoxia                          47
-
-\definecharacter greekanoteleia  	                59
-\definecharacter greekdasia                         60
-
-\definecharacter greekpsili                         62
-\definecharacter greekquestionmark                  63
-\definecharacter dialytika                          64
-\definecharacter greekAlpha                         65
-\definecharacter greekBeta                          66
-\definecharacter greekomegaiotasub                  67
-\definecharacter greekDelta                         68
-\definecharacter greekEpsilon                       69
-\definecharacter greekPhi                           70
-\definecharacter greekGamma                         71
-\definecharacter greekEta                           72
-\definecharacter greekIota                          73
-\definecharacter greekTheta                         74
-\definecharacter greekKappa                         75
-\definecharacter greekLambda                        76
-\definecharacter greekMu                            77
-\definecharacter greekNu                            78
-\definecharacter greekOmicron                       79
-\definecharacter greekPi                            80
-\definecharacter greekChi                           81
-\definecharacter greekRho                           82
-\definecharacter greekSigma                         83
-\definecharacter greekTau                           84
-\definecharacter greekUpsilon                       85
-\definecharacter greeketaiotasub                    86
-\definecharacter greekOmega                         87
-\definecharacter greekXi                            88
-\definecharacter greekPsi                           89
-\definecharacter greekZeta                          90
-\definecharacter bracketleft                        91
-\definecharacter greekvaria                         92
-\definecharacter bracketright                       93
-\definecharacter greekperispomeni                   94
-
-\definecharacter guilsingleleft                     96
-
-% the above is a quote character
-\definecharacter greekalpha                         97
-\definecharacter greekbeta                          98
-\definecharacter greekfinalsigma                    99
-\definecharacter greekdelta                        100
-\definecharacter greekepsilon                      101
-\definecharacter greekphi                          102
-\definecharacter greekgamma                        103
-\definecharacter greeketa                          104
-\definecharacter greekiota                         105
-\definecharacter greektheta                        106
-\definecharacter greekkappa                        107
-\definecharacter greeklambda                       108
-\definecharacter greekmu                           109
-\definecharacter greeknu                           110
-\definecharacter greekomicron                      111
-\definecharacter greekpi                           112
-\definecharacter greekchi                          113
-\definecharacter greekrho                          114
-\definecharacter greeksigma                        115
-\definecharacter greektau                          116
-\definecharacter greekupsilon                      117
-\definecharacter greekalphaiotasub                 118
-\definecharacter greekomega                        119
-\definecharacter greekxi                           120
-\definecharacter greekpsi                          121
-\definecharacter greekzeta                         122
-\definecharacter floorleft                         123
-\definecharacter textbar                           124
-\definecharacter floorright                        125
-\definecharacter greekperispomeni                  126
-
-\definecharacter quotedblleft                      128
-\definecharacter quotedblright                     129
-\definecharacter exclam                            130
-\definecharacter greekiotadasia                    131
-\definecharacter greekiotapsili                    132
-\definecharacter greekiotaoxia                     133
-\definecharacter greekiotadasiatonos               134
-\definecharacter greekiotapsilitonos               135
-\definecharacter greekiotavaria                    136
-\definecharacter greekiotadasiavaria               137
-\definecharacter greekiotapsilivaria               138
-\definecharacter greekiotaperispomeni              139
-\definecharacter greekiotadasiaperispomeni         140
-\definecharacter greekiotapsiliperispomeni         141
-\definecharacter greekiotadialytika                142
-\definecharacter greekiotadialytikatonos           143
-\definecharacter greekiotadialytikavaria           144
-\definecharacter greekdasiaperispomeni             145
-\definecharacter greekpsiliperispomeni             146
-\definecharacter greekdasiatonos                   147
-\definecharacter greekpsilitonos                   148
-\definecharacter greekdasiavaria                   149
-\definecharacter greekpsilivaria                   150
-\definecharacter greekdialytikatonos               151
-\definecharacter greekepsilondasia                 152
-\definecharacter greekepsilonpsili                 153
-\definecharacter greekepsilonoxia                  154
-\definecharacter greekepsilondasiatonos            155
-\definecharacter greekepsilonpsilitonos            156
-\definecharacter greekepsilonvaria                 157
-\definecharacter greekepsilondasiavaria            158
-\definecharacter greekepsilonpsilivaria            159
-\definecharacter greekdialytikavaria	           160
-\definecharacter greekalphadasia                   161
-\definecharacter greekalphapsili                   162
-\definecharacter greekalphaoxia                    163
-\definecharacter greekalphadasiatonos              164
-\definecharacter greekalphapsilitonos              165
-\definecharacter greekalphavaria                   166
-\definecharacter greekalphadasiavaria              167
-\definecharacter greekalphapsilivaria              168
-\definecharacter greekalphaperispomeni             169
-\definecharacter greekalphadasiaperispomeni        170
-\definecharacter greekalphapsiliperispomeni        171
-\definecharacter greekalphaiotasubdasia            172
-\definecharacter greekalphaiotasubpsili            173
-\definecharacter greekalphaiotasubtonos            174
-\definecharacter greekalphaiotasubdasiatonos       175
-\definecharacter greekalphaiotasubpsilitonos       176
-\definecharacter greekalphaiotasubvaria            177
-\definecharacter greekalphaiotasubdasiavaria       178
-\definecharacter greekalphaiotasubpsilivaria       179
-\definecharacter greekalphaiotasubperispomeni      180
-\definecharacter greekalphaiotasubdasiaperispomeni 181
-\definecharacter greekalphaiotasubpsiliperispomeni 182
-\definecharacter greekrhodasia                     183
-\definecharacter greekrhopsili                     184
-\definecharacter greeketadasia                     185
-\definecharacter greeketapsili                     186
-\definecharacter greeketaoxia                      187
-\definecharacter greeketadasiatonos                188
-\definecharacter greeketapsilitonos                189
-\definecharacter greeketavaria                     190
-\definecharacter greeketadasiavaria                191
-\definecharacter greeketapsilivaria                192
-\definecharacter greeketaperispomeni               193
-\definecharacter greeketadasiaperispomeni          194
-\definecharacter greeketapsiliperispomeni          195
-\definecharacter textslash                         196
-\definecharacter greeketaiotasubdasia              197
-\definecharacter greeketaiotasubpsili              198
-\definecharacter greeketaiotasubtonos              199
-\definecharacter greeketaiotasubdasiatonos         200
-\definecharacter greeketaiotasubpsilitonos         201
-\definecharacter greeketaiotasubvaria              202
-\definecharacter greeketaiotasubdasiavaria         203
-\definecharacter greeketaiotasubpsilivaria         204
-\definecharacter greeketaiotasubperispomeni        205
-\definecharacter greeketaiotasubdasiaperispomeni   206
-\definecharacter greeketaiotasubpsiliperispomeni   207
-\definecharacter greekomicrondasia                 208
-\definecharacter greekomicronpsili                 209
-\definecharacter greekomicronoxia                  210
-\definecharacter greekomicrondasiatonos            211
-\definecharacter greekomicronpsilitonos            212
-\definecharacter greekomicronvaria                 213
-\definecharacter greekomicrondasiavaria            214
-\definecharacter greekomicronpsilivaria            215
-\definecharacter greekupsilondasia                 216
-\definecharacter greekupsilonpsili                 217
-\definecharacter greekupsilonoxia                  218
-\definecharacter greekupsilondasiatonos            219
-\definecharacter greekupsilonpsilitonos            220
-\definecharacter greekupsilonvaria                 221
-\definecharacter greekupsilondasiavaria            222
-\definecharacter greekupsilonpsilivaria            223
-\definecharacter greekupsilonperispomeni           224
-\definecharacter greekupsilondasiaperispomeni      225
-\definecharacter greekupsilonpsiliperispomeni      226
-\definecharacter greekupsilondiaeresis             227
-\definecharacter greekupsilondialytikatonos        228
-\definecharacter greekupsilondialytikavaria        229
-\definecharacter greekomegadasia                   230
-\definecharacter greekomegapsili                   231
-\definecharacter greekomegaoxia                    232
-\definecharacter greekomegadasiatonos              233
-\definecharacter greekomegapsilitonos              234
-\definecharacter greekomegavaria                   235
-\definecharacter greekomegadasiavaria              236
-\definecharacter greekomegapsilivaria              237
-\definecharacter greekomegaperispomeni             238
-\definecharacter greekomegadasiaperispomeni        239
-\definecharacter greekomegapsiliperispomeni        240
-\definecharacter greekomegaiotasubdasia            241
-\definecharacter greekomegaiotasubpsili            242
-\definecharacter greekomegaiotasubtonos            243
-\definecharacter greekomegaiotasubdasiatonos       244
-\definecharacter greekomegaiotasubpsilitonos       245
-\definecharacter greekomegaiotasubvaria            246
-\definecharacter greekomegaiotasubdasiavaria       247
-\definecharacter greekomegaiotasubpsilivaria       248
-\definecharacter greekomegaiotasubperispomeni      249
-\definecharacter greekomegaiotasubdasiaperispomeni 250
-\definecharacter greekomegaiotasubpsiliperispomeni 251
-\definecharacter greeknumeralsign                  254
-\definecharacter greeknumeralsignlower             255
-
-\stopencoding
-
-\startencoding[default]
-
-\definecharacter greekAlphapsili                   {\greekpsili \greekAlpha}
-\definecharacter greekAlphadasia                   {\greekdasia \greekAlpha}
-\definecharacter greekAlphapsilivaria              {\greekpsilivaria \greekAlpha}
-\definecharacter greekAlphadasiavaria              {\greekdasiavaria \greekAlpha}
-\definecharacter greekAlphapsilitonos              {\greekpsilitonos \greekAlpha}
-\definecharacter greekAlphadasiatonos              {\greekdasiatonos \greekAlpha}
-\definecharacter greekAlphapsiliperispomeni        {\greekpsiliperispomeni \greekAlpha}
-\definecharacter greekAlphadasiaperispomeni        {\greekdasiaperispomeni \greekAlpha}
-\definecharacter greekEpsilonpsili                 {\greekpsili \greekEpsilon}
-\definecharacter greekEpsilondasia                 {\greekdasia \greekEpsilon}
-\definecharacter greekEpsilonpsilivaria            {\greekpsilivaria \greekEpsilon}
-\definecharacter greekEpsilondasiavaria            {\greekdasiavaria \greekEpsilon}
-\definecharacter greekEpsilonpsilitonos            {\greekpsilitonos \greekEpsilon}
-\definecharacter greekEpsilondasiatonos            {\greekdasiatonos \greekEpsilon}
-\definecharacter greekEtapsili                     {\greekpsili \greekEta}
-\definecharacter greekEtadasia                     {\greekdasia \greekEta}
-\definecharacter greekEtapsilivaria                {\greekpsilivaria \greekEta}
-\definecharacter greekEtadasiavaria                {\greekdasiavaria \greekEta}
-\definecharacter greekEtapsilitonos                {\greekpsilitonos \greekEta}
-\definecharacter greekEtadasiatonos                {\greekdasiatonos \greekEta}
-\definecharacter greekEtapsiliperispomeni          {\greekpsiliperispomeni \greekEta}
-\definecharacter greekEtadasiaperispomeni          {\greekdasiaperispomeni \greekEta}
-\definecharacter greekIotapsili                    {\greekpsili \greekIota}
-\definecharacter greekIotadasia                    {\greekdasia \greekIota}
-\definecharacter greekIotapsilivaria               {\greekpsilivaria \greekIota}
-\definecharacter greekIotadasiavaria               {\greekdasiavaria \greekIota}
-\definecharacter greekIotapsilitonos               {\greekpsilitonos \greekIota}
-\definecharacter greekIotadasiatonos               {\greekdasiatonos \greekIota}
-\definecharacter greekIotapsiliperispomeni         {\greekpsiliperispomeni \greekIota}
-\definecharacter greekIotadasiaperispomeni         {\greekdasiaperispomeni \greekIota}
-\definecharacter greekOmicronpsili                 {\greekpsili \greekOmicron}
-\definecharacter greekOmicrondasia                 {\greekdasia \greekOmicron}
-\definecharacter greekOmicronpsilivaria            {\greekpsilivaria \greekOmicron}
-\definecharacter greekOmicrondasiavaria            {\greekdasiavaria \greekOmicron}
-\definecharacter greekOmicronpsilitonos            {\greekpsilitonos \greekOmicron}
-\definecharacter greekOmicrondasiatonos            {\greekdasiatonos \greekOmicron}
-\definecharacter greekUpsilondasia                 {\greekdasia \greekUpsilon}
-\definecharacter greekUpsilondasiavaria            {\greekdasiavaria \greekUpsilon}
-\definecharacter greekUpsilondasiatonos            {\greekdasiatonos \greekUpsilon}
-\definecharacter greekUpsilondasiaperispomeni      {\greekdasiaperispomeni \greekUpsilon}
-\definecharacter greekOmegapsili                   {\greekpsili \greekOmega}
-\definecharacter greekOmegadasia                   {\greekdasia \greekOmega}
-\definecharacter greekOmegapsilivaria              {\greekpsilivaria \greekOmega}
-\definecharacter greekOmegadasiavaria              {\greekdasiavaria \greekOmega}
-\definecharacter greekOmegapsilitonos              {\greekpsilitonos \greekOmega}
-\definecharacter greekOmegadasiatonos              {\greekdasiatonos \greekOmega}
-\definecharacter greekOmegapsiliperispomeni        {\greekpsiliperispomeni \greekOmega}
-\definecharacter greekOmegadasiaperispomeni        {\greekdasiaperispomeni \greekOmega}
-\definecharacter greekAlphaiotasubpsili            {\greekpsili \greekAlpha \greekiota}
-\definecharacter greekAlphaiotasubdasia            {\greekdasia \greekAlpha \greekiota}
-\definecharacter greekAlphaiotasubpsilivaria       {\greekpsilivaria \greekAlpha \greekiota}
-\definecharacter greekAlphaiotasubdasiavaria       {\greekdasiavaria \greekAlpha \greekiota}
-\definecharacter greekAlphaiotasubpsilitonos       {\greekpsilitonos \greekAlpha \greekiota}
-\definecharacter greekAlphaiotasubdasiatonos       {\greekdasiatonos \greekAlpha \greekiota}
-\definecharacter greekAlphaiotasubpsiliperispomeni {\greekpsiliperispomeni \greekAlpha \greekiota}
-\definecharacter greekAlphaiotasubdasiaperispomeni {\greekdasiaperispomeni \greekAlpha \greekiota}
-\definecharacter greekEtaiotasubpsili              {\greekpsili \greekEta \greekiota}
-\definecharacter greekEtaiotasubdasia              {\greekdasia \greekEta \greekiota}
-\definecharacter greekEtaiotasubpsilivaria         {\greekpsilivaria \greekEta \greekiota}
-\definecharacter greekEtaiotasubdasiavaria         {\greekdasiavaria \greekEta \greekiota}
-\definecharacter greekEtaiotasubpsilitonos         {\greekpsilitonos \greekEta \greekiota}
-\definecharacter greekEtaiotasubdasiatonos         {\greekdasiatonos \greekEta \greekiota}
-\definecharacter greekEtaiotasubpsiliperispomeni   {\greekpsiliperispomeni \greekEta \greekiota}
-\definecharacter greekEtaiotasubdasiaperispomeni   {\greekdasiaperispomeni \greekEta \greekiota}
-\definecharacter greekOmegaiotasubpsili            {\greekpsili \greekOmega \greekiota}
-\definecharacter greekOmegaiotasubdasia            {\greekdasia \greekOmega \greekiota}
-\definecharacter greekOmegaiotasubpsilivaria       {\greekpsilivaria \greekOmega \greekiota}
-\definecharacter greekOmegaiotasubdasiavaria       {\greekdasiavaria \greekOmega \greekiota}
-\definecharacter greekOmegaiotasubpsilitonos       {\greekpsilitonos \greekOmega \greekiota}
-\definecharacter greekOmegaiotasubdasiatonos       {\greekdasiatonos \greekOmega \greekiota}
-\definecharacter greekOmegaiotasubpsiliperispomeni {\greekpsiliperispomeni \greekOmega \greekiota}
-\definecharacter greekOmegaiotasubdasiaperispomeni {\greekdasiaperispomeni \greekOmega \greekiota}
-\definecharacter greekAlphavaria                   {\greekvaria \greekAlpha}
-\definecharacter greekAlphaoxia                    {\greekoxia \greekAlpha}
-\definecharacter greekAlphaiotasub                 {\greekAlpha \greekiota}
-\definecharacter greekEpsilonvaria                 {\greekvaria \greekEpsilon}
-\definecharacter greekEpsilonoxia                  {\greekoxia \greekEpsilon}
-\definecharacter greekEtavaria                     {\greekvaria \greekEta}
-\definecharacter greekEtaoxia                      {\greekoxia \greekEta}
-\definecharacter greekEtaiotasub                   {\greekEta \greekiota}
-\definecharacter greekIotavaria                    {\greekvaria \greekIota}
-\definecharacter greekIotaoxia                     {\greekoxia \greekIota}
-\definecharacter greekUpsilonvaria                 {\greekvaria \greekUpsilon}
-\definecharacter greekUpsilonoxia                  {\greekoxia \greekUpsilon}
-\definecharacter greekOmicronvaria                 {\greekvaria \greekOmicron}
-\definecharacter greekOmicronoxia                  {\greekoxia \greekOmicron}
-\definecharacter greekOmegavaria                   {\greekvaria \greekOmega}
-\definecharacter greekOmegaoxia                    {\greekoxia \greekOmega}
-\definecharacter greekOmegaiotasub                 {\greekOmega \greekiota}
-\definecharacter greekRhodasia                     {\greekdasia \greekRho}
-\definecharacter digamma                           {\greekdigamma}
-\definecharacter sampi                             {\greeksampi}
-\definecharacter stigma                            {\greekstigma}
-\definecharacter koppa                             {\greeknumkoppa}
-\definecharacter lunars                            {\greeksigmalunate}
-\definecharacter lunarS                            {\greekSigmalunate}
-\definecharacter halfbraceleft                     {\floorleft}
-\definecharacter halfbraceright                    {\floorright}
-\definecharacter crux                              {\textdag}
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-ans.mkii b/tex/context/base/enco-ans.mkii
new file mode 100644
index 000000000..7a48b5b55
--- /dev/null
+++ b/tex/context/base/enco-ans.mkii
@@ -0,0 +1,237 @@
+%D \module
+%D   [     file=enco-ans,
+%D      version=2000.05.07, % 1995.01.01,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=\YandY\ texnansi Encoding,
+%D       author={Patrick Gundlach, Hans Hagen},
+%D         date=\currentdate,
+%D    copyright=PRAGMA-ADE]
+%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 is \YandY's texnansi encoding vector, which combines
+%D the best of the ansi encoding vector (prebuilt accented
+%D characters etc.) and some of \TEX's vectors.
+
+\startmapping[texnansi]
+
+\resetcaserange 128 to 158
+\resetcaserange 160 to 191
+\resetcaserange 215 to 215
+\resetcaserange 247 to 247
+
+\definecasemaps 192 to 214 lc +32 uc   0
+\definecasemaps 224 to 246 lc   0 uc -32
+\definecasemaps 216 to 222 lc +32 uc   0
+\definecasemaps 248 to 254 lc   0 uc -32
+
+\definecaseself 223
+\definecaseswap 156 140
+\definecaseswap 255 159
+
+% needed by some patterns:
+
+% \definecaseself  34 % quotedbl
+% \definecaseself 132 % quotedblbase
+% \definecaseself 147 % quotedblleft
+% \definecaseself 148 % quotedblright
+% \definecaseself 129 % quotesingle
+% \definecaseself 130 % quotesinglebase
+% \definecaseself 145 % quoteleft
+% \definecaseself 146 % quoteright
+
+\stopmapping
+
+\startencoding[texnansi]
+
+\definecharacter textacute         19
+\definecharacter textbreve         21
+\definecharacter textcaron         20
+\definecharacter textcedilla      184
+\definecharacter textcircumflex    94 % 136
+\definecharacter textdiaeresis    168
+\definecharacter textdotaccent      5
+\definecharacter textgrave         18
+\definecharacter texthungarumlaut   6
+\definecharacter textmacron       175
+\definecharacter textogonek         7
+\definecharacter textring          23
+\definecharacter texttilde        152
+
+\definecharacter dotlessi          16 % 105
+\definecharacter dotlessj          17
+
+\definecharacter endash           150 % lig
+\definecharacter emdash           151 % lig
+
+\definecharacter aeligature       230
+\definecharacter AEligature       198
+\definecharacter oeligature       156
+\definecharacter OEligature       140
+
+\definecharacter ssharp           223
+
+\definecharacter thorn            254
+\definecharacter Thorn            222
+
+\definecharacter Dstroke          208 % also Eth, mapped in enco-def
+\definecharacter eth              240
+
+\definecharacter exclamdown       161
+\definecharacter questiondown     191
+
+\definecharacter copyright        169
+\definecharacter registered       174
+\definecharacter trademark        153
+
+\definecharacter sectionmark      167
+\definecharacter paragraphmark    182
+
+\definecharacter onequarter       188
+\definecharacter onehalf          189
+\definecharacter threequarter     190
+
+\definecharacter onesuperior      185
+\definecharacter twosuperior      178
+\definecharacter threesuperior    179
+
+\definecharacter textcent         162 % ?
+\definecharacter textcurrency     164
+\definecharacter texteuro           1
+\definecharacter textflorin       131
+\definecharacter textsterling     163
+\definecharacter textyen          165
+
+\definecharacter percent           37
+\definecharacter perthousand      137
+
+\definecharacter softhyphen        45
+\definecharacter periodcentered   183
+
+\definecharacter textasciicircum  142
+\definecharacter textasciitilde   158
+\definecharacter textbackslash     92
+\definecharacter textbraceleft    123
+\definecharacter textbar          124
+\definecharacter textbraceright   125
+\definecharacter textunderscore    95
+
+\definecharacter textbrokenbar    166
+\definecharacter textbullet       149
+\definecharacter textdag          134
+\definecharacter textddag         135
+\definecharacter textdegree       176
+\definecharacter textdiv          247
+\definecharacter textellipsis     133
+\definecharacter textfraction       4
+\definecharacter textlognot       172
+\definecharacter textminus        143
+\definecharacter textmu           181
+\definecharacter textmultiply     215
+\definecharacter textpm           177
+
+\definecharacter quotedbl          34
+\definecharacter quotedblbase     132
+\definecharacter quotedblleft     147
+\definecharacter quotedblright    148
+
+\definecharacter quotesingle      129
+\definecharacter quotesinglebase  130
+
+\definecharacter quoteleft        145
+\definecharacter quoteright       146
+
+\definecharacter guilsingleleft   139
+\definecharacter guilsingleright  155
+\definecharacter leftguillemot    171
+\definecharacter rightguillemot   187
+
+\definecharacter aacute           225
+\definecharacter Aacute           193
+\definecharacter eacute           233
+\definecharacter Eacute           201
+\definecharacter iacute           237
+\definecharacter Iacute           205
+\definecharacter oacute           243
+\definecharacter Oacute           211
+\definecharacter uacute           250
+\definecharacter Uacute           218
+\definecharacter yacute           253
+\definecharacter Yacute           221
+
+\definecharacter scaron           154
+\definecharacter Scaron           138
+\definecharacter zcaron           157
+\definecharacter Zcaron           141
+
+\definecharacter ccedilla         231
+\definecharacter Ccedilla         199
+
+\definecharacter acircumflex      226
+\definecharacter Acircumflex      194
+\definecharacter ecircumflex      234
+\definecharacter Ecircumflex      202
+\definecharacter icircumflex      238
+\definecharacter Icircumflex      206
+\definecharacter ocircumflex      244
+\definecharacter Ocircumflex      212
+\definecharacter ucircumflex      251
+\definecharacter Ucircumflex      219
+
+\definecharacter adiaeresis       228
+\definecharacter Adiaeresis       196
+\definecharacter ediaeresis       235
+\definecharacter Ediaeresis       203
+\definecharacter idiaeresis       239
+\definecharacter Idiaeresis       207
+\definecharacter odiaeresis       246
+\definecharacter Odiaeresis       214
+\definecharacter udiaeresis       252
+\definecharacter Udiaeresis       220
+\definecharacter ydiaeresis       255
+\definecharacter Ydiaeresis       159
+
+\definecharacter agrave           224
+\definecharacter Agrave           192
+\definecharacter egrave           232
+\definecharacter Egrave           200
+\definecharacter igrave           236
+\definecharacter Igrave           204
+\definecharacter ograve           242
+\definecharacter Ograve           210
+\definecharacter ugrave           249
+\definecharacter Ugrave           217
+
+\definecharacter aring            229
+\definecharacter Aring            197
+
+\definecharacter Lstroke          128
+\definecharacter lstroke          144
+\definecharacter ostroke          248
+\definecharacter Ostoke           216
+
+\definecharacter atilde           227
+\definecharacter Atilde           195
+\definecharacter ntilde           241
+\definecharacter Ntilde           209
+\definecharacter otilde           245
+\definecharacter Otilde           213
+
+\stopencoding
+
+% will be replaced by math collection, fails anyway
+
+\startencoding[texnansi]
+
+\definecharacter mathgrave       "7060
+\definecharacter mathacute       "70B4
+\definecharacter mathhat         "7088
+\definecharacter mathtilde       "7098
+\definecharacter mathddot        "70A8
+\definecharacter mathbar         "70AF
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-ans.tex b/tex/context/base/enco-ans.tex
deleted file mode 100644
index 7a48b5b55..000000000
--- a/tex/context/base/enco-ans.tex
+++ /dev/null
@@ -1,237 +0,0 @@
-%D \module
-%D   [     file=enco-ans,
-%D      version=2000.05.07, % 1995.01.01,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=\YandY\ texnansi Encoding,
-%D       author={Patrick Gundlach, Hans Hagen},
-%D         date=\currentdate,
-%D    copyright=PRAGMA-ADE]
-%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 is \YandY's texnansi encoding vector, which combines
-%D the best of the ansi encoding vector (prebuilt accented
-%D characters etc.) and some of \TEX's vectors.
-
-\startmapping[texnansi]
-
-\resetcaserange 128 to 158
-\resetcaserange 160 to 191
-\resetcaserange 215 to 215
-\resetcaserange 247 to 247
-
-\definecasemaps 192 to 214 lc +32 uc   0
-\definecasemaps 224 to 246 lc   0 uc -32
-\definecasemaps 216 to 222 lc +32 uc   0
-\definecasemaps 248 to 254 lc   0 uc -32
-
-\definecaseself 223
-\definecaseswap 156 140
-\definecaseswap 255 159
-
-% needed by some patterns:
-
-% \definecaseself  34 % quotedbl
-% \definecaseself 132 % quotedblbase
-% \definecaseself 147 % quotedblleft
-% \definecaseself 148 % quotedblright
-% \definecaseself 129 % quotesingle
-% \definecaseself 130 % quotesinglebase
-% \definecaseself 145 % quoteleft
-% \definecaseself 146 % quoteright
-
-\stopmapping
-
-\startencoding[texnansi]
-
-\definecharacter textacute         19
-\definecharacter textbreve         21
-\definecharacter textcaron         20
-\definecharacter textcedilla      184
-\definecharacter textcircumflex    94 % 136
-\definecharacter textdiaeresis    168
-\definecharacter textdotaccent      5
-\definecharacter textgrave         18
-\definecharacter texthungarumlaut   6
-\definecharacter textmacron       175
-\definecharacter textogonek         7
-\definecharacter textring          23
-\definecharacter texttilde        152
-
-\definecharacter dotlessi          16 % 105
-\definecharacter dotlessj          17
-
-\definecharacter endash           150 % lig
-\definecharacter emdash           151 % lig
-
-\definecharacter aeligature       230
-\definecharacter AEligature       198
-\definecharacter oeligature       156
-\definecharacter OEligature       140
-
-\definecharacter ssharp           223
-
-\definecharacter thorn            254
-\definecharacter Thorn            222
-
-\definecharacter Dstroke          208 % also Eth, mapped in enco-def
-\definecharacter eth              240
-
-\definecharacter exclamdown       161
-\definecharacter questiondown     191
-
-\definecharacter copyright        169
-\definecharacter registered       174
-\definecharacter trademark        153
-
-\definecharacter sectionmark      167
-\definecharacter paragraphmark    182
-
-\definecharacter onequarter       188
-\definecharacter onehalf          189
-\definecharacter threequarter     190
-
-\definecharacter onesuperior      185
-\definecharacter twosuperior      178
-\definecharacter threesuperior    179
-
-\definecharacter textcent         162 % ?
-\definecharacter textcurrency     164
-\definecharacter texteuro           1
-\definecharacter textflorin       131
-\definecharacter textsterling     163
-\definecharacter textyen          165
-
-\definecharacter percent           37
-\definecharacter perthousand      137
-
-\definecharacter softhyphen        45
-\definecharacter periodcentered   183
-
-\definecharacter textasciicircum  142
-\definecharacter textasciitilde   158
-\definecharacter textbackslash     92
-\definecharacter textbraceleft    123
-\definecharacter textbar          124
-\definecharacter textbraceright   125
-\definecharacter textunderscore    95
-
-\definecharacter textbrokenbar    166
-\definecharacter textbullet       149
-\definecharacter textdag          134
-\definecharacter textddag         135
-\definecharacter textdegree       176
-\definecharacter textdiv          247
-\definecharacter textellipsis     133
-\definecharacter textfraction       4
-\definecharacter textlognot       172
-\definecharacter textminus        143
-\definecharacter textmu           181
-\definecharacter textmultiply     215
-\definecharacter textpm           177
-
-\definecharacter quotedbl          34
-\definecharacter quotedblbase     132
-\definecharacter quotedblleft     147
-\definecharacter quotedblright    148
-
-\definecharacter quotesingle      129
-\definecharacter quotesinglebase  130
-
-\definecharacter quoteleft        145
-\definecharacter quoteright       146
-
-\definecharacter guilsingleleft   139
-\definecharacter guilsingleright  155
-\definecharacter leftguillemot    171
-\definecharacter rightguillemot   187
-
-\definecharacter aacute           225
-\definecharacter Aacute           193
-\definecharacter eacute           233
-\definecharacter Eacute           201
-\definecharacter iacute           237
-\definecharacter Iacute           205
-\definecharacter oacute           243
-\definecharacter Oacute           211
-\definecharacter uacute           250
-\definecharacter Uacute           218
-\definecharacter yacute           253
-\definecharacter Yacute           221
-
-\definecharacter scaron           154
-\definecharacter Scaron           138
-\definecharacter zcaron           157
-\definecharacter Zcaron           141
-
-\definecharacter ccedilla         231
-\definecharacter Ccedilla         199
-
-\definecharacter acircumflex      226
-\definecharacter Acircumflex      194
-\definecharacter ecircumflex      234
-\definecharacter Ecircumflex      202
-\definecharacter icircumflex      238
-\definecharacter Icircumflex      206
-\definecharacter ocircumflex      244
-\definecharacter Ocircumflex      212
-\definecharacter ucircumflex      251
-\definecharacter Ucircumflex      219
-
-\definecharacter adiaeresis       228
-\definecharacter Adiaeresis       196
-\definecharacter ediaeresis       235
-\definecharacter Ediaeresis       203
-\definecharacter idiaeresis       239
-\definecharacter Idiaeresis       207
-\definecharacter odiaeresis       246
-\definecharacter Odiaeresis       214
-\definecharacter udiaeresis       252
-\definecharacter Udiaeresis       220
-\definecharacter ydiaeresis       255
-\definecharacter Ydiaeresis       159
-
-\definecharacter agrave           224
-\definecharacter Agrave           192
-\definecharacter egrave           232
-\definecharacter Egrave           200
-\definecharacter igrave           236
-\definecharacter Igrave           204
-\definecharacter ograve           242
-\definecharacter Ograve           210
-\definecharacter ugrave           249
-\definecharacter Ugrave           217
-
-\definecharacter aring            229
-\definecharacter Aring            197
-
-\definecharacter Lstroke          128
-\definecharacter lstroke          144
-\definecharacter ostroke          248
-\definecharacter Ostoke           216
-
-\definecharacter atilde           227
-\definecharacter Atilde           195
-\definecharacter ntilde           241
-\definecharacter Ntilde           209
-\definecharacter otilde           245
-\definecharacter Otilde           213
-
-\stopencoding
-
-% will be replaced by math collection, fails anyway
-
-\startencoding[texnansi]
-
-\definecharacter mathgrave       "7060
-\definecharacter mathacute       "70B4
-\definecharacter mathhat         "7088
-\definecharacter mathtilde       "7098
-\definecharacter mathddot        "70A8
-\definecharacter mathbar         "70AF
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-cas.mkii b/tex/context/base/enco-cas.mkii
new file mode 100644
index 000000000..38d12f9fa
--- /dev/null
+++ b/tex/context/base/enco-cas.mkii
@@ -0,0 +1,143 @@
+%D \module
+%D   [     file=enco-cas,
+%D      version=2005.08.23,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Named Glyph Case Mapping,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=PRAGMA-ADE]
+%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 For quite some years \CONTEXT\ used a rather compact way of
+%D defining encoded characters as well as case maps. When late
+%D 2000 more advanced remapping features were needed (like pdf
+%D unicode remapping), named glyphs were introduced to keep the
+%D coding tables more readable. At the same time, we introduced
+%D named glyph case mapping.
+
+\defineULcharacter Acircumflex acircumflex
+\defineULcharacter Ccircumflex ccircumflex
+\defineULcharacter Ecircumflex ecircumflex
+\defineULcharacter Gcircumflex gcircumflex
+\defineULcharacter Hcircumflex hcircumflex
+\defineULcharacter Icircumflex icircumflex
+\defineULcharacter Jcircumflex jcircumflex
+\defineULcharacter Ocircumflex ocircumflex
+\defineULcharacter Scircumflex scircumflex
+\defineULcharacter Ucircumflex ucircumflex
+\defineULcharacter Wcircumflex wcircumflex
+\defineULcharacter Ycircumflex ycircumflex
+
+\defineULcharacter Agrave agrave
+\defineULcharacter Egrave egrave
+\defineULcharacter Igrave igrave
+\defineULcharacter Ograve ograve
+\defineULcharacter Ugrave ugrave
+\defineULcharacter Ygrave ygrave
+
+\defineULcharacter Atilde atilde
+\defineULcharacter Itilde itilde
+\defineULcharacter Otilde otilde
+\defineULcharacter Ntilde ntilde
+\defineULcharacter Utilde utilde
+
+\defineULcharacter Adiaeresis adiaeresis
+\defineULcharacter Ediaeresis ediaeresis
+\defineULcharacter Idiaeresis idiaeresis
+\defineULcharacter Odiaeresis odiaeresis
+\defineULcharacter Udiaeresis udiaeresis
+\defineULcharacter Ydiaeresis ydiaeresis
+
+\defineULcharacter Aacute aacute
+\defineULcharacter Cacute cacute
+\defineULcharacter Eacute eacute
+\defineULcharacter Iacute iacute
+\defineULcharacter Lacute lacute
+\defineULcharacter Nacute nacute
+\defineULcharacter Oacute oacute
+\defineULcharacter Racute racute
+\defineULcharacter Sacute sacute
+\defineULcharacter Uacute uacute
+\defineULcharacter Yacute yacute
+\defineULcharacter Zacute zacute
+
+\defineULcharacter Dstroke dstroke
+\defineULcharacter Hstroke hstroke
+\defineULcharacter Lstroke lstroke
+\defineULcharacter Lslash  lslash
+\defineULcharacter Ostroke ostroke
+\defineULcharacter Tstroke tstroke
+
+\defineULcharacter Cdotaccent cdotaccent
+\defineULcharacter Edotaccent edotaccent
+\defineULcharacter Gdotaccent gdotaccent
+\defineULcharacter Idotaccent idotaccent
+\defineULcharacter Zdotaccent zdotaccent
+
+\defineULcharacter Amacron amacron
+\defineULcharacter Emacron emacron
+\defineULcharacter Imacron imacron
+\defineULcharacter Omacron omacron
+\defineULcharacter Umacron umacron
+
+\defineULcharacter Ccedilla ccedilla
+\defineULcharacter Gcedilla gcedilla
+\defineULcharacter Kcedilla kcedilla
+\defineULcharacter Lcedilla lcedilla
+\defineULcharacter Ncedilla ncedilla
+\defineULcharacter Rcedilla rcedilla
+\defineULcharacter Scedilla scedilla
+\defineULcharacter Tcedilla tcedilla
+
+\defineULcharacter Ccommaaccent ccommaaccent
+\defineULcharacter Gcommaaccent gcommaaccent
+\defineULcharacter Kcommaaccent kcommaaccent
+\defineULcharacter Lcommaaccent lcommaaccent
+\defineULcharacter Ncommaaccent ncommaaccent
+\defineULcharacter Rcommaaccent rcommaaccent
+\defineULcharacter Scommaaccent scommaaccent
+\defineULcharacter Tcommaaccent tcommaaccent
+
+\defineULcharacter Ohungarumlaut ohungarumlaut
+\defineULcharacter Uhungarumlaut uhungarumlaut
+
+\defineULcharacter Aogonek aogonek
+\defineULcharacter Eogonek eogonek
+\defineULcharacter Iogonek iogonek
+\defineULcharacter Uogonek uogonek
+
+\defineULcharacter Aring aring
+\defineULcharacter Uring uring
+
+\defineULcharacter Abreve abreve
+\defineULcharacter Ebreve ebreve
+\defineULcharacter Gbreve gbreve
+\defineULcharacter Ibreve ibreve
+\defineULcharacter Obreve obreve
+\defineULcharacter Ubreve ubreve
+
+\defineULcharacter Ccaron ccaron
+\defineULcharacter Dcaron dcaron
+\defineULcharacter Ecaron ecaron
+\defineULcharacter Lcaron lcaron
+\defineULcharacter Ncaron ncaron
+\defineULcharacter Rcaron rcaron
+\defineULcharacter Scaron scaron
+\defineULcharacter Tcaron tcaron
+\defineULcharacter Zcaron zcaron
+
+\defineULcharacter dotlessI dotlessi
+\defineULcharacter dotlessJ dotlessj
+
+\defineULcharacter AEligature aeligature
+\defineULcharacter OEligature oeligature
+\defineULcharacter Ssharp     ssharp
+\defineULcharacter IJligature ijligature
+
+\defineULcharacter Eth   eth
+\defineULcharacter Thorn thorn
+
+\endinput
diff --git a/tex/context/base/enco-cas.tex b/tex/context/base/enco-cas.tex
deleted file mode 100644
index 38d12f9fa..000000000
--- a/tex/context/base/enco-cas.tex
+++ /dev/null
@@ -1,143 +0,0 @@
-%D \module
-%D   [     file=enco-cas,
-%D      version=2005.08.23,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Named Glyph Case Mapping,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=PRAGMA-ADE]
-%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 For quite some years \CONTEXT\ used a rather compact way of
-%D defining encoded characters as well as case maps. When late
-%D 2000 more advanced remapping features were needed (like pdf
-%D unicode remapping), named glyphs were introduced to keep the
-%D coding tables more readable. At the same time, we introduced
-%D named glyph case mapping.
-
-\defineULcharacter Acircumflex acircumflex
-\defineULcharacter Ccircumflex ccircumflex
-\defineULcharacter Ecircumflex ecircumflex
-\defineULcharacter Gcircumflex gcircumflex
-\defineULcharacter Hcircumflex hcircumflex
-\defineULcharacter Icircumflex icircumflex
-\defineULcharacter Jcircumflex jcircumflex
-\defineULcharacter Ocircumflex ocircumflex
-\defineULcharacter Scircumflex scircumflex
-\defineULcharacter Ucircumflex ucircumflex
-\defineULcharacter Wcircumflex wcircumflex
-\defineULcharacter Ycircumflex ycircumflex
-
-\defineULcharacter Agrave agrave
-\defineULcharacter Egrave egrave
-\defineULcharacter Igrave igrave
-\defineULcharacter Ograve ograve
-\defineULcharacter Ugrave ugrave
-\defineULcharacter Ygrave ygrave
-
-\defineULcharacter Atilde atilde
-\defineULcharacter Itilde itilde
-\defineULcharacter Otilde otilde
-\defineULcharacter Ntilde ntilde
-\defineULcharacter Utilde utilde
-
-\defineULcharacter Adiaeresis adiaeresis
-\defineULcharacter Ediaeresis ediaeresis
-\defineULcharacter Idiaeresis idiaeresis
-\defineULcharacter Odiaeresis odiaeresis
-\defineULcharacter Udiaeresis udiaeresis
-\defineULcharacter Ydiaeresis ydiaeresis
-
-\defineULcharacter Aacute aacute
-\defineULcharacter Cacute cacute
-\defineULcharacter Eacute eacute
-\defineULcharacter Iacute iacute
-\defineULcharacter Lacute lacute
-\defineULcharacter Nacute nacute
-\defineULcharacter Oacute oacute
-\defineULcharacter Racute racute
-\defineULcharacter Sacute sacute
-\defineULcharacter Uacute uacute
-\defineULcharacter Yacute yacute
-\defineULcharacter Zacute zacute
-
-\defineULcharacter Dstroke dstroke
-\defineULcharacter Hstroke hstroke
-\defineULcharacter Lstroke lstroke
-\defineULcharacter Lslash  lslash
-\defineULcharacter Ostroke ostroke
-\defineULcharacter Tstroke tstroke
-
-\defineULcharacter Cdotaccent cdotaccent
-\defineULcharacter Edotaccent edotaccent
-\defineULcharacter Gdotaccent gdotaccent
-\defineULcharacter Idotaccent idotaccent
-\defineULcharacter Zdotaccent zdotaccent
-
-\defineULcharacter Amacron amacron
-\defineULcharacter Emacron emacron
-\defineULcharacter Imacron imacron
-\defineULcharacter Omacron omacron
-\defineULcharacter Umacron umacron
-
-\defineULcharacter Ccedilla ccedilla
-\defineULcharacter Gcedilla gcedilla
-\defineULcharacter Kcedilla kcedilla
-\defineULcharacter Lcedilla lcedilla
-\defineULcharacter Ncedilla ncedilla
-\defineULcharacter Rcedilla rcedilla
-\defineULcharacter Scedilla scedilla
-\defineULcharacter Tcedilla tcedilla
-
-\defineULcharacter Ccommaaccent ccommaaccent
-\defineULcharacter Gcommaaccent gcommaaccent
-\defineULcharacter Kcommaaccent kcommaaccent
-\defineULcharacter Lcommaaccent lcommaaccent
-\defineULcharacter Ncommaaccent ncommaaccent
-\defineULcharacter Rcommaaccent rcommaaccent
-\defineULcharacter Scommaaccent scommaaccent
-\defineULcharacter Tcommaaccent tcommaaccent
-
-\defineULcharacter Ohungarumlaut ohungarumlaut
-\defineULcharacter Uhungarumlaut uhungarumlaut
-
-\defineULcharacter Aogonek aogonek
-\defineULcharacter Eogonek eogonek
-\defineULcharacter Iogonek iogonek
-\defineULcharacter Uogonek uogonek
-
-\defineULcharacter Aring aring
-\defineULcharacter Uring uring
-
-\defineULcharacter Abreve abreve
-\defineULcharacter Ebreve ebreve
-\defineULcharacter Gbreve gbreve
-\defineULcharacter Ibreve ibreve
-\defineULcharacter Obreve obreve
-\defineULcharacter Ubreve ubreve
-
-\defineULcharacter Ccaron ccaron
-\defineULcharacter Dcaron dcaron
-\defineULcharacter Ecaron ecaron
-\defineULcharacter Lcaron lcaron
-\defineULcharacter Ncaron ncaron
-\defineULcharacter Rcaron rcaron
-\defineULcharacter Scaron scaron
-\defineULcharacter Tcaron tcaron
-\defineULcharacter Zcaron zcaron
-
-\defineULcharacter dotlessI dotlessi
-\defineULcharacter dotlessJ dotlessj
-
-\defineULcharacter AEligature aeligature
-\defineULcharacter OEligature oeligature
-\defineULcharacter Ssharp     ssharp
-\defineULcharacter IJligature ijligature
-
-\defineULcharacter Eth   eth
-\defineULcharacter Thorn thorn
-
-\endinput
diff --git a/tex/context/base/enco-chi.mkii b/tex/context/base/enco-chi.mkii
new file mode 100644
index 000000000..9d77893a0
--- /dev/null
+++ b/tex/context/base/enco-chi.mkii
@@ -0,0 +1,371 @@
+%D \module
+%D   [     file=enco-chi,
+%D      version=1999.12.02,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Traditional and Simplified Chinese,
+%D       author={Wang Lei \& Hans Hagen},
+%D         date=\currentdate,
+%D    copyright=Hans Hagen]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% actually this is also a filter -> enco-fcn.tex
+
+%D This is an experimental definition. Since we are dealing
+%D with unicode's, the registered values are not saved, so
+%D actually we're dealing with an pseudo encoding. The digits
+%D on the other hand are encoding specific.
+
+% chinese classes: left=1|right=2|center=3
+
+% untested, probably wrong
+
+\startencoding[cjk-uni]
+
+\defineuclass 1  32 24
+\defineuclass 1  32 28
+\defineuclass 1  48 20
+\defineuclass 1  48  8
+\defineuclass 1  48 10
+\defineuclass 1  48 12
+\defineuclass 1  48 14
+\defineuclass 1  48 22
+\defineuclass 1  48 16
+\defineuclass 1 255  8
+\defineuclass 1 255 59
+\defineuclass 1 255 64
+\defineuclass 1 255 91
+
+\defineuclass 3   0 183
+\defineuclass 3   0 168
+\defineuclass 3  32  38
+\defineuclass 3 255  30
+
+\defineuclass 2  48   1
+\defineuclass 2  48   2
+\defineuclass 2  32  20
+\defineuclass 2 255  94
+\defineuclass 2  32  25
+\defineuclass 2  32  29
+\defineuclass 2  48  21
+\defineuclass 2  48   9
+\defineuclass 2  48  11
+\defineuclass 2  48  13
+\defineuclass 2  48  15
+\defineuclass 2  48  23
+\defineuclass 2  48  17
+\defineuclass 2  34  55
+\defineuclass 2   0 176
+\defineuclass 2  32  50
+\defineuclass 2  32  51
+\defineuclass 2 255   1
+\defineuclass 2 255   2
+\defineuclass 2 255   7
+\defineuclass 2 255   9
+\defineuclass 2 255  12
+\defineuclass 2 255  14
+\defineuclass 2 255  26
+\defineuclass 2 255  27
+\defineuclass 2 255  31
+\defineuclass 2 255  61
+\defineuclass 2 255  93
+
+\defineudigit         0   37 203
+\defineudigit         1   78   0
+\defineudigit         2   78 140
+\defineudigit         3   78   9
+\defineudigit         4   86 219
+\defineudigit         5   78 148
+\defineudigit         6   81 109
+\defineudigit         7   78   3
+\defineudigit         8   81 107
+\defineudigit         9   78  93
+\defineudigit        10   83  65
+\defineudigit       100  118 126
+\defineudigit      1000   83  67
+\defineudigit     10000   78   7
+\defineudigit 100000000   78 191
+
+\defineudigit         0* 150 246
+\defineudigit         1*  88 249
+\defineudigit         2* 141  48
+\defineudigit         3*  83 193
+\defineudigit         4* 128 134
+\defineudigit         5*  79  13
+\defineudigit         6* 150  70
+\defineudigit         7* 103 210
+\defineudigit         8*  99  76
+\defineudigit         9* 115 150
+\defineudigit        10*  98 254
+\defineudigit       100*  79 112
+\defineudigit      1000*  78 223
+\defineudigit     10000* 132  44
+\defineudigit 100000000*  78 191
+
+\defineudigit 20 94 255
+\defineudigit 21 78   0
+\defineudigit 22 78 140
+\defineudigit 23 78   9
+\defineudigit 24 86 219
+\defineudigit 25 78 148
+\defineudigit 26 81 109
+\defineudigit 27 78   3
+\defineudigit 28 81 107
+\defineudigit 29 78  93
+
+\defineudigit 30 83  69
+\defineudigit 31 78   0
+\defineudigit 32 78 140
+\defineudigit 33 78   9
+\defineudigit 34 86 219
+\defineudigit 35 78 148
+\defineudigit 36 81 109
+\defineudigit 37 78   3
+\defineudigit 38 81 107
+\defineudigit 39 78  93
+
+\stopencoding
+
+% \doif \currentregime {utf} \endinput
+
+\startencoding[big5]
+
+\defineuclass 1 161  93
+\defineuclass 1 161  95
+\defineuclass 1 161  97
+\defineuclass 1 161  99
+\defineuclass 1 161 101
+\defineuclass 1 161 103
+\defineuclass 1 161 105
+\defineuclass 1 161 107
+\defineuclass 1 161 111
+\defineuclass 1 161 111
+\defineuclass 1 161 113
+\defineuclass 1 161 115
+\defineuclass 1 161 117
+\defineuclass 1 161 119
+\defineuclass 1 161 121
+\defineuclass 1 161 123
+\defineuclass 1 161 125
+\defineuclass 1 161 161
+\defineuclass 1 161 163
+\defineuclass 1 161 165
+\defineuclass 1 161 167
+\defineuclass 1 161 169
+\defineuclass 1 161 171
+
+\defineuclass 3 161  69
+\defineuclass 3 161  75
+\defineuclass 3 161  76
+
+\defineuclass 2 161  65
+\defineuclass 2 161  66
+\defineuclass 2 161  67
+\defineuclass 2 161  68
+\defineuclass 2 161  70
+\defineuclass 2 161  71
+\defineuclass 2 161  72
+\defineuclass 2 161  73
+\defineuclass 2 161  74
+\defineuclass 2 161  77
+\defineuclass 2 161  78
+\defineuclass 2 161  79
+\defineuclass 2 161  80
+\defineuclass 2 161  81
+\defineuclass 2 161  82
+\defineuclass 2 161  83
+\defineuclass 2 161  84
+\defineuclass 2 161  88
+\defineuclass 2 161  94
+\defineuclass 2 161  96
+\defineuclass 2 161  98
+\defineuclass 2 161 100
+\defineuclass 2 161 102
+\defineuclass 2 161 104
+\defineuclass 2 161 106
+\defineuclass 2 161 108
+\defineuclass 2 161 110
+\defineuclass 2 161 112
+\defineuclass 2 161 114
+\defineuclass 2 161 116
+\defineuclass 2 161 118
+\defineuclass 2 161 120
+\defineuclass 2 161 122
+\defineuclass 2 161 124
+\defineuclass 2 161 126
+\defineuclass 2 161 162
+\defineuclass 2 161 164
+\defineuclass 2 161 166
+\defineuclass 2 161 168
+\defineuclass 2 161 170
+\defineuclass 2 161 172
+\defineuclass 2 161 196
+\defineuclass 2 161 227
+\defineuclass 2 162  88
+\defineuclass 2 163 223
+
+\defineudigit         0  162 179
+\defineudigit         1  164  64
+\defineudigit         2  164  71
+\defineudigit         3  164  84
+\defineudigit         4  165 124
+\defineudigit         5  164 173
+\defineudigit         6  164 187
+\defineudigit         7  164  67
+\defineudigit         8  164  75
+\defineudigit         9  164  69
+\defineudigit        10  164  81
+\defineudigit       100  166 202
+\defineudigit      1000  164 100
+\defineudigit     10000  201  69
+\defineudigit 100000000  187 245
+
+\defineudigit         0* 185 115
+\defineudigit         1* 179 252
+\defineudigit         2* 182  76
+\defineudigit         3* 176 209
+\defineudigit         4* 184 118
+\defineudigit         5* 165 238
+\defineudigit         6* 179 176
+\defineudigit         7* 172 110
+\defineudigit         8* 174 195
+\defineudigit         9* 168 104
+\defineudigit        10* 172  66
+\defineudigit       100* 168 213
+\defineudigit      1000* 165  97
+\defineudigit     10000* 184  85
+\defineudigit 100000000* 187 245
+
+\defineudigit        20  164 220
+\defineudigit        21  164  64
+\defineudigit        22  164  71
+\defineudigit        23  164  84
+\defineudigit        24  165 124
+\defineudigit        25  164 173
+\defineudigit        26  164 187
+\defineudigit        27  164  67
+\defineudigit        28  164  75
+\defineudigit        29  164  69
+
+\defineudigit        30  164 202
+\defineudigit        31  164  64
+\defineudigit        32  164  71
+\defineudigit        33  164  84
+\defineudigit        34  165 124
+\defineudigit        35  164 173
+\defineudigit        36  164 187
+\defineudigit        37  164  67
+\defineudigit        38  164  75
+\defineudigit        39  164  69
+
+\stopencoding
+
+\startencoding[gbk]
+
+\defineuclass 1 161 174
+\defineuclass 1 161 176
+\defineuclass 1 161 178
+\defineuclass 1 161 180
+\defineuclass 1 161 182
+\defineuclass 1 161 184
+\defineuclass 1 161 186
+\defineuclass 1 161 188
+\defineuclass 1 161 190
+\defineuclass 1 163 168
+\defineuclass 1 163 219
+\defineuclass 1 163 224
+\defineuclass 1 163 251
+
+\defineuclass 3 161 164
+\defineuclass 3 161 167
+\defineuclass 3 161 173
+\defineuclass 3 163 190
+
+\defineuclass 2 161 162
+\defineuclass 2 161 163
+\defineuclass 2 161 170
+\defineuclass 2 161 171
+\defineuclass 2 161 175
+\defineuclass 2 161 177
+\defineuclass 2 161 179
+\defineuclass 2 161 181
+\defineuclass 2 161 183
+\defineuclass 2 161 185
+\defineuclass 2 161 187
+\defineuclass 2 161 189
+\defineuclass 2 161 191
+\defineuclass 2 161 203
+\defineuclass 2 161 227
+\defineuclass 2 161 228
+\defineuclass 2 161 229
+\defineuclass 2 163 161
+\defineuclass 2 163 162
+\defineuclass 2 163 167
+\defineuclass 2 163 169
+\defineuclass 2 163 172
+\defineuclass 2 163 174
+\defineuclass 2 163 186
+\defineuclass 2 163 187
+\defineuclass 2 163 191
+\defineuclass 2 163 221
+\defineuclass 2 163 253
+
+\defineudigit         0  161 240
+\defineudigit         1  210 187
+\defineudigit         2  182 254
+\defineudigit         3  200 253
+\defineudigit         4  203 196
+\defineudigit         5  206 229
+\defineudigit         6  193 249
+\defineudigit         7  198 223
+\defineudigit         8  176 203
+\defineudigit         9  190 197
+\defineudigit        10  202 174
+\defineudigit       100  176 217
+\defineudigit      1000  199 167
+\defineudigit     10000  205 242
+\defineudigit 100000000  210 218
+
+\defineudigit         0* 193 227
+\defineudigit         1* 210 188
+\defineudigit         2* 183 161
+\defineudigit         3* 200 254
+\defineudigit         4* 203 193
+\defineudigit         5* 206 233
+\defineudigit         6* 194 189
+\defineudigit         7* 198 226
+\defineudigit         8* 176 198
+\defineudigit         9* 190 193
+\defineudigit        10* 202 176
+\defineudigit       100* 176 219
+\defineudigit      1000* 199 170
+\defineudigit     10000* 200 102
+\defineudigit 100000000* 210 218
+
+\defineudigit        20  216 165
+\defineudigit        21  210 187
+\defineudigit        22  182 254
+\defineudigit        23  200 253
+\defineudigit        24  203 196
+\defineudigit        25  206 229
+\defineudigit        26  193 249
+\defineudigit        27  198 223
+\defineudigit        28  176 203
+\defineudigit        29  190 197
+
+\defineudigit        30  216 166
+\defineudigit        31  210 187
+\defineudigit        32  182 254
+\defineudigit        33  200 253
+\defineudigit        34  203 196
+\defineudigit        35  206 229
+\defineudigit        36  193 249
+\defineudigit        37  198 223
+\defineudigit        38  176 203
+\defineudigit        39  190 197
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-chi.tex b/tex/context/base/enco-chi.tex
deleted file mode 100644
index 9d77893a0..000000000
--- a/tex/context/base/enco-chi.tex
+++ /dev/null
@@ -1,371 +0,0 @@
-%D \module
-%D   [     file=enco-chi,
-%D      version=1999.12.02,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Traditional and Simplified Chinese,
-%D       author={Wang Lei \& Hans Hagen},
-%D         date=\currentdate,
-%D    copyright=Hans Hagen]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% actually this is also a filter -> enco-fcn.tex
-
-%D This is an experimental definition. Since we are dealing
-%D with unicode's, the registered values are not saved, so
-%D actually we're dealing with an pseudo encoding. The digits
-%D on the other hand are encoding specific.
-
-% chinese classes: left=1|right=2|center=3
-
-% untested, probably wrong
-
-\startencoding[cjk-uni]
-
-\defineuclass 1  32 24
-\defineuclass 1  32 28
-\defineuclass 1  48 20
-\defineuclass 1  48  8
-\defineuclass 1  48 10
-\defineuclass 1  48 12
-\defineuclass 1  48 14
-\defineuclass 1  48 22
-\defineuclass 1  48 16
-\defineuclass 1 255  8
-\defineuclass 1 255 59
-\defineuclass 1 255 64
-\defineuclass 1 255 91
-
-\defineuclass 3   0 183
-\defineuclass 3   0 168
-\defineuclass 3  32  38
-\defineuclass 3 255  30
-
-\defineuclass 2  48   1
-\defineuclass 2  48   2
-\defineuclass 2  32  20
-\defineuclass 2 255  94
-\defineuclass 2  32  25
-\defineuclass 2  32  29
-\defineuclass 2  48  21
-\defineuclass 2  48   9
-\defineuclass 2  48  11
-\defineuclass 2  48  13
-\defineuclass 2  48  15
-\defineuclass 2  48  23
-\defineuclass 2  48  17
-\defineuclass 2  34  55
-\defineuclass 2   0 176
-\defineuclass 2  32  50
-\defineuclass 2  32  51
-\defineuclass 2 255   1
-\defineuclass 2 255   2
-\defineuclass 2 255   7
-\defineuclass 2 255   9
-\defineuclass 2 255  12
-\defineuclass 2 255  14
-\defineuclass 2 255  26
-\defineuclass 2 255  27
-\defineuclass 2 255  31
-\defineuclass 2 255  61
-\defineuclass 2 255  93
-
-\defineudigit         0   37 203
-\defineudigit         1   78   0
-\defineudigit         2   78 140
-\defineudigit         3   78   9
-\defineudigit         4   86 219
-\defineudigit         5   78 148
-\defineudigit         6   81 109
-\defineudigit         7   78   3
-\defineudigit         8   81 107
-\defineudigit         9   78  93
-\defineudigit        10   83  65
-\defineudigit       100  118 126
-\defineudigit      1000   83  67
-\defineudigit     10000   78   7
-\defineudigit 100000000   78 191
-
-\defineudigit         0* 150 246
-\defineudigit         1*  88 249
-\defineudigit         2* 141  48
-\defineudigit         3*  83 193
-\defineudigit         4* 128 134
-\defineudigit         5*  79  13
-\defineudigit         6* 150  70
-\defineudigit         7* 103 210
-\defineudigit         8*  99  76
-\defineudigit         9* 115 150
-\defineudigit        10*  98 254
-\defineudigit       100*  79 112
-\defineudigit      1000*  78 223
-\defineudigit     10000* 132  44
-\defineudigit 100000000*  78 191
-
-\defineudigit 20 94 255
-\defineudigit 21 78   0
-\defineudigit 22 78 140
-\defineudigit 23 78   9
-\defineudigit 24 86 219
-\defineudigit 25 78 148
-\defineudigit 26 81 109
-\defineudigit 27 78   3
-\defineudigit 28 81 107
-\defineudigit 29 78  93
-
-\defineudigit 30 83  69
-\defineudigit 31 78   0
-\defineudigit 32 78 140
-\defineudigit 33 78   9
-\defineudigit 34 86 219
-\defineudigit 35 78 148
-\defineudigit 36 81 109
-\defineudigit 37 78   3
-\defineudigit 38 81 107
-\defineudigit 39 78  93
-
-\stopencoding
-
-% \doif \currentregime {utf} \endinput
-
-\startencoding[big5]
-
-\defineuclass 1 161  93
-\defineuclass 1 161  95
-\defineuclass 1 161  97
-\defineuclass 1 161  99
-\defineuclass 1 161 101
-\defineuclass 1 161 103
-\defineuclass 1 161 105
-\defineuclass 1 161 107
-\defineuclass 1 161 111
-\defineuclass 1 161 111
-\defineuclass 1 161 113
-\defineuclass 1 161 115
-\defineuclass 1 161 117
-\defineuclass 1 161 119
-\defineuclass 1 161 121
-\defineuclass 1 161 123
-\defineuclass 1 161 125
-\defineuclass 1 161 161
-\defineuclass 1 161 163
-\defineuclass 1 161 165
-\defineuclass 1 161 167
-\defineuclass 1 161 169
-\defineuclass 1 161 171
-
-\defineuclass 3 161  69
-\defineuclass 3 161  75
-\defineuclass 3 161  76
-
-\defineuclass 2 161  65
-\defineuclass 2 161  66
-\defineuclass 2 161  67
-\defineuclass 2 161  68
-\defineuclass 2 161  70
-\defineuclass 2 161  71
-\defineuclass 2 161  72
-\defineuclass 2 161  73
-\defineuclass 2 161  74
-\defineuclass 2 161  77
-\defineuclass 2 161  78
-\defineuclass 2 161  79
-\defineuclass 2 161  80
-\defineuclass 2 161  81
-\defineuclass 2 161  82
-\defineuclass 2 161  83
-\defineuclass 2 161  84
-\defineuclass 2 161  88
-\defineuclass 2 161  94
-\defineuclass 2 161  96
-\defineuclass 2 161  98
-\defineuclass 2 161 100
-\defineuclass 2 161 102
-\defineuclass 2 161 104
-\defineuclass 2 161 106
-\defineuclass 2 161 108
-\defineuclass 2 161 110
-\defineuclass 2 161 112
-\defineuclass 2 161 114
-\defineuclass 2 161 116
-\defineuclass 2 161 118
-\defineuclass 2 161 120
-\defineuclass 2 161 122
-\defineuclass 2 161 124
-\defineuclass 2 161 126
-\defineuclass 2 161 162
-\defineuclass 2 161 164
-\defineuclass 2 161 166
-\defineuclass 2 161 168
-\defineuclass 2 161 170
-\defineuclass 2 161 172
-\defineuclass 2 161 196
-\defineuclass 2 161 227
-\defineuclass 2 162  88
-\defineuclass 2 163 223
-
-\defineudigit         0  162 179
-\defineudigit         1  164  64
-\defineudigit         2  164  71
-\defineudigit         3  164  84
-\defineudigit         4  165 124
-\defineudigit         5  164 173
-\defineudigit         6  164 187
-\defineudigit         7  164  67
-\defineudigit         8  164  75
-\defineudigit         9  164  69
-\defineudigit        10  164  81
-\defineudigit       100  166 202
-\defineudigit      1000  164 100
-\defineudigit     10000  201  69
-\defineudigit 100000000  187 245
-
-\defineudigit         0* 185 115
-\defineudigit         1* 179 252
-\defineudigit         2* 182  76
-\defineudigit         3* 176 209
-\defineudigit         4* 184 118
-\defineudigit         5* 165 238
-\defineudigit         6* 179 176
-\defineudigit         7* 172 110
-\defineudigit         8* 174 195
-\defineudigit         9* 168 104
-\defineudigit        10* 172  66
-\defineudigit       100* 168 213
-\defineudigit      1000* 165  97
-\defineudigit     10000* 184  85
-\defineudigit 100000000* 187 245
-
-\defineudigit        20  164 220
-\defineudigit        21  164  64
-\defineudigit        22  164  71
-\defineudigit        23  164  84
-\defineudigit        24  165 124
-\defineudigit        25  164 173
-\defineudigit        26  164 187
-\defineudigit        27  164  67
-\defineudigit        28  164  75
-\defineudigit        29  164  69
-
-\defineudigit        30  164 202
-\defineudigit        31  164  64
-\defineudigit        32  164  71
-\defineudigit        33  164  84
-\defineudigit        34  165 124
-\defineudigit        35  164 173
-\defineudigit        36  164 187
-\defineudigit        37  164  67
-\defineudigit        38  164  75
-\defineudigit        39  164  69
-
-\stopencoding
-
-\startencoding[gbk]
-
-\defineuclass 1 161 174
-\defineuclass 1 161 176
-\defineuclass 1 161 178
-\defineuclass 1 161 180
-\defineuclass 1 161 182
-\defineuclass 1 161 184
-\defineuclass 1 161 186
-\defineuclass 1 161 188
-\defineuclass 1 161 190
-\defineuclass 1 163 168
-\defineuclass 1 163 219
-\defineuclass 1 163 224
-\defineuclass 1 163 251
-
-\defineuclass 3 161 164
-\defineuclass 3 161 167
-\defineuclass 3 161 173
-\defineuclass 3 163 190
-
-\defineuclass 2 161 162
-\defineuclass 2 161 163
-\defineuclass 2 161 170
-\defineuclass 2 161 171
-\defineuclass 2 161 175
-\defineuclass 2 161 177
-\defineuclass 2 161 179
-\defineuclass 2 161 181
-\defineuclass 2 161 183
-\defineuclass 2 161 185
-\defineuclass 2 161 187
-\defineuclass 2 161 189
-\defineuclass 2 161 191
-\defineuclass 2 161 203
-\defineuclass 2 161 227
-\defineuclass 2 161 228
-\defineuclass 2 161 229
-\defineuclass 2 163 161
-\defineuclass 2 163 162
-\defineuclass 2 163 167
-\defineuclass 2 163 169
-\defineuclass 2 163 172
-\defineuclass 2 163 174
-\defineuclass 2 163 186
-\defineuclass 2 163 187
-\defineuclass 2 163 191
-\defineuclass 2 163 221
-\defineuclass 2 163 253
-
-\defineudigit         0  161 240
-\defineudigit         1  210 187
-\defineudigit         2  182 254
-\defineudigit         3  200 253
-\defineudigit         4  203 196
-\defineudigit         5  206 229
-\defineudigit         6  193 249
-\defineudigit         7  198 223
-\defineudigit         8  176 203
-\defineudigit         9  190 197
-\defineudigit        10  202 174
-\defineudigit       100  176 217
-\defineudigit      1000  199 167
-\defineudigit     10000  205 242
-\defineudigit 100000000  210 218
-
-\defineudigit         0* 193 227
-\defineudigit         1* 210 188
-\defineudigit         2* 183 161
-\defineudigit         3* 200 254
-\defineudigit         4* 203 193
-\defineudigit         5* 206 233
-\defineudigit         6* 194 189
-\defineudigit         7* 198 226
-\defineudigit         8* 176 198
-\defineudigit         9* 190 193
-\defineudigit        10* 202 176
-\defineudigit       100* 176 219
-\defineudigit      1000* 199 170
-\defineudigit     10000* 200 102
-\defineudigit 100000000* 210 218
-
-\defineudigit        20  216 165
-\defineudigit        21  210 187
-\defineudigit        22  182 254
-\defineudigit        23  200 253
-\defineudigit        24  203 196
-\defineudigit        25  206 229
-\defineudigit        26  193 249
-\defineudigit        27  198 223
-\defineudigit        28  176 203
-\defineudigit        29  190 197
-
-\defineudigit        30  216 166
-\defineudigit        31  210 187
-\defineudigit        32  182 254
-\defineudigit        33  200 253
-\defineudigit        34  203 196
-\defineudigit        35  206 229
-\defineudigit        36  193 249
-\defineudigit        37  198 223
-\defineudigit        38  176 203
-\defineudigit        39  190 197
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-com.mkii b/tex/context/base/enco-com.mkii
new file mode 100644
index 000000000..42d0d4774
--- /dev/null
+++ b/tex/context/base/enco-com.mkii
@@ -0,0 +1,37 @@
+%D \module
+%D   [     file=enco-com,
+%D      version=2000.20.12, % split from base file 
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Composed Characters Commands,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=Hans Hagen \& Ton Otten]
+%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 Here we map some \quote {short} names onto the more 
+%D verbose glyph names. 
+
+\def\AA{\Aring}
+\def\aa{\aring}
+\def\AE{\AEligature}
+\def\ae{\aeligature}
+\def\CC{\Ccedilla}
+\def\cc{\ccedilla}
+\def \L{\Lstroke}
+\def \l{\lstroke}
+\def \O{\Ostroke}
+\def \o{\ostroke}
+\def\OE{\OEligature}
+\def\oe{\oeligature}
+\def\SZ{\Ssharp}
+\def\sz{\ssharp}
+\def\SS{\ssharp}
+\def\IJ{\IJligature}
+\def\ij{\ijligature}
+\def \i{\dotlessi}
+\def \j{\dotlessj}
+
+\endinput 
diff --git a/tex/context/base/enco-com.tex b/tex/context/base/enco-com.tex
deleted file mode 100644
index 42d0d4774..000000000
--- a/tex/context/base/enco-com.tex
+++ /dev/null
@@ -1,37 +0,0 @@
-%D \module
-%D   [     file=enco-com,
-%D      version=2000.20.12, % split from base file 
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Composed Characters Commands,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=Hans Hagen \& Ton Otten]
-%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 Here we map some \quote {short} names onto the more 
-%D verbose glyph names. 
-
-\def\AA{\Aring}
-\def\aa{\aring}
-\def\AE{\AEligature}
-\def\ae{\aeligature}
-\def\CC{\Ccedilla}
-\def\cc{\ccedilla}
-\def \L{\Lstroke}
-\def \l{\lstroke}
-\def \O{\Ostroke}
-\def \o{\ostroke}
-\def\OE{\OEligature}
-\def\oe{\oeligature}
-\def\SZ{\Ssharp}
-\def\sz{\ssharp}
-\def\SS{\ssharp}
-\def\IJ{\IJligature}
-\def\ij{\ijligature}
-\def \i{\dotlessi}
-\def \j{\dotlessj}
-
-\endinput 
diff --git a/tex/context/base/enco-cyr.mkii b/tex/context/base/enco-cyr.mkii
new file mode 100644
index 000000000..36bca82b5
--- /dev/null
+++ b/tex/context/base/enco-cyr.mkii
@@ -0,0 +1,1037 @@
+%D \module
+%D   [       file=enco-cyr,
+%D        version=2003.01.24,
+%D          title=\CONTEXT\ Encoding Macros,
+%D       subtitle=Cyrillic,
+%D         author=...,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 The following kerning test is inspired by a test file
+%D provided by Victor Figurnov. I hope he still recognizes
+%D some bit and pieces.
+%D
+%D \starttyping
+%D \setupoutput[pdftex]
+%D
+%D \startMPenvironment[global]
+%D   \useregime[cyr]
+%D   \useencoding[cyr]
+%D   \mainlanguage[ru]
+%D   \enableregime[cp1251]
+%D   \setupbodyfont[cyr]
+%D \stopMPenvironment
+%D
+%D \startbuffer
+%D \starttabulate[|l|l|l|]
+%D \NC \ruledhbox{}          \NC \ruledhbox{AV}        \NC with kerning    \NC \NR
+%D \NC \ruledhbox{{}{}}      \NC \ruledhbox{A{}V}      \NC without kerning \NC \NR
+%D \NC \ruledhbox{\tfd }     \NC \ruledhbox{\tfd AV}   \NC with kerning    \NC \NR
+%D \NC \ruledhbox{\tfd {}{}} \NC \ruledhbox{\tfd A{}V} \NC without kerning \NC \NR
+%D \stoptabulate
+%D
+%D \showkerning{  }
+%D \stopbuffer
+%D
+%D \starttext
+%D
+%D \title{Kerning test}
+%D
+%D \typebuffer
+%D
+%D \rm \subject{Serif      font} \getbuffer
+%D \ss \subject{SansSerif  font} \getbuffer
+%D \tt \subject{MonoSpacec font} \getbuffer
+%D
+%D \stoptext
+%D \stoptyping
+
+%D We start with a fallback, define by HH, who assumes that
+%D this is phonetic.
+
+\startmapping[t2a]
+
+\resetcaserange 128 to 255
+
+\definecasemaps 192 to 223 lc +32 uc   0  % base letters (russian)
+\definecasemaps 224 to 255 lc   0 uc -32
+
+\definecasemaps 128 to 156 lc +32 uc   0  % extra letters (cyrillic and old-slav)
+\definecasemaps 160 to 188 lc   0 uc -32
+
+\definecasemap 73 105 73  \definecasemap 105 105 73  % cyrillicII
+\definecasemap 74 106 74  \definecasemap 106 106 74  % cyrillicJE
+\definecasemap 81 113 81  \definecasemap 113 113 81  % cyrillicQ
+\definecasemap 87 119 87  \definecasemap 119 119 87  % cyrillicW
+
+\stopmapping
+
+\startencoding[t2a]
+
+\definecharacter textgrave                   0
+\definecharacter textacute                   1
+\definecharacter textcircumflex              2
+\definecharacter texttilde                   3
+\definecharacter textdiaeresis               4
+\definecharacter texthungarumlaut            5
+\definecharacter textring                    6
+\definecharacter textcaron                   7
+\definecharacter textbreve                   8
+\definecharacter textmacron                  9
+\definecharacter textdotaccent              10
+\definecharacter textcedilla                11
+\definecharacter textogonek                 12
+
+\definecharacter textcyrillicflex           18
+\definecharacter textdblgrave               19
+\definecharacter textcyrillicbreve          20
+
+\definecharacter endash                     21
+\definecharacter emdash                     22
+
+\definecharacter textcompwordmark           23
+\definecharacter textbackslash              92
+\definecharacter textasciicircum            94
+\definecharacter textunderscore             95
+\definecharacter textbraceleft             123
+\definecharacter textbraceright            125
+\definecharacter textasciitilde            126
+\definecharacter textnumero                157
+\definecharacter textcurrency              158
+\definecharacter sectionmark               159
+
+\definecharacter quotedbl                   34
+\definecharacter quoteleft                  96
+\definecharacter upperleftsingleninequote   39
+\definecharacter quotedblleft               16
+\definecharacter quotedblright              17
+\definecharacter lowerleftdoubleninequote  189
+\definecharacter upperrightdoublesixquote   16
+\definecharacter upperrightdoubleninequote  17
+\definecharacter quotedblbase              189
+
+\definecharacter cyrillicpalochka           13
+\definecharacter cyrilliclangle             14
+\definecharacter cyrillicrangle             15
+
+\definecharacter leftguillemot             190
+\definecharacter rightguillemot            191
+\definecharacter dotlessi                   25
+
+\definecharacter cyrillicA                 192
+\definecharacter cyrillica                 224
+\definecharacter cyrillicB                 193
+\definecharacter cyrillicb                 225
+\definecharacter cyrillicV                 194
+\definecharacter cyrillicv                 226
+\definecharacter cyrillicG                 195
+\definecharacter cyrillicg                 227
+\definecharacter cyrillicD                 196
+\definecharacter cyrillicd                 228
+\definecharacter cyrillicE                 197
+\definecharacter cyrillice                 229
+\definecharacter cyrillicZH                198
+\definecharacter cyrilliczh                230
+\definecharacter cyrillicZ                 199
+\definecharacter cyrillicz                 231
+\definecharacter cyrillicI                 200
+\definecharacter cyrillici                 232
+\definecharacter cyrillicISHRT             201
+\definecharacter cyrillicishrt             233
+\definecharacter cyrillicK                 202
+\definecharacter cyrillick                 234
+\definecharacter cyrillicL                 203
+\definecharacter cyrillicl                 235
+\definecharacter cyrillicM                 204
+\definecharacter cyrillicm                 236
+\definecharacter cyrillicN                 205
+\definecharacter cyrillicn                 237
+\definecharacter cyrillicO                 206
+\definecharacter cyrillico                 238
+\definecharacter cyrillicP                 207
+\definecharacter cyrillicp                 239
+\definecharacter cyrillicR                 208
+\definecharacter cyrillicr                 240
+\definecharacter cyrillicS                 209
+\definecharacter cyrillics                 241
+\definecharacter cyrillicT                 210
+\definecharacter cyrillict                 242
+\definecharacter cyrillicU                 211
+\definecharacter cyrillicu                 243
+\definecharacter cyrillicF                 212
+\definecharacter cyrillicf                 244
+\definecharacter cyrillicH                 213
+\definecharacter cyrillich                 245
+\definecharacter cyrillicC                 214
+\definecharacter cyrillicc                 246
+\definecharacter cyrillicCH                215
+\definecharacter cyrillicch                247
+\definecharacter cyrillicSH                216
+\definecharacter cyrillicsh                248
+\definecharacter cyrillicSHCH              217
+\definecharacter cyrillicshch              249
+\definecharacter cyrillicHRDSN             218
+\definecharacter cyrillichrdsn             250
+\definecharacter cyrillicERY               219
+\definecharacter cyrillicery               251
+\definecharacter cyrillicSFTSN             220
+\definecharacter cyrillicsftsn             252
+\definecharacter cyrillicEREV              221
+\definecharacter cyrillicerev              253
+\definecharacter cyrillicYU                222
+\definecharacter cyrillicyu                254
+\definecharacter cyrillicYA                223
+\definecharacter cyrillicya                255
+\definecharacter cyrillicGUP               128
+\definecharacter cyrillicgup               160
+\definecharacter cyrillicGHCRS             129
+\definecharacter cyrillicghcrs             161
+\definecharacter cyrillicDJE               130
+\definecharacter cyrillicdje               162
+\definecharacter cyrillicTSHE              131
+\definecharacter cyrillictshe              163
+\definecharacter cyrillicSHHA              132
+\definecharacter cyrillicshha              164
+\definecharacter cyrillicZHDSC             133
+\definecharacter cyrilliczhdsc             165
+\definecharacter cyrillicZDSC              134
+\definecharacter cyrilliczdsc              166
+\definecharacter cyrillicLJE               135
+\definecharacter cyrilliclje               167
+\definecharacter cyrillicYI                136
+\definecharacter cyrillicyi                168
+\definecharacter cyrillicKDSC              137
+\definecharacter cyrillickdsc              169
+\definecharacter cyrillicKBEAK             138
+\definecharacter cyrillickbeak             170
+\definecharacter cyrillicKVCRS             139
+\definecharacter cyrillickvcrs             171
+\definecharacter cyrillicAE                140
+\definecharacter cyrillicae                172
+\definecharacter cyrillicNDSC              141
+\definecharacter cyrillicndsc              173
+\definecharacter cyrillicNG                142
+\definecharacter cyrillicng                174
+\definecharacter cyrillicDZE               143
+\definecharacter cyrillicdze               175
+\definecharacter cyrillicOTLD              144
+\definecharacter cyrillicotld              176
+\definecharacter cyrillicSDSC              145
+\definecharacter cyrillicsdsc              177
+\definecharacter cyrillicUSHRT             146
+\definecharacter cyrillicushrt             178
+\definecharacter cyrillicY                 147
+\definecharacter cyrillicy                 179
+\definecharacter cyrillicYHCRS             148
+\definecharacter cyrillicyhcrs             180
+\definecharacter cyrillicHDSC              149
+\definecharacter cyrillichdsc              181
+\definecharacter cyrillicDZHE              150
+\definecharacter cyrillicdzhe              182
+\definecharacter cyrillicCHVCRS            151
+\definecharacter cyrillicchvcrs            183
+\definecharacter cyrillicCHRDSC            152
+\definecharacter cyrillicchrdsc            184
+\definecharacter cyrillicIE                153
+\definecharacter cyrillicie                185
+\definecharacter cyrillicSCHWA             154
+\definecharacter cyrillicschwa             186
+\definecharacter cyrillicNJE               155
+\definecharacter cyrillicnje               187
+\definecharacter cyrillicYO                156
+\definecharacter cyrillicyo                188
+\definecharacter cyrillicII                 73
+\definecharacter cyrillicii                105
+\definecharacter cyrillicJE                 74
+\definecharacter cyrillicje                106
+\definecharacter cyrillicQ                  81
+\definecharacter cyrillicq                 113
+\definecharacter cyrillicW                  87
+\definecharacter cyrillicw                 119
+
+% \definecharacter textperthousand    {\%\char 24 }
+% \definecharacter textpertenthousand {\%\char 24\char 24 }
+
+\definecharacter cyrillicgheupturn         160 % to satisfy the patterns
+
+\stopencoding
+
+\startmapping[t2b]
+
+\resetcaserange 128 to 255
+
+\definecasemaps 192 to 223 lc +32 uc   0  % base letters (russian)
+\definecasemaps 224 to 255 lc   0 uc -32
+
+\definecasemaps 128 to 156 lc +32 uc   0  % extra letters (cyrillic and old-slav)
+\definecasemaps 160 to 188 lc   0 uc -32
+
+\definecasemap 73  105 73   \definecasemap 105 105 73   % cyrillicII
+\definecasemap 74  106 74   \definecasemap 106 106 74   % cyrillicJE
+\definecasemap 81  113 81   \definecasemap 113 113 81   % cyrillicQ
+\definecasemap 83  115 83   \definecasemap 115 115 83   % cyrillicDZE
+\definecasemap 87  119 87   \definecasemap 119 119 87   % cyrillicW
+
+\stopmapping
+
+\startencoding[t2b]
+
+\definecharacter textgrave                   0
+\definecharacter textacute                   1
+\definecharacter textcircumflex              2
+\definecharacter texttilde                   3
+\definecharacter textdiaeresis               4
+\definecharacter texthungarumlaut            5
+\definecharacter textring                    6
+\definecharacter textcaron                   7
+\definecharacter textbreve                   8
+\definecharacter textmacron                  9
+\definecharacter textdotaccent              10
+\definecharacter textcedilla                11
+\definecharacter textogonek                 12
+
+\definecharacter textcyrillicflex           18
+\definecharacter textdblgrave               19
+\definecharacter textcyrillicbreve          20
+
+\definecharacter endash                     21
+\definecharacter emdash                     22
+
+\definecharacter textcompwordmark           23
+\definecharacter textbackslash              92
+\definecharacter textasciicircum            94
+\definecharacter textunderscore             95
+\definecharacter textbraceleft             123
+\definecharacter textbraceright            125
+\definecharacter textasciitilde            126
+\definecharacter textnumero                157
+\definecharacter textcurrency              158
+\definecharacter sectionmark               159
+\definecharacter quotedbl                   34
+\definecharacter quoteleft                  96
+\definecharacter upperleftsingleninequote   39
+\definecharacter quotedblleft               16
+\definecharacter quotedblright              17
+\definecharacter lowerleftdoubleninequote  189
+
+\definecharacter upperrightdoublesixquote   16
+\definecharacter upperrightdoubleninequote  17
+\definecharacter quotedblbase              189
+
+\definecharacter cyrillicpalochka           13
+\definecharacter cyrilliclangle             14
+\definecharacter cyrillicrangle             15
+
+\definecharacter leftguillemot             190
+\definecharacter rightguillemot            191
+\definecharacter dotlessi                   25
+
+\definecharacter cyrillicA                 192
+\definecharacter cyrillica                 224
+\definecharacter cyrillicB                 193
+\definecharacter cyrillicb                 225
+\definecharacter cyrillicV                 194
+\definecharacter cyrillicv                 226
+\definecharacter cyrillicG                 195
+\definecharacter cyrillicg                 227
+\definecharacter cyrillicD                 196
+\definecharacter cyrillicd                 228
+\definecharacter cyrillicE                 197
+\definecharacter cyrillice                 229
+\definecharacter cyrillicZH                198
+\definecharacter cyrilliczh                230
+\definecharacter cyrillicZ                 199
+\definecharacter cyrillicz                 231
+\definecharacter cyrillicI                 200
+\definecharacter cyrillici                 232
+\definecharacter cyrillicISHRT             201
+\definecharacter cyrillicishrt             233
+\definecharacter cyrillicK                 202
+\definecharacter cyrillick                 234
+\definecharacter cyrillicL                 203
+\definecharacter cyrillicl                 235
+\definecharacter cyrillicM                 204
+\definecharacter cyrillicm                 236
+\definecharacter cyrillicN                 205
+\definecharacter cyrillicn                 237
+\definecharacter cyrillicO                 206
+\definecharacter cyrillico                 238
+\definecharacter cyrillicP                 207
+\definecharacter cyrillicp                 239
+\definecharacter cyrillicR                 208
+\definecharacter cyrillicr                 240
+\definecharacter cyrillicS                 209
+\definecharacter cyrillics                 241
+\definecharacter cyrillicT                 210
+\definecharacter cyrillict                 242
+\definecharacter cyrillicU                 211
+\definecharacter cyrillicu                 243
+\definecharacter cyrillicF                 212
+\definecharacter cyrillicf                 244
+\definecharacter cyrillicH                 213
+\definecharacter cyrillich                 245
+\definecharacter cyrillicC                 214
+\definecharacter cyrillicc                 246
+\definecharacter cyrillicCH                215
+\definecharacter cyrillicch                247
+\definecharacter cyrillicSH                216
+\definecharacter cyrillicsh                248
+\definecharacter cyrillicSHCH              217
+\definecharacter cyrillicshch              249
+\definecharacter cyrillicHRDSN             218
+\definecharacter cyrillichrdsn             250
+\definecharacter cyrillicERY               219
+\definecharacter cyrillicery               251
+\definecharacter cyrillicSFTSN             220
+\definecharacter cyrillicsftsn             252
+\definecharacter cyrillicEREV              221
+\definecharacter cyrillicerev              253
+\definecharacter cyrillicYU                222
+\definecharacter cyrillicyu                254
+\definecharacter cyrillicYA                223
+\definecharacter cyrillicya                255
+\definecharacter cyrillicGDSCHCRS          128
+\definecharacter cyrillicgdschcrs          160
+\definecharacter cyrillicGHCRS             129
+\definecharacter cyrillicghcrs             161
+\definecharacter cyrillicGDSC              130
+\definecharacter cyrillicgdsc              162
+\definecharacter cyrillicGHK               131
+\definecharacter cyrillicghk               163
+\definecharacter cyrillicSHHA              132
+\definecharacter cyrillicshha              164
+\definecharacter cyrillicZHDSC             133
+\definecharacter cyrilliczhdsc             165
+\definecharacter cyrillicDELTA             134
+\definecharacter cyrillicdelta             166
+\definecharacter cyrillicABHDZE            135
+\definecharacter cyrillicabhdze            167
+\definecharacter cyrillicLJE               136
+\definecharacter cyrilliclje               168
+\definecharacter cyrillicKDSC              137
+\definecharacter cyrillickdsc              169
+\definecharacter cyrillicLDSC              138
+\definecharacter cyrillicldsc              170
+\definecharacter cyrillicKHK               139
+\definecharacter cyrillickhk               171
+\definecharacter cyrillicLHK               140
+\definecharacter cyrilliclhk               172
+\definecharacter cyrillicNDSC              141
+\definecharacter cyrillicndsc              173
+\definecharacter cyrillicNG                142
+\definecharacter cyrillicng                174
+\definecharacter cyrillicNHK               143
+\definecharacter cyrillicnhk               175
+\definecharacter cyrillicOTLD              144
+\definecharacter cyrillicotld              176
+\definecharacter cyrillicSACRS             145
+\definecharacter cyrillicsacrs             177
+\definecharacter cyrillicUSHRT             146
+\definecharacter cyrillicushrt             178
+\definecharacter cyrillicY                 147
+\definecharacter cyrillicy                 179
+\definecharacter cyrillicHHCRS             148
+\definecharacter cyrillichhcrs             180
+\definecharacter cyrillicHDSC              149
+\definecharacter cyrillichdsc              181
+\definecharacter cyrillicHHK               150
+\definecharacter cyrillichhk               182
+\definecharacter cyrillicCHLDSC            151
+\definecharacter cyrillicchldsc            183
+\definecharacter cyrillicCHRDSC            152
+\definecharacter cyrillicchrdsc            184
+\definecharacter cyrillicNJE               153
+\definecharacter cyrillicnje               185
+\definecharacter cyrillicSCHWA             154
+\definecharacter cyrillicschwa             186
+\definecharacter cyrillicEPS               155
+\definecharacter cyrilliceps               187
+\definecharacter cyrillicYO                156
+\definecharacter cyrillicyo                188
+\definecharacter cyrillicII                 73
+\definecharacter cyrillicii                105
+\definecharacter cyrillicJE                 74
+\definecharacter cyrillicje                106
+\definecharacter cyrillicQ                  81
+\definecharacter cyrillicq                 113
+\definecharacter cyrillicDZE                83
+\definecharacter cyrillicdze               115
+\definecharacter cyrillicW                  87
+\definecharacter cyrillicw                 119
+
+\stopencoding
+
+\startmapping[t2c]
+
+\resetcaserange 128 to 255
+
+\definecasemaps 192 to 223 lc +32 uc   0  % base letters (russian)
+\definecasemaps 224 to 255 lc   0 uc -32
+
+\definecasemaps 128 to 156 lc +32 uc   0  % extra letters (cyrillic and old-slav)
+\definecasemaps 160 to 188 lc   0 uc -32
+
+\definecasemap 73 105 73  \definecasemap 105 105 73  % cyrillicII
+\definecasemap 74 106 74  \definecasemap 106 106 74  % cyrillicJE
+\definecasemap 81 113 81  \definecasemap 113 113 81  % cyrillicQ
+\definecasemap 83 115 83  \definecasemap 115 115 83  % cyrillicDZE
+\definecasemap 87 119 87  \definecasemap 119 119 87  % cyrillicW
+
+\stopmapping
+
+\startencoding[t2c]
+
+\definecharacter textgrave                   0
+\definecharacter textacute                   1
+\definecharacter textcircumflex              2
+\definecharacter texttilde                   3
+\definecharacter textdiaeresis               4
+\definecharacter texthungarumlaut            5
+\definecharacter textring                    6
+\definecharacter textcaron                   7
+\definecharacter textbreve                   8
+\definecharacter textmacron                  9
+\definecharacter textdotaccent              10
+\definecharacter textcedilla                11
+\definecharacter textogonek                 12
+
+\definecharacter textcyrillicflex           18
+\definecharacter textdblgrave               19
+\definecharacter textcyrillicbreve          20
+
+\definecharacter endash                     21
+\definecharacter emdash                     22
+
+\definecharacter textcompwordmark           23
+\definecharacter textbackslash              92
+\definecharacter textasciicircum            94
+\definecharacter textunderscore             95
+\definecharacter textbraceleft             123
+\definecharacter textbraceright            125
+\definecharacter textasciitilde            126
+\definecharacter textnumero                157
+\definecharacter textcurrency              158
+\definecharacter sectionmark               159
+\definecharacter quotedbl                   34
+\definecharacter quoteleft                  96
+\definecharacter upperleftsingleninequote   39
+\definecharacter quotedblleft               16
+\definecharacter quotedblright              17
+\definecharacter lowerleftdoubleninequote  189
+\definecharacter upperrightdoublesixquote   16
+\definecharacter upperrightdoubleninequote  17
+\definecharacter quotedblbase              189
+
+\definecharacter cyrillicpalochka           13
+\definecharacter cyrilliclangle             14
+\definecharacter cyrillicrangle             15
+
+\definecharacter leftguillemot             190
+\definecharacter rightguillemot            191
+
+\definecharacter dotlessi                   25
+
+\definecharacter cyrillicA                  192
+\definecharacter cyrillica                  224
+\definecharacter cyrillicB                  193
+\definecharacter cyrillicb                  225
+\definecharacter cyrillicV                  194
+\definecharacter cyrillicv                  226
+\definecharacter cyrillicG                  195
+\definecharacter cyrillicg                  227
+\definecharacter cyrillicD                  196
+\definecharacter cyrillicd                  228
+\definecharacter cyrillicE                  197
+\definecharacter cyrillice                  229
+\definecharacter cyrillicZH                 198
+\definecharacter cyrilliczh                 230
+\definecharacter cyrillicZ                  199
+\definecharacter cyrillicz                  231
+\definecharacter cyrillicI                  200
+\definecharacter cyrillici                  232
+\definecharacter cyrillicISHRT              201
+\definecharacter cyrillicishrt              233
+\definecharacter cyrillicK                  202
+\definecharacter cyrillick                  234
+\definecharacter cyrillicL                  203
+\definecharacter cyrillicl                  235
+\definecharacter cyrillicM                  204
+\definecharacter cyrillicm                  236
+\definecharacter cyrillicN                  205
+\definecharacter cyrillicn                  237
+\definecharacter cyrillicO                  206
+\definecharacter cyrillico                  238
+\definecharacter cyrillicP                  207
+\definecharacter cyrillicp                  239
+\definecharacter cyrillicR                  208
+\definecharacter cyrillicr                  240
+\definecharacter cyrillicS                  209
+\definecharacter cyrillics                  241
+\definecharacter cyrillicT                  210
+\definecharacter cyrillict                  242
+\definecharacter cyrillicU                  211
+\definecharacter cyrillicu                  243
+\definecharacter cyrillicF                  212
+\definecharacter cyrillicf                  244
+\definecharacter cyrillicH                  213
+\definecharacter cyrillich                  245
+\definecharacter cyrillicC                  214
+\definecharacter cyrillicc                  246
+\definecharacter cyrillicCH                 215
+\definecharacter cyrillicch                 247
+\definecharacter cyrillicSH                 216
+\definecharacter cyrillicsh                 248
+\definecharacter cyrillicSHCH               217
+\definecharacter cyrillicshch               249
+\definecharacter cyrillicHRDSN              218
+\definecharacter cyrillichrdsn              250
+\definecharacter cyrillicERY                219
+\definecharacter cyrillicery                251
+\definecharacter cyrillicSFTSN              220
+\definecharacter cyrillicsftsn              252
+\definecharacter cyrillicEREV               221
+\definecharacter cyrillicerev               253
+\definecharacter cyrillicYU                 222
+\definecharacter cyrillicyu                 254
+\definecharacter cyrillicYA                 223
+\definecharacter cyrillicya                 255
+\definecharacter cyrillicPHK                128
+\definecharacter cyrillicphk                160
+\definecharacter cyrillicTETSE              129
+\definecharacter cyrillictetse              161
+\definecharacter cyrillicTDSC               130
+\definecharacter cyrillictdsc               162
+\definecharacter cyrillicGHK                131
+\definecharacter cyrillicghk                163
+\definecharacter cyrillicSHHA               132
+\definecharacter cyrillicshha               164
+\definecharacter cyrillicRDSC               133
+\definecharacter cyrillicrdsc               165
+\definecharacter cyrillicRTICK              134
+\definecharacter cyrillicrtick              166
+\definecharacter cyrillicABHDZE             135
+\definecharacter cyrillicabhdze             167
+\definecharacter cyrillicMDSC               136
+\definecharacter cyrillicmdsc               168
+\definecharacter cyrillicKDSC               137
+\definecharacter cyrillickdsc               169
+\definecharacter cyrillicLDSC               138
+\definecharacter cyrillicldsc               170
+\definecharacter cyrillicKHCRS              139
+\definecharacter cyrillickhcrs              171
+\definecharacter cyrillicLHK                140
+\definecharacter cyrilliclhk                172
+\definecharacter cyrillicNDSC               141
+\definecharacter cyrillicndsc               173
+\definecharacter cyrillicMHK                142
+\definecharacter cyrillicmhk                174
+\definecharacter cyrillicNHK                143
+\definecharacter cyrillicnhk                175
+\definecharacter cyrillicOTLD               144
+\definecharacter cyrillicotld               176
+\definecharacter cyrillicABHCH              145
+\definecharacter cyrillicabhch              177
+\definecharacter cyrillicABHCHDSC           146
+\definecharacter cyrillicabhchdsc           178
+\definecharacter cyrillicSEMISFTSN          147
+\definecharacter cyrillicsemisftsn          179
+\definecharacter cyrillicISHRTDSC           148
+\definecharacter cyrillicishrtdsc           180
+\definecharacter cyrillicHDSC               149
+\definecharacter cyrillichdsc               181
+\definecharacter cyrillicDZHE               150
+\definecharacter cyrillicdzhe               182
+\definecharacter cyrillicABHHA              151
+\definecharacter cyrillicabhha              183
+\definecharacter cyrillicCHRDSC             152
+\definecharacter cyrillicchrdsc             184
+\definecharacter cyrillicNLHK               153
+\definecharacter cyrillicnlhk               185
+\definecharacter cyrillicSCHWA              154
+\definecharacter cyrillicschwa              186
+\definecharacter cyrillicRHK                155
+\definecharacter cyrillicrhk                187
+\definecharacter cyrillicYO                 156
+\definecharacter cyrillicyo                 188
+\definecharacter cyrillicII                  73
+\definecharacter cyrillicii                 105
+\definecharacter cyrillicJE                  74
+\definecharacter cyrillicje                 106
+\definecharacter cyrillicQ                   81
+\definecharacter cyrillicq                  113
+\definecharacter cyrillicDZE                 83
+\definecharacter cyrillicdze                115
+\definecharacter cyrillicW                   87
+\definecharacter cyrillicw                  119
+
+\stopencoding
+
+\startmapping[x2]
+
+\resetcaserange 128 to 255
+
+\definecasemaps 192 to 223 lc +32 uc   0  % base letters (russian)
+\definecasemaps 224 to 255 lc   0 uc -32
+
+\definecasemaps 128 to 156 lc +32 uc   0  % extra letters (cyrillic and old-slav)
+\definecasemaps 160 to 188 lc   0 uc -32
+
+\definecasemaps  65 to  90 lc +32 uc   0  % more extra letters (cyrillic and old-slav)
+\definecasemaps  97 to 122 lc   0 uc -32
+
+\definecasemap 28 29 28  \definecasemap 29 29 28 % cyrillicNLHK
+\definecasemap 30 31 30  \definecasemap 31 31 30 % cyrillicDELTA
+
+\stopmapping
+
+\startencoding[x2]
+
+\definecharacter textgrave                    0
+\definecharacter textacute                    1
+\definecharacter textcircumflex               2
+\definecharacter texttilde                    3
+\definecharacter textdiaeresis                4
+\definecharacter texthungarumlaut             5
+\definecharacter textring                     6
+\definecharacter textcaron                    7
+\definecharacter textbreve                    8
+\definecharacter textmacron                   9
+\definecharacter textdotaccent               10
+\definecharacter textcedilla                 11
+\definecharacter textogonek                  12
+
+\definecharacter endash                      21
+\definecharacter emdash                      22
+
+\definecharacter textcompwordmark            23
+\definecharacter textvisiblespace            32
+\definecharacter textdollar                  36
+\definecharacter textless                    60
+\definecharacter textgreater                 62
+\definecharacter textbackslash               92
+\definecharacter textasciicircum             94
+\definecharacter textunderscore              95
+\definecharacter textbraceleft              123
+\definecharacter textbar                    124
+\definecharacter textbraceright             125
+\definecharacter textasciitilde             126
+\definecharacter textnumero                 157
+\definecharacter textcurrency               158
+\definecharacter textsection                159
+\definecharacter sectionmark                159
+\definecharacter textquotedbl                34
+
+\definecharacter cyrillicpalochka            13
+\definecharacter cyrilliclangle              14
+\definecharacter cyrillicrangle              15
+
+\definecharacter leftguillemot              190
+\definecharacter rightguillemot             191
+
+\definecharacter upperleftsinglesixquote     96
+\definecharacter upperleftsingleninequote    39
+\definecharacter upperleftdoublesixquote     16
+\definecharacter upperleftdoubleninequote    17
+\definecharacter lowerleftdoubleninequote   189
+
+\definecharacter upperrightsinglesixquote    96
+\definecharacter upperrightsingleninequote   39
+\definecharacter upperrightdoublesixquote    16
+\definecharacter upperrightdoubleninequote   17
+\definecharacter lowerrightdoubleninequote  189
+
+\definecharacter cyrillicA                  192
+\definecharacter cyrillica                  224
+\definecharacter cyrillicB                  193
+\definecharacter cyrillicb                  225
+\definecharacter cyrillicV                  194
+\definecharacter cyrillicv                  226
+\definecharacter cyrillicG                  195
+\definecharacter cyrillicg                  227
+\definecharacter cyrillicD                  196
+\definecharacter cyrillicd                  228
+\definecharacter cyrillicE                  197
+\definecharacter cyrillice                  229
+\definecharacter cyrillicZH                 198
+\definecharacter cyrilliczh                 230
+\definecharacter cyrillicZ                  199
+\definecharacter cyrillicz                  231
+\definecharacter cyrillicI                  200
+\definecharacter cyrillici                  232
+\definecharacter cyrillicISHRT              201
+\definecharacter cyrillicishrt              233
+\definecharacter cyrillicK                  202
+\definecharacter cyrillick                  234
+\definecharacter cyrillicL                  203
+\definecharacter cyrillicl                  235
+\definecharacter cyrillicM                  204
+\definecharacter cyrillicm                  236
+\definecharacter cyrillicN                  205
+\definecharacter cyrillicn                  237
+\definecharacter cyrillicO                  206
+\definecharacter cyrillico                  238
+\definecharacter cyrillicP                  207
+\definecharacter cyrillicp                  239
+\definecharacter cyrillicR                  208
+\definecharacter cyrillicr                  240
+\definecharacter cyrillicS                  209
+\definecharacter cyrillics                  241
+\definecharacter cyrillicT                  210
+\definecharacter cyrillict                  242
+\definecharacter cyrillicU                  211
+\definecharacter cyrillicu                  243
+\definecharacter cyrillicF                  212
+\definecharacter cyrillicf                  244
+\definecharacter cyrillicH                  213
+\definecharacter cyrillich                  245
+\definecharacter cyrillicC                  214
+\definecharacter cyrillicc                  246
+\definecharacter cyrillicCH                 215
+\definecharacter cyrillicch                 247
+\definecharacter cyrillicSH                 216
+\definecharacter cyrillicsh                 248
+\definecharacter cyrillicSHCH               217
+\definecharacter cyrillicshch               249
+\definecharacter cyrillicHRDSN              218
+\definecharacter cyrillichrdsn              250
+\definecharacter cyrillicERY                219
+\definecharacter cyrillicery                251
+\definecharacter cyrillicSFTSN              220
+\definecharacter cyrillicsftsn              252
+\definecharacter cyrillicEREV               221
+\definecharacter cyrillicerev               253
+\definecharacter cyrillicYU                 222
+\definecharacter cyrillicyu                 254
+\definecharacter cyrillicYA                 223
+\definecharacter cyrillicya                 255
+\definecharacter cyrillicGUP                128
+\definecharacter cyrillicgup                160
+\definecharacter cyrillicGHCRS              129
+\definecharacter cyrillicghcrs              161
+\definecharacter cyrillicGDSC               130
+\definecharacter cyrillicgdsc               162
+\definecharacter cyrillicGHK                131
+\definecharacter cyrillicghk                163
+\definecharacter cyrillicSHHA               132
+\definecharacter cyrillicshha               164
+\definecharacter cyrillicZHDSC              133
+\definecharacter cyrilliczhdsc              165
+\definecharacter cyrillicZDSC               134
+\definecharacter cyrilliczdsc               166
+\definecharacter cyrillicABHDZE             135
+\definecharacter cyrillicabhdze             167
+\definecharacter cyrillicYI                 136
+\definecharacter cyrillicyi                 168
+\definecharacter cyrillicKDSC               137
+\definecharacter cyrillickdsc               169
+\definecharacter cyrillicKBEAK              138
+\definecharacter cyrillickbeak              170
+\definecharacter cyrillicKHK                139
+\definecharacter cyrillickhk                171
+\definecharacter cyrillicLHK                140
+\definecharacter cyrilliclhk                172
+\definecharacter cyrillicNDSC               141
+\definecharacter cyrillicndsc               173
+\definecharacter cyrillicNG                 142
+\definecharacter cyrillicng                 174
+\definecharacter cyrillicNHK                143
+\definecharacter cyrillicnhk                175
+\definecharacter cyrillicOTLD               144
+\definecharacter cyrillicotld               176
+\definecharacter cyrillicSDSC               145
+\definecharacter cyrillicsdsc               177
+\definecharacter cyrillicUSHRT              146
+\definecharacter cyrillicushrt              178
+\definecharacter cyrillicY                  147
+\definecharacter cyrillicy                  179
+\definecharacter cyrillicYHCRS              148
+\definecharacter cyrillicyhcrs              180
+\definecharacter cyrillicHDSC               149
+\definecharacter cyrillichdsc               181
+\definecharacter cyrillicHHK                150
+\definecharacter cyrillichhk                182
+\definecharacter cyrillicCHLDSC             151
+\definecharacter cyrillicchldsc             183
+\definecharacter cyrillicCHRDSC             152
+\definecharacter cyrillicchrdsc             184
+\definecharacter cyrillicIE                 153
+\definecharacter cyrillicie                 185
+\definecharacter cyrillicSCHWA              154
+\definecharacter cyrillicschwa              186
+\definecharacter cyrillicEPS                155
+\definecharacter cyrilliceps                187
+\definecharacter cyrillicYO                 156
+\definecharacter cyrillicyo                 188
+\definecharacter cyrillicAE                  65
+\definecharacter cyrillicae                  97
+\definecharacter cyrillicDJE                 66
+\definecharacter cyrillicdje                 98
+\definecharacter cyrillicTSHE                67
+\definecharacter cyrillictshe                99
+\definecharacter cyrillicABHCH               68
+\definecharacter cyrillicabhch              100
+\definecharacter cyrillicABHCHDSC            69
+\definecharacter cyrillicabhchdsc           101
+\definecharacter cyrillicKVCRS               70
+\definecharacter cyrillickvcrs              102
+\definecharacter cyrillicKHCRS               71
+\definecharacter cyrillickhcrs              103
+\definecharacter cyrillicLDSC                72
+\definecharacter cyrillicldsc               104
+\definecharacter cyrillicII                  73
+\definecharacter cyrillicii                 105
+\definecharacter cyrillicJE                  74
+\definecharacter cyrillicje                 106
+\definecharacter cyrillicLJE                 75
+\definecharacter cyrilliclje                107
+\definecharacter cyrillicMDSC                76
+\definecharacter cyrillicmdsc               108
+\definecharacter cyrillicNJE                 77
+\definecharacter cyrillicnje                109
+\definecharacter cyrillicABHHA               78
+\definecharacter cyrillicabhha              110
+\definecharacter cyrillicPHK                 79
+\definecharacter cyrillicphk                111
+\definecharacter cyrillicRDSC                80
+\definecharacter cyrillicrdsc               112
+\definecharacter cyrillicQ                   81
+\definecharacter cyrillicq                  113
+\definecharacter cyrillicTDSC                82
+\definecharacter cyrillictdsc               114
+\definecharacter cyrillicDZE                 83
+\definecharacter cyrillicdze                115
+\definecharacter cyrillicTETSE               84
+\definecharacter cyrillictetse              116
+\definecharacter cyrillicDZHE                85
+\definecharacter cyrillicdzhe               117
+\definecharacter cyrillicCHVCRS              86
+\definecharacter cyrillicchvcrs             118
+\definecharacter cyrillicW                   87
+\definecharacter cyrillicw                  119
+\definecharacter cyrillicYAT                 88
+\definecharacter cyrillicyat                120
+\definecharacter cyrillicBYUS                89
+\definecharacter cyrillicbyus               121
+\definecharacter cyrillicIZH                 90
+\definecharacter cyrillicizh                122
+\definecharacter cyrillicNLHK                28
+\definecharacter cyrillicnlhk                29
+\definecharacter cyrillicDELTA               30
+\definecharacter cyrillicdelta               31
+
+\stopencoding
+
+\startmapping[lcy]
+
+\resetcaserange 128 to 255
+
+\definecasemaps 128 to 143 lc +32 uc   0
+\definecasemaps 160 to 175 lc   0 uc -32
+
+\definecasemaps 144 to 159 lc +80 uc   0
+\definecasemaps 224 to 239 lc   0 uc -80
+
+\definecasemap 240 241 240  \definecasemap 241 241 240  % cyrillicYO
+\definecasemap 242 243 242  \definecasemap 243 243 242  % cyrillicGUP
+\definecasemap 244 245 244  \definecasemap 245 245 244  % cyrillicIE
+\definecasemap 244 247 244  \definecasemap 247 247 244  % cyrillicII
+\definecasemap 248 249 248  \definecasemap 249 249 248  % cyrillicYI
+\definecasemap 250 251 240  \definecasemap 241 241 240  % cyrillicUSHRT
+
+\stopmapping
+
+\startencoding[lcy]
+
+%D Characters 0 to 127 are as in normal cmr slots
+
+\definecharacter cyrillicA                128
+\definecharacter cyrillicB                129
+\definecharacter cyrillicV                130
+\definecharacter cyrillicG                131
+\definecharacter cyrillicD                132
+\definecharacter cyrillicE                133
+\definecharacter cyrillicZH               134
+\definecharacter cyrillicZ                135
+\definecharacter cyrillicI                136
+\definecharacter cyrillicISHRT            137
+\definecharacter cyrillicK                138
+\definecharacter cyrillicL                139
+\definecharacter cyrillicM                140
+\definecharacter cyrillicN                141
+\definecharacter cyrillicO                142
+\definecharacter cyrillicP                143
+\definecharacter cyrillicR                144
+\definecharacter cyrillicS                145
+\definecharacter cyrillicT                146
+\definecharacter cyrillicU                147
+\definecharacter cyrillicF                148
+\definecharacter cyrillicH                149
+\definecharacter cyrillicC                150
+\definecharacter cyrillicCH               151
+\definecharacter cyrillicSH               152
+\definecharacter cyrillicSHCH             153
+\definecharacter cyrillicHRDSN            154
+\definecharacter cyrillicERY              155
+\definecharacter cyrillicSFTSN            156
+\definecharacter cyrillicEREV             157
+\definecharacter cyrillicYU               158
+\definecharacter cyrillicYA               159
+\definecharacter cyrillica                160
+\definecharacter cyrillicb                161
+\definecharacter cyrillicv                162
+\definecharacter cyrillicg                163
+\definecharacter cyrillicd                164
+\definecharacter cyrillice                165
+\definecharacter cyrilliczh               166
+\definecharacter cyrillicz                167
+\definecharacter cyrillici                168
+\definecharacter cyrillicishrt            169
+\definecharacter cyrillick                170
+\definecharacter cyrillicl                171
+\definecharacter cyrillicm                172
+\definecharacter cyrillicn                173
+\definecharacter cyrillico                174
+\definecharacter cyrillicp                175
+\definecharacter cyrillicr                224
+\definecharacter cyrillics                225
+\definecharacter cyrillict                226
+\definecharacter cyrillicu                227
+\definecharacter cyrillicf                228
+\definecharacter cyrillich                229
+\definecharacter cyrillicc                230
+\definecharacter cyrillicch               231
+\definecharacter cyrillicsh               232
+\definecharacter cyrillicshch             233
+\definecharacter cyrillichrdsn            234
+\definecharacter cyrillicery              235
+\definecharacter cyrillicsftsn            236
+\definecharacter cyrillicerev             237
+\definecharacter cyrillicyu               238
+\definecharacter cyrillicya               239
+\definecharacter cyrillicYO               240
+\definecharacter cyrillicyo               241
+\definecharacter cyrillicGUP              242
+\definecharacter cyrillicgup              243
+\definecharacter cyrillicIE               244
+\definecharacter cyrillicie               245
+\definecharacter cyrillicII               246
+\definecharacter cyrillicii               247
+\definecharacter cyrillicYI               248
+\definecharacter cyrillicyi               249
+\definecharacter cyrillicUSHRT            250
+\definecharacter cyrillicushrt            251
+
+\definecharacter emdash                   196
+\definecharacter textcurrency             197
+\definecharacter textnumero               252
+\definecharacter leftguillemot            253
+\definecharacter rightguillemot           254
+\definecharacter quotedblbase             255
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-cyr.tex b/tex/context/base/enco-cyr.tex
deleted file mode 100644
index 36bca82b5..000000000
--- a/tex/context/base/enco-cyr.tex
+++ /dev/null
@@ -1,1037 +0,0 @@
-%D \module
-%D   [       file=enco-cyr,
-%D        version=2003.01.24,
-%D          title=\CONTEXT\ Encoding Macros,
-%D       subtitle=Cyrillic,
-%D         author=...,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 The following kerning test is inspired by a test file
-%D provided by Victor Figurnov. I hope he still recognizes
-%D some bit and pieces.
-%D
-%D \starttyping
-%D \setupoutput[pdftex]
-%D
-%D \startMPenvironment[global]
-%D   \useregime[cyr]
-%D   \useencoding[cyr]
-%D   \mainlanguage[ru]
-%D   \enableregime[cp1251]
-%D   \setupbodyfont[cyr]
-%D \stopMPenvironment
-%D
-%D \startbuffer
-%D \starttabulate[|l|l|l|]
-%D \NC \ruledhbox{}          \NC \ruledhbox{AV}        \NC with kerning    \NC \NR
-%D \NC \ruledhbox{{}{}}      \NC \ruledhbox{A{}V}      \NC without kerning \NC \NR
-%D \NC \ruledhbox{\tfd }     \NC \ruledhbox{\tfd AV}   \NC with kerning    \NC \NR
-%D \NC \ruledhbox{\tfd {}{}} \NC \ruledhbox{\tfd A{}V} \NC without kerning \NC \NR
-%D \stoptabulate
-%D
-%D \showkerning{  }
-%D \stopbuffer
-%D
-%D \starttext
-%D
-%D \title{Kerning test}
-%D
-%D \typebuffer
-%D
-%D \rm \subject{Serif      font} \getbuffer
-%D \ss \subject{SansSerif  font} \getbuffer
-%D \tt \subject{MonoSpacec font} \getbuffer
-%D
-%D \stoptext
-%D \stoptyping
-
-%D We start with a fallback, define by HH, who assumes that
-%D this is phonetic.
-
-\startmapping[t2a]
-
-\resetcaserange 128 to 255
-
-\definecasemaps 192 to 223 lc +32 uc   0  % base letters (russian)
-\definecasemaps 224 to 255 lc   0 uc -32
-
-\definecasemaps 128 to 156 lc +32 uc   0  % extra letters (cyrillic and old-slav)
-\definecasemaps 160 to 188 lc   0 uc -32
-
-\definecasemap 73 105 73  \definecasemap 105 105 73  % cyrillicII
-\definecasemap 74 106 74  \definecasemap 106 106 74  % cyrillicJE
-\definecasemap 81 113 81  \definecasemap 113 113 81  % cyrillicQ
-\definecasemap 87 119 87  \definecasemap 119 119 87  % cyrillicW
-
-\stopmapping
-
-\startencoding[t2a]
-
-\definecharacter textgrave                   0
-\definecharacter textacute                   1
-\definecharacter textcircumflex              2
-\definecharacter texttilde                   3
-\definecharacter textdiaeresis               4
-\definecharacter texthungarumlaut            5
-\definecharacter textring                    6
-\definecharacter textcaron                   7
-\definecharacter textbreve                   8
-\definecharacter textmacron                  9
-\definecharacter textdotaccent              10
-\definecharacter textcedilla                11
-\definecharacter textogonek                 12
-
-\definecharacter textcyrillicflex           18
-\definecharacter textdblgrave               19
-\definecharacter textcyrillicbreve          20
-
-\definecharacter endash                     21
-\definecharacter emdash                     22
-
-\definecharacter textcompwordmark           23
-\definecharacter textbackslash              92
-\definecharacter textasciicircum            94
-\definecharacter textunderscore             95
-\definecharacter textbraceleft             123
-\definecharacter textbraceright            125
-\definecharacter textasciitilde            126
-\definecharacter textnumero                157
-\definecharacter textcurrency              158
-\definecharacter sectionmark               159
-
-\definecharacter quotedbl                   34
-\definecharacter quoteleft                  96
-\definecharacter upperleftsingleninequote   39
-\definecharacter quotedblleft               16
-\definecharacter quotedblright              17
-\definecharacter lowerleftdoubleninequote  189
-\definecharacter upperrightdoublesixquote   16
-\definecharacter upperrightdoubleninequote  17
-\definecharacter quotedblbase              189
-
-\definecharacter cyrillicpalochka           13
-\definecharacter cyrilliclangle             14
-\definecharacter cyrillicrangle             15
-
-\definecharacter leftguillemot             190
-\definecharacter rightguillemot            191
-\definecharacter dotlessi                   25
-
-\definecharacter cyrillicA                 192
-\definecharacter cyrillica                 224
-\definecharacter cyrillicB                 193
-\definecharacter cyrillicb                 225
-\definecharacter cyrillicV                 194
-\definecharacter cyrillicv                 226
-\definecharacter cyrillicG                 195
-\definecharacter cyrillicg                 227
-\definecharacter cyrillicD                 196
-\definecharacter cyrillicd                 228
-\definecharacter cyrillicE                 197
-\definecharacter cyrillice                 229
-\definecharacter cyrillicZH                198
-\definecharacter cyrilliczh                230
-\definecharacter cyrillicZ                 199
-\definecharacter cyrillicz                 231
-\definecharacter cyrillicI                 200
-\definecharacter cyrillici                 232
-\definecharacter cyrillicISHRT             201
-\definecharacter cyrillicishrt             233
-\definecharacter cyrillicK                 202
-\definecharacter cyrillick                 234
-\definecharacter cyrillicL                 203
-\definecharacter cyrillicl                 235
-\definecharacter cyrillicM                 204
-\definecharacter cyrillicm                 236
-\definecharacter cyrillicN                 205
-\definecharacter cyrillicn                 237
-\definecharacter cyrillicO                 206
-\definecharacter cyrillico                 238
-\definecharacter cyrillicP                 207
-\definecharacter cyrillicp                 239
-\definecharacter cyrillicR                 208
-\definecharacter cyrillicr                 240
-\definecharacter cyrillicS                 209
-\definecharacter cyrillics                 241
-\definecharacter cyrillicT                 210
-\definecharacter cyrillict                 242
-\definecharacter cyrillicU                 211
-\definecharacter cyrillicu                 243
-\definecharacter cyrillicF                 212
-\definecharacter cyrillicf                 244
-\definecharacter cyrillicH                 213
-\definecharacter cyrillich                 245
-\definecharacter cyrillicC                 214
-\definecharacter cyrillicc                 246
-\definecharacter cyrillicCH                215
-\definecharacter cyrillicch                247
-\definecharacter cyrillicSH                216
-\definecharacter cyrillicsh                248
-\definecharacter cyrillicSHCH              217
-\definecharacter cyrillicshch              249
-\definecharacter cyrillicHRDSN             218
-\definecharacter cyrillichrdsn             250
-\definecharacter cyrillicERY               219
-\definecharacter cyrillicery               251
-\definecharacter cyrillicSFTSN             220
-\definecharacter cyrillicsftsn             252
-\definecharacter cyrillicEREV              221
-\definecharacter cyrillicerev              253
-\definecharacter cyrillicYU                222
-\definecharacter cyrillicyu                254
-\definecharacter cyrillicYA                223
-\definecharacter cyrillicya                255
-\definecharacter cyrillicGUP               128
-\definecharacter cyrillicgup               160
-\definecharacter cyrillicGHCRS             129
-\definecharacter cyrillicghcrs             161
-\definecharacter cyrillicDJE               130
-\definecharacter cyrillicdje               162
-\definecharacter cyrillicTSHE              131
-\definecharacter cyrillictshe              163
-\definecharacter cyrillicSHHA              132
-\definecharacter cyrillicshha              164
-\definecharacter cyrillicZHDSC             133
-\definecharacter cyrilliczhdsc             165
-\definecharacter cyrillicZDSC              134
-\definecharacter cyrilliczdsc              166
-\definecharacter cyrillicLJE               135
-\definecharacter cyrilliclje               167
-\definecharacter cyrillicYI                136
-\definecharacter cyrillicyi                168
-\definecharacter cyrillicKDSC              137
-\definecharacter cyrillickdsc              169
-\definecharacter cyrillicKBEAK             138
-\definecharacter cyrillickbeak             170
-\definecharacter cyrillicKVCRS             139
-\definecharacter cyrillickvcrs             171
-\definecharacter cyrillicAE                140
-\definecharacter cyrillicae                172
-\definecharacter cyrillicNDSC              141
-\definecharacter cyrillicndsc              173
-\definecharacter cyrillicNG                142
-\definecharacter cyrillicng                174
-\definecharacter cyrillicDZE               143
-\definecharacter cyrillicdze               175
-\definecharacter cyrillicOTLD              144
-\definecharacter cyrillicotld              176
-\definecharacter cyrillicSDSC              145
-\definecharacter cyrillicsdsc              177
-\definecharacter cyrillicUSHRT             146
-\definecharacter cyrillicushrt             178
-\definecharacter cyrillicY                 147
-\definecharacter cyrillicy                 179
-\definecharacter cyrillicYHCRS             148
-\definecharacter cyrillicyhcrs             180
-\definecharacter cyrillicHDSC              149
-\definecharacter cyrillichdsc              181
-\definecharacter cyrillicDZHE              150
-\definecharacter cyrillicdzhe              182
-\definecharacter cyrillicCHVCRS            151
-\definecharacter cyrillicchvcrs            183
-\definecharacter cyrillicCHRDSC            152
-\definecharacter cyrillicchrdsc            184
-\definecharacter cyrillicIE                153
-\definecharacter cyrillicie                185
-\definecharacter cyrillicSCHWA             154
-\definecharacter cyrillicschwa             186
-\definecharacter cyrillicNJE               155
-\definecharacter cyrillicnje               187
-\definecharacter cyrillicYO                156
-\definecharacter cyrillicyo                188
-\definecharacter cyrillicII                 73
-\definecharacter cyrillicii                105
-\definecharacter cyrillicJE                 74
-\definecharacter cyrillicje                106
-\definecharacter cyrillicQ                  81
-\definecharacter cyrillicq                 113
-\definecharacter cyrillicW                  87
-\definecharacter cyrillicw                 119
-
-% \definecharacter textperthousand    {\%\char 24 }
-% \definecharacter textpertenthousand {\%\char 24\char 24 }
-
-\definecharacter cyrillicgheupturn         160 % to satisfy the patterns
-
-\stopencoding
-
-\startmapping[t2b]
-
-\resetcaserange 128 to 255
-
-\definecasemaps 192 to 223 lc +32 uc   0  % base letters (russian)
-\definecasemaps 224 to 255 lc   0 uc -32
-
-\definecasemaps 128 to 156 lc +32 uc   0  % extra letters (cyrillic and old-slav)
-\definecasemaps 160 to 188 lc   0 uc -32
-
-\definecasemap 73  105 73   \definecasemap 105 105 73   % cyrillicII
-\definecasemap 74  106 74   \definecasemap 106 106 74   % cyrillicJE
-\definecasemap 81  113 81   \definecasemap 113 113 81   % cyrillicQ
-\definecasemap 83  115 83   \definecasemap 115 115 83   % cyrillicDZE
-\definecasemap 87  119 87   \definecasemap 119 119 87   % cyrillicW
-
-\stopmapping
-
-\startencoding[t2b]
-
-\definecharacter textgrave                   0
-\definecharacter textacute                   1
-\definecharacter textcircumflex              2
-\definecharacter texttilde                   3
-\definecharacter textdiaeresis               4
-\definecharacter texthungarumlaut            5
-\definecharacter textring                    6
-\definecharacter textcaron                   7
-\definecharacter textbreve                   8
-\definecharacter textmacron                  9
-\definecharacter textdotaccent              10
-\definecharacter textcedilla                11
-\definecharacter textogonek                 12
-
-\definecharacter textcyrillicflex           18
-\definecharacter textdblgrave               19
-\definecharacter textcyrillicbreve          20
-
-\definecharacter endash                     21
-\definecharacter emdash                     22
-
-\definecharacter textcompwordmark           23
-\definecharacter textbackslash              92
-\definecharacter textasciicircum            94
-\definecharacter textunderscore             95
-\definecharacter textbraceleft             123
-\definecharacter textbraceright            125
-\definecharacter textasciitilde            126
-\definecharacter textnumero                157
-\definecharacter textcurrency              158
-\definecharacter sectionmark               159
-\definecharacter quotedbl                   34
-\definecharacter quoteleft                  96
-\definecharacter upperleftsingleninequote   39
-\definecharacter quotedblleft               16
-\definecharacter quotedblright              17
-\definecharacter lowerleftdoubleninequote  189
-
-\definecharacter upperrightdoublesixquote   16
-\definecharacter upperrightdoubleninequote  17
-\definecharacter quotedblbase              189
-
-\definecharacter cyrillicpalochka           13
-\definecharacter cyrilliclangle             14
-\definecharacter cyrillicrangle             15
-
-\definecharacter leftguillemot             190
-\definecharacter rightguillemot            191
-\definecharacter dotlessi                   25
-
-\definecharacter cyrillicA                 192
-\definecharacter cyrillica                 224
-\definecharacter cyrillicB                 193
-\definecharacter cyrillicb                 225
-\definecharacter cyrillicV                 194
-\definecharacter cyrillicv                 226
-\definecharacter cyrillicG                 195
-\definecharacter cyrillicg                 227
-\definecharacter cyrillicD                 196
-\definecharacter cyrillicd                 228
-\definecharacter cyrillicE                 197
-\definecharacter cyrillice                 229
-\definecharacter cyrillicZH                198
-\definecharacter cyrilliczh                230
-\definecharacter cyrillicZ                 199
-\definecharacter cyrillicz                 231
-\definecharacter cyrillicI                 200
-\definecharacter cyrillici                 232
-\definecharacter cyrillicISHRT             201
-\definecharacter cyrillicishrt             233
-\definecharacter cyrillicK                 202
-\definecharacter cyrillick                 234
-\definecharacter cyrillicL                 203
-\definecharacter cyrillicl                 235
-\definecharacter cyrillicM                 204
-\definecharacter cyrillicm                 236
-\definecharacter cyrillicN                 205
-\definecharacter cyrillicn                 237
-\definecharacter cyrillicO                 206
-\definecharacter cyrillico                 238
-\definecharacter cyrillicP                 207
-\definecharacter cyrillicp                 239
-\definecharacter cyrillicR                 208
-\definecharacter cyrillicr                 240
-\definecharacter cyrillicS                 209
-\definecharacter cyrillics                 241
-\definecharacter cyrillicT                 210
-\definecharacter cyrillict                 242
-\definecharacter cyrillicU                 211
-\definecharacter cyrillicu                 243
-\definecharacter cyrillicF                 212
-\definecharacter cyrillicf                 244
-\definecharacter cyrillicH                 213
-\definecharacter cyrillich                 245
-\definecharacter cyrillicC                 214
-\definecharacter cyrillicc                 246
-\definecharacter cyrillicCH                215
-\definecharacter cyrillicch                247
-\definecharacter cyrillicSH                216
-\definecharacter cyrillicsh                248
-\definecharacter cyrillicSHCH              217
-\definecharacter cyrillicshch              249
-\definecharacter cyrillicHRDSN             218
-\definecharacter cyrillichrdsn             250
-\definecharacter cyrillicERY               219
-\definecharacter cyrillicery               251
-\definecharacter cyrillicSFTSN             220
-\definecharacter cyrillicsftsn             252
-\definecharacter cyrillicEREV              221
-\definecharacter cyrillicerev              253
-\definecharacter cyrillicYU                222
-\definecharacter cyrillicyu                254
-\definecharacter cyrillicYA                223
-\definecharacter cyrillicya                255
-\definecharacter cyrillicGDSCHCRS          128
-\definecharacter cyrillicgdschcrs          160
-\definecharacter cyrillicGHCRS             129
-\definecharacter cyrillicghcrs             161
-\definecharacter cyrillicGDSC              130
-\definecharacter cyrillicgdsc              162
-\definecharacter cyrillicGHK               131
-\definecharacter cyrillicghk               163
-\definecharacter cyrillicSHHA              132
-\definecharacter cyrillicshha              164
-\definecharacter cyrillicZHDSC             133
-\definecharacter cyrilliczhdsc             165
-\definecharacter cyrillicDELTA             134
-\definecharacter cyrillicdelta             166
-\definecharacter cyrillicABHDZE            135
-\definecharacter cyrillicabhdze            167
-\definecharacter cyrillicLJE               136
-\definecharacter cyrilliclje               168
-\definecharacter cyrillicKDSC              137
-\definecharacter cyrillickdsc              169
-\definecharacter cyrillicLDSC              138
-\definecharacter cyrillicldsc              170
-\definecharacter cyrillicKHK               139
-\definecharacter cyrillickhk               171
-\definecharacter cyrillicLHK               140
-\definecharacter cyrilliclhk               172
-\definecharacter cyrillicNDSC              141
-\definecharacter cyrillicndsc              173
-\definecharacter cyrillicNG                142
-\definecharacter cyrillicng                174
-\definecharacter cyrillicNHK               143
-\definecharacter cyrillicnhk               175
-\definecharacter cyrillicOTLD              144
-\definecharacter cyrillicotld              176
-\definecharacter cyrillicSACRS             145
-\definecharacter cyrillicsacrs             177
-\definecharacter cyrillicUSHRT             146
-\definecharacter cyrillicushrt             178
-\definecharacter cyrillicY                 147
-\definecharacter cyrillicy                 179
-\definecharacter cyrillicHHCRS             148
-\definecharacter cyrillichhcrs             180
-\definecharacter cyrillicHDSC              149
-\definecharacter cyrillichdsc              181
-\definecharacter cyrillicHHK               150
-\definecharacter cyrillichhk               182
-\definecharacter cyrillicCHLDSC            151
-\definecharacter cyrillicchldsc            183
-\definecharacter cyrillicCHRDSC            152
-\definecharacter cyrillicchrdsc            184
-\definecharacter cyrillicNJE               153
-\definecharacter cyrillicnje               185
-\definecharacter cyrillicSCHWA             154
-\definecharacter cyrillicschwa             186
-\definecharacter cyrillicEPS               155
-\definecharacter cyrilliceps               187
-\definecharacter cyrillicYO                156
-\definecharacter cyrillicyo                188
-\definecharacter cyrillicII                 73
-\definecharacter cyrillicii                105
-\definecharacter cyrillicJE                 74
-\definecharacter cyrillicje                106
-\definecharacter cyrillicQ                  81
-\definecharacter cyrillicq                 113
-\definecharacter cyrillicDZE                83
-\definecharacter cyrillicdze               115
-\definecharacter cyrillicW                  87
-\definecharacter cyrillicw                 119
-
-\stopencoding
-
-\startmapping[t2c]
-
-\resetcaserange 128 to 255
-
-\definecasemaps 192 to 223 lc +32 uc   0  % base letters (russian)
-\definecasemaps 224 to 255 lc   0 uc -32
-
-\definecasemaps 128 to 156 lc +32 uc   0  % extra letters (cyrillic and old-slav)
-\definecasemaps 160 to 188 lc   0 uc -32
-
-\definecasemap 73 105 73  \definecasemap 105 105 73  % cyrillicII
-\definecasemap 74 106 74  \definecasemap 106 106 74  % cyrillicJE
-\definecasemap 81 113 81  \definecasemap 113 113 81  % cyrillicQ
-\definecasemap 83 115 83  \definecasemap 115 115 83  % cyrillicDZE
-\definecasemap 87 119 87  \definecasemap 119 119 87  % cyrillicW
-
-\stopmapping
-
-\startencoding[t2c]
-
-\definecharacter textgrave                   0
-\definecharacter textacute                   1
-\definecharacter textcircumflex              2
-\definecharacter texttilde                   3
-\definecharacter textdiaeresis               4
-\definecharacter texthungarumlaut            5
-\definecharacter textring                    6
-\definecharacter textcaron                   7
-\definecharacter textbreve                   8
-\definecharacter textmacron                  9
-\definecharacter textdotaccent              10
-\definecharacter textcedilla                11
-\definecharacter textogonek                 12
-
-\definecharacter textcyrillicflex           18
-\definecharacter textdblgrave               19
-\definecharacter textcyrillicbreve          20
-
-\definecharacter endash                     21
-\definecharacter emdash                     22
-
-\definecharacter textcompwordmark           23
-\definecharacter textbackslash              92
-\definecharacter textasciicircum            94
-\definecharacter textunderscore             95
-\definecharacter textbraceleft             123
-\definecharacter textbraceright            125
-\definecharacter textasciitilde            126
-\definecharacter textnumero                157
-\definecharacter textcurrency              158
-\definecharacter sectionmark               159
-\definecharacter quotedbl                   34
-\definecharacter quoteleft                  96
-\definecharacter upperleftsingleninequote   39
-\definecharacter quotedblleft               16
-\definecharacter quotedblright              17
-\definecharacter lowerleftdoubleninequote  189
-\definecharacter upperrightdoublesixquote   16
-\definecharacter upperrightdoubleninequote  17
-\definecharacter quotedblbase              189
-
-\definecharacter cyrillicpalochka           13
-\definecharacter cyrilliclangle             14
-\definecharacter cyrillicrangle             15
-
-\definecharacter leftguillemot             190
-\definecharacter rightguillemot            191
-
-\definecharacter dotlessi                   25
-
-\definecharacter cyrillicA                  192
-\definecharacter cyrillica                  224
-\definecharacter cyrillicB                  193
-\definecharacter cyrillicb                  225
-\definecharacter cyrillicV                  194
-\definecharacter cyrillicv                  226
-\definecharacter cyrillicG                  195
-\definecharacter cyrillicg                  227
-\definecharacter cyrillicD                  196
-\definecharacter cyrillicd                  228
-\definecharacter cyrillicE                  197
-\definecharacter cyrillice                  229
-\definecharacter cyrillicZH                 198
-\definecharacter cyrilliczh                 230
-\definecharacter cyrillicZ                  199
-\definecharacter cyrillicz                  231
-\definecharacter cyrillicI                  200
-\definecharacter cyrillici                  232
-\definecharacter cyrillicISHRT              201
-\definecharacter cyrillicishrt              233
-\definecharacter cyrillicK                  202
-\definecharacter cyrillick                  234
-\definecharacter cyrillicL                  203
-\definecharacter cyrillicl                  235
-\definecharacter cyrillicM                  204
-\definecharacter cyrillicm                  236
-\definecharacter cyrillicN                  205
-\definecharacter cyrillicn                  237
-\definecharacter cyrillicO                  206
-\definecharacter cyrillico                  238
-\definecharacter cyrillicP                  207
-\definecharacter cyrillicp                  239
-\definecharacter cyrillicR                  208
-\definecharacter cyrillicr                  240
-\definecharacter cyrillicS                  209
-\definecharacter cyrillics                  241
-\definecharacter cyrillicT                  210
-\definecharacter cyrillict                  242
-\definecharacter cyrillicU                  211
-\definecharacter cyrillicu                  243
-\definecharacter cyrillicF                  212
-\definecharacter cyrillicf                  244
-\definecharacter cyrillicH                  213
-\definecharacter cyrillich                  245
-\definecharacter cyrillicC                  214
-\definecharacter cyrillicc                  246
-\definecharacter cyrillicCH                 215
-\definecharacter cyrillicch                 247
-\definecharacter cyrillicSH                 216
-\definecharacter cyrillicsh                 248
-\definecharacter cyrillicSHCH               217
-\definecharacter cyrillicshch               249
-\definecharacter cyrillicHRDSN              218
-\definecharacter cyrillichrdsn              250
-\definecharacter cyrillicERY                219
-\definecharacter cyrillicery                251
-\definecharacter cyrillicSFTSN              220
-\definecharacter cyrillicsftsn              252
-\definecharacter cyrillicEREV               221
-\definecharacter cyrillicerev               253
-\definecharacter cyrillicYU                 222
-\definecharacter cyrillicyu                 254
-\definecharacter cyrillicYA                 223
-\definecharacter cyrillicya                 255
-\definecharacter cyrillicPHK                128
-\definecharacter cyrillicphk                160
-\definecharacter cyrillicTETSE              129
-\definecharacter cyrillictetse              161
-\definecharacter cyrillicTDSC               130
-\definecharacter cyrillictdsc               162
-\definecharacter cyrillicGHK                131
-\definecharacter cyrillicghk                163
-\definecharacter cyrillicSHHA               132
-\definecharacter cyrillicshha               164
-\definecharacter cyrillicRDSC               133
-\definecharacter cyrillicrdsc               165
-\definecharacter cyrillicRTICK              134
-\definecharacter cyrillicrtick              166
-\definecharacter cyrillicABHDZE             135
-\definecharacter cyrillicabhdze             167
-\definecharacter cyrillicMDSC               136
-\definecharacter cyrillicmdsc               168
-\definecharacter cyrillicKDSC               137
-\definecharacter cyrillickdsc               169
-\definecharacter cyrillicLDSC               138
-\definecharacter cyrillicldsc               170
-\definecharacter cyrillicKHCRS              139
-\definecharacter cyrillickhcrs              171
-\definecharacter cyrillicLHK                140
-\definecharacter cyrilliclhk                172
-\definecharacter cyrillicNDSC               141
-\definecharacter cyrillicndsc               173
-\definecharacter cyrillicMHK                142
-\definecharacter cyrillicmhk                174
-\definecharacter cyrillicNHK                143
-\definecharacter cyrillicnhk                175
-\definecharacter cyrillicOTLD               144
-\definecharacter cyrillicotld               176
-\definecharacter cyrillicABHCH              145
-\definecharacter cyrillicabhch              177
-\definecharacter cyrillicABHCHDSC           146
-\definecharacter cyrillicabhchdsc           178
-\definecharacter cyrillicSEMISFTSN          147
-\definecharacter cyrillicsemisftsn          179
-\definecharacter cyrillicISHRTDSC           148
-\definecharacter cyrillicishrtdsc           180
-\definecharacter cyrillicHDSC               149
-\definecharacter cyrillichdsc               181
-\definecharacter cyrillicDZHE               150
-\definecharacter cyrillicdzhe               182
-\definecharacter cyrillicABHHA              151
-\definecharacter cyrillicabhha              183
-\definecharacter cyrillicCHRDSC             152
-\definecharacter cyrillicchrdsc             184
-\definecharacter cyrillicNLHK               153
-\definecharacter cyrillicnlhk               185
-\definecharacter cyrillicSCHWA              154
-\definecharacter cyrillicschwa              186
-\definecharacter cyrillicRHK                155
-\definecharacter cyrillicrhk                187
-\definecharacter cyrillicYO                 156
-\definecharacter cyrillicyo                 188
-\definecharacter cyrillicII                  73
-\definecharacter cyrillicii                 105
-\definecharacter cyrillicJE                  74
-\definecharacter cyrillicje                 106
-\definecharacter cyrillicQ                   81
-\definecharacter cyrillicq                  113
-\definecharacter cyrillicDZE                 83
-\definecharacter cyrillicdze                115
-\definecharacter cyrillicW                   87
-\definecharacter cyrillicw                  119
-
-\stopencoding
-
-\startmapping[x2]
-
-\resetcaserange 128 to 255
-
-\definecasemaps 192 to 223 lc +32 uc   0  % base letters (russian)
-\definecasemaps 224 to 255 lc   0 uc -32
-
-\definecasemaps 128 to 156 lc +32 uc   0  % extra letters (cyrillic and old-slav)
-\definecasemaps 160 to 188 lc   0 uc -32
-
-\definecasemaps  65 to  90 lc +32 uc   0  % more extra letters (cyrillic and old-slav)
-\definecasemaps  97 to 122 lc   0 uc -32
-
-\definecasemap 28 29 28  \definecasemap 29 29 28 % cyrillicNLHK
-\definecasemap 30 31 30  \definecasemap 31 31 30 % cyrillicDELTA
-
-\stopmapping
-
-\startencoding[x2]
-
-\definecharacter textgrave                    0
-\definecharacter textacute                    1
-\definecharacter textcircumflex               2
-\definecharacter texttilde                    3
-\definecharacter textdiaeresis                4
-\definecharacter texthungarumlaut             5
-\definecharacter textring                     6
-\definecharacter textcaron                    7
-\definecharacter textbreve                    8
-\definecharacter textmacron                   9
-\definecharacter textdotaccent               10
-\definecharacter textcedilla                 11
-\definecharacter textogonek                  12
-
-\definecharacter endash                      21
-\definecharacter emdash                      22
-
-\definecharacter textcompwordmark            23
-\definecharacter textvisiblespace            32
-\definecharacter textdollar                  36
-\definecharacter textless                    60
-\definecharacter textgreater                 62
-\definecharacter textbackslash               92
-\definecharacter textasciicircum             94
-\definecharacter textunderscore              95
-\definecharacter textbraceleft              123
-\definecharacter textbar                    124
-\definecharacter textbraceright             125
-\definecharacter textasciitilde             126
-\definecharacter textnumero                 157
-\definecharacter textcurrency               158
-\definecharacter textsection                159
-\definecharacter sectionmark                159
-\definecharacter textquotedbl                34
-
-\definecharacter cyrillicpalochka            13
-\definecharacter cyrilliclangle              14
-\definecharacter cyrillicrangle              15
-
-\definecharacter leftguillemot              190
-\definecharacter rightguillemot             191
-
-\definecharacter upperleftsinglesixquote     96
-\definecharacter upperleftsingleninequote    39
-\definecharacter upperleftdoublesixquote     16
-\definecharacter upperleftdoubleninequote    17
-\definecharacter lowerleftdoubleninequote   189
-
-\definecharacter upperrightsinglesixquote    96
-\definecharacter upperrightsingleninequote   39
-\definecharacter upperrightdoublesixquote    16
-\definecharacter upperrightdoubleninequote   17
-\definecharacter lowerrightdoubleninequote  189
-
-\definecharacter cyrillicA                  192
-\definecharacter cyrillica                  224
-\definecharacter cyrillicB                  193
-\definecharacter cyrillicb                  225
-\definecharacter cyrillicV                  194
-\definecharacter cyrillicv                  226
-\definecharacter cyrillicG                  195
-\definecharacter cyrillicg                  227
-\definecharacter cyrillicD                  196
-\definecharacter cyrillicd                  228
-\definecharacter cyrillicE                  197
-\definecharacter cyrillice                  229
-\definecharacter cyrillicZH                 198
-\definecharacter cyrilliczh                 230
-\definecharacter cyrillicZ                  199
-\definecharacter cyrillicz                  231
-\definecharacter cyrillicI                  200
-\definecharacter cyrillici                  232
-\definecharacter cyrillicISHRT              201
-\definecharacter cyrillicishrt              233
-\definecharacter cyrillicK                  202
-\definecharacter cyrillick                  234
-\definecharacter cyrillicL                  203
-\definecharacter cyrillicl                  235
-\definecharacter cyrillicM                  204
-\definecharacter cyrillicm                  236
-\definecharacter cyrillicN                  205
-\definecharacter cyrillicn                  237
-\definecharacter cyrillicO                  206
-\definecharacter cyrillico                  238
-\definecharacter cyrillicP                  207
-\definecharacter cyrillicp                  239
-\definecharacter cyrillicR                  208
-\definecharacter cyrillicr                  240
-\definecharacter cyrillicS                  209
-\definecharacter cyrillics                  241
-\definecharacter cyrillicT                  210
-\definecharacter cyrillict                  242
-\definecharacter cyrillicU                  211
-\definecharacter cyrillicu                  243
-\definecharacter cyrillicF                  212
-\definecharacter cyrillicf                  244
-\definecharacter cyrillicH                  213
-\definecharacter cyrillich                  245
-\definecharacter cyrillicC                  214
-\definecharacter cyrillicc                  246
-\definecharacter cyrillicCH                 215
-\definecharacter cyrillicch                 247
-\definecharacter cyrillicSH                 216
-\definecharacter cyrillicsh                 248
-\definecharacter cyrillicSHCH               217
-\definecharacter cyrillicshch               249
-\definecharacter cyrillicHRDSN              218
-\definecharacter cyrillichrdsn              250
-\definecharacter cyrillicERY                219
-\definecharacter cyrillicery                251
-\definecharacter cyrillicSFTSN              220
-\definecharacter cyrillicsftsn              252
-\definecharacter cyrillicEREV               221
-\definecharacter cyrillicerev               253
-\definecharacter cyrillicYU                 222
-\definecharacter cyrillicyu                 254
-\definecharacter cyrillicYA                 223
-\definecharacter cyrillicya                 255
-\definecharacter cyrillicGUP                128
-\definecharacter cyrillicgup                160
-\definecharacter cyrillicGHCRS              129
-\definecharacter cyrillicghcrs              161
-\definecharacter cyrillicGDSC               130
-\definecharacter cyrillicgdsc               162
-\definecharacter cyrillicGHK                131
-\definecharacter cyrillicghk                163
-\definecharacter cyrillicSHHA               132
-\definecharacter cyrillicshha               164
-\definecharacter cyrillicZHDSC              133
-\definecharacter cyrilliczhdsc              165
-\definecharacter cyrillicZDSC               134
-\definecharacter cyrilliczdsc               166
-\definecharacter cyrillicABHDZE             135
-\definecharacter cyrillicabhdze             167
-\definecharacter cyrillicYI                 136
-\definecharacter cyrillicyi                 168
-\definecharacter cyrillicKDSC               137
-\definecharacter cyrillickdsc               169
-\definecharacter cyrillicKBEAK              138
-\definecharacter cyrillickbeak              170
-\definecharacter cyrillicKHK                139
-\definecharacter cyrillickhk                171
-\definecharacter cyrillicLHK                140
-\definecharacter cyrilliclhk                172
-\definecharacter cyrillicNDSC               141
-\definecharacter cyrillicndsc               173
-\definecharacter cyrillicNG                 142
-\definecharacter cyrillicng                 174
-\definecharacter cyrillicNHK                143
-\definecharacter cyrillicnhk                175
-\definecharacter cyrillicOTLD               144
-\definecharacter cyrillicotld               176
-\definecharacter cyrillicSDSC               145
-\definecharacter cyrillicsdsc               177
-\definecharacter cyrillicUSHRT              146
-\definecharacter cyrillicushrt              178
-\definecharacter cyrillicY                  147
-\definecharacter cyrillicy                  179
-\definecharacter cyrillicYHCRS              148
-\definecharacter cyrillicyhcrs              180
-\definecharacter cyrillicHDSC               149
-\definecharacter cyrillichdsc               181
-\definecharacter cyrillicHHK                150
-\definecharacter cyrillichhk                182
-\definecharacter cyrillicCHLDSC             151
-\definecharacter cyrillicchldsc             183
-\definecharacter cyrillicCHRDSC             152
-\definecharacter cyrillicchrdsc             184
-\definecharacter cyrillicIE                 153
-\definecharacter cyrillicie                 185
-\definecharacter cyrillicSCHWA              154
-\definecharacter cyrillicschwa              186
-\definecharacter cyrillicEPS                155
-\definecharacter cyrilliceps                187
-\definecharacter cyrillicYO                 156
-\definecharacter cyrillicyo                 188
-\definecharacter cyrillicAE                  65
-\definecharacter cyrillicae                  97
-\definecharacter cyrillicDJE                 66
-\definecharacter cyrillicdje                 98
-\definecharacter cyrillicTSHE                67
-\definecharacter cyrillictshe                99
-\definecharacter cyrillicABHCH               68
-\definecharacter cyrillicabhch              100
-\definecharacter cyrillicABHCHDSC            69
-\definecharacter cyrillicabhchdsc           101
-\definecharacter cyrillicKVCRS               70
-\definecharacter cyrillickvcrs              102
-\definecharacter cyrillicKHCRS               71
-\definecharacter cyrillickhcrs              103
-\definecharacter cyrillicLDSC                72
-\definecharacter cyrillicldsc               104
-\definecharacter cyrillicII                  73
-\definecharacter cyrillicii                 105
-\definecharacter cyrillicJE                  74
-\definecharacter cyrillicje                 106
-\definecharacter cyrillicLJE                 75
-\definecharacter cyrilliclje                107
-\definecharacter cyrillicMDSC                76
-\definecharacter cyrillicmdsc               108
-\definecharacter cyrillicNJE                 77
-\definecharacter cyrillicnje                109
-\definecharacter cyrillicABHHA               78
-\definecharacter cyrillicabhha              110
-\definecharacter cyrillicPHK                 79
-\definecharacter cyrillicphk                111
-\definecharacter cyrillicRDSC                80
-\definecharacter cyrillicrdsc               112
-\definecharacter cyrillicQ                   81
-\definecharacter cyrillicq                  113
-\definecharacter cyrillicTDSC                82
-\definecharacter cyrillictdsc               114
-\definecharacter cyrillicDZE                 83
-\definecharacter cyrillicdze                115
-\definecharacter cyrillicTETSE               84
-\definecharacter cyrillictetse              116
-\definecharacter cyrillicDZHE                85
-\definecharacter cyrillicdzhe               117
-\definecharacter cyrillicCHVCRS              86
-\definecharacter cyrillicchvcrs             118
-\definecharacter cyrillicW                   87
-\definecharacter cyrillicw                  119
-\definecharacter cyrillicYAT                 88
-\definecharacter cyrillicyat                120
-\definecharacter cyrillicBYUS                89
-\definecharacter cyrillicbyus               121
-\definecharacter cyrillicIZH                 90
-\definecharacter cyrillicizh                122
-\definecharacter cyrillicNLHK                28
-\definecharacter cyrillicnlhk                29
-\definecharacter cyrillicDELTA               30
-\definecharacter cyrillicdelta               31
-
-\stopencoding
-
-\startmapping[lcy]
-
-\resetcaserange 128 to 255
-
-\definecasemaps 128 to 143 lc +32 uc   0
-\definecasemaps 160 to 175 lc   0 uc -32
-
-\definecasemaps 144 to 159 lc +80 uc   0
-\definecasemaps 224 to 239 lc   0 uc -80
-
-\definecasemap 240 241 240  \definecasemap 241 241 240  % cyrillicYO
-\definecasemap 242 243 242  \definecasemap 243 243 242  % cyrillicGUP
-\definecasemap 244 245 244  \definecasemap 245 245 244  % cyrillicIE
-\definecasemap 244 247 244  \definecasemap 247 247 244  % cyrillicII
-\definecasemap 248 249 248  \definecasemap 249 249 248  % cyrillicYI
-\definecasemap 250 251 240  \definecasemap 241 241 240  % cyrillicUSHRT
-
-\stopmapping
-
-\startencoding[lcy]
-
-%D Characters 0 to 127 are as in normal cmr slots
-
-\definecharacter cyrillicA                128
-\definecharacter cyrillicB                129
-\definecharacter cyrillicV                130
-\definecharacter cyrillicG                131
-\definecharacter cyrillicD                132
-\definecharacter cyrillicE                133
-\definecharacter cyrillicZH               134
-\definecharacter cyrillicZ                135
-\definecharacter cyrillicI                136
-\definecharacter cyrillicISHRT            137
-\definecharacter cyrillicK                138
-\definecharacter cyrillicL                139
-\definecharacter cyrillicM                140
-\definecharacter cyrillicN                141
-\definecharacter cyrillicO                142
-\definecharacter cyrillicP                143
-\definecharacter cyrillicR                144
-\definecharacter cyrillicS                145
-\definecharacter cyrillicT                146
-\definecharacter cyrillicU                147
-\definecharacter cyrillicF                148
-\definecharacter cyrillicH                149
-\definecharacter cyrillicC                150
-\definecharacter cyrillicCH               151
-\definecharacter cyrillicSH               152
-\definecharacter cyrillicSHCH             153
-\definecharacter cyrillicHRDSN            154
-\definecharacter cyrillicERY              155
-\definecharacter cyrillicSFTSN            156
-\definecharacter cyrillicEREV             157
-\definecharacter cyrillicYU               158
-\definecharacter cyrillicYA               159
-\definecharacter cyrillica                160
-\definecharacter cyrillicb                161
-\definecharacter cyrillicv                162
-\definecharacter cyrillicg                163
-\definecharacter cyrillicd                164
-\definecharacter cyrillice                165
-\definecharacter cyrilliczh               166
-\definecharacter cyrillicz                167
-\definecharacter cyrillici                168
-\definecharacter cyrillicishrt            169
-\definecharacter cyrillick                170
-\definecharacter cyrillicl                171
-\definecharacter cyrillicm                172
-\definecharacter cyrillicn                173
-\definecharacter cyrillico                174
-\definecharacter cyrillicp                175
-\definecharacter cyrillicr                224
-\definecharacter cyrillics                225
-\definecharacter cyrillict                226
-\definecharacter cyrillicu                227
-\definecharacter cyrillicf                228
-\definecharacter cyrillich                229
-\definecharacter cyrillicc                230
-\definecharacter cyrillicch               231
-\definecharacter cyrillicsh               232
-\definecharacter cyrillicshch             233
-\definecharacter cyrillichrdsn            234
-\definecharacter cyrillicery              235
-\definecharacter cyrillicsftsn            236
-\definecharacter cyrillicerev             237
-\definecharacter cyrillicyu               238
-\definecharacter cyrillicya               239
-\definecharacter cyrillicYO               240
-\definecharacter cyrillicyo               241
-\definecharacter cyrillicGUP              242
-\definecharacter cyrillicgup              243
-\definecharacter cyrillicIE               244
-\definecharacter cyrillicie               245
-\definecharacter cyrillicII               246
-\definecharacter cyrillicii               247
-\definecharacter cyrillicYI               248
-\definecharacter cyrillicyi               249
-\definecharacter cyrillicUSHRT            250
-\definecharacter cyrillicushrt            251
-
-\definecharacter emdash                   196
-\definecharacter textcurrency             197
-\definecharacter textnumero               252
-\definecharacter leftguillemot            253
-\definecharacter rightguillemot           254
-\definecharacter quotedblbase             255
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-def.mkii b/tex/context/base/enco-def.mkii
new file mode 100644
index 000000000..b6d66bb6c
--- /dev/null
+++ b/tex/context/base/enco-def.mkii
@@ -0,0 +1,920 @@
+%D \module
+%D   [     file=enco-def,
+%D      version=2000.05.07, % 2000.20.12, % split from less verbose base file
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Default Character Definitions,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=PRAGMA-ADE]
+%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 Instead of overloading plain \TEX\ macros (and keeping them
+%D available as an escape), we now use the more verbose
+%D definitions in this file. Since memory is less a problem
+%D these days, this verbosity has only a small price, but we
+%D gain readability. The following definitions are based on
+%D usage of the the original \TEX\ fonts, where composed
+%D characters were not part of the design. So, occasionally
+%D we have to revert to hacks. Thanks to all those users who
+%D helped me to fill in the details.
+
+\startencoding[default]
+
+\definecharacter textcomma         ,
+\definecharacter textperiod        .
+
+\definecharacter textacute         19
+\definecharacter textbottomdot     46
+\definecharacter textbreve         21
+\definecharacter textcaron         20
+\definecharacter textcedilla       24
+\definecharacter textcircumflex    94
+\definecharacter textdiaeresis    127
+\definecharacter textdotaccent     95
+\definecharacter textgrave         18
+\definecharacter texthungarumlaut 125
+\definecharacter textmacron        22
+\definecharacter textogonek        24 % fake
+\definecharacter textring          23
+\definecharacter texttilde        126
+
+\definecharacter textbottomcomma  {\hbox{\lower.35ex\hbox{\tx,}}} % for mojca
+
+\definecharacter dotlessi         {\char"10 }
+\definecharacter dotlessj         {\char"11 }
+\definecharacter dotlessI         {I}
+\definecharacter dotlessJ         {J}
+
+\definecharacter endash           123
+\definecharacter emdash           124
+
+\definecharacter aeligature       {\char26 } % "1A
+\definecharacter AEligature       {\char29 } % "1D
+\definecharacter ijligature       {ij}
+\definecharacter IJligature       {IJ}
+\definecharacter oeligature       {\char27 } % "1B
+\definecharacter OEligature       {\char30 } % "1E
+
+\definecharacter ssharp           {\char25 } % "19
+\definecharacter Ssharp           {SS}
+
+\definecharacter thorn            {\unknownchar}
+\definecharacter Thorn            {\unknownchar}
+
+\definecharacter eth              {\unknownchar} % mojca prefers this (was \dstroke)
+%definecharacter Eth              {\unknownchar}
+\definecharacter Eth              {\Dstroke}     % mojca prefers this too
+
+\definecharacter exclamdown        60
+\definecharacter questiondown      62
+
+\definecharacter copyright        {\encircled{\txx C}}
+\definecharacter registered       {\encircled{\txx R}}
+\definecharacter trademark        {\high{\txx TM}}
+
+\definecharacter sectionmark      {\mathematics{\mathhexbox278}}
+\definecharacter paragraphmark    {\mathematics{\mathhexbox27B}}
+
+\definecharacter onequarter       {\vulgarfraction{1}{4}}
+\definecharacter onehalf          {\vulgarfraction{1}{2}}
+\definecharacter threequarter     {\vulgarfraction{3}{4}}
+
+\definecharacter onesuperior      {\high{1}}
+\definecharacter twosuperior      {\high{2}}
+\definecharacter threesuperior    {\high{3}}
+
+\definecharacter textcent         {c}
+\definecharacter textcurrency     {\unknownchar}
+\definecharacter textdollar       {\fakedollar}
+\definecharacter texteuro         {E}
+\definecharacter textflorin       {\fakeflorin}
+\definecharacter textsterling     {\fakesterling}
+\definecharacter textyen          {Y}
+
+\definecharacter ordfeminine      {\high{\txx a}}
+\definecharacter ordmasculine     {\high{\txx o}}
+
+\definecharacter percent          {\fakepercent}
+\definecharacter perthousand      {\fakeperthousand}
+
+\definecharacter softhyphen        45
+\definecharacter periodcentered   {\hbox{\mathematics\cdot}}
+\definecharacter compoundwordmark  23
+
+\definecharacter textasciicircum   94
+\definecharacter textasciitilde   126
+\definecharacter textslash         47
+\definecharacter textbackslash    {\tex{}} % todo
+\definecharacter textbraceleft    {\mathematics\{}
+\definecharacter textbraceright   {\mathematics\}}
+\definecharacter textunderscore   {\fakeunderscore}
+\definecharacter textvisiblespace {\fakevisiblespace}
+
+\definecharacter textbrokenbar    {\mathematics\vert}
+\definecharacter textbullet       {\mathematics\bullet}
+\definecharacter textdag          {\mathematics\dag}
+\definecharacter textddag         {\mathematics\ddag}
+\definecharacter textdegree       {\mathematics{{}^{\circ}}}
+\definecharacter textdiv          {\mathematics\div}
+\definecharacter textellipsis     {\mathematics\cdots}
+\definecharacter textfraction     {\mathematics/}
+\definecharacter textlognot       {\mathematics\neg}
+\definecharacter textminus        {\mathematics-}
+\definecharacter textmu           {\mathematics\mu}
+\definecharacter textmultiply     {\mathematics\times}
+\definecharacter textpm           {\mathematics\pm}
+
+\definecharacter quotedbl         {"}
+\definecharacter quotedblbase     {,,}
+\definecharacter quotedblleft     {``}
+\definecharacter quotedblright    {''}
+
+\definecharacter quotesingle      {`}
+\definecharacter quotesinglebase  {,}
+
+\definecharacter quoteleft        {`}
+\definecharacter quoteright       {'}
+
+\definecharacter guilsingleleft   {\fakeleftsubguillemot }
+\definecharacter guilsingleright  {\fakerightsubguillemot}
+
+\definecharacter leftguillemot    {\fakeleftguillemot }
+\definecharacter rightguillemot   {\fakerightguillemot}
+
+\definecharacter Acircumflex      {\buildtextaccent\textcircumflex A}
+\definecharacter acircumflex      {\buildtextaccent\textcircumflex a}
+\definecharacter Ccircumflex      {\buildtextaccent\textcircumflex C}
+\definecharacter ccircumflex      {\buildtextaccent\textcircumflex c}
+\definecharacter Ecircumflex      {\buildtextaccent\textcircumflex E}
+\definecharacter ecircumflex      {\buildtextaccent\textcircumflex e}
+\definecharacter Gcircumflex      {\buildtextaccent\textcircumflex G}
+\definecharacter gcircumflex      {\buildtextaccent\textcircumflex g}
+\definecharacter Hcircumflex      {\buildtextaccent\textcircumflex H}
+\definecharacter hcircumflex      {\buildtextaccent\textcircumflex h}
+\definecharacter Icircumflex      {\buildtextaccent\textcircumflex \dotlessI}
+\definecharacter icircumflex      {\buildtextaccent\textcircumflex \dotlessi}
+\definecharacter Jcircumflex      {\buildtextaccent\textcircumflex \dotlessJ}
+\definecharacter jcircumflex      {\buildtextaccent\textcircumflex \dotlessj}
+\definecharacter Ocircumflex      {\buildtextaccent\textcircumflex O}
+\definecharacter ocircumflex      {\buildtextaccent\textcircumflex o}
+\definecharacter Scircumflex      {\buildtextaccent\textcircumflex S}
+\definecharacter scircumflex      {\buildtextaccent\textcircumflex s}
+\definecharacter Ucircumflex      {\buildtextaccent\textcircumflex U}
+\definecharacter ucircumflex      {\buildtextaccent\textcircumflex u}
+\definecharacter Wcircumflex      {\buildtextaccent\textcircumflex W}
+\definecharacter wcircumflex      {\buildtextaccent\textcircumflex w}
+\definecharacter Ycircumflex      {\buildtextaccent\textcircumflex Y}
+\definecharacter ycircumflex      {\buildtextaccent\textcircumflex y}
+
+\definecharacter Agrave           {\buildtextaccent\textgrave A}
+\definecharacter agrave           {\buildtextaccent\textgrave a}
+\definecharacter Egrave           {\buildtextaccent\textgrave E}
+\definecharacter egrave           {\buildtextaccent\textgrave e}
+\definecharacter Igrave           {\buildtextaccent\textgrave \dotlessI}
+\definecharacter igrave           {\buildtextaccent\textgrave \dotlessi}
+\definecharacter Ograve           {\buildtextaccent\textgrave O}
+\definecharacter ograve           {\buildtextaccent\textgrave o}
+\definecharacter Ugrave           {\buildtextaccent\textgrave U}
+\definecharacter ugrave           {\buildtextaccent\textgrave u}
+\definecharacter Ygrave           {\buildtextaccent\textgrave Y}
+\definecharacter ygrave           {\buildtextaccent\textgrave y}
+
+\definecharacter Atilde           {\buildtextaccent\texttilde A}
+\definecharacter atilde           {\buildtextaccent\texttilde a}
+\definecharacter Itilde           {\buildtextaccent\texttilde \dotlessI}
+\definecharacter itilde           {\buildtextaccent\texttilde \dotlessi}
+\definecharacter Ntilde           {\buildtextaccent\texttilde N}
+\definecharacter ntilde           {\buildtextaccent\texttilde n}
+\definecharacter Otilde           {\buildtextaccent\texttilde O}
+\definecharacter otilde           {\buildtextaccent\texttilde o}
+\definecharacter Utilde           {\buildtextaccent\texttilde U}
+\definecharacter utilde           {\buildtextaccent\texttilde u}
+\definecharacter Ytilde           {\buildtextaccent\texttilde Y}
+\definecharacter ytilde           {\buildtextaccent\texttilde y}
+
+\definecharacter Adiaeresis       {\buildtextaccent\textdiaeresis A}
+\definecharacter adiaeresis       {\buildtextaccent\textdiaeresis a}
+\definecharacter Ediaeresis       {\buildtextaccent\textdiaeresis E}
+\definecharacter ediaeresis       {\buildtextaccent\textdiaeresis e}
+\definecharacter Idiaeresis       {\buildtextaccent\textdiaeresis \dotlessI}
+\definecharacter idiaeresis       {\buildtextaccent\textdiaeresis \dotlessi}
+\definecharacter Odiaeresis       {\buildtextaccent\textdiaeresis O}
+\definecharacter odiaeresis       {\buildtextaccent\textdiaeresis o}
+\definecharacter Udiaeresis       {\buildtextaccent\textdiaeresis U}
+\definecharacter udiaeresis       {\buildtextaccent\textdiaeresis u}
+\definecharacter Ydiaeresis       {\buildtextaccent\textdiaeresis Y}
+\definecharacter ydiaeresis       {\buildtextaccent\textdiaeresis y}
+
+\definecharacter Aacute           {\buildtextaccent\textacute A}
+\definecharacter aacute           {\buildtextaccent\textacute a}
+\definecharacter Cacute           {\buildtextaccent\textacute C}
+\definecharacter cacute           {\buildtextaccent\textacute c}
+\definecharacter Eacute           {\buildtextaccent\textacute E}
+\definecharacter eacute           {\buildtextaccent\textacute e}
+\definecharacter Iacute           {\buildtextaccent\textacute \dotlessI}
+\definecharacter iacute           {\buildtextaccent\textacute \dotlessi}
+\definecharacter Lacute           {\buildtextaccent\textacute L}
+\definecharacter lacute           {\buildtextaccent\textacute l}
+\definecharacter Nacute           {\buildtextaccent\textacute N}
+\definecharacter nacute           {\buildtextaccent\textacute n}
+\definecharacter Oacute           {\buildtextaccent\textacute O}
+\definecharacter oacute           {\buildtextaccent\textacute o}
+\definecharacter Racute           {\buildtextaccent\textacute R}
+\definecharacter racute           {\buildtextaccent\textacute r}
+\definecharacter Sacute           {\buildtextaccent\textacute S}
+\definecharacter sacute           {\buildtextaccent\textacute s}
+\definecharacter Uacute           {\buildtextaccent\textacute U}
+\definecharacter uacute           {\buildtextaccent\textacute u}
+\definecharacter Yacute           {\buildtextaccent\textacute Y}
+\definecharacter yacute           {\buildtextaccent\textacute y}
+\definecharacter Zacute           {\buildtextaccent\textacute Z}
+\definecharacter zacute           {\buildtextaccent\textacute z}
+
+%definecharacter Dstroke          {D}
+%definecharacter dstroke          {d}
+
+\definecharacter dstroke          {\pseudoencodeddj}
+\definecharacter Dstroke          {\pseudoencodedDJ}
+\definecharacter Hstroke          {H}
+\definecharacter hstroke          {h}
+\definecharacter Tstroke          {T}
+\definecharacter tstroke          {t}
+
+\definecharacter Cdotaccent       {\buildtextaccent\textdotaccent C}
+\definecharacter cdotaccent       {\buildtextaccent\textdotaccent c}
+\definecharacter Edotaccent       {\buildtextaccent\textdotaccent E}
+\definecharacter edotaccent       {\buildtextaccent\textdotaccent e}
+\definecharacter Gdotaccent       {\buildtextaccent\textdotaccent G}
+\definecharacter gdotaccent       {\buildtextaccent\textdotaccent g}
+\definecharacter Idotaccent       {\buildtextaccent\textdotaccent \dotlessI}
+\definecharacter idotaccent       {\buildtextaccent\textdotaccent \dotlessi}
+\definecharacter Zdotaccent       {\buildtextaccent\textdotaccent Z}
+\definecharacter zdotaccent       {\buildtextaccent\textdotaccent z}
+
+\definecharacter Amacron          {\buildtextaccent\textmacron A}
+\definecharacter amacron          {\buildtextaccent\textmacron a}
+\definecharacter Emacron          {\buildtextaccent\textmacron E}
+\definecharacter emacron          {\buildtextaccent\textmacron e}
+\definecharacter Imacron          {\buildtextaccent\textmacron \dotlessI}
+\definecharacter imacron          {\buildtextaccent\textmacron \dotlessi}
+\definecharacter Omacron          {\buildtextaccent\textmacron O}
+\definecharacter omacron          {\buildtextaccent\textmacron o}
+\definecharacter Umacron          {\buildtextaccent\textmacron U}
+\definecharacter umacron          {\buildtextaccent\textmacron u}
+
+\definecharacter Ccedilla         {\buildtextcedilla C}
+\definecharacter ccedilla         {\buildtextcedilla c}
+\definecharacter Kcedilla         {\buildtextcedilla K}
+\definecharacter kcedilla         {\buildtextcedilla k}
+\definecharacter Lcedilla         {\buildtextcedilla L}
+\definecharacter lcedilla         {\buildtextcedilla l}
+\definecharacter Ncedilla         {\buildtextcedilla N}
+\definecharacter ncedilla         {\buildtextcedilla n}
+\definecharacter Rcedilla         {\buildtextcedilla R}
+\definecharacter rcedilla         {\buildtextcedilla r}
+\definecharacter Scedilla         {\buildtextcedilla S}
+\definecharacter scedilla         {\buildtextcedilla s}
+\definecharacter Tcedilla         {\buildtextcedilla T}
+\definecharacter tcedilla         {\buildtextcedilla t}
+
+\definecharacter Ohungarumlaut    {\buildtextaccent\texthungarumlaut O}
+\definecharacter ohungarumlaut    {\buildtextaccent\texthungarumlaut o}
+\definecharacter Uhungarumlaut    {\buildtextaccent\texthungarumlaut U}
+\definecharacter uhungarumlaut    {\buildtextaccent\texthungarumlaut u}
+
+\definecharacter Aogonek          {\buildtextogonek A}
+\definecharacter aogonek          {\buildtextogonek a}
+\definecharacter Eogonek          {\buildtextogonek E}
+\definecharacter eogonek          {\buildtextogonek e}
+\definecharacter Iogonek          {\buildtextogonek I}
+\definecharacter iogonek          {\buildtextogonek i}
+\definecharacter Uogonek          {\buildtextogonek U}
+\definecharacter uogonek          {\buildtextogonek u}
+
+\definecharacter Aring            {\buildtextaccent\textring A}
+\definecharacter aring            {\buildtextaccent\textring a}
+\definecharacter Uring            {\buildtextaccent\textring U}
+\definecharacter uring            {\buildtextaccent\textring u}
+
+\definecharacter Abreve           {\buildtextaccent\textbreve A}
+\definecharacter abreve           {\buildtextaccent\textbreve a}
+\definecharacter Ebreve           {\buildtextaccent\textbreve E}
+\definecharacter ebreve           {\buildtextaccent\textbreve e}
+\definecharacter Gbreve           {\buildtextaccent\textbreve G}
+\definecharacter gbreve           {\buildtextaccent\textbreve g}
+\definecharacter Ibreve           {\buildtextaccent\textbreve \dotlessI}
+\definecharacter ibreve           {\buildtextaccent\textbreve \dotlessi}
+\definecharacter Obreve           {\buildtextaccent\textbreve O}
+\definecharacter obreve           {\buildtextaccent\textbreve o}
+\definecharacter Ubreve           {\buildtextaccent\textbreve U}
+\definecharacter ubreve           {\buildtextaccent\textbreve u}
+
+\definecharacter Ccaron           {\buildtextaccent\textcaron C}
+\definecharacter ccaron           {\buildtextaccent\textcaron c}
+\definecharacter Dcaron           {\buildtextaccent\textcaron D}
+\definecharacter dcaron           {\buildtextaccent\textcaron d}
+\definecharacter Ecaron           {\buildtextaccent\textcaron E}
+\definecharacter ecaron           {\buildtextaccent\textcaron e}
+\definecharacter Lcaron           {\buildtextaccent\textcaron L}
+\definecharacter lcaron           {\buildtextaccent\textcaron l}
+\definecharacter Ncaron           {\buildtextaccent\textcaron N}
+\definecharacter ncaron           {\buildtextaccent\textcaron n}
+\definecharacter Rcaron           {\buildtextaccent\textcaron R}
+\definecharacter rcaron           {\buildtextaccent\textcaron r}
+\definecharacter Scaron           {\buildtextaccent\textcaron S}
+\definecharacter scaron           {\buildtextaccent\textcaron s}
+\definecharacter Tcaron           {\buildtextaccent\textcaron T}
+\definecharacter tcaron           {\buildtextaccent\textcaron t}
+\definecharacter Ycaron           {\buildtextaccent\textcaron Y}
+\definecharacter ycaron           {\buildtextaccent\textcaron y}
+\definecharacter Zcaron           {\buildtextaccent\textcaron Z}
+\definecharacter zcaron           {\buildtextaccent\textcaron z}
+
+\definecharacter Lstroke          {\hsmash{\char32}L}
+\definecharacter lstroke          {\hsmash{\char32}l}
+\definecharacter Ostroke          {\char31 } % "1F
+\definecharacter ostroke          {\char28 } % "1C
+
+\definecharacter aumlaut          {\moveaccent{-.1ex}\adiaeresis}
+\definecharacter eumlaut          {\moveaccent{-.1ex}\ediaeresis}
+\definecharacter iumlaut          {\moveaccent{-.1ex}\idiaeresis}
+\definecharacter oumlaut          {\moveaccent{-.1ex}\odiaeresis}
+\definecharacter uumlaut          {\moveaccent{-.1ex}\udiaeresis}
+
+\definecharacter Aumlaut          {\smashaccent\Adiaeresis}
+\definecharacter Eumlaut          {\smashaccent\Ediaeresis}
+\definecharacter Iumlaut          {\smashaccent\Idiaeresis}
+\definecharacter Oumlaut          {\smashaccent\Odiaeresis}
+\definecharacter Uumlaut          {\smashaccent\Udiaeresis}
+
+\definecharacter scommaaccent     {\buildtextbottomcomma s}
+\definecharacter Scommaaccent     {\buildtextbottomcomma S}
+\definecharacter tcommaaccent     {\buildtextbottomcomma t}
+\definecharacter Tcommaaccent     {\buildtextbottomcomma T}
+\definecharacter lcommaaccent     {\buildtextbottomcomma l}
+\definecharacter Lcommaaccent     {\buildtextbottomcomma L}
+
+\definecharacter Etilde           {\buildtextaccent\texttilde E}
+\definecharacter etilde           {\buildtextaccent\texttilde e}
+
+\definecharacter Ahook               {A}
+\definecharacter ahook               {a}
+\definecharacter Ehook               {E}
+\definecharacter ehook               {e}
+\definecharacter Ihook               {I}
+\definecharacter ihook               {i}
+\definecharacter Ohook               {O}
+\definecharacter ohook               {o}
+\definecharacter Uhook               {U}
+\definecharacter uhook               {u}
+\definecharacter Yhook               {Y}
+\definecharacter yhook               {y}
+
+\definecharacter Acircumflexgrave    {\Acircumflex}
+\definecharacter Acircumflexacute    {\Acircumflex}
+\definecharacter Acircumflextilde    {\Acircumflex}
+\definecharacter Acircumflexhook     {\Acircumflex}
+\definecharacter acircumflexgrave    {\acircumflex}
+\definecharacter acircumflexacute    {\acircumflex}
+\definecharacter acircumflextilde    {\acircumflex}
+\definecharacter acircumflexhook     {\acircumflex}
+\definecharacter Ecircumflexgrave    {\Ecircumflex}
+\definecharacter Ecircumflexacute    {\Ecircumflex}
+\definecharacter Ecircumflextilde    {\Ecircumflex}
+\definecharacter Ecircumflexhook     {\Ecircumflex}
+\definecharacter ecircumflexgrave    {\ecircumflex}
+\definecharacter ecircumflexacute    {\ecircumflex}
+\definecharacter ecircumflextilde    {\ecircumflex}
+\definecharacter ecircumflexhook     {\ecircumflex}
+\definecharacter Ocircumflexgrave    {\Ocircumflex}
+\definecharacter Ocircumflexacute    {\Ocircumflex}
+\definecharacter Ocircumflextilde    {\Ocircumflex}
+\definecharacter Ocircumflexhook     {\Ocircumflex}
+\definecharacter ocircumflexgrave    {\ocircumflex}
+\definecharacter ocircumflexacute    {\ocircumflex}
+\definecharacter ocircumflextilde    {\ocircumflex}
+\definecharacter ocircumflexhook     {\ocircumflex}
+
+\definecharacter Abrevegrave         {\Abreve}
+\definecharacter Abreveacute         {\Abreve}
+\definecharacter Abrevetilde         {\Abreve}
+\definecharacter Abrevehook          {\Abreve}
+\definecharacter abrevegrave         {\abreve}
+\definecharacter abreveacute         {\abreve}
+\definecharacter abrevetilde         {\abreve}
+\definecharacter abrevehook          {\abreve}
+
+\definecharacter Adotbelow           {\buildtextbottomdot A}
+\definecharacter adotbelow           {\buildtextbottomdot a}
+\definecharacter Edotbelow           {\buildtextbottomdot E}
+\definecharacter edotbelow           {\buildtextbottomdot e}
+\definecharacter Idotbelow           {\buildtextbottomdot I}
+\definecharacter idotbelow           {\buildtextbottomdot i}
+\definecharacter Odotbelow           {\buildtextbottomdot O}
+\definecharacter odotbelow           {\buildtextbottomdot o}
+\definecharacter Udotbelow           {\buildtextbottomdot U}
+\definecharacter udotbelow           {\buildtextbottomdot u}
+\definecharacter Ydotbelow           {\buildtextbottomdot Y}
+\definecharacter ydotbelow           {\buildtextbottomdot y}
+
+\definecharacter Ohorndotbelow       {\buildtextbottomdot\Ohorn}
+\definecharacter ohorndotbelow       {\buildtextbottomdot\ohorn}
+\definecharacter Uhorndotbelow       {\buildtextbottomdot\Uhorn}
+\definecharacter uhorndotbelow       {\buildtextbottomdot\uhorn}
+
+\definecharacter Acircumflexdotbelow {\buildtextbottomdot\Acircumflex}
+\definecharacter acircumflexdotbelow {\buildtextbottomdot\acircumflex}
+\definecharacter Ecircumflexdotbelow {\buildtextbottomdot\Ecircumflex}
+\definecharacter ecircumflexdotbelow {\buildtextbottomdot\ecircumflex}
+\definecharacter Ocircumflexdotbelow {\buildtextbottomdot\Ocircumflex}
+\definecharacter ocircumflexdotbelow {\buildtextbottomdot\ocircumflex}
+\definecharacter Abrevedotbelow      {\buildtextbottomdot\Abreve}
+\definecharacter abrevedotbelow      {\buildtextbottomdot\abreve}
+
+\definecharacter Ohorn               {O}
+\definecharacter Ohorngrave          {\Ograve}
+\definecharacter Ohornacute          {\Oacute}
+\definecharacter Ohorntilde          {\Otilde}
+\definecharacter Ohornhook           {O}
+\definecharacter ohorn               {o}
+\definecharacter ohorngrave          {\ograve}
+\definecharacter ohornacute          {\oacute}
+\definecharacter ohorntilde          {\otilde}
+\definecharacter ohornhook           {o}
+\definecharacter Uhorn               {U}
+\definecharacter Uhorngrave          {\Ugrave}
+\definecharacter Uhornacute          {\Uacute}
+\definecharacter Uhorntilde          {\Utilde}
+\definecharacter Uhornhook           {U}
+\definecharacter uhorn               {u}
+\definecharacter uhorngrave          {\ugrave}
+\definecharacter uhornacute          {\uacute}
+\definecharacter uhorntilde          {\utilde}
+\definecharacter uhornhook           {u}
+
+\stopencoding
+
+%D Needed for transliterated chinese (provided by Tobias Burnus).
+
+\startencoding[default]
+
+\definecharacter acaron {\buildtextaccent\textcaron a}         % U+01CE
+\definecharacter icaron {\buildtextaccent\textcaron \dotlessi} % U+01D0
+\definecharacter ocaron {\buildtextaccent\textcaron o}         % U+01D2
+\definecharacter ucaron {\buildtextaccent\textcaron u}         % U+01D4
+
+\stopencoding
+
+%D Greek (moved to here):
+
+\startencoding[default]
+
+% Uppercase Greek letters
+
+\definecharacter greekAlpha   {\Alpha}
+\definecharacter greekBeta    {\Beta}
+\definecharacter greekGamma   {\Gamma}
+\definecharacter greekDelta   {\Delta}
+\definecharacter greekEpsilon {\Epsilon}
+\definecharacter greekZeta    {\Zeta}
+\definecharacter greekEta     {\Eta}
+\definecharacter greekTheta   {\Theta}
+\definecharacter greekIota    {\Iota}
+\definecharacter greekKappa   {\Kappa}
+\definecharacter greekLambda  {\Lambda}
+\definecharacter greekMu      {\Mu}
+\definecharacter greekNu      {\Nu}
+\definecharacter greekXi      {\Xi}
+\definecharacter greekOmicron {\Omicron}
+\definecharacter greekPi      {\Pi}
+\definecharacter greekRho     {\Rho}
+\definecharacter greekSigma   {\Sigma}
+\definecharacter greekTau     {\Tau}
+\definecharacter greekUpsilon {\Upsilon}
+\definecharacter greekPhi     {\Phi}
+\definecharacter greekChi     {\Chi}
+\definecharacter greekPsi     {\Psi}
+\definecharacter greekOmega   {\Omega}
+
+% Lowercase Greek letters
+
+\definecharacter greekalpha      {\alpha}
+\definecharacter greekbeta       {\beta}
+\definecharacter greekgamma      {\gamma}
+\definecharacter greekdelta      {\delta}
+\definecharacter greekepsilon    {\varepsilon}
+\definecharacter greekepsilonalt {\epsilon}
+\definecharacter greekzeta       {\zeta}
+\definecharacter greeketa        {\eta}
+\definecharacter greektheta      {\theta}
+\definecharacter greekthetaalt   {\vartheta}
+\definecharacter greekiota       {\iota}
+\definecharacter greekkappa      {\kappa}
+\definecharacter greeklambda     {\lambda}
+\definecharacter greekmu         {\mu}
+\definecharacter greeknu         {\nu}
+\definecharacter greekxi         {\xi}
+\definecharacter greekomicron    {\omicron}
+\definecharacter greekpi         {\pi}
+\definecharacter greekrho        {\rho}
+\definecharacter greeksigma      {\sigma}
+\definecharacter greekfinalsigma {\varsigma}
+\definecharacter greektau        {\tau}
+\definecharacter greekupsilon    {\upsilon}
+\definecharacter greekphi        {\varphi}
+\definecharacter greekphialt     {\phi}
+\definecharacter greekchi        {\chi}
+\definecharacter greekpsi        {\psi}
+\definecharacter greekomega      {\omega}
+
+% Accented Uppercase Greek letters
+
+\definecharacter greekAlphatonos       {'A}
+\definecharacter greekEpsilontonos     {'E}
+\definecharacter greekEtatonos         {'H}
+\definecharacter greekIotatonos        {'I}
+\definecharacter greekOmicrontonos     {'O}
+\definecharacter greekUpsilontonos     {'U}
+\definecharacter greekOmegatonos       {'W}
+\definecharacter greekIotadialytika    {"I}
+\definecharacter greekUpsilondialytika {"U}
+
+% Accented Lowercase Greek letters
+
+\definecharacter greekalphatonos            {'a}
+\definecharacter greekepsilontonos          {'e}
+\definecharacter greeketatonos              {'h}
+\definecharacter greekiotatonos             {'i}
+\definecharacter greekomicrontonos          {'o}
+\definecharacter greekupsilontonos          {'u}
+\definecharacter greekomegatonos            {'w}
+\definecharacter greekiotadialytika         {"i}
+\definecharacter greekupsilondialytika      {"u}
+\definecharacter greekiotadialytikatonos    {'"i}
+\definecharacter greekupsilondialytikatonos {'"u}
+
+% Miscellaneous Greek symbols
+
+\definecharacter greekleftquot       {((}
+\definecharacter greekrightquot      {))}
+\definecharacter greektonos          {'}
+\definecharacter greekdialytikatonos {'"}
+\definecharacter greekapostrophos    {''}
+
+\stopencoding
+
+%D Cyrillic (moved to here):
+
+\startencoding[default]
+
+\definecharacter cyrillicA      {A}
+\definecharacter cyrillicB      {B}
+\definecharacter cyrillicV      {V}
+\definecharacter cyrillicG      {G}
+\definecharacter cyrillicD      {D}
+\definecharacter cyrillicE      {E}
+\definecharacter cyrillicZH     {ZH}
+\definecharacter cyrillicZ      {Z}
+\definecharacter cyrillicI      {I}
+\definecharacter cyrillicISHRT  {ISHRT}
+\definecharacter cyrillicK      {K}
+\definecharacter cyrillicL      {L}
+\definecharacter cyrillicM      {M}
+\definecharacter cyrillicN      {N}
+\definecharacter cyrillicO      {O}
+\definecharacter cyrillicP      {P}
+\definecharacter cyrillicR      {R}
+\definecharacter cyrillicS      {S}
+\definecharacter cyrillicT      {T}
+\definecharacter cyrillicU      {U}
+\definecharacter cyrillicF      {F}
+\definecharacter cyrillicH      {H}
+\definecharacter cyrillicC      {C}
+\definecharacter cyrillicCH     {CH}
+\definecharacter cyrillicSH     {SH}
+\definecharacter cyrillicSHCH   {SHCH}
+\definecharacter cyrillicHRDSN  {HRDSN}
+\definecharacter cyrillicERY    {ERY}
+\definecharacter cyrillicSFTSN  {SFTSN}
+\definecharacter cyrillicEREV   {EREV}
+\definecharacter cyrillicYU     {YU}
+\definecharacter cyrillicYA     {YA}
+\definecharacter cyrillicGUP    {GUP}
+\definecharacter cyrillicGHCRS  {GHCRS}
+\definecharacter cyrillicDJE    {DJE}
+\definecharacter cyrillicTSHE   {TSHE}
+\definecharacter cyrillicSHHA   {SHHA}
+\definecharacter cyrillicZHDSC  {ZHDSC}
+\definecharacter cyrillicZDSC   {ZDSC}
+\definecharacter cyrillicLJE    {LJE}
+\definecharacter cyrillicYI     {YI}
+\definecharacter cyrillicKDSC   {KDSC}
+\definecharacter cyrillicKBEAK  {KBEAK}
+\definecharacter cyrillicKVCRS  {KVCRS}
+\definecharacter cyrillicAE     {AE}
+\definecharacter cyrillicNDSC   {NDSC}
+\definecharacter cyrillicNG     {NG}
+\definecharacter cyrillicDZE    {DZE}
+\definecharacter cyrillicOTLD   {OTLD}
+\definecharacter cyrillicSDSC   {SDSC}
+\definecharacter cyrillicUSHRT  {USHRT}
+\definecharacter cyrillicY      {Y}
+\definecharacter cyrillicYHCRS  {YHCRS}
+\definecharacter cyrillicHDSC   {HDSC}
+\definecharacter cyrillicDZHE   {DZHE}
+\definecharacter cyrillicCHVCRS {CHVCRS}
+\definecharacter cyrillicCHRDSC {CHRDSC}
+\definecharacter cyrillicIE     {IE}
+\definecharacter cyrillicSCHWA  {SCHWA}
+\definecharacter cyrillicNJE    {NJE}
+\definecharacter cyrillicYO     {YO}
+\definecharacter cyrillicII     {II}
+\definecharacter cyrillicJE     {JE}
+\definecharacter cyrillicQ      {Q}
+\definecharacter cyrillicW      {W}
+
+\definecharacter cyrillica      {a}
+\definecharacter cyrillicb      {b}
+\definecharacter cyrillicv      {v}
+\definecharacter cyrillicg      {g}
+\definecharacter cyrillicd      {d}
+\definecharacter cyrillice      {e}
+\definecharacter cyrilliczh     {zh}
+\definecharacter cyrillicz      {z}
+\definecharacter cyrillici      {i}
+\definecharacter cyrillicishrt  {ishrt}
+\definecharacter cyrillick      {k}
+\definecharacter cyrillicl      {l}
+\definecharacter cyrillicm      {m}
+\definecharacter cyrillicn      {n}
+\definecharacter cyrillico      {o}
+\definecharacter cyrillicp      {p}
+\definecharacter cyrillicr      {r}
+\definecharacter cyrillics      {s}
+\definecharacter cyrillict      {t}
+\definecharacter cyrillicu      {u}
+\definecharacter cyrillicf      {f}
+\definecharacter cyrillich      {h}
+\definecharacter cyrillicc      {c}
+\definecharacter cyrillicch     {ch}
+\definecharacter cyrillicsh     {sh}
+\definecharacter cyrillicshch   {shch}
+\definecharacter cyrillichrdsn  {hrdsn}
+\definecharacter cyrillicery    {ery}
+\definecharacter cyrillicsftsn  {sftsn}
+\definecharacter cyrillicerev   {erev}
+\definecharacter cyrillicyu     {yu}
+\definecharacter cyrillicya     {ya}
+\definecharacter cyrillicgup    {gup}
+\definecharacter cyrillicghcrs  {ghcrs}
+\definecharacter cyrillicdje    {dje}
+\definecharacter cyrillictshe   {tshe}
+\definecharacter cyrillicshha   {shha}
+\definecharacter cyrilliczhdsc  {zhdsc}
+\definecharacter cyrilliczdsc   {zdsc}
+\definecharacter cyrilliclje    {lje}
+\definecharacter cyrillicyi     {yi}
+\definecharacter cyrillickdsc   {kdsc}
+\definecharacter cyrillickbeak  {kbeak}
+\definecharacter cyrillickvcrs  {kvcrs}
+\definecharacter cyrillicae     {ae}
+\definecharacter cyrillicndsc   {ndsc}
+\definecharacter cyrillicng     {ng}
+\definecharacter cyrillicdze    {dze}
+\definecharacter cyrillicotld   {otld}
+\definecharacter cyrillicsdsc   {sdsc}
+\definecharacter cyrillicushrt  {ushrt}
+\definecharacter cyrillicy      {y}
+\definecharacter cyrillicyhcrs  {yhcrs}
+\definecharacter cyrillichdsc   {hdsc}
+\definecharacter cyrillicdzhe   {dzhe}
+\definecharacter cyrillicchvcrs {chvcrs}
+\definecharacter cyrillicchrdsc {chrdsc}
+\definecharacter cyrillicie     {ie}
+\definecharacter cyrillicschwa  {schwa}
+\definecharacter cyrillicnje    {nje}
+\definecharacter cyrillicyo     {yo}
+\definecharacter cyrillicii     {ii}
+\definecharacter cyrillicje     {je}
+\definecharacter cyrillicq      {q}
+\definecharacter cyrillicw      {w}
+
+\definecharacter cyrillicGJE      {\'\cyrillicG}
+\definecharacter cyrillicgje      {\'\cyrillicg}
+\definecharacter cyrillicKJE      {\'\cyrillicK}
+\definecharacter cyrillickje      {\'\cyrillick}
+
+\stopencoding
+
+\def\cyrillicio{\cyrillicyo}
+\def\cyrillicIO{\cyrillicYO}
+
+%D Hebrew:
+
+\startencoding[default]
+
+\definecharacter hebrewAlef       {'}
+\definecharacter hebrewBet        {b}
+\definecharacter hebrewGimel      {g}
+\definecharacter hebrewDalet      {d}
+\definecharacter hebrewHe         {h}
+\definecharacter hebrewVav        {w}
+\definecharacter hebrewZayin      {z}
+\definecharacter hebrewHet        {\hstroke}
+\definecharacter hebrewTet        {\tcedilla}
+\definecharacter hebrewYod        {y}
+\definecharacter hebrewKaffinal   {k}
+\definecharacter hebrewKaf        {k}
+\definecharacter hebrewLamed      {l}
+\definecharacter hebrewMemfinal   {m}
+\definecharacter hebrewMem        {m}
+\definecharacter hebrewNunfinal   {n}
+\definecharacter hebrewNun        {n}
+\definecharacter hebrewSamekh     {s}
+\definecharacter hebrewAyin       {\gdotaccent}
+\definecharacter hebrewPefinal    {p}
+\definecharacter hebrewPe         {p}
+\definecharacter hebrewTsadifinal {\scedilla}
+\definecharacter hebrewTsadi      {\scedilla}
+\definecharacter hebrewQof        {q}
+\definecharacter hebrewResh       {r}
+\definecharacter hebrewShin       {\scaron}
+\definecharacter hebrewTav        {th}
+
+\stopencoding
+
+%D A few goodies:
+
+\def\eszett{\ssharp}
+\def\Eszett{\Ssharp}
+
+\def\lslash{\lstroke}
+\def\Lslash{\Lstroke}
+\def\dslash{\dstroke}
+\def\Dslash{\Dstroke}
+\def\oslash{\ostroke}
+\def\Oslash{\Ostroke}
+
+\def\dcroat{\dstroke}
+\def\Dcroat{\Dstroke}
+
+% \startencoding [default]
+%
+% \definecharacter scommaaccent {\scedilla}
+% \definecharacter Scommaaccent {\Scedilla}
+% \definecharacter tcommaaccent {\tcedilla}
+% \definecharacter Tcommaaccent {\Tcedilla}
+%
+% \stopencoding
+
+% for plain tex's sake
+
+\def\S       {\sectionmark  }
+\def\P       {\paragraphmark}
+
+% for latex users sake
+
+\def\textS   {\sectionmark  }
+\def\textP   {\paragraphmark}
+
+% for old times sake
+
+\def\florin  {\textflorin  }  \def\florijn{\textflorin}
+\def\dollar  {\textdollar  }
+\def\pound   {\textsterling}
+\def\sterling{\textsterling}
+
+% idem
+
+\def\promille{\perthousand}
+\def\permille{\perthousand}
+\def\procent {\percent }
+\def\permine {\fakepermine}
+
+% some more
+
+\def\hyphen            {\softhyphen}
+\def\cwm               {\compoundwordmark}
+\def\nonbreakinghyphen {\hyphen}
+\def\breakinghyphen    {\hyphen\prewordbreak}
+
+% quotes
+
+\def\lowerleftsingleninequote  {\quotesinglebase}
+\def\lowerleftdoubleninequote  {\quotedblbase}
+\def\lowerrightsingleninequote {\quotesinglebase}
+\def\lowerrightdoubleninequote {\quotedblbase}
+
+\def\upperleftsingleninequote  {\quoteright}
+\def\upperleftdoubleninequote  {\quotedblright}
+\def\upperrightsingleninequote {\quoteright}
+\def\upperrightdoubleninequote {\quotedblright}
+
+\def\upperleftsinglesixquote   {\quoteleft}
+\def\upperleftdoublesixquote   {\quotedblleft}
+\def\upperrightsinglesixquote  {\quoteleft}
+\def\upperrightdoublesixquote  {\quotedblleft}
+
+\def\leftsubguillemot          {\guilsingleleft}
+\def\rightsubguillemot         {\guilsingleright}
+
+%D A couple of fallbacks suggestion by users, slightly
+%D adapted and obscured by memory saving hacks.
+
+\unprotect
+
+\startencoding[default]
+
+\definecharacter textcent        {c\rlap{\hskip-.2\s!em
+  \vrule\!!width.2\s!pt\!!height1.2\s!ex\!!depth.2\s!ex}}
+
+\definecharacter texteuro        {C\rlap{\hskip-.75\s!em
+  \vrule\!!width.4\s!em\!!height.85\s!ex\!!depth-.8\s!ex}}
+
+\definecharacter textblacksquare {\dontleavehmode\hbox{%
+  \vrule\!!width.3\s!em\!!height.4\s!em\!!depth-.1\s!em}}
+
+\definecharacter textbrokenbar   {\dontleavehmode\hbox{\kern.05\s!em
+  \vrule\!!width.4\s!pt\!!height1.8\s!ex\!!depth-.85\s!ex
+                                  \llap{%
+  \vrule\!!width.4\s!pt\!!height.35\s!ex\!!depth.6\s!ex}%
+                                  \kern.05\s!em}}
+
+\stopencoding
+
+\protect
+
+%D We also use symbolic names for math accents.
+
+\startencoding[default]
+
+\definecharacter mathacute      "7013
+\definecharacter mathgrave      "7012
+\definecharacter mathddot       "707F
+\definecharacter mathtilde      "707E
+\definecharacter mathbar        "7016
+\definecharacter mathbreve      "7015
+\definecharacter mathcheck      "7014
+\definecharacter mathhat        "705E
+\definecharacter mathvec        "017E
+\definecharacter mathdot        "705F
+\definecharacter mathwidetilde  "0365
+\definecharacter mathwidehat    "0362
+
+\stopencoding
+
+% \startencoding [default]
+
+% \definecommand prime       {\mathematics{'}}
+% \definecommand doubleprime {\mathematics{''}}
+% \definecommand tripleprime {\mathematics{'''}}
+
+% \stopencoding
+
+\ifx\zdot\undefined \def\zdot{\zdotaccent} \fi
+\ifx\Zdot\undefined \def\Zdot{\Zdotaccent} \fi
+
+\ifx\greeklamda\undefined \def\greeklamda{\greeklambda} \fi
+\ifx\greekLamda\undefined \def\greekLamda{\greekLambda} \fi
+
+\ifx\leftguillemet \undefined \def\leftguillemet {\leftguillemot } \fi
+\ifx\rightguillemet\undefined \def\rightguillemet{\rightguillemot} \fi
+
+%D New:
+
+\startencoding[\s!default]
+
+\definecharacter schwa      {\hbox{\rotate[\c!rotation=180,\c!location=\v!high]{\hbox{e}}}}
+\definecharacter schwagrave {\buildtextgrave\schwa}
+
+\stopencoding
+
+%D Also new, from Taco, for Mojca, who wanted another 8~regimes.
+
+\startencoding[\s!default]
+
+\definecharacter texthorizontalbar {{\endash\kern\zeropoint\endash}}
+\definecharacter textdong          {\underbar{\dstroke}}
+
+\stopencoding
+
+%D Goodie (makes more sense):
+
+\def\normalcontrolspace
+  {\getglyph{ComputerModernMono}{\char32}}
+
+\def\fakedcontrolspace % can be virtual in luatex
+  {\dontleavehmode\hbox
+     {\scratchdimen.1ex%
+      \kern\scratchdimen
+      \vrule \!!width\scratchdimen \!!height5.5\scratchdimen \!!depth3\scratchdimen
+      \vrule \!!width\dimexpr.5em-4\scratchdimen\relax \!!height-2\scratchdimen \!!depth3\scratchdimen
+      \vrule \!!width\scratchdimen \!!height5.5\scratchdimen \!!depth3\scratchdimen
+      \kern\scratchdimen}}
+
+\def\fakecontrolspace{\let\normalcontrolspace\fakedcontrolspace}
+
+\endinput
diff --git a/tex/context/base/enco-def.tex b/tex/context/base/enco-def.tex
deleted file mode 100644
index b6d66bb6c..000000000
--- a/tex/context/base/enco-def.tex
+++ /dev/null
@@ -1,920 +0,0 @@
-%D \module
-%D   [     file=enco-def,
-%D      version=2000.05.07, % 2000.20.12, % split from less verbose base file
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Default Character Definitions,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=PRAGMA-ADE]
-%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 Instead of overloading plain \TEX\ macros (and keeping them
-%D available as an escape), we now use the more verbose
-%D definitions in this file. Since memory is less a problem
-%D these days, this verbosity has only a small price, but we
-%D gain readability. The following definitions are based on
-%D usage of the the original \TEX\ fonts, where composed
-%D characters were not part of the design. So, occasionally
-%D we have to revert to hacks. Thanks to all those users who
-%D helped me to fill in the details.
-
-\startencoding[default]
-
-\definecharacter textcomma         ,
-\definecharacter textperiod        .
-
-\definecharacter textacute         19
-\definecharacter textbottomdot     46
-\definecharacter textbreve         21
-\definecharacter textcaron         20
-\definecharacter textcedilla       24
-\definecharacter textcircumflex    94
-\definecharacter textdiaeresis    127
-\definecharacter textdotaccent     95
-\definecharacter textgrave         18
-\definecharacter texthungarumlaut 125
-\definecharacter textmacron        22
-\definecharacter textogonek        24 % fake
-\definecharacter textring          23
-\definecharacter texttilde        126
-
-\definecharacter textbottomcomma  {\hbox{\lower.35ex\hbox{\tx,}}} % for mojca
-
-\definecharacter dotlessi         {\char"10 }
-\definecharacter dotlessj         {\char"11 }
-\definecharacter dotlessI         {I}
-\definecharacter dotlessJ         {J}
-
-\definecharacter endash           123
-\definecharacter emdash           124
-
-\definecharacter aeligature       {\char26 } % "1A
-\definecharacter AEligature       {\char29 } % "1D
-\definecharacter ijligature       {ij}
-\definecharacter IJligature       {IJ}
-\definecharacter oeligature       {\char27 } % "1B
-\definecharacter OEligature       {\char30 } % "1E
-
-\definecharacter ssharp           {\char25 } % "19
-\definecharacter Ssharp           {SS}
-
-\definecharacter thorn            {\unknownchar}
-\definecharacter Thorn            {\unknownchar}
-
-\definecharacter eth              {\unknownchar} % mojca prefers this (was \dstroke)
-%definecharacter Eth              {\unknownchar}
-\definecharacter Eth              {\Dstroke}     % mojca prefers this too
-
-\definecharacter exclamdown        60
-\definecharacter questiondown      62
-
-\definecharacter copyright        {\encircled{\txx C}}
-\definecharacter registered       {\encircled{\txx R}}
-\definecharacter trademark        {\high{\txx TM}}
-
-\definecharacter sectionmark      {\mathematics{\mathhexbox278}}
-\definecharacter paragraphmark    {\mathematics{\mathhexbox27B}}
-
-\definecharacter onequarter       {\vulgarfraction{1}{4}}
-\definecharacter onehalf          {\vulgarfraction{1}{2}}
-\definecharacter threequarter     {\vulgarfraction{3}{4}}
-
-\definecharacter onesuperior      {\high{1}}
-\definecharacter twosuperior      {\high{2}}
-\definecharacter threesuperior    {\high{3}}
-
-\definecharacter textcent         {c}
-\definecharacter textcurrency     {\unknownchar}
-\definecharacter textdollar       {\fakedollar}
-\definecharacter texteuro         {E}
-\definecharacter textflorin       {\fakeflorin}
-\definecharacter textsterling     {\fakesterling}
-\definecharacter textyen          {Y}
-
-\definecharacter ordfeminine      {\high{\txx a}}
-\definecharacter ordmasculine     {\high{\txx o}}
-
-\definecharacter percent          {\fakepercent}
-\definecharacter perthousand      {\fakeperthousand}
-
-\definecharacter softhyphen        45
-\definecharacter periodcentered   {\hbox{\mathematics\cdot}}
-\definecharacter compoundwordmark  23
-
-\definecharacter textasciicircum   94
-\definecharacter textasciitilde   126
-\definecharacter textslash         47
-\definecharacter textbackslash    {\tex{}} % todo
-\definecharacter textbraceleft    {\mathematics\{}
-\definecharacter textbraceright   {\mathematics\}}
-\definecharacter textunderscore   {\fakeunderscore}
-\definecharacter textvisiblespace {\fakevisiblespace}
-
-\definecharacter textbrokenbar    {\mathematics\vert}
-\definecharacter textbullet       {\mathematics\bullet}
-\definecharacter textdag          {\mathematics\dag}
-\definecharacter textddag         {\mathematics\ddag}
-\definecharacter textdegree       {\mathematics{{}^{\circ}}}
-\definecharacter textdiv          {\mathematics\div}
-\definecharacter textellipsis     {\mathematics\cdots}
-\definecharacter textfraction     {\mathematics/}
-\definecharacter textlognot       {\mathematics\neg}
-\definecharacter textminus        {\mathematics-}
-\definecharacter textmu           {\mathematics\mu}
-\definecharacter textmultiply     {\mathematics\times}
-\definecharacter textpm           {\mathematics\pm}
-
-\definecharacter quotedbl         {"}
-\definecharacter quotedblbase     {,,}
-\definecharacter quotedblleft     {``}
-\definecharacter quotedblright    {''}
-
-\definecharacter quotesingle      {`}
-\definecharacter quotesinglebase  {,}
-
-\definecharacter quoteleft        {`}
-\definecharacter quoteright       {'}
-
-\definecharacter guilsingleleft   {\fakeleftsubguillemot }
-\definecharacter guilsingleright  {\fakerightsubguillemot}
-
-\definecharacter leftguillemot    {\fakeleftguillemot }
-\definecharacter rightguillemot   {\fakerightguillemot}
-
-\definecharacter Acircumflex      {\buildtextaccent\textcircumflex A}
-\definecharacter acircumflex      {\buildtextaccent\textcircumflex a}
-\definecharacter Ccircumflex      {\buildtextaccent\textcircumflex C}
-\definecharacter ccircumflex      {\buildtextaccent\textcircumflex c}
-\definecharacter Ecircumflex      {\buildtextaccent\textcircumflex E}
-\definecharacter ecircumflex      {\buildtextaccent\textcircumflex e}
-\definecharacter Gcircumflex      {\buildtextaccent\textcircumflex G}
-\definecharacter gcircumflex      {\buildtextaccent\textcircumflex g}
-\definecharacter Hcircumflex      {\buildtextaccent\textcircumflex H}
-\definecharacter hcircumflex      {\buildtextaccent\textcircumflex h}
-\definecharacter Icircumflex      {\buildtextaccent\textcircumflex \dotlessI}
-\definecharacter icircumflex      {\buildtextaccent\textcircumflex \dotlessi}
-\definecharacter Jcircumflex      {\buildtextaccent\textcircumflex \dotlessJ}
-\definecharacter jcircumflex      {\buildtextaccent\textcircumflex \dotlessj}
-\definecharacter Ocircumflex      {\buildtextaccent\textcircumflex O}
-\definecharacter ocircumflex      {\buildtextaccent\textcircumflex o}
-\definecharacter Scircumflex      {\buildtextaccent\textcircumflex S}
-\definecharacter scircumflex      {\buildtextaccent\textcircumflex s}
-\definecharacter Ucircumflex      {\buildtextaccent\textcircumflex U}
-\definecharacter ucircumflex      {\buildtextaccent\textcircumflex u}
-\definecharacter Wcircumflex      {\buildtextaccent\textcircumflex W}
-\definecharacter wcircumflex      {\buildtextaccent\textcircumflex w}
-\definecharacter Ycircumflex      {\buildtextaccent\textcircumflex Y}
-\definecharacter ycircumflex      {\buildtextaccent\textcircumflex y}
-
-\definecharacter Agrave           {\buildtextaccent\textgrave A}
-\definecharacter agrave           {\buildtextaccent\textgrave a}
-\definecharacter Egrave           {\buildtextaccent\textgrave E}
-\definecharacter egrave           {\buildtextaccent\textgrave e}
-\definecharacter Igrave           {\buildtextaccent\textgrave \dotlessI}
-\definecharacter igrave           {\buildtextaccent\textgrave \dotlessi}
-\definecharacter Ograve           {\buildtextaccent\textgrave O}
-\definecharacter ograve           {\buildtextaccent\textgrave o}
-\definecharacter Ugrave           {\buildtextaccent\textgrave U}
-\definecharacter ugrave           {\buildtextaccent\textgrave u}
-\definecharacter Ygrave           {\buildtextaccent\textgrave Y}
-\definecharacter ygrave           {\buildtextaccent\textgrave y}
-
-\definecharacter Atilde           {\buildtextaccent\texttilde A}
-\definecharacter atilde           {\buildtextaccent\texttilde a}
-\definecharacter Itilde           {\buildtextaccent\texttilde \dotlessI}
-\definecharacter itilde           {\buildtextaccent\texttilde \dotlessi}
-\definecharacter Ntilde           {\buildtextaccent\texttilde N}
-\definecharacter ntilde           {\buildtextaccent\texttilde n}
-\definecharacter Otilde           {\buildtextaccent\texttilde O}
-\definecharacter otilde           {\buildtextaccent\texttilde o}
-\definecharacter Utilde           {\buildtextaccent\texttilde U}
-\definecharacter utilde           {\buildtextaccent\texttilde u}
-\definecharacter Ytilde           {\buildtextaccent\texttilde Y}
-\definecharacter ytilde           {\buildtextaccent\texttilde y}
-
-\definecharacter Adiaeresis       {\buildtextaccent\textdiaeresis A}
-\definecharacter adiaeresis       {\buildtextaccent\textdiaeresis a}
-\definecharacter Ediaeresis       {\buildtextaccent\textdiaeresis E}
-\definecharacter ediaeresis       {\buildtextaccent\textdiaeresis e}
-\definecharacter Idiaeresis       {\buildtextaccent\textdiaeresis \dotlessI}
-\definecharacter idiaeresis       {\buildtextaccent\textdiaeresis \dotlessi}
-\definecharacter Odiaeresis       {\buildtextaccent\textdiaeresis O}
-\definecharacter odiaeresis       {\buildtextaccent\textdiaeresis o}
-\definecharacter Udiaeresis       {\buildtextaccent\textdiaeresis U}
-\definecharacter udiaeresis       {\buildtextaccent\textdiaeresis u}
-\definecharacter Ydiaeresis       {\buildtextaccent\textdiaeresis Y}
-\definecharacter ydiaeresis       {\buildtextaccent\textdiaeresis y}
-
-\definecharacter Aacute           {\buildtextaccent\textacute A}
-\definecharacter aacute           {\buildtextaccent\textacute a}
-\definecharacter Cacute           {\buildtextaccent\textacute C}
-\definecharacter cacute           {\buildtextaccent\textacute c}
-\definecharacter Eacute           {\buildtextaccent\textacute E}
-\definecharacter eacute           {\buildtextaccent\textacute e}
-\definecharacter Iacute           {\buildtextaccent\textacute \dotlessI}
-\definecharacter iacute           {\buildtextaccent\textacute \dotlessi}
-\definecharacter Lacute           {\buildtextaccent\textacute L}
-\definecharacter lacute           {\buildtextaccent\textacute l}
-\definecharacter Nacute           {\buildtextaccent\textacute N}
-\definecharacter nacute           {\buildtextaccent\textacute n}
-\definecharacter Oacute           {\buildtextaccent\textacute O}
-\definecharacter oacute           {\buildtextaccent\textacute o}
-\definecharacter Racute           {\buildtextaccent\textacute R}
-\definecharacter racute           {\buildtextaccent\textacute r}
-\definecharacter Sacute           {\buildtextaccent\textacute S}
-\definecharacter sacute           {\buildtextaccent\textacute s}
-\definecharacter Uacute           {\buildtextaccent\textacute U}
-\definecharacter uacute           {\buildtextaccent\textacute u}
-\definecharacter Yacute           {\buildtextaccent\textacute Y}
-\definecharacter yacute           {\buildtextaccent\textacute y}
-\definecharacter Zacute           {\buildtextaccent\textacute Z}
-\definecharacter zacute           {\buildtextaccent\textacute z}
-
-%definecharacter Dstroke          {D}
-%definecharacter dstroke          {d}
-
-\definecharacter dstroke          {\pseudoencodeddj}
-\definecharacter Dstroke          {\pseudoencodedDJ}
-\definecharacter Hstroke          {H}
-\definecharacter hstroke          {h}
-\definecharacter Tstroke          {T}
-\definecharacter tstroke          {t}
-
-\definecharacter Cdotaccent       {\buildtextaccent\textdotaccent C}
-\definecharacter cdotaccent       {\buildtextaccent\textdotaccent c}
-\definecharacter Edotaccent       {\buildtextaccent\textdotaccent E}
-\definecharacter edotaccent       {\buildtextaccent\textdotaccent e}
-\definecharacter Gdotaccent       {\buildtextaccent\textdotaccent G}
-\definecharacter gdotaccent       {\buildtextaccent\textdotaccent g}
-\definecharacter Idotaccent       {\buildtextaccent\textdotaccent \dotlessI}
-\definecharacter idotaccent       {\buildtextaccent\textdotaccent \dotlessi}
-\definecharacter Zdotaccent       {\buildtextaccent\textdotaccent Z}
-\definecharacter zdotaccent       {\buildtextaccent\textdotaccent z}
-
-\definecharacter Amacron          {\buildtextaccent\textmacron A}
-\definecharacter amacron          {\buildtextaccent\textmacron a}
-\definecharacter Emacron          {\buildtextaccent\textmacron E}
-\definecharacter emacron          {\buildtextaccent\textmacron e}
-\definecharacter Imacron          {\buildtextaccent\textmacron \dotlessI}
-\definecharacter imacron          {\buildtextaccent\textmacron \dotlessi}
-\definecharacter Omacron          {\buildtextaccent\textmacron O}
-\definecharacter omacron          {\buildtextaccent\textmacron o}
-\definecharacter Umacron          {\buildtextaccent\textmacron U}
-\definecharacter umacron          {\buildtextaccent\textmacron u}
-
-\definecharacter Ccedilla         {\buildtextcedilla C}
-\definecharacter ccedilla         {\buildtextcedilla c}
-\definecharacter Kcedilla         {\buildtextcedilla K}
-\definecharacter kcedilla         {\buildtextcedilla k}
-\definecharacter Lcedilla         {\buildtextcedilla L}
-\definecharacter lcedilla         {\buildtextcedilla l}
-\definecharacter Ncedilla         {\buildtextcedilla N}
-\definecharacter ncedilla         {\buildtextcedilla n}
-\definecharacter Rcedilla         {\buildtextcedilla R}
-\definecharacter rcedilla         {\buildtextcedilla r}
-\definecharacter Scedilla         {\buildtextcedilla S}
-\definecharacter scedilla         {\buildtextcedilla s}
-\definecharacter Tcedilla         {\buildtextcedilla T}
-\definecharacter tcedilla         {\buildtextcedilla t}
-
-\definecharacter Ohungarumlaut    {\buildtextaccent\texthungarumlaut O}
-\definecharacter ohungarumlaut    {\buildtextaccent\texthungarumlaut o}
-\definecharacter Uhungarumlaut    {\buildtextaccent\texthungarumlaut U}
-\definecharacter uhungarumlaut    {\buildtextaccent\texthungarumlaut u}
-
-\definecharacter Aogonek          {\buildtextogonek A}
-\definecharacter aogonek          {\buildtextogonek a}
-\definecharacter Eogonek          {\buildtextogonek E}
-\definecharacter eogonek          {\buildtextogonek e}
-\definecharacter Iogonek          {\buildtextogonek I}
-\definecharacter iogonek          {\buildtextogonek i}
-\definecharacter Uogonek          {\buildtextogonek U}
-\definecharacter uogonek          {\buildtextogonek u}
-
-\definecharacter Aring            {\buildtextaccent\textring A}
-\definecharacter aring            {\buildtextaccent\textring a}
-\definecharacter Uring            {\buildtextaccent\textring U}
-\definecharacter uring            {\buildtextaccent\textring u}
-
-\definecharacter Abreve           {\buildtextaccent\textbreve A}
-\definecharacter abreve           {\buildtextaccent\textbreve a}
-\definecharacter Ebreve           {\buildtextaccent\textbreve E}
-\definecharacter ebreve           {\buildtextaccent\textbreve e}
-\definecharacter Gbreve           {\buildtextaccent\textbreve G}
-\definecharacter gbreve           {\buildtextaccent\textbreve g}
-\definecharacter Ibreve           {\buildtextaccent\textbreve \dotlessI}
-\definecharacter ibreve           {\buildtextaccent\textbreve \dotlessi}
-\definecharacter Obreve           {\buildtextaccent\textbreve O}
-\definecharacter obreve           {\buildtextaccent\textbreve o}
-\definecharacter Ubreve           {\buildtextaccent\textbreve U}
-\definecharacter ubreve           {\buildtextaccent\textbreve u}
-
-\definecharacter Ccaron           {\buildtextaccent\textcaron C}
-\definecharacter ccaron           {\buildtextaccent\textcaron c}
-\definecharacter Dcaron           {\buildtextaccent\textcaron D}
-\definecharacter dcaron           {\buildtextaccent\textcaron d}
-\definecharacter Ecaron           {\buildtextaccent\textcaron E}
-\definecharacter ecaron           {\buildtextaccent\textcaron e}
-\definecharacter Lcaron           {\buildtextaccent\textcaron L}
-\definecharacter lcaron           {\buildtextaccent\textcaron l}
-\definecharacter Ncaron           {\buildtextaccent\textcaron N}
-\definecharacter ncaron           {\buildtextaccent\textcaron n}
-\definecharacter Rcaron           {\buildtextaccent\textcaron R}
-\definecharacter rcaron           {\buildtextaccent\textcaron r}
-\definecharacter Scaron           {\buildtextaccent\textcaron S}
-\definecharacter scaron           {\buildtextaccent\textcaron s}
-\definecharacter Tcaron           {\buildtextaccent\textcaron T}
-\definecharacter tcaron           {\buildtextaccent\textcaron t}
-\definecharacter Ycaron           {\buildtextaccent\textcaron Y}
-\definecharacter ycaron           {\buildtextaccent\textcaron y}
-\definecharacter Zcaron           {\buildtextaccent\textcaron Z}
-\definecharacter zcaron           {\buildtextaccent\textcaron z}
-
-\definecharacter Lstroke          {\hsmash{\char32}L}
-\definecharacter lstroke          {\hsmash{\char32}l}
-\definecharacter Ostroke          {\char31 } % "1F
-\definecharacter ostroke          {\char28 } % "1C
-
-\definecharacter aumlaut          {\moveaccent{-.1ex}\adiaeresis}
-\definecharacter eumlaut          {\moveaccent{-.1ex}\ediaeresis}
-\definecharacter iumlaut          {\moveaccent{-.1ex}\idiaeresis}
-\definecharacter oumlaut          {\moveaccent{-.1ex}\odiaeresis}
-\definecharacter uumlaut          {\moveaccent{-.1ex}\udiaeresis}
-
-\definecharacter Aumlaut          {\smashaccent\Adiaeresis}
-\definecharacter Eumlaut          {\smashaccent\Ediaeresis}
-\definecharacter Iumlaut          {\smashaccent\Idiaeresis}
-\definecharacter Oumlaut          {\smashaccent\Odiaeresis}
-\definecharacter Uumlaut          {\smashaccent\Udiaeresis}
-
-\definecharacter scommaaccent     {\buildtextbottomcomma s}
-\definecharacter Scommaaccent     {\buildtextbottomcomma S}
-\definecharacter tcommaaccent     {\buildtextbottomcomma t}
-\definecharacter Tcommaaccent     {\buildtextbottomcomma T}
-\definecharacter lcommaaccent     {\buildtextbottomcomma l}
-\definecharacter Lcommaaccent     {\buildtextbottomcomma L}
-
-\definecharacter Etilde           {\buildtextaccent\texttilde E}
-\definecharacter etilde           {\buildtextaccent\texttilde e}
-
-\definecharacter Ahook               {A}
-\definecharacter ahook               {a}
-\definecharacter Ehook               {E}
-\definecharacter ehook               {e}
-\definecharacter Ihook               {I}
-\definecharacter ihook               {i}
-\definecharacter Ohook               {O}
-\definecharacter ohook               {o}
-\definecharacter Uhook               {U}
-\definecharacter uhook               {u}
-\definecharacter Yhook               {Y}
-\definecharacter yhook               {y}
-
-\definecharacter Acircumflexgrave    {\Acircumflex}
-\definecharacter Acircumflexacute    {\Acircumflex}
-\definecharacter Acircumflextilde    {\Acircumflex}
-\definecharacter Acircumflexhook     {\Acircumflex}
-\definecharacter acircumflexgrave    {\acircumflex}
-\definecharacter acircumflexacute    {\acircumflex}
-\definecharacter acircumflextilde    {\acircumflex}
-\definecharacter acircumflexhook     {\acircumflex}
-\definecharacter Ecircumflexgrave    {\Ecircumflex}
-\definecharacter Ecircumflexacute    {\Ecircumflex}
-\definecharacter Ecircumflextilde    {\Ecircumflex}
-\definecharacter Ecircumflexhook     {\Ecircumflex}
-\definecharacter ecircumflexgrave    {\ecircumflex}
-\definecharacter ecircumflexacute    {\ecircumflex}
-\definecharacter ecircumflextilde    {\ecircumflex}
-\definecharacter ecircumflexhook     {\ecircumflex}
-\definecharacter Ocircumflexgrave    {\Ocircumflex}
-\definecharacter Ocircumflexacute    {\Ocircumflex}
-\definecharacter Ocircumflextilde    {\Ocircumflex}
-\definecharacter Ocircumflexhook     {\Ocircumflex}
-\definecharacter ocircumflexgrave    {\ocircumflex}
-\definecharacter ocircumflexacute    {\ocircumflex}
-\definecharacter ocircumflextilde    {\ocircumflex}
-\definecharacter ocircumflexhook     {\ocircumflex}
-
-\definecharacter Abrevegrave         {\Abreve}
-\definecharacter Abreveacute         {\Abreve}
-\definecharacter Abrevetilde         {\Abreve}
-\definecharacter Abrevehook          {\Abreve}
-\definecharacter abrevegrave         {\abreve}
-\definecharacter abreveacute         {\abreve}
-\definecharacter abrevetilde         {\abreve}
-\definecharacter abrevehook          {\abreve}
-
-\definecharacter Adotbelow           {\buildtextbottomdot A}
-\definecharacter adotbelow           {\buildtextbottomdot a}
-\definecharacter Edotbelow           {\buildtextbottomdot E}
-\definecharacter edotbelow           {\buildtextbottomdot e}
-\definecharacter Idotbelow           {\buildtextbottomdot I}
-\definecharacter idotbelow           {\buildtextbottomdot i}
-\definecharacter Odotbelow           {\buildtextbottomdot O}
-\definecharacter odotbelow           {\buildtextbottomdot o}
-\definecharacter Udotbelow           {\buildtextbottomdot U}
-\definecharacter udotbelow           {\buildtextbottomdot u}
-\definecharacter Ydotbelow           {\buildtextbottomdot Y}
-\definecharacter ydotbelow           {\buildtextbottomdot y}
-
-\definecharacter Ohorndotbelow       {\buildtextbottomdot\Ohorn}
-\definecharacter ohorndotbelow       {\buildtextbottomdot\ohorn}
-\definecharacter Uhorndotbelow       {\buildtextbottomdot\Uhorn}
-\definecharacter uhorndotbelow       {\buildtextbottomdot\uhorn}
-
-\definecharacter Acircumflexdotbelow {\buildtextbottomdot\Acircumflex}
-\definecharacter acircumflexdotbelow {\buildtextbottomdot\acircumflex}
-\definecharacter Ecircumflexdotbelow {\buildtextbottomdot\Ecircumflex}
-\definecharacter ecircumflexdotbelow {\buildtextbottomdot\ecircumflex}
-\definecharacter Ocircumflexdotbelow {\buildtextbottomdot\Ocircumflex}
-\definecharacter ocircumflexdotbelow {\buildtextbottomdot\ocircumflex}
-\definecharacter Abrevedotbelow      {\buildtextbottomdot\Abreve}
-\definecharacter abrevedotbelow      {\buildtextbottomdot\abreve}
-
-\definecharacter Ohorn               {O}
-\definecharacter Ohorngrave          {\Ograve}
-\definecharacter Ohornacute          {\Oacute}
-\definecharacter Ohorntilde          {\Otilde}
-\definecharacter Ohornhook           {O}
-\definecharacter ohorn               {o}
-\definecharacter ohorngrave          {\ograve}
-\definecharacter ohornacute          {\oacute}
-\definecharacter ohorntilde          {\otilde}
-\definecharacter ohornhook           {o}
-\definecharacter Uhorn               {U}
-\definecharacter Uhorngrave          {\Ugrave}
-\definecharacter Uhornacute          {\Uacute}
-\definecharacter Uhorntilde          {\Utilde}
-\definecharacter Uhornhook           {U}
-\definecharacter uhorn               {u}
-\definecharacter uhorngrave          {\ugrave}
-\definecharacter uhornacute          {\uacute}
-\definecharacter uhorntilde          {\utilde}
-\definecharacter uhornhook           {u}
-
-\stopencoding
-
-%D Needed for transliterated chinese (provided by Tobias Burnus).
-
-\startencoding[default]
-
-\definecharacter acaron {\buildtextaccent\textcaron a}         % U+01CE
-\definecharacter icaron {\buildtextaccent\textcaron \dotlessi} % U+01D0
-\definecharacter ocaron {\buildtextaccent\textcaron o}         % U+01D2
-\definecharacter ucaron {\buildtextaccent\textcaron u}         % U+01D4
-
-\stopencoding
-
-%D Greek (moved to here):
-
-\startencoding[default]
-
-% Uppercase Greek letters
-
-\definecharacter greekAlpha   {\Alpha}
-\definecharacter greekBeta    {\Beta}
-\definecharacter greekGamma   {\Gamma}
-\definecharacter greekDelta   {\Delta}
-\definecharacter greekEpsilon {\Epsilon}
-\definecharacter greekZeta    {\Zeta}
-\definecharacter greekEta     {\Eta}
-\definecharacter greekTheta   {\Theta}
-\definecharacter greekIota    {\Iota}
-\definecharacter greekKappa   {\Kappa}
-\definecharacter greekLambda  {\Lambda}
-\definecharacter greekMu      {\Mu}
-\definecharacter greekNu      {\Nu}
-\definecharacter greekXi      {\Xi}
-\definecharacter greekOmicron {\Omicron}
-\definecharacter greekPi      {\Pi}
-\definecharacter greekRho     {\Rho}
-\definecharacter greekSigma   {\Sigma}
-\definecharacter greekTau     {\Tau}
-\definecharacter greekUpsilon {\Upsilon}
-\definecharacter greekPhi     {\Phi}
-\definecharacter greekChi     {\Chi}
-\definecharacter greekPsi     {\Psi}
-\definecharacter greekOmega   {\Omega}
-
-% Lowercase Greek letters
-
-\definecharacter greekalpha      {\alpha}
-\definecharacter greekbeta       {\beta}
-\definecharacter greekgamma      {\gamma}
-\definecharacter greekdelta      {\delta}
-\definecharacter greekepsilon    {\varepsilon}
-\definecharacter greekepsilonalt {\epsilon}
-\definecharacter greekzeta       {\zeta}
-\definecharacter greeketa        {\eta}
-\definecharacter greektheta      {\theta}
-\definecharacter greekthetaalt   {\vartheta}
-\definecharacter greekiota       {\iota}
-\definecharacter greekkappa      {\kappa}
-\definecharacter greeklambda     {\lambda}
-\definecharacter greekmu         {\mu}
-\definecharacter greeknu         {\nu}
-\definecharacter greekxi         {\xi}
-\definecharacter greekomicron    {\omicron}
-\definecharacter greekpi         {\pi}
-\definecharacter greekrho        {\rho}
-\definecharacter greeksigma      {\sigma}
-\definecharacter greekfinalsigma {\varsigma}
-\definecharacter greektau        {\tau}
-\definecharacter greekupsilon    {\upsilon}
-\definecharacter greekphi        {\varphi}
-\definecharacter greekphialt     {\phi}
-\definecharacter greekchi        {\chi}
-\definecharacter greekpsi        {\psi}
-\definecharacter greekomega      {\omega}
-
-% Accented Uppercase Greek letters
-
-\definecharacter greekAlphatonos       {'A}
-\definecharacter greekEpsilontonos     {'E}
-\definecharacter greekEtatonos         {'H}
-\definecharacter greekIotatonos        {'I}
-\definecharacter greekOmicrontonos     {'O}
-\definecharacter greekUpsilontonos     {'U}
-\definecharacter greekOmegatonos       {'W}
-\definecharacter greekIotadialytika    {"I}
-\definecharacter greekUpsilondialytika {"U}
-
-% Accented Lowercase Greek letters
-
-\definecharacter greekalphatonos            {'a}
-\definecharacter greekepsilontonos          {'e}
-\definecharacter greeketatonos              {'h}
-\definecharacter greekiotatonos             {'i}
-\definecharacter greekomicrontonos          {'o}
-\definecharacter greekupsilontonos          {'u}
-\definecharacter greekomegatonos            {'w}
-\definecharacter greekiotadialytika         {"i}
-\definecharacter greekupsilondialytika      {"u}
-\definecharacter greekiotadialytikatonos    {'"i}
-\definecharacter greekupsilondialytikatonos {'"u}
-
-% Miscellaneous Greek symbols
-
-\definecharacter greekleftquot       {((}
-\definecharacter greekrightquot      {))}
-\definecharacter greektonos          {'}
-\definecharacter greekdialytikatonos {'"}
-\definecharacter greekapostrophos    {''}
-
-\stopencoding
-
-%D Cyrillic (moved to here):
-
-\startencoding[default]
-
-\definecharacter cyrillicA      {A}
-\definecharacter cyrillicB      {B}
-\definecharacter cyrillicV      {V}
-\definecharacter cyrillicG      {G}
-\definecharacter cyrillicD      {D}
-\definecharacter cyrillicE      {E}
-\definecharacter cyrillicZH     {ZH}
-\definecharacter cyrillicZ      {Z}
-\definecharacter cyrillicI      {I}
-\definecharacter cyrillicISHRT  {ISHRT}
-\definecharacter cyrillicK      {K}
-\definecharacter cyrillicL      {L}
-\definecharacter cyrillicM      {M}
-\definecharacter cyrillicN      {N}
-\definecharacter cyrillicO      {O}
-\definecharacter cyrillicP      {P}
-\definecharacter cyrillicR      {R}
-\definecharacter cyrillicS      {S}
-\definecharacter cyrillicT      {T}
-\definecharacter cyrillicU      {U}
-\definecharacter cyrillicF      {F}
-\definecharacter cyrillicH      {H}
-\definecharacter cyrillicC      {C}
-\definecharacter cyrillicCH     {CH}
-\definecharacter cyrillicSH     {SH}
-\definecharacter cyrillicSHCH   {SHCH}
-\definecharacter cyrillicHRDSN  {HRDSN}
-\definecharacter cyrillicERY    {ERY}
-\definecharacter cyrillicSFTSN  {SFTSN}
-\definecharacter cyrillicEREV   {EREV}
-\definecharacter cyrillicYU     {YU}
-\definecharacter cyrillicYA     {YA}
-\definecharacter cyrillicGUP    {GUP}
-\definecharacter cyrillicGHCRS  {GHCRS}
-\definecharacter cyrillicDJE    {DJE}
-\definecharacter cyrillicTSHE   {TSHE}
-\definecharacter cyrillicSHHA   {SHHA}
-\definecharacter cyrillicZHDSC  {ZHDSC}
-\definecharacter cyrillicZDSC   {ZDSC}
-\definecharacter cyrillicLJE    {LJE}
-\definecharacter cyrillicYI     {YI}
-\definecharacter cyrillicKDSC   {KDSC}
-\definecharacter cyrillicKBEAK  {KBEAK}
-\definecharacter cyrillicKVCRS  {KVCRS}
-\definecharacter cyrillicAE     {AE}
-\definecharacter cyrillicNDSC   {NDSC}
-\definecharacter cyrillicNG     {NG}
-\definecharacter cyrillicDZE    {DZE}
-\definecharacter cyrillicOTLD   {OTLD}
-\definecharacter cyrillicSDSC   {SDSC}
-\definecharacter cyrillicUSHRT  {USHRT}
-\definecharacter cyrillicY      {Y}
-\definecharacter cyrillicYHCRS  {YHCRS}
-\definecharacter cyrillicHDSC   {HDSC}
-\definecharacter cyrillicDZHE   {DZHE}
-\definecharacter cyrillicCHVCRS {CHVCRS}
-\definecharacter cyrillicCHRDSC {CHRDSC}
-\definecharacter cyrillicIE     {IE}
-\definecharacter cyrillicSCHWA  {SCHWA}
-\definecharacter cyrillicNJE    {NJE}
-\definecharacter cyrillicYO     {YO}
-\definecharacter cyrillicII     {II}
-\definecharacter cyrillicJE     {JE}
-\definecharacter cyrillicQ      {Q}
-\definecharacter cyrillicW      {W}
-
-\definecharacter cyrillica      {a}
-\definecharacter cyrillicb      {b}
-\definecharacter cyrillicv      {v}
-\definecharacter cyrillicg      {g}
-\definecharacter cyrillicd      {d}
-\definecharacter cyrillice      {e}
-\definecharacter cyrilliczh     {zh}
-\definecharacter cyrillicz      {z}
-\definecharacter cyrillici      {i}
-\definecharacter cyrillicishrt  {ishrt}
-\definecharacter cyrillick      {k}
-\definecharacter cyrillicl      {l}
-\definecharacter cyrillicm      {m}
-\definecharacter cyrillicn      {n}
-\definecharacter cyrillico      {o}
-\definecharacter cyrillicp      {p}
-\definecharacter cyrillicr      {r}
-\definecharacter cyrillics      {s}
-\definecharacter cyrillict      {t}
-\definecharacter cyrillicu      {u}
-\definecharacter cyrillicf      {f}
-\definecharacter cyrillich      {h}
-\definecharacter cyrillicc      {c}
-\definecharacter cyrillicch     {ch}
-\definecharacter cyrillicsh     {sh}
-\definecharacter cyrillicshch   {shch}
-\definecharacter cyrillichrdsn  {hrdsn}
-\definecharacter cyrillicery    {ery}
-\definecharacter cyrillicsftsn  {sftsn}
-\definecharacter cyrillicerev   {erev}
-\definecharacter cyrillicyu     {yu}
-\definecharacter cyrillicya     {ya}
-\definecharacter cyrillicgup    {gup}
-\definecharacter cyrillicghcrs  {ghcrs}
-\definecharacter cyrillicdje    {dje}
-\definecharacter cyrillictshe   {tshe}
-\definecharacter cyrillicshha   {shha}
-\definecharacter cyrilliczhdsc  {zhdsc}
-\definecharacter cyrilliczdsc   {zdsc}
-\definecharacter cyrilliclje    {lje}
-\definecharacter cyrillicyi     {yi}
-\definecharacter cyrillickdsc   {kdsc}
-\definecharacter cyrillickbeak  {kbeak}
-\definecharacter cyrillickvcrs  {kvcrs}
-\definecharacter cyrillicae     {ae}
-\definecharacter cyrillicndsc   {ndsc}
-\definecharacter cyrillicng     {ng}
-\definecharacter cyrillicdze    {dze}
-\definecharacter cyrillicotld   {otld}
-\definecharacter cyrillicsdsc   {sdsc}
-\definecharacter cyrillicushrt  {ushrt}
-\definecharacter cyrillicy      {y}
-\definecharacter cyrillicyhcrs  {yhcrs}
-\definecharacter cyrillichdsc   {hdsc}
-\definecharacter cyrillicdzhe   {dzhe}
-\definecharacter cyrillicchvcrs {chvcrs}
-\definecharacter cyrillicchrdsc {chrdsc}
-\definecharacter cyrillicie     {ie}
-\definecharacter cyrillicschwa  {schwa}
-\definecharacter cyrillicnje    {nje}
-\definecharacter cyrillicyo     {yo}
-\definecharacter cyrillicii     {ii}
-\definecharacter cyrillicje     {je}
-\definecharacter cyrillicq      {q}
-\definecharacter cyrillicw      {w}
-
-\definecharacter cyrillicGJE      {\'\cyrillicG}
-\definecharacter cyrillicgje      {\'\cyrillicg}
-\definecharacter cyrillicKJE      {\'\cyrillicK}
-\definecharacter cyrillickje      {\'\cyrillick}
-
-\stopencoding
-
-\def\cyrillicio{\cyrillicyo}
-\def\cyrillicIO{\cyrillicYO}
-
-%D Hebrew:
-
-\startencoding[default]
-
-\definecharacter hebrewAlef       {'}
-\definecharacter hebrewBet        {b}
-\definecharacter hebrewGimel      {g}
-\definecharacter hebrewDalet      {d}
-\definecharacter hebrewHe         {h}
-\definecharacter hebrewVav        {w}
-\definecharacter hebrewZayin      {z}
-\definecharacter hebrewHet        {\hstroke}
-\definecharacter hebrewTet        {\tcedilla}
-\definecharacter hebrewYod        {y}
-\definecharacter hebrewKaffinal   {k}
-\definecharacter hebrewKaf        {k}
-\definecharacter hebrewLamed      {l}
-\definecharacter hebrewMemfinal   {m}
-\definecharacter hebrewMem        {m}
-\definecharacter hebrewNunfinal   {n}
-\definecharacter hebrewNun        {n}
-\definecharacter hebrewSamekh     {s}
-\definecharacter hebrewAyin       {\gdotaccent}
-\definecharacter hebrewPefinal    {p}
-\definecharacter hebrewPe         {p}
-\definecharacter hebrewTsadifinal {\scedilla}
-\definecharacter hebrewTsadi      {\scedilla}
-\definecharacter hebrewQof        {q}
-\definecharacter hebrewResh       {r}
-\definecharacter hebrewShin       {\scaron}
-\definecharacter hebrewTav        {th}
-
-\stopencoding
-
-%D A few goodies:
-
-\def\eszett{\ssharp}
-\def\Eszett{\Ssharp}
-
-\def\lslash{\lstroke}
-\def\Lslash{\Lstroke}
-\def\dslash{\dstroke}
-\def\Dslash{\Dstroke}
-\def\oslash{\ostroke}
-\def\Oslash{\Ostroke}
-
-\def\dcroat{\dstroke}
-\def\Dcroat{\Dstroke}
-
-% \startencoding [default]
-%
-% \definecharacter scommaaccent {\scedilla}
-% \definecharacter Scommaaccent {\Scedilla}
-% \definecharacter tcommaaccent {\tcedilla}
-% \definecharacter Tcommaaccent {\Tcedilla}
-%
-% \stopencoding
-
-% for plain tex's sake
-
-\def\S       {\sectionmark  }
-\def\P       {\paragraphmark}
-
-% for latex users sake
-
-\def\textS   {\sectionmark  }
-\def\textP   {\paragraphmark}
-
-% for old times sake
-
-\def\florin  {\textflorin  }  \def\florijn{\textflorin}
-\def\dollar  {\textdollar  }
-\def\pound   {\textsterling}
-\def\sterling{\textsterling}
-
-% idem
-
-\def\promille{\perthousand}
-\def\permille{\perthousand}
-\def\procent {\percent }
-\def\permine {\fakepermine}
-
-% some more
-
-\def\hyphen            {\softhyphen}
-\def\cwm               {\compoundwordmark}
-\def\nonbreakinghyphen {\hyphen}
-\def\breakinghyphen    {\hyphen\prewordbreak}
-
-% quotes
-
-\def\lowerleftsingleninequote  {\quotesinglebase}
-\def\lowerleftdoubleninequote  {\quotedblbase}
-\def\lowerrightsingleninequote {\quotesinglebase}
-\def\lowerrightdoubleninequote {\quotedblbase}
-
-\def\upperleftsingleninequote  {\quoteright}
-\def\upperleftdoubleninequote  {\quotedblright}
-\def\upperrightsingleninequote {\quoteright}
-\def\upperrightdoubleninequote {\quotedblright}
-
-\def\upperleftsinglesixquote   {\quoteleft}
-\def\upperleftdoublesixquote   {\quotedblleft}
-\def\upperrightsinglesixquote  {\quoteleft}
-\def\upperrightdoublesixquote  {\quotedblleft}
-
-\def\leftsubguillemot          {\guilsingleleft}
-\def\rightsubguillemot         {\guilsingleright}
-
-%D A couple of fallbacks suggestion by users, slightly
-%D adapted and obscured by memory saving hacks.
-
-\unprotect
-
-\startencoding[default]
-
-\definecharacter textcent        {c\rlap{\hskip-.2\s!em
-  \vrule\!!width.2\s!pt\!!height1.2\s!ex\!!depth.2\s!ex}}
-
-\definecharacter texteuro        {C\rlap{\hskip-.75\s!em
-  \vrule\!!width.4\s!em\!!height.85\s!ex\!!depth-.8\s!ex}}
-
-\definecharacter textblacksquare {\dontleavehmode\hbox{%
-  \vrule\!!width.3\s!em\!!height.4\s!em\!!depth-.1\s!em}}
-
-\definecharacter textbrokenbar   {\dontleavehmode\hbox{\kern.05\s!em
-  \vrule\!!width.4\s!pt\!!height1.8\s!ex\!!depth-.85\s!ex
-                                  \llap{%
-  \vrule\!!width.4\s!pt\!!height.35\s!ex\!!depth.6\s!ex}%
-                                  \kern.05\s!em}}
-
-\stopencoding
-
-\protect
-
-%D We also use symbolic names for math accents.
-
-\startencoding[default]
-
-\definecharacter mathacute      "7013
-\definecharacter mathgrave      "7012
-\definecharacter mathddot       "707F
-\definecharacter mathtilde      "707E
-\definecharacter mathbar        "7016
-\definecharacter mathbreve      "7015
-\definecharacter mathcheck      "7014
-\definecharacter mathhat        "705E
-\definecharacter mathvec        "017E
-\definecharacter mathdot        "705F
-\definecharacter mathwidetilde  "0365
-\definecharacter mathwidehat    "0362
-
-\stopencoding
-
-% \startencoding [default]
-
-% \definecommand prime       {\mathematics{'}}
-% \definecommand doubleprime {\mathematics{''}}
-% \definecommand tripleprime {\mathematics{'''}}
-
-% \stopencoding
-
-\ifx\zdot\undefined \def\zdot{\zdotaccent} \fi
-\ifx\Zdot\undefined \def\Zdot{\Zdotaccent} \fi
-
-\ifx\greeklamda\undefined \def\greeklamda{\greeklambda} \fi
-\ifx\greekLamda\undefined \def\greekLamda{\greekLambda} \fi
-
-\ifx\leftguillemet \undefined \def\leftguillemet {\leftguillemot } \fi
-\ifx\rightguillemet\undefined \def\rightguillemet{\rightguillemot} \fi
-
-%D New:
-
-\startencoding[\s!default]
-
-\definecharacter schwa      {\hbox{\rotate[\c!rotation=180,\c!location=\v!high]{\hbox{e}}}}
-\definecharacter schwagrave {\buildtextgrave\schwa}
-
-\stopencoding
-
-%D Also new, from Taco, for Mojca, who wanted another 8~regimes.
-
-\startencoding[\s!default]
-
-\definecharacter texthorizontalbar {{\endash\kern\zeropoint\endash}}
-\definecharacter textdong          {\underbar{\dstroke}}
-
-\stopencoding
-
-%D Goodie (makes more sense):
-
-\def\normalcontrolspace
-  {\getglyph{ComputerModernMono}{\char32}}
-
-\def\fakedcontrolspace % can be virtual in luatex
-  {\dontleavehmode\hbox
-     {\scratchdimen.1ex%
-      \kern\scratchdimen
-      \vrule \!!width\scratchdimen \!!height5.5\scratchdimen \!!depth3\scratchdimen
-      \vrule \!!width\dimexpr.5em-4\scratchdimen\relax \!!height-2\scratchdimen \!!depth3\scratchdimen
-      \vrule \!!width\scratchdimen \!!height5.5\scratchdimen \!!depth3\scratchdimen
-      \kern\scratchdimen}}
-
-\def\fakecontrolspace{\let\normalcontrolspace\fakedcontrolspace}
-
-\endinput
diff --git a/tex/context/base/enco-ec.mkii b/tex/context/base/enco-ec.mkii
new file mode 100644
index 000000000..1ac41cadf
--- /dev/null
+++ b/tex/context/base/enco-ec.mkii
@@ -0,0 +1,295 @@
+%D \module
+%D   [     file=enco-ec,
+%D      version=2000.05.07, % 1999.16.07,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=\LATEX\ EC Encoding,
+%D       author={Patrick Gundlach, Hans Hagen, Taco Hoekwater, Mojca Miklavec},
+%D         date=\currentdate,
+%D    copyright=PRAGMA-ADE]
+%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 is \LATEX2e's T1 encoding vector. All standard \LATEX\
+%D accents will work, including \type{\k}. The only accent that
+%D does not work is \type{\t} (there is no tie in T1 encoding).
+%D
+%D Annoyingly, most \POSTSCRIPT\ fonts do not have \type
+%D {\dotlessj}, and T1 encoding does not make the various
+%D prebuilts with \type {j} available. When this is the case:
+%D
+%D \starttyping
+%D \startencoding[ec]
+%D \definecharacter dotlessj {j}
+%D \stopencoding
+%D \stoptyping
+%D
+%D is a way out.
+
+%D There is hardly a point in supporting TS1 encoding.
+
+\startmapping[ec]
+
+% a problem is that the uppercase of dstroke (158) and eth (240)
+% is the same glyph (208) so we cannot do lowercase mapping there
+
+\definecasemaps 128 to 156 lc +32 uc   0
+\definecasemap  157 `i  157               % Idotaccent i
+\definecasemap  158 158 208               % dstroke Eth
+\definecasemap  159 159 159               % sectionmark
+\definecasemaps 160 to 187 lc   0 uc -32
+\resetcaserange 189 to 191                % exclamdown, questiondown, textsterling
+\definecasemaps 192 to 223 lc +32 uc   0
+\definecasemaps 224 to 254 lc   0 uc -32
+\definecaseswap 255 223                   % ssharp (else patterns fail)
+\definecaseswap  25 `I                    % dotless i
+
+% 156 vs. 188 IJligature
+
+%D Some languages need this:
+
+% \definecaseself 34 % quotedbl
+% \definecaseself 18 % quotedblbase
+% \definecaseself 16 % quotedblleft
+% \definecaseself 17 % quotedblright
+% \definecaseself 39 % quotesingle
+% \definecaseself 13 % quotesinglebase
+% \definecaseself 96 % quoteleft
+% \definecaseself 39 % quoteright
+
+%D So far for the mapping.
+
+%D The following characters are kind of dangerous,
+%D that is, they are normally not part of fonts, unless
+%D explicitly constructed.
+%D
+%D \startitemize[columns,two]
+%D \item \type{\dotlessj} - but then it may not be defined!!!!
+%D \item \type{\IJligature}
+%D \item \type{\ijligature}
+%D \item \type{\Ssharp}
+%D \item \type{\perthousand}
+%D \item \type{\compoundwordmark}
+%  \item \type{\textvisiblespace}
+%D \stopitemize
+
+%D So, for the moment we nil them; we can always create
+%D another vector if needed.
+
+\stopmapping
+
+\startencoding[ec][ec] % second arg defines auto regime, needed here ?
+
+\definecharacter textgrave         0
+\definecharacter textacute         1
+\definecharacter textcircumflex    2
+\definecharacter texttilde         3
+\definecharacter textdiaeresis     4
+\definecharacter texthungarumlaut  5
+\definecharacter textring          6
+\definecharacter textcaron         7
+\definecharacter textbreve         8
+\definecharacter textmacron        9
+\definecharacter textdotaccent    10
+\definecharacter textcedilla      11
+\definecharacter textogonek       12
+\definecharacter quotesinglebase  13
+\definecharacter guilsingleleft   14
+\definecharacter guilsingleright  15
+\definecharacter quotedblleft     16
+\definecharacter quotedblright    17
+\definecharacter quotedblbase     18
+\definecharacter leftguillemot    19
+\definecharacter rightguillemot   20
+\definecharacter endash           21
+\definecharacter emdash           22
+%definecharacter compoundwordmark 23
+%definecharacter perthousand      24
+\definecharacter dotlessi         25 % or when missing: {j}
+\definecharacter dotlessj         26
+% ff                              27
+% fi                              28
+% fl                              29
+% ffi                             30
+% ffl                             31
+%definecharacter textvisiblespace 32
+% exclam         !                33
+\definecharacter quotedbl         34
+% numbersign     #                35
+% dollar         $                36
+\definecharacter percent          37
+% ampersand      &                38
+%definecharacter quotesingle      39 % fake 'm TODO:enco-def!!!!
+\definecharacter quoteright       39
+% parenleft      (                40
+% parenright     )                41
+% asterisk       *                42
+% plus           +                43
+% comma          ,                44
+\definecharacter softhyphen       45
+% period         .                46
+% slash          /                47
+% 0-9                          48-57
+% colon          :                58
+% semicolon      ;                59
+% less           <                60
+% equal          =                61
+% greater        >                62
+% question       ?                63
+% at             @                64
+% A-Z                          65-90
+% bracketleft    [                91
+\definecharacter textbackslash    92
+% bracketright   ]                93
+\definecharacter textasciicircum  94
+\definecharacter textunderscore   95
+\definecharacter quoteleft        96
+% a-z                         97-122
+\definecharacter textbraceleft   123
+\definecharacter textbraceright  125
+\definecharacter textasciitilde  126
+%definecharacter softhyphen      127 % -> 45 (127 often undefined)
+\definecharacter Abreve          128 % abreve          160
+\definecharacter Aogonek         129 % aogonek         161
+\definecharacter Cacute          130 % cacute          162
+\definecharacter Ccaron          131 % ccaron          163
+\definecharacter Dcaron          132 % dcaron          164
+\definecharacter Ecaron          133 % ecaron          165
+\definecharacter Eogonek         134 % eogonek         166
+\definecharacter Gbreve          135 % gbreve          167
+\definecharacter Lacute          136 % lacute          168
+\definecharacter Lcaron          137 % lcaron          169
+\definecharacter Lstroke         138 % lstroke         170
+\definecharacter Nacute          139 % nacute          171
+\definecharacter Ncaron          140 % ncaron          172
+\definecharacter Eng             141 % eng             173
+\definecharacter Neng            141 % Neng            173
+\definecharacter Ohungarumlaut   142 % ohungarumlaut   174
+\definecharacter Racute          143 % racute          175
+\definecharacter Rcaron          144 % rcaron          176
+\definecharacter Sacute          145 % sacute          177
+\definecharacter Scaron          146 % scaron          178
+\definecharacter Scedilla        147 % scedilla        179
+\definecharacter Tcaron          148 % tcaron          180
+\definecharacter Tcedilla        149 % tcedilla        181
+\definecharacter Uhungarumlaut   150 % uhungarumlaut   182
+\definecharacter Uring           151 % uring           183
+\definecharacter Ydiaeresis      152 % ydiaeresis      184
+\definecharacter Zacute          153 % zacute          185
+\definecharacter Zcaron          154 % zcaron          186
+\definecharacter Zdotaccent      155 % zdotaccent      187
+\definecharacter IJligature      156 % ijligature      188
+\definecharacter Idotaccent      157
+\definecharacter dstroke         158 % Dstroke         208
+\definecharacter sectionmark     159
+\definecharacter abreve          160 % Abreve          128
+\definecharacter aogonek         161 % Aogonek         129
+\definecharacter cacute          162 % Cacute          130
+\definecharacter ccaron          163 % Ccaron          131
+\definecharacter dcaron          164 % Dcaron          132
+\definecharacter ecaron          165 % Ecaron          133
+\definecharacter eogonek         166 % Eogonek         134
+\definecharacter gbreve          167 % Gbreve          135
+\definecharacter lacute          168 % Lacute          136
+\definecharacter lcaron          169 % Lcaron          137
+\definecharacter lstroke         170 % Lstroke         138
+\definecharacter nacute          171 % Nacute          139
+\definecharacter ncaron          172 % Ncaron          140
+\definecharacter eng             173 % Eng             141
+\definecharacter ohungarumlaut   174 % Ohungarumlaut   142
+\definecharacter racute          175 % Racute          143
+\definecharacter rcaron          176 % Rcaron          144
+\definecharacter sacute          177 % Sacute          145
+\definecharacter scaron          178 % Scaron          146
+\definecharacter scedilla        179 % Scedilla        147
+\definecharacter tcaron          180 % Tcaron          148
+\definecharacter tcedilla        181 % Tcedilla        149
+\definecharacter uhungarumlaut   182 % Uhungarumlaut   150
+\definecharacter uring           183 % Uring           151
+\definecharacter ydiaeresis      184 % Ydiaeresis      152
+\definecharacter zacute          185 % Zacute          153
+\definecharacter zcaron          186 % Zcaron          154
+\definecharacter zdotaccent      187 % Zdotaccent      155
+\definecharacter ijligature      188 % IJligature      156
+\definecharacter exclamdown      189
+\definecharacter questiondown    190
+\definecharacter textsterling    191
+\definecharacter Agrave          192 % agrave          224
+\definecharacter Aacute          193 % aacute          225
+\definecharacter Acircumflex     194 % acircumflex     226
+\definecharacter Atilde          195 % atilde          227
+\definecharacter Adiaeresis      196 % adiaeresis      228
+\definecharacter Aring           197 % aring           229
+\definecharacter AEligature      198 % aeligature      230
+\definecharacter Ccedilla        199 % ccedilla        231
+\definecharacter Egrave          200 % egrave          232
+\definecharacter Eacute          201 % eacute          233
+\definecharacter Ecircumflex     202 % ecircumflex     234
+\definecharacter Ediaeresis      203 % ediaeresis      235
+\definecharacter Igrave          204 % igrave          236
+\definecharacter Iacute          205 % iacute          237
+\definecharacter Icircumflex     206 % icircumflex     238
+\definecharacter Idiaeresis      207 % idiaeresis      239
+\definecharacter Eth             208 % eth             240
+\definecharacter Dstroke         208 % dstroke         158
+\definecharacter Ntilde          209 % ntilde          241
+\definecharacter Ograve          210 % ograve          242
+\definecharacter Oacute          211 % oacute          243
+\definecharacter Ocircumflex     212 % ocircumflex     244
+\definecharacter Otilde          213 % otilde          245
+\definecharacter Odiaeresis      214 % odiaeresis      246
+\definecharacter OEligature      215 % oeligature      247
+\definecharacter Ostroke         216 % ostroke         248
+\definecharacter Ugrave          217 % ugrave          249
+\definecharacter Uacute          218 % uacute          250
+\definecharacter Ucircumflex     219 % ucircumflex     251
+\definecharacter Udiaeresis      220 % udiaeresis      252
+\definecharacter Yacute          221 % yacute          253
+\definecharacter Thorn           222 % thorn           254
+\definecharacter Ssharp          223 % ssharp          255
+\definecharacter agrave          224 % Agrave          192
+\definecharacter aacute          225 % Aacute          193
+\definecharacter acircumflex     226 % Acircumflex     194
+\definecharacter atilde          227 % Atilde          195
+\definecharacter adiaeresis      228 % Adiaeresis      196
+\definecharacter aring           229 % Aring           197
+\definecharacter aeligature      230 % AEligature      198
+\definecharacter ccedilla        231 % Ccedilla        199
+\definecharacter egrave          232 % Egrave          200
+\definecharacter eacute          233 % Eacute          201
+\definecharacter ecircumflex     234 % Ecircumflex     202
+\definecharacter ediaeresis      235 % Ediaeresis      203
+\definecharacter igrave          236 % Igrave          204
+\definecharacter iacute          237 % Iacute          205
+\definecharacter icircumflex     238 % Icircumflex     206
+\definecharacter idiaeresis      239 % Idiaeresis      207
+\definecharacter eth             240 % Eth             208
+\definecharacter ntilde          241 % Ntilde          209
+\definecharacter ograve          242 % Ograve          210
+\definecharacter oacute          243 % Oacute          211
+\definecharacter ocircumflex     244 % Ocircumflex     212
+\definecharacter otilde          245 % Otilde          213
+\definecharacter odiaeresis      246 % Odiaeresis      214
+\definecharacter oeligature      247 % OEligature      215
+\definecharacter ostroke         248 % Ostroke         216
+\definecharacter ugrave          249 % Ugrave          217
+\definecharacter uacute          250 % Uacute          218
+\definecharacter ucircumflex     251 % Ucircumflex     219
+\definecharacter udiaeresis      252 % Udiaeresis      220
+\definecharacter yacute          253 % Yacute          221
+\definecharacter thorn           254 % Thorn           222
+\definecharacter ssharp          255 % Ssharp          223
+
+\stopencoding
+
+\startencoding[ec]
+
+\definecharacter Scommaaccent {\Scedilla}
+\definecharacter scommaaccent {\scedilla}
+\definecharacter Tcommaaccent {\Tcedilla}
+\definecharacter tcommaaccent {\tcedilla}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-ec.tex b/tex/context/base/enco-ec.tex
deleted file mode 100644
index 1ac41cadf..000000000
--- a/tex/context/base/enco-ec.tex
+++ /dev/null
@@ -1,295 +0,0 @@
-%D \module
-%D   [     file=enco-ec,
-%D      version=2000.05.07, % 1999.16.07,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=\LATEX\ EC Encoding,
-%D       author={Patrick Gundlach, Hans Hagen, Taco Hoekwater, Mojca Miklavec},
-%D         date=\currentdate,
-%D    copyright=PRAGMA-ADE]
-%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 is \LATEX2e's T1 encoding vector. All standard \LATEX\
-%D accents will work, including \type{\k}. The only accent that
-%D does not work is \type{\t} (there is no tie in T1 encoding).
-%D
-%D Annoyingly, most \POSTSCRIPT\ fonts do not have \type
-%D {\dotlessj}, and T1 encoding does not make the various
-%D prebuilts with \type {j} available. When this is the case:
-%D
-%D \starttyping
-%D \startencoding[ec]
-%D \definecharacter dotlessj {j}
-%D \stopencoding
-%D \stoptyping
-%D
-%D is a way out.
-
-%D There is hardly a point in supporting TS1 encoding.
-
-\startmapping[ec]
-
-% a problem is that the uppercase of dstroke (158) and eth (240)
-% is the same glyph (208) so we cannot do lowercase mapping there
-
-\definecasemaps 128 to 156 lc +32 uc   0
-\definecasemap  157 `i  157               % Idotaccent i
-\definecasemap  158 158 208               % dstroke Eth
-\definecasemap  159 159 159               % sectionmark
-\definecasemaps 160 to 187 lc   0 uc -32
-\resetcaserange 189 to 191                % exclamdown, questiondown, textsterling
-\definecasemaps 192 to 223 lc +32 uc   0
-\definecasemaps 224 to 254 lc   0 uc -32
-\definecaseswap 255 223                   % ssharp (else patterns fail)
-\definecaseswap  25 `I                    % dotless i
-
-% 156 vs. 188 IJligature
-
-%D Some languages need this:
-
-% \definecaseself 34 % quotedbl
-% \definecaseself 18 % quotedblbase
-% \definecaseself 16 % quotedblleft
-% \definecaseself 17 % quotedblright
-% \definecaseself 39 % quotesingle
-% \definecaseself 13 % quotesinglebase
-% \definecaseself 96 % quoteleft
-% \definecaseself 39 % quoteright
-
-%D So far for the mapping.
-
-%D The following characters are kind of dangerous,
-%D that is, they are normally not part of fonts, unless
-%D explicitly constructed.
-%D
-%D \startitemize[columns,two]
-%D \item \type{\dotlessj} - but then it may not be defined!!!!
-%D \item \type{\IJligature}
-%D \item \type{\ijligature}
-%D \item \type{\Ssharp}
-%D \item \type{\perthousand}
-%D \item \type{\compoundwordmark}
-%  \item \type{\textvisiblespace}
-%D \stopitemize
-
-%D So, for the moment we nil them; we can always create
-%D another vector if needed.
-
-\stopmapping
-
-\startencoding[ec][ec] % second arg defines auto regime, needed here ?
-
-\definecharacter textgrave         0
-\definecharacter textacute         1
-\definecharacter textcircumflex    2
-\definecharacter texttilde         3
-\definecharacter textdiaeresis     4
-\definecharacter texthungarumlaut  5
-\definecharacter textring          6
-\definecharacter textcaron         7
-\definecharacter textbreve         8
-\definecharacter textmacron        9
-\definecharacter textdotaccent    10
-\definecharacter textcedilla      11
-\definecharacter textogonek       12
-\definecharacter quotesinglebase  13
-\definecharacter guilsingleleft   14
-\definecharacter guilsingleright  15
-\definecharacter quotedblleft     16
-\definecharacter quotedblright    17
-\definecharacter quotedblbase     18
-\definecharacter leftguillemot    19
-\definecharacter rightguillemot   20
-\definecharacter endash           21
-\definecharacter emdash           22
-%definecharacter compoundwordmark 23
-%definecharacter perthousand      24
-\definecharacter dotlessi         25 % or when missing: {j}
-\definecharacter dotlessj         26
-% ff                              27
-% fi                              28
-% fl                              29
-% ffi                             30
-% ffl                             31
-%definecharacter textvisiblespace 32
-% exclam         !                33
-\definecharacter quotedbl         34
-% numbersign     #                35
-% dollar         $                36
-\definecharacter percent          37
-% ampersand      &                38
-%definecharacter quotesingle      39 % fake 'm TODO:enco-def!!!!
-\definecharacter quoteright       39
-% parenleft      (                40
-% parenright     )                41
-% asterisk       *                42
-% plus           +                43
-% comma          ,                44
-\definecharacter softhyphen       45
-% period         .                46
-% slash          /                47
-% 0-9                          48-57
-% colon          :                58
-% semicolon      ;                59
-% less           <                60
-% equal          =                61
-% greater        >                62
-% question       ?                63
-% at             @                64
-% A-Z                          65-90
-% bracketleft    [                91
-\definecharacter textbackslash    92
-% bracketright   ]                93
-\definecharacter textasciicircum  94
-\definecharacter textunderscore   95
-\definecharacter quoteleft        96
-% a-z                         97-122
-\definecharacter textbraceleft   123
-\definecharacter textbraceright  125
-\definecharacter textasciitilde  126
-%definecharacter softhyphen      127 % -> 45 (127 often undefined)
-\definecharacter Abreve          128 % abreve          160
-\definecharacter Aogonek         129 % aogonek         161
-\definecharacter Cacute          130 % cacute          162
-\definecharacter Ccaron          131 % ccaron          163
-\definecharacter Dcaron          132 % dcaron          164
-\definecharacter Ecaron          133 % ecaron          165
-\definecharacter Eogonek         134 % eogonek         166
-\definecharacter Gbreve          135 % gbreve          167
-\definecharacter Lacute          136 % lacute          168
-\definecharacter Lcaron          137 % lcaron          169
-\definecharacter Lstroke         138 % lstroke         170
-\definecharacter Nacute          139 % nacute          171
-\definecharacter Ncaron          140 % ncaron          172
-\definecharacter Eng             141 % eng             173
-\definecharacter Neng            141 % Neng            173
-\definecharacter Ohungarumlaut   142 % ohungarumlaut   174
-\definecharacter Racute          143 % racute          175
-\definecharacter Rcaron          144 % rcaron          176
-\definecharacter Sacute          145 % sacute          177
-\definecharacter Scaron          146 % scaron          178
-\definecharacter Scedilla        147 % scedilla        179
-\definecharacter Tcaron          148 % tcaron          180
-\definecharacter Tcedilla        149 % tcedilla        181
-\definecharacter Uhungarumlaut   150 % uhungarumlaut   182
-\definecharacter Uring           151 % uring           183
-\definecharacter Ydiaeresis      152 % ydiaeresis      184
-\definecharacter Zacute          153 % zacute          185
-\definecharacter Zcaron          154 % zcaron          186
-\definecharacter Zdotaccent      155 % zdotaccent      187
-\definecharacter IJligature      156 % ijligature      188
-\definecharacter Idotaccent      157
-\definecharacter dstroke         158 % Dstroke         208
-\definecharacter sectionmark     159
-\definecharacter abreve          160 % Abreve          128
-\definecharacter aogonek         161 % Aogonek         129
-\definecharacter cacute          162 % Cacute          130
-\definecharacter ccaron          163 % Ccaron          131
-\definecharacter dcaron          164 % Dcaron          132
-\definecharacter ecaron          165 % Ecaron          133
-\definecharacter eogonek         166 % Eogonek         134
-\definecharacter gbreve          167 % Gbreve          135
-\definecharacter lacute          168 % Lacute          136
-\definecharacter lcaron          169 % Lcaron          137
-\definecharacter lstroke         170 % Lstroke         138
-\definecharacter nacute          171 % Nacute          139
-\definecharacter ncaron          172 % Ncaron          140
-\definecharacter eng             173 % Eng             141
-\definecharacter ohungarumlaut   174 % Ohungarumlaut   142
-\definecharacter racute          175 % Racute          143
-\definecharacter rcaron          176 % Rcaron          144
-\definecharacter sacute          177 % Sacute          145
-\definecharacter scaron          178 % Scaron          146
-\definecharacter scedilla        179 % Scedilla        147
-\definecharacter tcaron          180 % Tcaron          148
-\definecharacter tcedilla        181 % Tcedilla        149
-\definecharacter uhungarumlaut   182 % Uhungarumlaut   150
-\definecharacter uring           183 % Uring           151
-\definecharacter ydiaeresis      184 % Ydiaeresis      152
-\definecharacter zacute          185 % Zacute          153
-\definecharacter zcaron          186 % Zcaron          154
-\definecharacter zdotaccent      187 % Zdotaccent      155
-\definecharacter ijligature      188 % IJligature      156
-\definecharacter exclamdown      189
-\definecharacter questiondown    190
-\definecharacter textsterling    191
-\definecharacter Agrave          192 % agrave          224
-\definecharacter Aacute          193 % aacute          225
-\definecharacter Acircumflex     194 % acircumflex     226
-\definecharacter Atilde          195 % atilde          227
-\definecharacter Adiaeresis      196 % adiaeresis      228
-\definecharacter Aring           197 % aring           229
-\definecharacter AEligature      198 % aeligature      230
-\definecharacter Ccedilla        199 % ccedilla        231
-\definecharacter Egrave          200 % egrave          232
-\definecharacter Eacute          201 % eacute          233
-\definecharacter Ecircumflex     202 % ecircumflex     234
-\definecharacter Ediaeresis      203 % ediaeresis      235
-\definecharacter Igrave          204 % igrave          236
-\definecharacter Iacute          205 % iacute          237
-\definecharacter Icircumflex     206 % icircumflex     238
-\definecharacter Idiaeresis      207 % idiaeresis      239
-\definecharacter Eth             208 % eth             240
-\definecharacter Dstroke         208 % dstroke         158
-\definecharacter Ntilde          209 % ntilde          241
-\definecharacter Ograve          210 % ograve          242
-\definecharacter Oacute          211 % oacute          243
-\definecharacter Ocircumflex     212 % ocircumflex     244
-\definecharacter Otilde          213 % otilde          245
-\definecharacter Odiaeresis      214 % odiaeresis      246
-\definecharacter OEligature      215 % oeligature      247
-\definecharacter Ostroke         216 % ostroke         248
-\definecharacter Ugrave          217 % ugrave          249
-\definecharacter Uacute          218 % uacute          250
-\definecharacter Ucircumflex     219 % ucircumflex     251
-\definecharacter Udiaeresis      220 % udiaeresis      252
-\definecharacter Yacute          221 % yacute          253
-\definecharacter Thorn           222 % thorn           254
-\definecharacter Ssharp          223 % ssharp          255
-\definecharacter agrave          224 % Agrave          192
-\definecharacter aacute          225 % Aacute          193
-\definecharacter acircumflex     226 % Acircumflex     194
-\definecharacter atilde          227 % Atilde          195
-\definecharacter adiaeresis      228 % Adiaeresis      196
-\definecharacter aring           229 % Aring           197
-\definecharacter aeligature      230 % AEligature      198
-\definecharacter ccedilla        231 % Ccedilla        199
-\definecharacter egrave          232 % Egrave          200
-\definecharacter eacute          233 % Eacute          201
-\definecharacter ecircumflex     234 % Ecircumflex     202
-\definecharacter ediaeresis      235 % Ediaeresis      203
-\definecharacter igrave          236 % Igrave          204
-\definecharacter iacute          237 % Iacute          205
-\definecharacter icircumflex     238 % Icircumflex     206
-\definecharacter idiaeresis      239 % Idiaeresis      207
-\definecharacter eth             240 % Eth             208
-\definecharacter ntilde          241 % Ntilde          209
-\definecharacter ograve          242 % Ograve          210
-\definecharacter oacute          243 % Oacute          211
-\definecharacter ocircumflex     244 % Ocircumflex     212
-\definecharacter otilde          245 % Otilde          213
-\definecharacter odiaeresis      246 % Odiaeresis      214
-\definecharacter oeligature      247 % OEligature      215
-\definecharacter ostroke         248 % Ostroke         216
-\definecharacter ugrave          249 % Ugrave          217
-\definecharacter uacute          250 % Uacute          218
-\definecharacter ucircumflex     251 % Ucircumflex     219
-\definecharacter udiaeresis      252 % Udiaeresis      220
-\definecharacter yacute          253 % Yacute          221
-\definecharacter thorn           254 % Thorn           222
-\definecharacter ssharp          255 % Ssharp          223
-
-\stopencoding
-
-\startencoding[ec]
-
-\definecharacter Scommaaccent {\Scedilla}
-\definecharacter scommaaccent {\scedilla}
-\definecharacter Tcommaaccent {\Tcedilla}
-\definecharacter tcommaaccent {\tcedilla}
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-ecm.mkii b/tex/context/base/enco-ecm.mkii
new file mode 100644
index 000000000..b74473960
--- /dev/null
+++ b/tex/context/base/enco-ecm.mkii
@@ -0,0 +1,33 @@
+%D \module
+%D   [     file=enco-ec,
+%D      version=2000.05.07, 
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Glyphs that may not be present in EC,  
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=PRAGMA-ADE]
+%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 The next typescript removes a few problematic characters 
+%D from the ec encoding vector. So, in case of troubles, say
+%D
+%D \starttyping
+%D \useencoding[ecm] % ec minus 
+%D \stoptyping 
+
+\startencoding[ec][ec]
+
+\definecharacter ijligature {ij}
+\definecharacter IJligature {IJ}
+\definecharacter Ssharp     {SS}
+\definecharacter tcaron     {\buildtextaccent\textcaron t}
+\definecharacter Tcedilla   {\buildtextcedilla T}
+\definecharacter tcedilla   {\buildtextcedilla t}
+\definecharacter ydiaeresis {\buildtextaccent\textdiaeresis y}
+
+\stopencoding
+
+\endinput 
diff --git a/tex/context/base/enco-ecm.tex b/tex/context/base/enco-ecm.tex
deleted file mode 100644
index b74473960..000000000
--- a/tex/context/base/enco-ecm.tex
+++ /dev/null
@@ -1,33 +0,0 @@
-%D \module
-%D   [     file=enco-ec,
-%D      version=2000.05.07, 
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Glyphs that may not be present in EC,  
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=PRAGMA-ADE]
-%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 The next typescript removes a few problematic characters 
-%D from the ec encoding vector. So, in case of troubles, say
-%D
-%D \starttyping
-%D \useencoding[ecm] % ec minus 
-%D \stoptyping 
-
-\startencoding[ec][ec]
-
-\definecharacter ijligature {ij}
-\definecharacter IJligature {IJ}
-\definecharacter Ssharp     {SS}
-\definecharacter tcaron     {\buildtextaccent\textcaron t}
-\definecharacter Tcedilla   {\buildtextcedilla T}
-\definecharacter tcedilla   {\buildtextcedilla t}
-\definecharacter ydiaeresis {\buildtextaccent\textdiaeresis y}
-
-\stopencoding
-
-\endinput 
diff --git a/tex/context/base/enco-el.mkii b/tex/context/base/enco-el.mkii
new file mode 100644
index 000000000..24729967b
--- /dev/null
+++ b/tex/context/base/enco-el.mkii
@@ -0,0 +1,272 @@
+%D \module
+%D   [     file=enco-el,
+%D      version=2005.08.24,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=EuroLetter,
+%D       author={Several Users},
+%D         date=\currentdate,
+%D    copyright=PRAGMA-ADE]
+%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 EuroLetter encoding vector, also known as Dense Encoding is
+%D the result of discussion among users, most noticably Adam Lindsay,
+%D Mojka Miklavec, Patrick Gundlach, Taco Hoekwater and \unknown.
+%D It was a follow up of a thread started long ago where we
+%D discussed an encoding without the weird, never used symbols, but
+%D with as many characters as possible in order to support the utf-8
+%D input regime.
+
+\startencoding[el]
+
+\definecasemaps   1 to  15 lc +16 uc   0
+\definecasemaps  17 to  31 lc   0 uc -16
+
+\definecasemaps 128 to 159 lc +32 uc   0
+\definecasemaps 160 to 191 lc   0 uc -32
+
+\definecasemaps 192 to 223 lc +32 uc   0
+\definecasemaps 224 to 255 lc   0 uc -32
+
+\definecasemap   92  92 124
+\definecasemap   92 124  92
+
+\definecharacter dotlessi         160
+\definecharacter endash            32
+\definecharacter emdash            16
+
+\definecharacter aeligature       230
+\definecharacter AEligature       198
+\definecharacter oeligature       247
+\definecharacter OEligature       215
+
+\definecharacter ssharp            38
+
+\definecharacter thorn            254
+\definecharacter Thorn            222
+
+\definecharacter eth              240
+\definecharacter Eth              208
+
+\definecharacter exclamdown        42
+\definecharacter questiondown      43
+
+\definecharacter quotedbl          35
+\definecharacter quotedblbase      36
+\definecharacter quotedblleft      34
+\definecharacter quotedblright     35
+
+\definecharacter quotesingle       39
+\definecharacter quotesinglebase    0
+
+\definecharacter quoteleft         96
+\definecharacter quoteright        39
+
+\definecharacter guilsingleleft    60
+\definecharacter guilsingleright   62
+
+\definecharacter leftguillemot    123
+\definecharacter rightguillemot   125
+
+\definecharacter Acircumflex      194
+\definecharacter acircumflex      226
+%definecharacter Ccircumflex      {\buildtextaccent\textcircumflex C}
+%definecharacter ccircumflex      {\buildtextaccent\textcircumflex c}
+\definecharacter Ecircumflex      202
+\definecharacter ecircumflex      234
+%definecharacter Gcircumflex      {\buildtextaccent\textcircumflex G}
+%definecharacter gcircumflex      {\buildtextaccent\textcircumflex g}
+%definecharacter Hcircumflex      {\buildtextaccent\textcircumflex H}
+%definecharacter hcircumflex      {\buildtextaccent\textcircumflex h}
+\definecharacter Icircumflex      206
+\definecharacter icircumflex      238
+%definecharacter Jcircumflex      {\buildtextaccent\textcircumflex \dotlessJ}
+%definecharacter jcircumflex      {\buildtextaccent\textcircumflex \dotlessj}
+\definecharacter Ocircumflex      212
+\definecharacter ocircumflex      244
+%definecharacter Scircumflex      {\buildtextaccent\textcircumflex S}
+%definecharacter scircumflex      {\buildtextaccent\textcircumflex s}
+\definecharacter Ucircumflex      219
+\definecharacter ucircumflex      251
+\definecharacter Wcircumflex      154
+\definecharacter wcircumflex      186
+\definecharacter Ycircumflex      156
+\definecharacter ycircumflex      188
+
+\definecharacter Agrave           192
+\definecharacter agrave           224
+\definecharacter Egrave           200
+\definecharacter egrave           232
+\definecharacter Igrave           204
+\definecharacter igrave           236
+\definecharacter Ograve           210
+\definecharacter ograve           242
+\definecharacter Ugrave           217
+\definecharacter ugrave           249
+\definecharacter Ygrave           155
+\definecharacter ygrave           187
+
+\definecharacter Atilde           195
+\definecharacter atilde           227
+%definecharacter Itilde           {\buildtextaccent\texttilde \dotlessI}
+%definecharacter itilde           {\buildtextaccent\texttilde \dotlessi}
+\definecharacter Ntilde           209
+\definecharacter ntilde           241
+\definecharacter Otilde           213
+\definecharacter otilde           245
+%definecharacter Utilde           {\buildtextaccent\texttilde U}
+%definecharacter utilde           {\buildtextaccent\texttilde u}
+%definecharacter Ytilde           {\buildtextaccent\texttilde Y}
+%definecharacter ytilde           {\buildtextaccent\texttilde y}
+
+\definecharacter Adiaeresis       196
+\definecharacter adiaeresis       228
+\definecharacter Ediaeresis       203
+\definecharacter ediaeresis       235
+\definecharacter Idiaeresis       207
+\definecharacter idiaeresis       239
+\definecharacter Odiaeresis       214
+\definecharacter odiaeresis       246
+\definecharacter Udiaeresis       220
+\definecharacter udiaeresis       252
+\definecharacter Ydiaeresis       223
+\definecharacter ydiaeresis       255
+
+\definecharacter Aacute           193
+\definecharacter aacute           225
+\definecharacter Cacute             4
+\definecharacter cacute            20
+\definecharacter Eacute           201
+\definecharacter eacute           233
+\definecharacter Iacute           205
+\definecharacter iacute           237
+\definecharacter Lacute           132
+\definecharacter lacute           164
+\definecharacter Nacute           136
+\definecharacter nacute           168
+\definecharacter Oacute           211
+\definecharacter oacute           243
+\definecharacter Racute           141
+\definecharacter racute           173
+\definecharacter Sacute           144
+\definecharacter sacute           176
+\definecharacter Uacute           218
+\definecharacter uacute           250
+\definecharacter Yacute           221
+\definecharacter yacute           253
+\definecharacter Zacute           157
+\definecharacter zacute           189
+
+\definecharacter Dstroke            8
+\definecharacter dstroke           24
+\definecharacter Hstroke           92
+\definecharacter hstroke          124
+%definecharacter Tstroke          {T}
+%definecharacter tstroke          {t}
+
+\definecharacter Cdotaccent         6
+\definecharacter cdotaccent        22
+\definecharacter Edotaccent        10
+\definecharacter edotaccent        26
+\definecharacter Gdotaccent        15
+\definecharacter gdotaccent        31
+\definecharacter Idotaccent       128
+%definecharacter idotaccent       {\buildtextaccent\textdotaccent \dotlessi}
+\definecharacter Zdotaccent       159
+\definecharacter zdotaccent       191
+
+\definecharacter Amacron            2
+\definecharacter amacron           18
+\definecharacter Emacron           11
+\definecharacter emacron           27
+\definecharacter Imacron          129
+\definecharacter imacron          161
+\definecharacter Omacron          140
+\definecharacter omacron          172
+\definecharacter Umacron          152
+\definecharacter umacron          184
+
+\definecharacter Ccedilla         199
+\definecharacter ccedilla         231
+\definecharacter Scedilla         146
+\definecharacter scedilla         178
+
+\definecharacter Gcommaaccent      14
+\definecharacter gcommaaccent      30
+\definecharacter Kcommaaccent     131
+\definecharacter kcommaaccent     163
+\definecharacter Lcommaaccent     135
+\definecharacter lcommaaccent     167
+\definecharacter Ncommaaccent     138
+\definecharacter ncommaaccent     170
+\definecharacter Rcommaaccent     143
+\definecharacter rcommaaccent     175
+%definecharacter Tcedilla         149 % there is no tcedilla in encoding
+%definecharacter tcedilla         181
+
+\definecharacter Scommaaccent     147
+\definecharacter scommaaccent     179
+\definecharacter Tcommaaccent     149
+\definecharacter tcommaaccent     181
+
+\definecharacter Ohungarumlaut    139
+\definecharacter ohungarumlaut    171
+\definecharacter Uhungarumlaut    150
+\definecharacter uhungarumlaut    182
+
+\definecharacter Aogonek            3
+\definecharacter aogonek           19
+\definecharacter Eogonek           12
+\definecharacter eogonek           28
+\definecharacter Iogonek          130
+\definecharacter iogonek          162
+\definecharacter Uogonek          153
+\definecharacter uogonek          185
+
+\definecharacter Aring            197
+\definecharacter aring            229
+\definecharacter Uring            151
+\definecharacter uring            183
+
+\definecharacter Abreve            1
+\definecharacter abreve            17
+%definecharacter Ebreve           {\buildtextaccent\textbreve E}
+%definecharacter ebreve           {\buildtextaccent\textbreve e}
+\definecharacter Gbreve            13
+\definecharacter gbreve            29
+%definecharacter Ibreve           {\buildtextaccent\textbreve \dotlessI}
+%definecharacter ibreve           {\buildtextaccent\textbreve \dotlessi}
+%definecharacter Obreve           {\buildtextaccent\textbreve O}
+%definecharacter obreve           {\buildtextaccent\textbreve o}
+%definecharacter Ubreve           {\buildtextaccent\textbreve U}
+%definecharacter ubreve           {\buildtextaccent\textbreve u}
+
+\definecharacter Ccaron             5
+\definecharacter ccaron            21
+\definecharacter Dcaron             7
+\definecharacter dcaron            23
+\definecharacter Ecaron             9
+\definecharacter ecaron            25
+\definecharacter Lcaron           133
+\definecharacter lcaron           165
+\definecharacter Ncaron           137
+\definecharacter ncaron           169
+\definecharacter Rcaron           142
+\definecharacter rcaron           174
+\definecharacter Scaron           145
+\definecharacter scaron           177
+\definecharacter Tcaron           148
+\definecharacter tcaron           180
+%definecharacter Ycaron           {\buildtextaccent\textcaron Y}
+%definecharacter ycaron           {\buildtextaccent\textcaron y}
+\definecharacter Zcaron           158
+\definecharacter zcaron           190
+
+\definecharacter Lstroke          134
+\definecharacter lstroke          166
+\definecharacter Ostroke          216
+\definecharacter ostroke          248
+
+\stopencoding
diff --git a/tex/context/base/enco-el.tex b/tex/context/base/enco-el.tex
deleted file mode 100644
index 24729967b..000000000
--- a/tex/context/base/enco-el.tex
+++ /dev/null
@@ -1,272 +0,0 @@
-%D \module
-%D   [     file=enco-el,
-%D      version=2005.08.24,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=EuroLetter,
-%D       author={Several Users},
-%D         date=\currentdate,
-%D    copyright=PRAGMA-ADE]
-%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 EuroLetter encoding vector, also known as Dense Encoding is
-%D the result of discussion among users, most noticably Adam Lindsay,
-%D Mojka Miklavec, Patrick Gundlach, Taco Hoekwater and \unknown.
-%D It was a follow up of a thread started long ago where we
-%D discussed an encoding without the weird, never used symbols, but
-%D with as many characters as possible in order to support the utf-8
-%D input regime.
-
-\startencoding[el]
-
-\definecasemaps   1 to  15 lc +16 uc   0
-\definecasemaps  17 to  31 lc   0 uc -16
-
-\definecasemaps 128 to 159 lc +32 uc   0
-\definecasemaps 160 to 191 lc   0 uc -32
-
-\definecasemaps 192 to 223 lc +32 uc   0
-\definecasemaps 224 to 255 lc   0 uc -32
-
-\definecasemap   92  92 124
-\definecasemap   92 124  92
-
-\definecharacter dotlessi         160
-\definecharacter endash            32
-\definecharacter emdash            16
-
-\definecharacter aeligature       230
-\definecharacter AEligature       198
-\definecharacter oeligature       247
-\definecharacter OEligature       215
-
-\definecharacter ssharp            38
-
-\definecharacter thorn            254
-\definecharacter Thorn            222
-
-\definecharacter eth              240
-\definecharacter Eth              208
-
-\definecharacter exclamdown        42
-\definecharacter questiondown      43
-
-\definecharacter quotedbl          35
-\definecharacter quotedblbase      36
-\definecharacter quotedblleft      34
-\definecharacter quotedblright     35
-
-\definecharacter quotesingle       39
-\definecharacter quotesinglebase    0
-
-\definecharacter quoteleft         96
-\definecharacter quoteright        39
-
-\definecharacter guilsingleleft    60
-\definecharacter guilsingleright   62
-
-\definecharacter leftguillemot    123
-\definecharacter rightguillemot   125
-
-\definecharacter Acircumflex      194
-\definecharacter acircumflex      226
-%definecharacter Ccircumflex      {\buildtextaccent\textcircumflex C}
-%definecharacter ccircumflex      {\buildtextaccent\textcircumflex c}
-\definecharacter Ecircumflex      202
-\definecharacter ecircumflex      234
-%definecharacter Gcircumflex      {\buildtextaccent\textcircumflex G}
-%definecharacter gcircumflex      {\buildtextaccent\textcircumflex g}
-%definecharacter Hcircumflex      {\buildtextaccent\textcircumflex H}
-%definecharacter hcircumflex      {\buildtextaccent\textcircumflex h}
-\definecharacter Icircumflex      206
-\definecharacter icircumflex      238
-%definecharacter Jcircumflex      {\buildtextaccent\textcircumflex \dotlessJ}
-%definecharacter jcircumflex      {\buildtextaccent\textcircumflex \dotlessj}
-\definecharacter Ocircumflex      212
-\definecharacter ocircumflex      244
-%definecharacter Scircumflex      {\buildtextaccent\textcircumflex S}
-%definecharacter scircumflex      {\buildtextaccent\textcircumflex s}
-\definecharacter Ucircumflex      219
-\definecharacter ucircumflex      251
-\definecharacter Wcircumflex      154
-\definecharacter wcircumflex      186
-\definecharacter Ycircumflex      156
-\definecharacter ycircumflex      188
-
-\definecharacter Agrave           192
-\definecharacter agrave           224
-\definecharacter Egrave           200
-\definecharacter egrave           232
-\definecharacter Igrave           204
-\definecharacter igrave           236
-\definecharacter Ograve           210
-\definecharacter ograve           242
-\definecharacter Ugrave           217
-\definecharacter ugrave           249
-\definecharacter Ygrave           155
-\definecharacter ygrave           187
-
-\definecharacter Atilde           195
-\definecharacter atilde           227
-%definecharacter Itilde           {\buildtextaccent\texttilde \dotlessI}
-%definecharacter itilde           {\buildtextaccent\texttilde \dotlessi}
-\definecharacter Ntilde           209
-\definecharacter ntilde           241
-\definecharacter Otilde           213
-\definecharacter otilde           245
-%definecharacter Utilde           {\buildtextaccent\texttilde U}
-%definecharacter utilde           {\buildtextaccent\texttilde u}
-%definecharacter Ytilde           {\buildtextaccent\texttilde Y}
-%definecharacter ytilde           {\buildtextaccent\texttilde y}
-
-\definecharacter Adiaeresis       196
-\definecharacter adiaeresis       228
-\definecharacter Ediaeresis       203
-\definecharacter ediaeresis       235
-\definecharacter Idiaeresis       207
-\definecharacter idiaeresis       239
-\definecharacter Odiaeresis       214
-\definecharacter odiaeresis       246
-\definecharacter Udiaeresis       220
-\definecharacter udiaeresis       252
-\definecharacter Ydiaeresis       223
-\definecharacter ydiaeresis       255
-
-\definecharacter Aacute           193
-\definecharacter aacute           225
-\definecharacter Cacute             4
-\definecharacter cacute            20
-\definecharacter Eacute           201
-\definecharacter eacute           233
-\definecharacter Iacute           205
-\definecharacter iacute           237
-\definecharacter Lacute           132
-\definecharacter lacute           164
-\definecharacter Nacute           136
-\definecharacter nacute           168
-\definecharacter Oacute           211
-\definecharacter oacute           243
-\definecharacter Racute           141
-\definecharacter racute           173
-\definecharacter Sacute           144
-\definecharacter sacute           176
-\definecharacter Uacute           218
-\definecharacter uacute           250
-\definecharacter Yacute           221
-\definecharacter yacute           253
-\definecharacter Zacute           157
-\definecharacter zacute           189
-
-\definecharacter Dstroke            8
-\definecharacter dstroke           24
-\definecharacter Hstroke           92
-\definecharacter hstroke          124
-%definecharacter Tstroke          {T}
-%definecharacter tstroke          {t}
-
-\definecharacter Cdotaccent         6
-\definecharacter cdotaccent        22
-\definecharacter Edotaccent        10
-\definecharacter edotaccent        26
-\definecharacter Gdotaccent        15
-\definecharacter gdotaccent        31
-\definecharacter Idotaccent       128
-%definecharacter idotaccent       {\buildtextaccent\textdotaccent \dotlessi}
-\definecharacter Zdotaccent       159
-\definecharacter zdotaccent       191
-
-\definecharacter Amacron            2
-\definecharacter amacron           18
-\definecharacter Emacron           11
-\definecharacter emacron           27
-\definecharacter Imacron          129
-\definecharacter imacron          161
-\definecharacter Omacron          140
-\definecharacter omacron          172
-\definecharacter Umacron          152
-\definecharacter umacron          184
-
-\definecharacter Ccedilla         199
-\definecharacter ccedilla         231
-\definecharacter Scedilla         146
-\definecharacter scedilla         178
-
-\definecharacter Gcommaaccent      14
-\definecharacter gcommaaccent      30
-\definecharacter Kcommaaccent     131
-\definecharacter kcommaaccent     163
-\definecharacter Lcommaaccent     135
-\definecharacter lcommaaccent     167
-\definecharacter Ncommaaccent     138
-\definecharacter ncommaaccent     170
-\definecharacter Rcommaaccent     143
-\definecharacter rcommaaccent     175
-%definecharacter Tcedilla         149 % there is no tcedilla in encoding
-%definecharacter tcedilla         181
-
-\definecharacter Scommaaccent     147
-\definecharacter scommaaccent     179
-\definecharacter Tcommaaccent     149
-\definecharacter tcommaaccent     181
-
-\definecharacter Ohungarumlaut    139
-\definecharacter ohungarumlaut    171
-\definecharacter Uhungarumlaut    150
-\definecharacter uhungarumlaut    182
-
-\definecharacter Aogonek            3
-\definecharacter aogonek           19
-\definecharacter Eogonek           12
-\definecharacter eogonek           28
-\definecharacter Iogonek          130
-\definecharacter iogonek          162
-\definecharacter Uogonek          153
-\definecharacter uogonek          185
-
-\definecharacter Aring            197
-\definecharacter aring            229
-\definecharacter Uring            151
-\definecharacter uring            183
-
-\definecharacter Abreve            1
-\definecharacter abreve            17
-%definecharacter Ebreve           {\buildtextaccent\textbreve E}
-%definecharacter ebreve           {\buildtextaccent\textbreve e}
-\definecharacter Gbreve            13
-\definecharacter gbreve            29
-%definecharacter Ibreve           {\buildtextaccent\textbreve \dotlessI}
-%definecharacter ibreve           {\buildtextaccent\textbreve \dotlessi}
-%definecharacter Obreve           {\buildtextaccent\textbreve O}
-%definecharacter obreve           {\buildtextaccent\textbreve o}
-%definecharacter Ubreve           {\buildtextaccent\textbreve U}
-%definecharacter ubreve           {\buildtextaccent\textbreve u}
-
-\definecharacter Ccaron             5
-\definecharacter ccaron            21
-\definecharacter Dcaron             7
-\definecharacter dcaron            23
-\definecharacter Ecaron             9
-\definecharacter ecaron            25
-\definecharacter Lcaron           133
-\definecharacter lcaron           165
-\definecharacter Ncaron           137
-\definecharacter ncaron           169
-\definecharacter Rcaron           142
-\definecharacter rcaron           174
-\definecharacter Scaron           145
-\definecharacter scaron           177
-\definecharacter Tcaron           148
-\definecharacter tcaron           180
-%definecharacter Ycaron           {\buildtextaccent\textcaron Y}
-%definecharacter ycaron           {\buildtextaccent\textcaron y}
-\definecharacter Zcaron           158
-\definecharacter zcaron           190
-
-\definecharacter Lstroke          134
-\definecharacter lstroke          166
-\definecharacter Ostroke          216
-\definecharacter ostroke          248
-
-\stopencoding
diff --git a/tex/context/base/enco-fde.mkii b/tex/context/base/enco-fde.mkii
new file mode 100644
index 000000000..a7c11abfc
--- /dev/null
+++ b/tex/context/base/enco-fde.mkii
@@ -0,0 +1,128 @@
+%D \module
+%D   [     file=enco-fde,
+%D      version=2000.08.20,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=German Input Filter,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=Hans Hagen]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\doifmode{mkiv}{\endinput}
+
+\unprotect
+
+\installactivecharacter "
+
+\startlanguagespecifics[\s!de]
+
+  \installcompoundcharacter "a {\aumlaut\midworddiscretionary}
+  \installcompoundcharacter "e {\eumlaut\midworddiscretionary}
+  \installcompoundcharacter "i {\iumlaut\midworddiscretionary}
+  \installcompoundcharacter "o {\oumlaut\midworddiscretionary}
+  \installcompoundcharacter "u {\uumlaut\midworddiscretionary}
+  \installcompoundcharacter "s {\ssharp}
+  \installcompoundcharacter "z {\ssharp}
+
+  \installcompoundcharacter "A {\Aumlaut}
+  \installcompoundcharacter "E {\Eumlaut}
+  \installcompoundcharacter "I {\Iumlaut}
+  \installcompoundcharacter "O {\Oumlaut}
+  \installcompoundcharacter "U {\Uumlaut}
+  \installcompoundcharacter "Z {SZ}
+  \installcompoundcharacter "S {SS}
+
+\stoplanguagespecifics
+
+\startlanguagespecifics[\s!de]
+
+  \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}}
+  \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}}
+  \installcompoundcharacter "ll {\discretionary{ll-}{l}{ll}}
+  \installcompoundcharacter "mm {\discretionary{mm-}{m}{mm}}
+  \installcompoundcharacter "nn {\discretionary{nn-}{n}{nn}}
+  \installcompoundcharacter "pp {\discretionary{pp-}{p}{pp}}
+  \installcompoundcharacter "rr {\discretionary{rr-}{r}{rr}}
+  \installcompoundcharacter "tt {\discretionary{tt-}{t}{tt}}
+
+  \installcompoundcharacter "CK {\discretionary {K-}{K}{CK}}
+  \installcompoundcharacter "FF {\discretionary{FF-}{F}{FF}}
+  \installcompoundcharacter "LL {\discretionary{LL-}{L}{LL}}
+  \installcompoundcharacter "MM {\discretionary{MM-}{M}{MM}}
+  \installcompoundcharacter "NN {\discretionary{NN-}{N}{NN}}
+  \installcompoundcharacter "PP {\discretionary{PP-}{P}{PP}}
+  \installcompoundcharacter "RR {\discretionary{RR-}{R}{RR}}
+  \installcompoundcharacter "TT {\discretionary{TT-}{T}{TT}}
+
+\stoplanguagespecifics
+
+\startlanguagespecifics[\s!de]
+
+  \installcompoundcharacter "` {\startdelimitedtext[\v!quotation]}
+  \installcompoundcharacter "' {\stopdelimitedtext}
+  \installcompoundcharacter ". {\kern.1em\ignorespaces}
+
+  %installcompoundcharacter "` {\languageparameter\c!leftquotation }
+  %installcompoundcharacter "' {\languageparameter\c!rightquotation}
+
+  \def\setupDElanguage
+    {\setuplanguage
+       [\s!de]
+       [\c!leftsentence=\leftguillemot,
+        \c!rightsentence=\rightguillemot,
+        \c!leftsubsentence=\leftsubguillemot,
+        \c!rightsubsentence=\rightsubguillemot]}
+
+  \installcompoundcharacter "< {{\setupDElanguage|<|}}
+  \installcompoundcharacter "> {{\setupDElanguage|>|}}
+  \installcompoundcharacter "| {|*|}
+
+\stoplanguagespecifics
+
+% \hyphenatedword{hinauff|*|liegen}
+% \hyphenatedword{hinauff"|liegen}
+
+%D An experimental hack:
+
+% no {\simplifiedcompoundcharacter"}
+
+% \startencoding[pdfdoc]
+%   \startlanguagespecifics[\s!de]% hm, a % is needed
+%     \defineactivecharacter " {\"}
+%   \stoplanguagespecifics
+% \stopencoding
+
+\startencoding[ec]
+  \startlanguagespecifics[\s!de]%
+    \installcompoundcharacter "a {\adiaeresis}
+    \installcompoundcharacter "e {\ediaeresis}
+    \installcompoundcharacter "i {\idiaeresis}
+    \installcompoundcharacter "o {\odiaeresis}
+    \installcompoundcharacter "u {\udiaeresis}
+    \installcompoundcharacter "A {\Adiaeresis}
+    \installcompoundcharacter "E {\Ediaeresis}
+    \installcompoundcharacter "I {\Idiaeresis}
+    \installcompoundcharacter "O {\Odiaeresis}
+    \installcompoundcharacter "U {\Udiaeresis}
+  \stoplanguagespecifics
+\stopencoding
+
+\startencoding[texnansi]
+  \startlanguagespecifics[\s!de]%
+    \installcompoundcharacter "a {\adiaeresis}
+    \installcompoundcharacter "e {\ediaeresis}
+    \installcompoundcharacter "i {\idiaeresis}
+    \installcompoundcharacter "o {\odiaeresis}
+    \installcompoundcharacter "u {\udiaeresis}
+    \installcompoundcharacter "A {\Adiaeresis}
+    \installcompoundcharacter "E {\Ediaeresis}
+    \installcompoundcharacter "I {\Idiaeresis}
+    \installcompoundcharacter "O {\Odiaeresis}
+    \installcompoundcharacter "U {\Udiaeresis}
+  \stoplanguagespecifics
+\stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/enco-fde.tex b/tex/context/base/enco-fde.tex
deleted file mode 100644
index a7c11abfc..000000000
--- a/tex/context/base/enco-fde.tex
+++ /dev/null
@@ -1,128 +0,0 @@
-%D \module
-%D   [     file=enco-fde,
-%D      version=2000.08.20,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=German Input Filter,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=Hans Hagen]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\doifmode{mkiv}{\endinput}
-
-\unprotect
-
-\installactivecharacter "
-
-\startlanguagespecifics[\s!de]
-
-  \installcompoundcharacter "a {\aumlaut\midworddiscretionary}
-  \installcompoundcharacter "e {\eumlaut\midworddiscretionary}
-  \installcompoundcharacter "i {\iumlaut\midworddiscretionary}
-  \installcompoundcharacter "o {\oumlaut\midworddiscretionary}
-  \installcompoundcharacter "u {\uumlaut\midworddiscretionary}
-  \installcompoundcharacter "s {\ssharp}
-  \installcompoundcharacter "z {\ssharp}
-
-  \installcompoundcharacter "A {\Aumlaut}
-  \installcompoundcharacter "E {\Eumlaut}
-  \installcompoundcharacter "I {\Iumlaut}
-  \installcompoundcharacter "O {\Oumlaut}
-  \installcompoundcharacter "U {\Uumlaut}
-  \installcompoundcharacter "Z {SZ}
-  \installcompoundcharacter "S {SS}
-
-\stoplanguagespecifics
-
-\startlanguagespecifics[\s!de]
-
-  \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}}
-  \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}}
-  \installcompoundcharacter "ll {\discretionary{ll-}{l}{ll}}
-  \installcompoundcharacter "mm {\discretionary{mm-}{m}{mm}}
-  \installcompoundcharacter "nn {\discretionary{nn-}{n}{nn}}
-  \installcompoundcharacter "pp {\discretionary{pp-}{p}{pp}}
-  \installcompoundcharacter "rr {\discretionary{rr-}{r}{rr}}
-  \installcompoundcharacter "tt {\discretionary{tt-}{t}{tt}}
-
-  \installcompoundcharacter "CK {\discretionary {K-}{K}{CK}}
-  \installcompoundcharacter "FF {\discretionary{FF-}{F}{FF}}
-  \installcompoundcharacter "LL {\discretionary{LL-}{L}{LL}}
-  \installcompoundcharacter "MM {\discretionary{MM-}{M}{MM}}
-  \installcompoundcharacter "NN {\discretionary{NN-}{N}{NN}}
-  \installcompoundcharacter "PP {\discretionary{PP-}{P}{PP}}
-  \installcompoundcharacter "RR {\discretionary{RR-}{R}{RR}}
-  \installcompoundcharacter "TT {\discretionary{TT-}{T}{TT}}
-
-\stoplanguagespecifics
-
-\startlanguagespecifics[\s!de]
-
-  \installcompoundcharacter "` {\startdelimitedtext[\v!quotation]}
-  \installcompoundcharacter "' {\stopdelimitedtext}
-  \installcompoundcharacter ". {\kern.1em\ignorespaces}
-
-  %installcompoundcharacter "` {\languageparameter\c!leftquotation }
-  %installcompoundcharacter "' {\languageparameter\c!rightquotation}
-
-  \def\setupDElanguage
-    {\setuplanguage
-       [\s!de]
-       [\c!leftsentence=\leftguillemot,
-        \c!rightsentence=\rightguillemot,
-        \c!leftsubsentence=\leftsubguillemot,
-        \c!rightsubsentence=\rightsubguillemot]}
-
-  \installcompoundcharacter "< {{\setupDElanguage|<|}}
-  \installcompoundcharacter "> {{\setupDElanguage|>|}}
-  \installcompoundcharacter "| {|*|}
-
-\stoplanguagespecifics
-
-% \hyphenatedword{hinauff|*|liegen}
-% \hyphenatedword{hinauff"|liegen}
-
-%D An experimental hack:
-
-% no {\simplifiedcompoundcharacter"}
-
-% \startencoding[pdfdoc]
-%   \startlanguagespecifics[\s!de]% hm, a % is needed
-%     \defineactivecharacter " {\"}
-%   \stoplanguagespecifics
-% \stopencoding
-
-\startencoding[ec]
-  \startlanguagespecifics[\s!de]%
-    \installcompoundcharacter "a {\adiaeresis}
-    \installcompoundcharacter "e {\ediaeresis}
-    \installcompoundcharacter "i {\idiaeresis}
-    \installcompoundcharacter "o {\odiaeresis}
-    \installcompoundcharacter "u {\udiaeresis}
-    \installcompoundcharacter "A {\Adiaeresis}
-    \installcompoundcharacter "E {\Ediaeresis}
-    \installcompoundcharacter "I {\Idiaeresis}
-    \installcompoundcharacter "O {\Odiaeresis}
-    \installcompoundcharacter "U {\Udiaeresis}
-  \stoplanguagespecifics
-\stopencoding
-
-\startencoding[texnansi]
-  \startlanguagespecifics[\s!de]%
-    \installcompoundcharacter "a {\adiaeresis}
-    \installcompoundcharacter "e {\ediaeresis}
-    \installcompoundcharacter "i {\idiaeresis}
-    \installcompoundcharacter "o {\odiaeresis}
-    \installcompoundcharacter "u {\udiaeresis}
-    \installcompoundcharacter "A {\Adiaeresis}
-    \installcompoundcharacter "E {\Ediaeresis}
-    \installcompoundcharacter "I {\Idiaeresis}
-    \installcompoundcharacter "O {\Odiaeresis}
-    \installcompoundcharacter "U {\Udiaeresis}
-  \stoplanguagespecifics
-\stopencoding
-
-\protect \endinput
diff --git a/tex/context/base/enco-ffr.mkii b/tex/context/base/enco-ffr.mkii
new file mode 100644
index 000000000..c321153e8
--- /dev/null
+++ b/tex/context/base/enco-ffr.mkii
@@ -0,0 +1,53 @@
+%D \module
+%D   [     file=enco-ffr,
+%D      version=2002.05.07,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=French Input Filter,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=Hans Hagen]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\doifmode{mkiv}{\endinput}
+
+% \definehspace[fr][:][.25em]
+% \definehspace[fr][;][.25em]
+% \definehspace[fr][!][.25em]
+% \definehspace[fr][?][.25em]
+
+\enablemode[activecolon] \usemodule[tryout] % for the moment
+
+\installactivecharacter :
+\installactivecharacter ;
+\installactivecharacter ?
+\installactivecharacter !
+
+\unprotect
+
+\startlanguagespecifics[\s!fr]
+    \definetextmodediscretionary : {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{:}:}
+    \definetextmodediscretionary ; {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{;};}
+    \definetextmodediscretionary ? {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{?}?}
+    \definetextmodediscretionary ! {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{!}!}
+\stoplanguagespecifics
+
+\startlanguagespecifics[\s!fr]
+    \defineactivecharacter : {\mathortext{:}{\directdiscretionary{:}}}
+    \defineactivecharacter ; {\mathortext{;}{\directdiscretionary{;}}}
+    \defineactivecharacter ! {\mathortext{!}{\directdiscretionary{!}}}
+    \defineactivecharacter ? {\mathortext{?}{\directdiscretionary{?}}}
+\stoplanguagespecifics
+
+% maybe tricky due to possible name clashes:
+%
+% \def\ieme {\highordinalstr{e}}
+% \def\iemes{\highordinalstr{es}}
+% \def\ier  {\highordinalstr{er}}
+% \def\iers {\highordinalstr{ers}}
+% \def\iere {\highordinalstr{re}}
+% \def\ieres{\highordinalstr{res}}
+
+\protect \endinput
diff --git a/tex/context/base/enco-ffr.tex b/tex/context/base/enco-ffr.tex
deleted file mode 100644
index c321153e8..000000000
--- a/tex/context/base/enco-ffr.tex
+++ /dev/null
@@ -1,53 +0,0 @@
-%D \module
-%D   [     file=enco-ffr,
-%D      version=2002.05.07,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=French Input Filter,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=Hans Hagen]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\doifmode{mkiv}{\endinput}
-
-% \definehspace[fr][:][.25em]
-% \definehspace[fr][;][.25em]
-% \definehspace[fr][!][.25em]
-% \definehspace[fr][?][.25em]
-
-\enablemode[activecolon] \usemodule[tryout] % for the moment
-
-\installactivecharacter :
-\installactivecharacter ;
-\installactivecharacter ?
-\installactivecharacter !
-
-\unprotect
-
-\startlanguagespecifics[\s!fr]
-    \definetextmodediscretionary : {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{:}:}
-    \definetextmodediscretionary ; {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{;};}
-    \definetextmodediscretionary ? {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{?}?}
-    \definetextmodediscretionary ! {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{!}!}
-\stoplanguagespecifics
-
-\startlanguagespecifics[\s!fr]
-    \defineactivecharacter : {\mathortext{:}{\directdiscretionary{:}}}
-    \defineactivecharacter ; {\mathortext{;}{\directdiscretionary{;}}}
-    \defineactivecharacter ! {\mathortext{!}{\directdiscretionary{!}}}
-    \defineactivecharacter ? {\mathortext{?}{\directdiscretionary{?}}}
-\stoplanguagespecifics
-
-% maybe tricky due to possible name clashes:
-%
-% \def\ieme {\highordinalstr{e}}
-% \def\iemes{\highordinalstr{es}}
-% \def\ier  {\highordinalstr{er}}
-% \def\iers {\highordinalstr{ers}}
-% \def\iere {\highordinalstr{re}}
-% \def\ieres{\highordinalstr{res}}
-
-\protect \endinput
diff --git a/tex/context/base/enco-fpl.mkii b/tex/context/base/enco-fpl.mkii
new file mode 100644
index 000000000..14d102ff1
--- /dev/null
+++ b/tex/context/base/enco-fpl.mkii
@@ -0,0 +1,98 @@
+%D \module
+%D   [     file=enco-fpl,
+%D      version=2000.08.20,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Polish Input Filter,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=Hans Hagen]
+%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 These definitions used to be part of lang-sla.tex.
+
+\unprotect
+
+% todo : named glyphs
+
+\installactivecharacter /
+
+\startlanguagespecifics[\s!pl]
+
+% \appendtoks \makecharacteractive / \to \everynormalcatcodes % obsolete
+
+  \installcompoundcharacter /a {\aogonek}
+  \installcompoundcharacter /c {\cacute}
+  \installcompoundcharacter /e {\eogonek}
+  \installcompoundcharacter /l {\lstroke}
+  \installcompoundcharacter /n {\nacute}
+  \installcompoundcharacter /o {\oacute}
+  \installcompoundcharacter /s {\sacute}
+  \installcompoundcharacter /x {\zacute}
+  \installcompoundcharacter /z {\zdotaccent}
+  \installcompoundcharacter /A {\Aogonek}
+  \installcompoundcharacter /C {\Cacute}
+  \installcompoundcharacter /E {\Eogonek}
+  \installcompoundcharacter /L {\Lstroke}
+  \installcompoundcharacter /N {\Nacute}
+  \installcompoundcharacter /O {\Oacute}
+  \installcompoundcharacter /S {\Sacute}
+  \installcompoundcharacter /X {\Zacute}
+  \installcompoundcharacter /Z {\Zdotaccent}
+
+\stoplanguagespecifics
+
+\startlanguagespecifics[\s!pl]
+
+  \installcompoundcharacter /, {\handlequotation\c!leftquotation}
+  \installcompoundcharacter /' {\handlequotation\c!rightquotation}
+
+  \def\setupPLlanguage%
+    {\setuplanguage
+       [\s!pl]
+       [\c!leftsentence=\leftguillemot,
+        \c!rightsentence=\rightguillemot,
+        \c!leftsubsentence=\leftsubguillemot,
+        \c!rightsubsentence=\rightsubguillemot]}
+
+  \installcompoundcharacter /< {{\setupPLlanguage|<|}}
+  \installcompoundcharacter /> {{\setupPLlanguage|>|}}
+
+  \installcompoundcharacter /- {|-|}
+
+\stoplanguagespecifics
+
+% obsolete
+%
+% \startlanguagespecifics[\s!pl]
+%
+%   \definesortkey {/a}{a}{a}{\k a}
+%   \definesortkey {/A}{a}{a}{\k a}
+%   \definesortkey {/c}{c}{a}{\'c}
+%   \definesortkey {/C}{c}{a}{\'c}
+%   \definesortkey {/e}{e}{a}{\k e}
+%   \definesortkey {/E}{e}{a}{\k e}
+%   \definesortkey {/l}{l}{a}{\l }
+%   \definesortkey {/L}{l}{a}{\l }
+%   \definesortkey {/n}{n}{a}{\'n}
+%   \definesortkey {/N}{n}{a}{\'n}
+%   \definesortkey {/o}{o}{a}{\'o}
+%   \definesortkey {/O}{o}{a}{\'o}
+%   \definesortkey {/s}{s}{a}{\'s}
+%   \definesortkey {/S}{s}{a}{\'s}
+%   \definesortkey {/x}{z}{a}{\'x}
+%   \definesortkey {/X}{z}{a}{\'x}
+%   \definesortkey {/z}{z}{b}{\.z}
+%   \definesortkey {/Z}{z}{b}{\.z}
+%
+% \stoplanguagespecifics
+
+\startencoding[pdfdoc]
+  \startlanguagespecifics[pl]% hm
+    \defineactivecharacter / {\simplifiedcompoundcharacter/}
+  \stoplanguagespecifics
+\stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/enco-fpl.tex b/tex/context/base/enco-fpl.tex
deleted file mode 100644
index 14d102ff1..000000000
--- a/tex/context/base/enco-fpl.tex
+++ /dev/null
@@ -1,98 +0,0 @@
-%D \module
-%D   [     file=enco-fpl,
-%D      version=2000.08.20,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Polish Input Filter,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=Hans Hagen]
-%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 These definitions used to be part of lang-sla.tex.
-
-\unprotect
-
-% todo : named glyphs
-
-\installactivecharacter /
-
-\startlanguagespecifics[\s!pl]
-
-% \appendtoks \makecharacteractive / \to \everynormalcatcodes % obsolete
-
-  \installcompoundcharacter /a {\aogonek}
-  \installcompoundcharacter /c {\cacute}
-  \installcompoundcharacter /e {\eogonek}
-  \installcompoundcharacter /l {\lstroke}
-  \installcompoundcharacter /n {\nacute}
-  \installcompoundcharacter /o {\oacute}
-  \installcompoundcharacter /s {\sacute}
-  \installcompoundcharacter /x {\zacute}
-  \installcompoundcharacter /z {\zdotaccent}
-  \installcompoundcharacter /A {\Aogonek}
-  \installcompoundcharacter /C {\Cacute}
-  \installcompoundcharacter /E {\Eogonek}
-  \installcompoundcharacter /L {\Lstroke}
-  \installcompoundcharacter /N {\Nacute}
-  \installcompoundcharacter /O {\Oacute}
-  \installcompoundcharacter /S {\Sacute}
-  \installcompoundcharacter /X {\Zacute}
-  \installcompoundcharacter /Z {\Zdotaccent}
-
-\stoplanguagespecifics
-
-\startlanguagespecifics[\s!pl]
-
-  \installcompoundcharacter /, {\handlequotation\c!leftquotation}
-  \installcompoundcharacter /' {\handlequotation\c!rightquotation}
-
-  \def\setupPLlanguage%
-    {\setuplanguage
-       [\s!pl]
-       [\c!leftsentence=\leftguillemot,
-        \c!rightsentence=\rightguillemot,
-        \c!leftsubsentence=\leftsubguillemot,
-        \c!rightsubsentence=\rightsubguillemot]}
-
-  \installcompoundcharacter /< {{\setupPLlanguage|<|}}
-  \installcompoundcharacter /> {{\setupPLlanguage|>|}}
-
-  \installcompoundcharacter /- {|-|}
-
-\stoplanguagespecifics
-
-% obsolete
-%
-% \startlanguagespecifics[\s!pl]
-%
-%   \definesortkey {/a}{a}{a}{\k a}
-%   \definesortkey {/A}{a}{a}{\k a}
-%   \definesortkey {/c}{c}{a}{\'c}
-%   \definesortkey {/C}{c}{a}{\'c}
-%   \definesortkey {/e}{e}{a}{\k e}
-%   \definesortkey {/E}{e}{a}{\k e}
-%   \definesortkey {/l}{l}{a}{\l }
-%   \definesortkey {/L}{l}{a}{\l }
-%   \definesortkey {/n}{n}{a}{\'n}
-%   \definesortkey {/N}{n}{a}{\'n}
-%   \definesortkey {/o}{o}{a}{\'o}
-%   \definesortkey {/O}{o}{a}{\'o}
-%   \definesortkey {/s}{s}{a}{\'s}
-%   \definesortkey {/S}{s}{a}{\'s}
-%   \definesortkey {/x}{z}{a}{\'x}
-%   \definesortkey {/X}{z}{a}{\'x}
-%   \definesortkey {/z}{z}{b}{\.z}
-%   \definesortkey {/Z}{z}{b}{\.z}
-%
-% \stoplanguagespecifics
-
-\startencoding[pdfdoc]
-  \startlanguagespecifics[pl]% hm
-    \defineactivecharacter / {\simplifiedcompoundcharacter/}
-  \stoplanguagespecifics
-\stopencoding
-
-\protect \endinput
diff --git a/tex/context/base/enco-fro.mkii b/tex/context/base/enco-fro.mkii
new file mode 100644
index 000000000..e5f5e1257
--- /dev/null
+++ b/tex/context/base/enco-fro.mkii
@@ -0,0 +1,35 @@
+%D \module
+%D   [     file=enco-fro,
+%D      version=2000.08.20,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Romanian Input Filter,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=Hans Hagen]
+%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 These definitions used to be part of lang-ita.tex.
+
+\unprotect
+
+\installactivecharacter "
+
+\startlanguagespecifics[\s!ro]
+
+  \installcompoundcharacter "a {\acircumflex}
+  \installcompoundcharacter "i {\icircumflex}
+  \installcompoundcharacter "s {\scedilla}
+  \installcompoundcharacter "t {\tcedilla}
+  \installcompoundcharacter "A {\Acircumflex}
+  \installcompoundcharacter "I {\Icircumflex}
+  \installcompoundcharacter "S {\Scedilla}
+  \installcompoundcharacter "T {\Tcedilla}
+  \installcompoundcharacter "` {\startdelimitedtext[\v!quotation]}
+  \installcompoundcharacter "' {\stopdelimitedtext}
+
+\stoplanguagespecifics
+
+\protect \endinput
diff --git a/tex/context/base/enco-fro.tex b/tex/context/base/enco-fro.tex
deleted file mode 100644
index e5f5e1257..000000000
--- a/tex/context/base/enco-fro.tex
+++ /dev/null
@@ -1,35 +0,0 @@
-%D \module
-%D   [     file=enco-fro,
-%D      version=2000.08.20,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Romanian Input Filter,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=Hans Hagen]
-%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 These definitions used to be part of lang-ita.tex.
-
-\unprotect
-
-\installactivecharacter "
-
-\startlanguagespecifics[\s!ro]
-
-  \installcompoundcharacter "a {\acircumflex}
-  \installcompoundcharacter "i {\icircumflex}
-  \installcompoundcharacter "s {\scedilla}
-  \installcompoundcharacter "t {\tcedilla}
-  \installcompoundcharacter "A {\Acircumflex}
-  \installcompoundcharacter "I {\Icircumflex}
-  \installcompoundcharacter "S {\Scedilla}
-  \installcompoundcharacter "T {\Tcedilla}
-  \installcompoundcharacter "` {\startdelimitedtext[\v!quotation]}
-  \installcompoundcharacter "' {\stopdelimitedtext}
-
-\stoplanguagespecifics
-
-\protect \endinput
diff --git a/tex/context/base/enco-fsl.mkii b/tex/context/base/enco-fsl.mkii
new file mode 100644
index 000000000..86a41c88a
--- /dev/null
+++ b/tex/context/base/enco-fsl.mkii
@@ -0,0 +1,32 @@
+%D \module
+%D   [     file=enco-fsl,
+%D      version=2005.08.17,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Slovenian Specialities,
+%D       author={Hans Hagen, Mojka Miklavec},
+%D         date=\currentdate,
+%D    copyright=Hans Hagen]
+%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 Usage:
+%D
+%D \starttyping
+%D \useencoding[fsl]
+%D
+%D \starttext
+%D   \dstroke \language[sl] \dstroke
+%D \stoptext
+%D \stoptyping
+
+\unprotect
+
+\startlanguagespecifics[\s!sl]
+  \startencoding[\s!default]
+    \definecharacter dstroke {d\zcaron} % hm, expects a space delimiter
+  \stopencoding
+\stoplanguagespecifics
+
+\protect \endinput
diff --git a/tex/context/base/enco-fsl.tex b/tex/context/base/enco-fsl.tex
deleted file mode 100644
index 86a41c88a..000000000
--- a/tex/context/base/enco-fsl.tex
+++ /dev/null
@@ -1,32 +0,0 @@
-%D \module
-%D   [     file=enco-fsl,
-%D      version=2005.08.17,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Slovenian Specialities,
-%D       author={Hans Hagen, Mojka Miklavec},
-%D         date=\currentdate,
-%D    copyright=Hans Hagen]
-%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 Usage:
-%D
-%D \starttyping
-%D \useencoding[fsl]
-%D
-%D \starttext
-%D   \dstroke \language[sl] \dstroke
-%D \stoptext
-%D \stoptyping
-
-\unprotect
-
-\startlanguagespecifics[\s!sl]
-  \startencoding[\s!default]
-    \definecharacter dstroke {d\zcaron} % hm, expects a space delimiter
-  \stopencoding
-\stoplanguagespecifics
-
-\protect \endinput
diff --git a/tex/context/base/enco-grk.mkii b/tex/context/base/enco-grk.mkii
new file mode 100644
index 000000000..882a3c9b0
--- /dev/null
+++ b/tex/context/base/enco-grk.mkii
@@ -0,0 +1,190 @@
+%D \module
+%D   [       file=enco-grk,
+%D        version=2003.03.01,
+%D          title=\CONTEXT\ Encoding Macros,
+%D       subtitle=Greek,
+%D         author=Apostolos Syropoulos,
+%D           date=\currentdate,
+%D      copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startmapping[iso-8859-7]
+
+% Uppercase Greek letters
+
+\definecasemap 193 193 225 % greekAlpha
+\definecasemap 194 194 226 % greekBeta
+\definecasemap 195 195 227 % greekGamma
+\definecasemap 196 196 228 % greekDelta
+\definecasemap 197 197 229 % greekEpsilon
+\definecasemap 198 198 230 % greekZeta
+\definecasemap 199 199 213 % greekEta
+\definecasemap 200 200 232 % greekTheta
+\definecasemap 201 201 233 % greekIota
+\definecasemap 202 202 234 % greekKappa
+\definecasemap 203 203 235 % greekLambda
+\definecasemap 204 204 236 % greekMu
+\definecasemap 205 205 237 % greekNu
+\definecasemap 206 206 238 % greekXi
+\definecasemap 207 207 239 % greekOmicron
+\definecasemap 208 208 240 % greekPi
+\definecasemap 209 209 241 % greekRho
+\definecasemap 211 211 243 % greekSigma
+\definecasemap 212 212 244 % greekTau
+\definecasemap 213 213 245 % greekUpsilon
+\definecasemap 214 214 246 % greekPhi
+\definecasemap 215 215 247 % greekChi
+\definecasemap 216 216 248 % greekPsi
+\definecasemap 217 217 249 % greekOmega
+
+% Lowercase Greek letters
+
+\definecasemap 225 193 225 % greekalpha
+\definecasemap 226 194 226 % greekbeta
+\definecasemap 227 195 227 % greekgamma
+\definecasemap 228 196 228 % greekdelta
+\definecasemap 229 197 229 % greekepsilon
+\definecasemap 230 198 230 % greekzeta
+\definecasemap 213 199 213 % greeketa
+\definecasemap 232 200 232 % greektheta
+\definecasemap 233 201 233 % greekiota
+\definecasemap 234 202 234 % greekkappa
+\definecasemap 235 203 235 % greeklambda
+\definecasemap 236 204 236 % greekmu
+\definecasemap 237 205 237 % greeknu
+\definecasemap 238 206 238 % greekxi
+\definecasemap 239 207 239 % greekomicron
+\definecasemap 240 208 240 % greekpi
+\definecasemap 241 209 241 % greekrho
+\definecasemap 242 211 242 % greekfinalsigma
+\definecasemap 243 211 243 % greekSigma
+\definecasemap 244 212 244 % greekTau
+\definecasemap 245 213 245 % greekUpsilon
+\definecasemap 246 214 246 % greekPhi
+\definecasemap 247 215 247 % greekChi
+\definecasemap 248 216 248 % greekPsi
+\definecasemap 249 217 249 % greekOmega
+
+% Accented Uppercase Greek letters
+
+\definecasemap 182 193 220  % greekAlphatonos
+\definecasemap 184 197 221  % greekEpsilontonos
+\definecasemap 185 199 222  % greekEtatonos
+\definecasemap 186 201 223  % greekIotatonos
+\definecasemap 188 207 252  % greekOmicrontonos
+\definecasemap 190 213 253  % greekUpsilontonos
+\definecasemap 191 217 254  % greekOmegatonos
+\definecasemap 218 218 250  % greekIotadialytika
+\definecasemap 219 219 251  % greekUpsilondialytika
+
+% Accented Lowercase Greek letters
+
+\definecasemap 220 193 220  % greekalphatonos
+\definecasemap 221 197 221  % greekepsilontonos
+\definecasemap 222 199 222  % greeketatonos
+\definecasemap 223 201 223  % greekiotatonos
+\definecasemap 252 207 252  % greekomicrontonos
+\definecasemap 253 213 253  % greekupsilontonos
+\definecasemap 254 217 254  % greekomegatonos
+\definecasemap 250 218 250  % greekiotadialytika
+\definecasemap 251 219 251  % greekupsilondialytika
+\definecasemap 192 218 192  % greekiotadialytikatonos
+\definecasemap 224 219 224  % greekupsilondialytikatonos
+
+\stopmapping
+
+\startencoding[iso-8859-7]
+
+% Uppercase Greek letters
+
+\definecharacter greekAlpha        193
+\definecharacter greekBeta         194
+\definecharacter greekGamma        195
+\definecharacter greekDelta        196
+\definecharacter greekEpsilon      197
+\definecharacter greekZeta         198
+\definecharacter greekEta          199
+\definecharacter greekTheta        200
+\definecharacter greekIota         201
+\definecharacter greekKappa        202
+\definecharacter greekLambda       203
+\definecharacter greekMu           204
+\definecharacter greekNu           205
+\definecharacter greekXi           206
+\definecharacter greekOmicron      207
+\definecharacter greekPi           208
+\definecharacter greekRho          209
+\definecharacter greekSigma        211
+\definecharacter greekTau          212
+\definecharacter greekUpsilon      213
+\definecharacter greekPhi          214
+\definecharacter greekChi          215
+\definecharacter greekPsi          216
+\definecharacter greekOmega        217
+
+% Lowercase Greek letters
+
+\definecharacter greekalpha        225
+\definecharacter greekbeta         226
+\definecharacter greekgamma        227
+\definecharacter greekdelta        228
+\definecharacter greekepsilon      229
+\definecharacter greekzeta         230
+\definecharacter greeketa          231
+\definecharacter greektheta        232
+\definecharacter greekiota         233
+\definecharacter greekkappa        234
+\definecharacter greeklambda       235
+\definecharacter greekmu           236
+\definecharacter greeknu           237
+\definecharacter greekxi           238
+\definecharacter greekomicron      239
+\definecharacter greekpi           240
+\definecharacter greekrho          241
+\definecharacter greekfinalsigma   242
+\definecharacter greeksigma        243
+\definecharacter greektau          244
+\definecharacter greekupsilon      245
+\definecharacter greekphi          246
+\definecharacter greekchi          247
+\definecharacter greekpsi          248
+\definecharacter greekomega        249
+
+% Accented Uppercase Greek letters
+
+\definecharacter greekAlphatonos        182
+\definecharacter greekEpsilontonos      184
+\definecharacter greekEtatonos          185
+\definecharacter greekIotatonos         186
+\definecharacter greekOmicrontonos      188
+\definecharacter greekUpsilontonos      190
+\definecharacter greekOmegatonos        191
+\definecharacter greekIotadialytika     218
+\definecharacter greekUpsilondialytika  219
+
+% Accented Lowercase Greek letters
+
+\definecharacter greekalphatonos             220
+\definecharacter greekepsilontonos           221
+\definecharacter greeketatonos               222
+\definecharacter greekiotatonos              223
+\definecharacter greekomicrontonos           252
+\definecharacter greekupsilontonos           253
+\definecharacter greekomegatonos             254
+\definecharacter greekiotadialytika          250
+\definecharacter greekupsilondialytika       251
+\definecharacter greekiotadialytikatonos     192
+\definecharacter greekupsilondialytikatonos  224
+
+% Miscellaneous Greek symbols
+
+\definecharacter greekleftquot               171
+\definecharacter greekrightquot              187
+\definecharacter greektonos                  180
+\definecharacter greekdialytikatonos         181
+\definecharacter greekapostrophos            162
+
+\stopencoding
diff --git a/tex/context/base/enco-grk.tex b/tex/context/base/enco-grk.tex
deleted file mode 100644
index 882a3c9b0..000000000
--- a/tex/context/base/enco-grk.tex
+++ /dev/null
@@ -1,190 +0,0 @@
-%D \module
-%D   [       file=enco-grk,
-%D        version=2003.03.01,
-%D          title=\CONTEXT\ Encoding Macros,
-%D       subtitle=Greek,
-%D         author=Apostolos Syropoulos,
-%D           date=\currentdate,
-%D      copyright=PRAGMA-ADE]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\startmapping[iso-8859-7]
-
-% Uppercase Greek letters
-
-\definecasemap 193 193 225 % greekAlpha
-\definecasemap 194 194 226 % greekBeta
-\definecasemap 195 195 227 % greekGamma
-\definecasemap 196 196 228 % greekDelta
-\definecasemap 197 197 229 % greekEpsilon
-\definecasemap 198 198 230 % greekZeta
-\definecasemap 199 199 213 % greekEta
-\definecasemap 200 200 232 % greekTheta
-\definecasemap 201 201 233 % greekIota
-\definecasemap 202 202 234 % greekKappa
-\definecasemap 203 203 235 % greekLambda
-\definecasemap 204 204 236 % greekMu
-\definecasemap 205 205 237 % greekNu
-\definecasemap 206 206 238 % greekXi
-\definecasemap 207 207 239 % greekOmicron
-\definecasemap 208 208 240 % greekPi
-\definecasemap 209 209 241 % greekRho
-\definecasemap 211 211 243 % greekSigma
-\definecasemap 212 212 244 % greekTau
-\definecasemap 213 213 245 % greekUpsilon
-\definecasemap 214 214 246 % greekPhi
-\definecasemap 215 215 247 % greekChi
-\definecasemap 216 216 248 % greekPsi
-\definecasemap 217 217 249 % greekOmega
-
-% Lowercase Greek letters
-
-\definecasemap 225 193 225 % greekalpha
-\definecasemap 226 194 226 % greekbeta
-\definecasemap 227 195 227 % greekgamma
-\definecasemap 228 196 228 % greekdelta
-\definecasemap 229 197 229 % greekepsilon
-\definecasemap 230 198 230 % greekzeta
-\definecasemap 213 199 213 % greeketa
-\definecasemap 232 200 232 % greektheta
-\definecasemap 233 201 233 % greekiota
-\definecasemap 234 202 234 % greekkappa
-\definecasemap 235 203 235 % greeklambda
-\definecasemap 236 204 236 % greekmu
-\definecasemap 237 205 237 % greeknu
-\definecasemap 238 206 238 % greekxi
-\definecasemap 239 207 239 % greekomicron
-\definecasemap 240 208 240 % greekpi
-\definecasemap 241 209 241 % greekrho
-\definecasemap 242 211 242 % greekfinalsigma
-\definecasemap 243 211 243 % greekSigma
-\definecasemap 244 212 244 % greekTau
-\definecasemap 245 213 245 % greekUpsilon
-\definecasemap 246 214 246 % greekPhi
-\definecasemap 247 215 247 % greekChi
-\definecasemap 248 216 248 % greekPsi
-\definecasemap 249 217 249 % greekOmega
-
-% Accented Uppercase Greek letters
-
-\definecasemap 182 193 220  % greekAlphatonos
-\definecasemap 184 197 221  % greekEpsilontonos
-\definecasemap 185 199 222  % greekEtatonos
-\definecasemap 186 201 223  % greekIotatonos
-\definecasemap 188 207 252  % greekOmicrontonos
-\definecasemap 190 213 253  % greekUpsilontonos
-\definecasemap 191 217 254  % greekOmegatonos
-\definecasemap 218 218 250  % greekIotadialytika
-\definecasemap 219 219 251  % greekUpsilondialytika
-
-% Accented Lowercase Greek letters
-
-\definecasemap 220 193 220  % greekalphatonos
-\definecasemap 221 197 221  % greekepsilontonos
-\definecasemap 222 199 222  % greeketatonos
-\definecasemap 223 201 223  % greekiotatonos
-\definecasemap 252 207 252  % greekomicrontonos
-\definecasemap 253 213 253  % greekupsilontonos
-\definecasemap 254 217 254  % greekomegatonos
-\definecasemap 250 218 250  % greekiotadialytika
-\definecasemap 251 219 251  % greekupsilondialytika
-\definecasemap 192 218 192  % greekiotadialytikatonos
-\definecasemap 224 219 224  % greekupsilondialytikatonos
-
-\stopmapping
-
-\startencoding[iso-8859-7]
-
-% Uppercase Greek letters
-
-\definecharacter greekAlpha        193
-\definecharacter greekBeta         194
-\definecharacter greekGamma        195
-\definecharacter greekDelta        196
-\definecharacter greekEpsilon      197
-\definecharacter greekZeta         198
-\definecharacter greekEta          199
-\definecharacter greekTheta        200
-\definecharacter greekIota         201
-\definecharacter greekKappa        202
-\definecharacter greekLambda       203
-\definecharacter greekMu           204
-\definecharacter greekNu           205
-\definecharacter greekXi           206
-\definecharacter greekOmicron      207
-\definecharacter greekPi           208
-\definecharacter greekRho          209
-\definecharacter greekSigma        211
-\definecharacter greekTau          212
-\definecharacter greekUpsilon      213
-\definecharacter greekPhi          214
-\definecharacter greekChi          215
-\definecharacter greekPsi          216
-\definecharacter greekOmega        217
-
-% Lowercase Greek letters
-
-\definecharacter greekalpha        225
-\definecharacter greekbeta         226
-\definecharacter greekgamma        227
-\definecharacter greekdelta        228
-\definecharacter greekepsilon      229
-\definecharacter greekzeta         230
-\definecharacter greeketa          231
-\definecharacter greektheta        232
-\definecharacter greekiota         233
-\definecharacter greekkappa        234
-\definecharacter greeklambda       235
-\definecharacter greekmu           236
-\definecharacter greeknu           237
-\definecharacter greekxi           238
-\definecharacter greekomicron      239
-\definecharacter greekpi           240
-\definecharacter greekrho          241
-\definecharacter greekfinalsigma   242
-\definecharacter greeksigma        243
-\definecharacter greektau          244
-\definecharacter greekupsilon      245
-\definecharacter greekphi          246
-\definecharacter greekchi          247
-\definecharacter greekpsi          248
-\definecharacter greekomega        249
-
-% Accented Uppercase Greek letters
-
-\definecharacter greekAlphatonos        182
-\definecharacter greekEpsilontonos      184
-\definecharacter greekEtatonos          185
-\definecharacter greekIotatonos         186
-\definecharacter greekOmicrontonos      188
-\definecharacter greekUpsilontonos      190
-\definecharacter greekOmegatonos        191
-\definecharacter greekIotadialytika     218
-\definecharacter greekUpsilondialytika  219
-
-% Accented Lowercase Greek letters
-
-\definecharacter greekalphatonos             220
-\definecharacter greekepsilontonos           221
-\definecharacter greeketatonos               222
-\definecharacter greekiotatonos              223
-\definecharacter greekomicrontonos           252
-\definecharacter greekupsilontonos           253
-\definecharacter greekomegatonos             254
-\definecharacter greekiotadialytika          250
-\definecharacter greekupsilondialytika       251
-\definecharacter greekiotadialytikatonos     192
-\definecharacter greekupsilondialytikatonos  224
-
-% Miscellaneous Greek symbols
-
-\definecharacter greekleftquot               171
-\definecharacter greekrightquot              187
-\definecharacter greektonos                  180
-\definecharacter greekdialytikatonos         181
-\definecharacter greekapostrophos            162
-
-\stopencoding
diff --git a/tex/context/base/enco-heb.mkii b/tex/context/base/enco-heb.mkii
new file mode 100644
index 000000000..443745752
--- /dev/null
+++ b/tex/context/base/enco-heb.mkii
@@ -0,0 +1,16 @@
+%D \module
+%D   [       file=enco-heb,
+%D        version=2005.01.27,
+%D          title=\CONTEXT\ Encoding Macros,
+%D       subtitle=Hebrew,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright=PRAGMA-ADE]
+%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 To be done.
+
+\endinput
diff --git a/tex/context/base/enco-heb.tex b/tex/context/base/enco-heb.tex
deleted file mode 100644
index 443745752..000000000
--- a/tex/context/base/enco-heb.tex
+++ /dev/null
@@ -1,16 +0,0 @@
-%D \module
-%D   [       file=enco-heb,
-%D        version=2005.01.27,
-%D          title=\CONTEXT\ Encoding Macros,
-%D       subtitle=Hebrew,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright=PRAGMA-ADE]
-%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 To be done.
-
-\endinput
diff --git a/tex/context/base/enco-ibm.mkii b/tex/context/base/enco-ibm.mkii
new file mode 100644
index 000000000..48695ca52
--- /dev/null
+++ b/tex/context/base/enco-ibm.mkii
@@ -0,0 +1,7 @@
+% temporary module, needed for downward compatibility
+
+%\input regi-ibm.tex 
+
+\enableregime[ibm] 
+
+\endinput 
diff --git a/tex/context/base/enco-ibm.tex b/tex/context/base/enco-ibm.tex
deleted file mode 100644
index 48695ca52..000000000
--- a/tex/context/base/enco-ibm.tex
+++ /dev/null
@@ -1,7 +0,0 @@
-% temporary module, needed for downward compatibility
-
-%\input regi-ibm.tex 
-
-\enableregime[ibm] 
-
-\endinput 
diff --git a/tex/context/base/enco-il2.mkii b/tex/context/base/enco-il2.mkii
new file mode 100644
index 000000000..9fb87b2fd
--- /dev/null
+++ b/tex/context/base/enco-il2.mkii
@@ -0,0 +1,157 @@
+%D \module
+%D   [     file=enco-il2,
+%D      version=2000.05.07, % 1998.12.01,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Czech and Slovak ISO Latin 2 Encoding,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% This encoding will go but the regime will remain.
+
+%D This Czech/Slovak encoding is dedicated to Han The Thanh.
+%D The numbers are derived from some files he sent me. This
+%D definition file is (still) sort of beta.
+
+\startmapping[il2]
+
+\resetcaserange 127 to 255    % we map them all to themselves
+
+\definecaseswap 184 152
+\definecaseswap 181 165
+\definecaseswap 185 169
+\definecaseswap 187 171
+\definecaseswap 190 174
+\definecaseswap 224 192
+\definecaseswap 225 193
+\definecaseswap 228 196
+\definecaseswap 229 197
+\definecaseswap 232 200
+\definecaseswap 233 201
+\definecaseswap 236 204
+\definecaseswap 237 205
+\definecaseswap 239 207
+\definecaseswap 242 210
+\definecaseswap 243 211
+\definecaseswap 244 212
+\definecaseswap 246 214
+\definecaseswap 248 216
+\definecaseswap 249 217
+\definecaseswap 250 218
+\definecaseswap 252 220
+\definecaseswap 253 221
+
+\stopmapping
+
+\startencoding[il2][il2]
+
+\definecharacter textgrave          18
+\definecharacter textacute          19
+\definecharacter textcaron          20
+\definecharacter textbreve          21
+\definecharacter textmacron         22
+\definecharacter textring           23
+\definecharacter textcedilla        24
+\definecharacter textcircumflex     94
+\definecharacter textdotaccent      95
+\definecharacter texthungarumlaut  125
+\definecharacter texttilde         126
+\definecharacter textdiaeresis     127
+
+\definecharacter dotlessi       16
+\definecharacter dotlessj       17
+
+\definecharacter aeligature     26
+\definecharacter AEligature     29
+\definecharacter oeligature     27
+\definecharacter OEligature     30
+
+\definecharacter ssharp         25
+
+\definecharacter Racute        192
+\definecharacter Aacute        193
+\definecharacter Lacute        197
+\definecharacter Eacute        201
+\definecharacter Iacute        205
+\definecharacter Oacute        211
+\definecharacter Uacute        218
+\definecharacter Yacute        221
+\definecharacter racute        224
+\definecharacter aacute        225
+\definecharacter lacute        229
+\definecharacter eacute        233
+\definecharacter iacute        237
+\definecharacter oacute        243
+\definecharacter uacute        250
+\definecharacter yacute        253
+
+\definecharacter Lcaron        165
+\definecharacter Scaron        169
+\definecharacter Tcaron        171
+\definecharacter Zcaron        174
+\definecharacter lcaron        181
+\definecharacter scaron        185
+\definecharacter tcaron        187
+\definecharacter zcaron        190
+\definecharacter Ccaron        200
+\definecharacter Ecaron        204
+\definecharacter Dcaron        207
+\definecharacter Ncaron        210
+\definecharacter Rcaron        216
+\definecharacter ccaron        232
+\definecharacter ecaron        236
+\definecharacter dcaron        239
+\definecharacter ncaron        242
+\definecharacter rcaron        248
+
+\definecharacter Ocircumflex   212
+\definecharacter ocircumflex   244
+
+\definecharacter Adiaeresis    196
+\definecharacter Odiaeresis    214
+\definecharacter Udiaeresis    220
+\definecharacter adiaeresis    228
+\definecharacter odiaeresis    246
+\definecharacter udiaeresis    252
+
+\definecharacter Agrave        152
+\definecharacter agrave        184
+
+\definecharacter Ohungarumlaut 213
+\definecharacter Uhungarumlaut 219
+\definecharacter ohungarumlaut 245
+\definecharacter uhungarumlaut 251
+
+\definecharacter Uring         217
+\definecharacter uring         249
+\definecharacter Aring         {\ilencodedrA}
+
+\definecharacter ostroke        28
+\definecharacter Ostroke        31
+\definecharacter Lstroke       {\ilencodedL}
+\definecharacter lstroke       {\ilencodedl}
+
+\def\ilencodedrA
+  {\dontleavehmode\hbox\bgroup
+   \setbox0\hbox{h}%
+   \dimen0=\ht0
+   \advance\dimen0 by -1ex
+   \rlap{\raise.67\dimen0\hbox{\char'27}}A%
+   \egroup}
+
+\def\ilencodedl
+  {\dontleavehmode{\char32l}}
+
+\def\ilencodedL
+  {\dontleavehmode\hbox\bgroup
+   \setbox0\hbox{L}%
+   \hbox to\wd0{\hss\char32L}%
+   \egroup}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-il2.tex b/tex/context/base/enco-il2.tex
deleted file mode 100644
index 9fb87b2fd..000000000
--- a/tex/context/base/enco-il2.tex
+++ /dev/null
@@ -1,157 +0,0 @@
-%D \module
-%D   [     file=enco-il2,
-%D      version=2000.05.07, % 1998.12.01,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Czech and Slovak ISO Latin 2 Encoding,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=PRAGMA-ADE]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% This encoding will go but the regime will remain.
-
-%D This Czech/Slovak encoding is dedicated to Han The Thanh.
-%D The numbers are derived from some files he sent me. This
-%D definition file is (still) sort of beta.
-
-\startmapping[il2]
-
-\resetcaserange 127 to 255    % we map them all to themselves
-
-\definecaseswap 184 152
-\definecaseswap 181 165
-\definecaseswap 185 169
-\definecaseswap 187 171
-\definecaseswap 190 174
-\definecaseswap 224 192
-\definecaseswap 225 193
-\definecaseswap 228 196
-\definecaseswap 229 197
-\definecaseswap 232 200
-\definecaseswap 233 201
-\definecaseswap 236 204
-\definecaseswap 237 205
-\definecaseswap 239 207
-\definecaseswap 242 210
-\definecaseswap 243 211
-\definecaseswap 244 212
-\definecaseswap 246 214
-\definecaseswap 248 216
-\definecaseswap 249 217
-\definecaseswap 250 218
-\definecaseswap 252 220
-\definecaseswap 253 221
-
-\stopmapping
-
-\startencoding[il2][il2]
-
-\definecharacter textgrave          18
-\definecharacter textacute          19
-\definecharacter textcaron          20
-\definecharacter textbreve          21
-\definecharacter textmacron         22
-\definecharacter textring           23
-\definecharacter textcedilla        24
-\definecharacter textcircumflex     94
-\definecharacter textdotaccent      95
-\definecharacter texthungarumlaut  125
-\definecharacter texttilde         126
-\definecharacter textdiaeresis     127
-
-\definecharacter dotlessi       16
-\definecharacter dotlessj       17
-
-\definecharacter aeligature     26
-\definecharacter AEligature     29
-\definecharacter oeligature     27
-\definecharacter OEligature     30
-
-\definecharacter ssharp         25
-
-\definecharacter Racute        192
-\definecharacter Aacute        193
-\definecharacter Lacute        197
-\definecharacter Eacute        201
-\definecharacter Iacute        205
-\definecharacter Oacute        211
-\definecharacter Uacute        218
-\definecharacter Yacute        221
-\definecharacter racute        224
-\definecharacter aacute        225
-\definecharacter lacute        229
-\definecharacter eacute        233
-\definecharacter iacute        237
-\definecharacter oacute        243
-\definecharacter uacute        250
-\definecharacter yacute        253
-
-\definecharacter Lcaron        165
-\definecharacter Scaron        169
-\definecharacter Tcaron        171
-\definecharacter Zcaron        174
-\definecharacter lcaron        181
-\definecharacter scaron        185
-\definecharacter tcaron        187
-\definecharacter zcaron        190
-\definecharacter Ccaron        200
-\definecharacter Ecaron        204
-\definecharacter Dcaron        207
-\definecharacter Ncaron        210
-\definecharacter Rcaron        216
-\definecharacter ccaron        232
-\definecharacter ecaron        236
-\definecharacter dcaron        239
-\definecharacter ncaron        242
-\definecharacter rcaron        248
-
-\definecharacter Ocircumflex   212
-\definecharacter ocircumflex   244
-
-\definecharacter Adiaeresis    196
-\definecharacter Odiaeresis    214
-\definecharacter Udiaeresis    220
-\definecharacter adiaeresis    228
-\definecharacter odiaeresis    246
-\definecharacter udiaeresis    252
-
-\definecharacter Agrave        152
-\definecharacter agrave        184
-
-\definecharacter Ohungarumlaut 213
-\definecharacter Uhungarumlaut 219
-\definecharacter ohungarumlaut 245
-\definecharacter uhungarumlaut 251
-
-\definecharacter Uring         217
-\definecharacter uring         249
-\definecharacter Aring         {\ilencodedrA}
-
-\definecharacter ostroke        28
-\definecharacter Ostroke        31
-\definecharacter Lstroke       {\ilencodedL}
-\definecharacter lstroke       {\ilencodedl}
-
-\def\ilencodedrA
-  {\dontleavehmode\hbox\bgroup
-   \setbox0\hbox{h}%
-   \dimen0=\ht0
-   \advance\dimen0 by -1ex
-   \rlap{\raise.67\dimen0\hbox{\char'27}}A%
-   \egroup}
-
-\def\ilencodedl
-  {\dontleavehmode{\char32l}}
-
-\def\ilencodedL
-  {\dontleavehmode\hbox\bgroup
-   \setbox0\hbox{L}%
-   \hbox to\wd0{\hss\char32L}%
-   \egroup}
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-ini.mkii b/tex/context/base/enco-ini.mkii
index 9379c3a7f..1ac491e62 100644
--- a/tex/context/base/enco-ini.mkii
+++ b/tex/context/base/enco-ini.mkii
@@ -93,7 +93,7 @@
      {\letvalue{\c!file\f!encodingprefix#1}\empty
       \makeshortfilename[\truefilename{\f!encodingprefix#1}]%
       \startreadingfile
-        \readsysfile\shortfilename
+        \readsysfile{\shortfilename.mkii}
           {\showmessage\m!encodings2{#1}}
           {\showmessage\m!encodings3{#1}}%
       \stopreadingfile}}
@@ -747,11 +747,11 @@
 %D can be used to check the correct loading of hyphenation
 %D patterns.
 
-\fetchruntimecommand \showaccents         {\f!encodingprefix\s!run}
-\fetchruntimecommand \showcharacters      {\f!encodingprefix\s!run}
-\fetchruntimecommand \showcharacterbounds {\f!encodingprefix\s!run}
-\fetchruntimecommand \showhyphenations    {\f!encodingprefix\s!run}
-\fetchruntimecommand \showmapping         {\f!encodingprefix\s!run}
+\fetchruntimecommand \showaccents         {\f!encodingprefix\s!run.mkii}
+\fetchruntimecommand \showcharacters      {\f!encodingprefix\s!run.mkii}
+\fetchruntimecommand \showcharacterbounds {\f!encodingprefix\s!run.mkii}
+\fetchruntimecommand \showhyphenations    {\f!encodingprefix\s!run.mkii}
+\fetchruntimecommand \showmapping         {\f!encodingprefix\s!run.mkii}
 
 %D \macros
 %D   {everyuppercase, EveryUppercase,
diff --git a/tex/context/base/enco-ini.mkiv b/tex/context/base/enco-ini.mkiv
index 5fd3d9cef..112c5596a 100644
--- a/tex/context/base/enco-ini.mkiv
+++ b/tex/context/base/enco-ini.mkiv
@@ -11,12 +11,12 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-%D This is s stripped down version of th eoriginal enco-ini.tex
+%D This is stripped down version of th eoriginal enco-ini.tex
 %D file. For more details you might want to study the \MKII\ file
 %D but since \LUATEX\ is unicode inside we need less code.
 
-% When dealing with characters we have four cases to take into account when moving
-% from mkii to mkiv:
+% When dealing with characters we have four cases to take into account
+% when moving from mkii to mkiv:
 
 % 1.    => ref to slot 200 in current font
 % 2. \char 200    => ref to slot 200 in current font
@@ -36,36 +36,19 @@
 
 \unprotect
 
-%D Quite some commands are now obsolete. These nillers will disappear soon.
-
-\def\currentencoding    {utf}
-\def\currentmapping     {utf}
-
-\let\defaultencoding    \s!default
-\let\characterencoding  \s!default
-\let\nocharacterencoding\s!default
-
-\def\setupencoding          [#1]{}
-\def\startmapping           [#1]{\gobbleuntil\stopmapping}
-\def\startencoding          [#1]{}
-\let\stopencoding           \relax
-\let\startcoding            \startencoding
-\let\stopcoding             \relax
-\def\optimizemapping        [#1]{}
-\def\enablemapping          [#1]{}
-\def\enableencoding         [#1]{}
-\def\enablecoding           [#1]{}
-\def\fastenableencoding       #1{}
-\def\enablelanguagespecifics[#1]{}
-\def\useencoding            [#1]{}
-
-\let\dontexpandencoding     \relax
-\let\keepencodedtokens      \relax
-\let\literateencodedtokens  \relax
-\let\stringifyencodedtokens \relax
-\let\dontexpandencodedtokens\relax
-\let\convertencodedtokens   \relax
-\let\ignoreencoding         \relax
+%D Quite some commands are now obsolete. We keep only a few commands
+%D around, just in case they are used in styles (and in for instance
+%D symb and xtag files).
+
+\def\startencoding [#1]{} % used in symb
+\let\stopencoding  \relax
+\def\setupencoding [#1]{}
+\def\enablemapping [#1]{}
+\def\enableencoding[#1]{}
+
+\def\currentencoding{utf}
+\def\currentmapping {utf}
+\let\defaultencoding\s!default
 
 % todo:
 
@@ -78,14 +61,12 @@
 %D \macros
 %D   {defineaccent, definecharacter, definecommand}
 
-\def\accentprefix{@acc@}
-
 \def\defineaccent#1 #2 #3 %
   {\setevalue{\string#1}{\noexpand\dohandleaccent{\string#1}}%
-   \setvalue{\accentprefix\string#1\string#2}{#3}}
+   \setvalue{\??ac\string#1\string#2}{#3}}
 
 \def\dohandleaccent#1#2%
-  {\csname\accentprefix\string#1\string#2\endcsname}
+  {\csname\??ac\string#1\string#2\endcsname}
 
 \def\definecharacter#1 #2 %
   {\doifnumberelse{\string#2}
@@ -102,7 +83,7 @@
 
 \newevery \everyuppercase \EveryUppercase
 \newevery \everylowercase \EveryLowercase
-\newevery \everysanitize \EverySanitize
+\newevery \everysanitize  \EverySanitize
 
 %D Some saved meanings (not really needed):
 
@@ -371,21 +352,6 @@
       \vrule \!!width\scratchdimen              \!!height5.5\scratchdimen\!!depth3\scratchdimen
       \kern\scratchdimen}}
 
-% what to do with these:
-%
-% \definecharacter mathacute      "7013
-% \definecharacter mathgrave      "7012
-% \definecharacter mathddot       "707F
-% \definecharacter mathtilde      "707E
-% \definecharacter mathbar        "7016
-% \definecharacter mathbreve      "7015
-% \definecharacter mathcheck      "7014
-% \definecharacter mathhat        "705E
-% \definecharacter mathvec        "017E
-% \definecharacter mathdot        "705F
-% \definecharacter mathwidetilde  "0365
-% \definecharacter mathwidehat    "0362
-
 % from enco-acc:
 
 \defineaccent ^ A {\Acircumflex}   \defineaccent ^ a {\acircumflex}
@@ -412,6 +378,7 @@
 \defineaccent ~ I {\Itilde}        \defineaccent ~ i {\itilde}       \defineaccent ~ {\i} {\itilde}
 \defineaccent ~ O {\Otilde}        \defineaccent ~ o {\otilde}
 \defineaccent ~ U {\Utilde}        \defineaccent ~ u {\utilde}
+\defineaccent ~ N {\Ntilde}        \defineaccent ~ n {\ntilde}
 
 \defineaccent " A {\Adiaeresis}    \defineaccent " a {\adiaeresis}
 \defineaccent " E {\Ediaeresis}    \defineaccent " e {\ediaeresis}
@@ -512,7 +479,6 @@
         \!!width \wd\scratchbox
         \!!height\zeropoint}}
 
-
 \def\fakeunderscores{\let\_\fakeunderscore}
 \def\textunderscores{\let\_\textunderscore}
 
diff --git a/tex/context/base/enco-lat.mkii b/tex/context/base/enco-lat.mkii
new file mode 100644
index 000000000..2623aae8d
--- /dev/null
+++ b/tex/context/base/enco-lat.mkii
@@ -0,0 +1,7 @@
+% temporary module, needed for downward compatibility
+
+\input regi-lat.tex
+
+\enableregime[latin2]
+
+\endinput
diff --git a/tex/context/base/enco-lat.tex b/tex/context/base/enco-lat.tex
deleted file mode 100644
index 2623aae8d..000000000
--- a/tex/context/base/enco-lat.tex
+++ /dev/null
@@ -1,7 +0,0 @@
-% temporary module, needed for downward compatibility
-
-\input regi-lat.tex
-
-\enableregime[latin2]
-
-\endinput
diff --git a/tex/context/base/enco-mis.mkii b/tex/context/base/enco-mis.mkii
new file mode 100644
index 000000000..92dc61b3f
--- /dev/null
+++ b/tex/context/base/enco-mis.mkii
@@ -0,0 +1,188 @@
+%D \module
+%D   [       file=enco-mis,
+%D        version=2000.05.07, % 1999.11.11,
+%D          title=\CONTEXT\ Encoding Macros,
+%D       subtitle=Missing Glyphs,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright=PRAGMA-ADE]
+%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 In this file we collect some definitions that construct
+%D pseudo characters. Some day we will move some definitions
+%D from \type {plain.tex} to this file. Some definitions are
+%D derived from definitions in the \LATEX\ distribution,
+%D especially Johannes Braams' Babel system.
+
+\startmapping[\s!default]
+
+\defineuppercasecom \dj  \DJ
+\defineuppercasecom \Dj  \dj
+\defineuppercasecom \DJ  \dj
+
+\definecharacter dstroke {\pseudoencodeddj}
+\definecharacter Dstroke {\pseudoencodedDJ}
+
+\stopmapping
+
+%D We need proper names like in enco-com.tex!
+
+\definecharacter dj {\dstroke} % {\pseudoencodeddj}
+\definecharacter Dj {\Dstroke} % {\pseudoencodedDJ}
+\definecharacter DJ {\Dstroke} % {\pseudoencodedDJ}
+
+\unprotect
+
+\def\pseudoencodeddj % like in babel, but safer
+  {\dontleavehmode\hbox\bgroup
+   \setbox\scratchbox\hbox{d}%
+   \scratchdimen\ht\scratchbox
+   \advance\scratchdimen 1ex
+   \scratchdimen.45\scratchdimen
+   \dimen2=\withoutpt\the\slantperpoint\dimen0
+   \advance\dimen2 .5ex
+   \hbox to \wd\scratchbox
+     {\box\scratchbox\hss
+      \raise\scratchdimen\hbox{\kern\dimen2\vbox{\hrule\!!height0.1ex\!!width0.3em}}}%
+   \egroup}
+
+\def\pseudoencodedDJ % design: taco; quality assurance: mojca; cleanup: hans
+  {\dontleavehmode
+   \hbox\bgroup
+   \setbox\scratchbox\hbox{D}%
+   \dimen2=1.1ex
+   \dimen2=\withoutpt\the\slantperpoint\dimen2
+   \hbox to \wd\scratchbox
+     {\rlap
+        {\raise.52\ht\scratchbox
+         \hbox
+           {\kern\dimen2
+            \vbox{\hrule\!!height.04ex\!!depth.04ex\!!width.4\wd\scratchbox}}}%
+     \box\scratchbox}%
+   \egroup}
+
+% currency
+
+\def\fakedollar % pretty cmr dependent
+  {\bgroup
+   \ifnum\fam=\itfam
+     \sl
+   \else\ifnum\fam=\bifam
+     \bs
+   \fi\fi
+   \$%
+   \egroup}
+
+\def\fakesterling % pretty cmr dependent
+  {\bgroup
+   \ifnum\fam=\bffam
+     \bi
+   \else\ifnum\fam=\bifam
+     \bi
+   \else\ifnum\fam=\bsfam
+     \bi
+   \else
+     \it
+   \fi\fi\fi
+   \$%
+   \egroup}
+
+\def\fakeflorin
+  {\bgroup
+   \ifnum\fam=\bffam
+     \bi
+   \else\ifnum\fam=\bifam
+     \bi
+   \else\ifnum\fam=\bsfam
+     \bi
+   \else
+     \it
+   \fi\fi\fi
+   f%
+   \egroup}
+
+% perthings
+
+\def\fakepercent
+  {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle0}}}
+
+\def\fakeperthousand
+  {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle00}}}
+
+\def\fakepermine
+  {\dontleavehmode
+   \bgroup
+   \setbox\scratchbox\hbox
+     {\mathematics{+}}%
+   \hbox to \wd\scratchbox
+     {\hss
+      \mathematics{^{\scriptscriptstyle-}\kern-.4em/\kern-.3em_{\scriptscriptstyle-}}%
+      \hss}%
+   \egroup}
+
+% guillemots
+
+%D Yes I know, they are ugly:
+
+\def\fakeleftguillemot
+  {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle\ll$}}}
+
+\def\fakerightguillemot
+  {\hbox{\raise.25ex\hbox{$\scriptscriptstyle\gg$}}}
+
+\def\fakeleftsubguillemot
+  {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle<$}}}
+
+\def\fakerightsubguillemot
+  {\hbox{\raise.25ex\hbox{$\scriptscriptstyle>$}}}
+
+%D Needed:
+
+\def\fakevisiblespace
+  {\leavevmode\hbox
+     {\setbox\scratchbox\hbox{(}%
+      \scratchdimen.1\dp\scratchbox
+      \setbox\scratchbox\hbox{\space}%
+      \hbox to \wd\scratchbox
+        {\vrule
+           \!!depth  5\scratchdimen
+           \!!width   \scratchdimen
+           \!!height  \zeropoint
+         \hss
+         \vrule
+           \!!depth  5\scratchdimen
+           \!!width   \wd\scratchbox
+           \!!height-4\scratchdimen
+         \hss
+         \vrule
+           \!!depth  5\scratchdimen
+           \!!width   \scratchdimen
+           \!!height  \zeropoint}}}
+
+%\def\fakeunderscore{\leavevmode\kern.06em\vbox{\hrule\!!width.3em}}
+
+\def\fakeunderscore
+  {\leavevmode\hbox
+     {\setbox\scratchbox\hbox{(}%
+      \scratchdimen.2\dp\scratchbox
+      \setbox\scratchbox\hbox{\space}%
+      \vrule
+        \!!depth \scratchdimen
+        \!!width \wd\scratchbox
+        \!!height\zeropoint}}
+
+\ifx\mathunderscore\undefined \let\mathunderscore\fakeunderscore \fi
+\ifx\textunderscore\undefined \let\textunderscore\fakeunderscore \fi
+
+\unexpanded\def\normalunderscore{\ifmmode\mathunderscore\else\textunderscore\fi}
+
+\let\_\normalunderscore
+
+% Handy but obsolete, replaced by \unknownchar:
+%
+% \def\missingglyph{\ruledhbox{?}}
+
+\protect \endinput
diff --git a/tex/context/base/enco-mis.tex b/tex/context/base/enco-mis.tex
deleted file mode 100644
index 92dc61b3f..000000000
--- a/tex/context/base/enco-mis.tex
+++ /dev/null
@@ -1,188 +0,0 @@
-%D \module
-%D   [       file=enco-mis,
-%D        version=2000.05.07, % 1999.11.11,
-%D          title=\CONTEXT\ Encoding Macros,
-%D       subtitle=Missing Glyphs,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright=PRAGMA-ADE]
-%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 In this file we collect some definitions that construct
-%D pseudo characters. Some day we will move some definitions
-%D from \type {plain.tex} to this file. Some definitions are
-%D derived from definitions in the \LATEX\ distribution,
-%D especially Johannes Braams' Babel system.
-
-\startmapping[\s!default]
-
-\defineuppercasecom \dj  \DJ
-\defineuppercasecom \Dj  \dj
-\defineuppercasecom \DJ  \dj
-
-\definecharacter dstroke {\pseudoencodeddj}
-\definecharacter Dstroke {\pseudoencodedDJ}
-
-\stopmapping
-
-%D We need proper names like in enco-com.tex!
-
-\definecharacter dj {\dstroke} % {\pseudoencodeddj}
-\definecharacter Dj {\Dstroke} % {\pseudoencodedDJ}
-\definecharacter DJ {\Dstroke} % {\pseudoencodedDJ}
-
-\unprotect
-
-\def\pseudoencodeddj % like in babel, but safer
-  {\dontleavehmode\hbox\bgroup
-   \setbox\scratchbox\hbox{d}%
-   \scratchdimen\ht\scratchbox
-   \advance\scratchdimen 1ex
-   \scratchdimen.45\scratchdimen
-   \dimen2=\withoutpt\the\slantperpoint\dimen0
-   \advance\dimen2 .5ex
-   \hbox to \wd\scratchbox
-     {\box\scratchbox\hss
-      \raise\scratchdimen\hbox{\kern\dimen2\vbox{\hrule\!!height0.1ex\!!width0.3em}}}%
-   \egroup}
-
-\def\pseudoencodedDJ % design: taco; quality assurance: mojca; cleanup: hans
-  {\dontleavehmode
-   \hbox\bgroup
-   \setbox\scratchbox\hbox{D}%
-   \dimen2=1.1ex
-   \dimen2=\withoutpt\the\slantperpoint\dimen2
-   \hbox to \wd\scratchbox
-     {\rlap
-        {\raise.52\ht\scratchbox
-         \hbox
-           {\kern\dimen2
-            \vbox{\hrule\!!height.04ex\!!depth.04ex\!!width.4\wd\scratchbox}}}%
-     \box\scratchbox}%
-   \egroup}
-
-% currency
-
-\def\fakedollar % pretty cmr dependent
-  {\bgroup
-   \ifnum\fam=\itfam
-     \sl
-   \else\ifnum\fam=\bifam
-     \bs
-   \fi\fi
-   \$%
-   \egroup}
-
-\def\fakesterling % pretty cmr dependent
-  {\bgroup
-   \ifnum\fam=\bffam
-     \bi
-   \else\ifnum\fam=\bifam
-     \bi
-   \else\ifnum\fam=\bsfam
-     \bi
-   \else
-     \it
-   \fi\fi\fi
-   \$%
-   \egroup}
-
-\def\fakeflorin
-  {\bgroup
-   \ifnum\fam=\bffam
-     \bi
-   \else\ifnum\fam=\bifam
-     \bi
-   \else\ifnum\fam=\bsfam
-     \bi
-   \else
-     \it
-   \fi\fi\fi
-   f%
-   \egroup}
-
-% perthings
-
-\def\fakepercent
-  {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle0}}}
-
-\def\fakeperthousand
-  {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle00}}}
-
-\def\fakepermine
-  {\dontleavehmode
-   \bgroup
-   \setbox\scratchbox\hbox
-     {\mathematics{+}}%
-   \hbox to \wd\scratchbox
-     {\hss
-      \mathematics{^{\scriptscriptstyle-}\kern-.4em/\kern-.3em_{\scriptscriptstyle-}}%
-      \hss}%
-   \egroup}
-
-% guillemots
-
-%D Yes I know, they are ugly:
-
-\def\fakeleftguillemot
-  {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle\ll$}}}
-
-\def\fakerightguillemot
-  {\hbox{\raise.25ex\hbox{$\scriptscriptstyle\gg$}}}
-
-\def\fakeleftsubguillemot
-  {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle<$}}}
-
-\def\fakerightsubguillemot
-  {\hbox{\raise.25ex\hbox{$\scriptscriptstyle>$}}}
-
-%D Needed:
-
-\def\fakevisiblespace
-  {\leavevmode\hbox
-     {\setbox\scratchbox\hbox{(}%
-      \scratchdimen.1\dp\scratchbox
-      \setbox\scratchbox\hbox{\space}%
-      \hbox to \wd\scratchbox
-        {\vrule
-           \!!depth  5\scratchdimen
-           \!!width   \scratchdimen
-           \!!height  \zeropoint
-         \hss
-         \vrule
-           \!!depth  5\scratchdimen
-           \!!width   \wd\scratchbox
-           \!!height-4\scratchdimen
-         \hss
-         \vrule
-           \!!depth  5\scratchdimen
-           \!!width   \scratchdimen
-           \!!height  \zeropoint}}}
-
-%\def\fakeunderscore{\leavevmode\kern.06em\vbox{\hrule\!!width.3em}}
-
-\def\fakeunderscore
-  {\leavevmode\hbox
-     {\setbox\scratchbox\hbox{(}%
-      \scratchdimen.2\dp\scratchbox
-      \setbox\scratchbox\hbox{\space}%
-      \vrule
-        \!!depth \scratchdimen
-        \!!width \wd\scratchbox
-        \!!height\zeropoint}}
-
-\ifx\mathunderscore\undefined \let\mathunderscore\fakeunderscore \fi
-\ifx\textunderscore\undefined \let\textunderscore\fakeunderscore \fi
-
-\unexpanded\def\normalunderscore{\ifmmode\mathunderscore\else\textunderscore\fi}
-
-\let\_\normalunderscore
-
-% Handy but obsolete, replaced by \unknownchar:
-%
-% \def\missingglyph{\ruledhbox{?}}
-
-\protect \endinput
diff --git a/tex/context/base/enco-pdf.mkii b/tex/context/base/enco-pdf.mkii
new file mode 100644
index 000000000..a03e81df2
--- /dev/null
+++ b/tex/context/base/enco-pdf.mkii
@@ -0,0 +1,278 @@
+%D \module
+%D   [     file=enco-pdf,
+%D      version=1995.01.01,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=\YandY\ texnansi Encoding,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=Hans Hagen]
+%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 is the \PDF\ document encoding.
+
+\startencoding[pdfdoc] % \rawcharacter{number}
+
+\definecharacter oeligature        ^^9c
+
+\definecharacter leftguillemot     ^^ab
+\definecharacter rightguillemot    ^^bb
+
+\definecharacter Agrave            ^^c0
+\definecharacter Aacute            ^^c1
+\definecharacter Acircumflex       ^^c2
+\definecharacter Atilde            ^^c3
+\definecharacter Adiaeresis        ^^c4
+\definecharacter OAligature        ^^c5
+\definecharacter AEligature        ^^c6
+\definecharacter Ccedilla          ^^c7
+\definecharacter Egrave            ^^c8
+\definecharacter Eacute            ^^c9
+\definecharacter Ecircumflex       ^^ca
+\definecharacter Ediaeresis        ^^cb
+\definecharacter Igrave            ^^cc
+\definecharacter Iacute            ^^cd
+\definecharacter Icircumflex       ^^ce
+\definecharacter Idiaeresis        ^^cf
+
+\definecharacter Ntilde            ^^d1
+\definecharacter Ograve            ^^d2
+\definecharacter Oacute            ^^d3
+\definecharacter Ocircumflex       ^^d4
+\definecharacter Otilde            ^^d5
+\definecharacter Odiaeresis        ^^d6
+
+\definecharacter Ugrave            ^^d9
+\definecharacter Uacute            ^^da
+\definecharacter Ucircumflex       ^^db
+\definecharacter Udiaeresis        ^^dc
+\definecharacter Yacute            ^^dd
+
+\definecharacter ssharp            ^^df
+\definecharacter agrave            ^^e0
+\definecharacter aacute            ^^e1
+\definecharacter acircumflex       ^^e2
+\definecharacter atilde            ^^e3
+\definecharacter adiaeresis        ^^e4
+\definecharacter oaligature        ^^e5
+\definecharacter aeligature        ^^e6
+\definecharacter ccedilla          ^^e7
+\definecharacter egrave            ^^e8
+\definecharacter eacute            ^^e9
+\definecharacter ecircumflex       ^^ea
+\definecharacter ediaeresis        ^^eb
+\definecharacter igrave            ^^ec
+\definecharacter iacute            ^^ed
+\definecharacter icircumflex       ^^ee
+\definecharacter idiaeresis        ^^ef
+
+\definecharacter ntilde            ^^f1
+\definecharacter ograve            ^^f2
+\definecharacter oacute            ^^f3
+\definecharacter ocircumflex       ^^f4
+\definecharacter otilde            ^^f5
+\definecharacter odiaeresis        ^^f6
+
+\definecharacter ugrave            ^^f9
+\definecharacter uacute            ^^fa
+\definecharacter ucircumflex       ^^fb
+\definecharacter udiaeresis        ^^fc
+\definecharacter yacute            ^^fd
+
+\definecharacter ydiaeresis        ^^ff
+
+\definecharacter leftsubguillemot  {\leftguillemot}
+\definecharacter rightsubguillemot {\rightguillemot}
+
+\definecharacter Uhungarumlaut     {\Ucircumflex}
+\definecharacter uhungarumlaut     {\ucircumflex}
+\definecharacter Ohungarumlaut     {\Ocircumflex}
+\definecharacter ohungarumlaut     {\ocircumflex}
+
+\definecharacter Aogonek           {A}
+\definecharacter aogonek           {a}
+\definecharacter Eogonek           {E}
+\definecharacter eogonek           {e}
+\definecharacter Iogonek           {I}
+\definecharacter iogonek           {i}
+\definecharacter Uogonek           {U}
+\definecharacter uogonek           {u}
+
+\definecharacter Aring             {A}
+\definecharacter aring             {a}
+\definecharacter Uring             {U}
+\definecharacter uring             {u}
+
+\definecharacter Abreve            {A}
+\definecharacter abreve            {a}
+\definecharacter Ebreve            {E}
+\definecharacter ebreve            {e}
+\definecharacter Gbreve            {G}
+\definecharacter gbreve            {g}
+\definecharacter Ibreve            {I}
+\definecharacter ibreve            {i}
+\definecharacter Obreve            {O}
+\definecharacter obreve            {o}
+\definecharacter Ubreve            {U}
+\definecharacter ubreve            {u}
+
+\definecharacter Ccaron            {C}
+\definecharacter ccaron            {c}
+\definecharacter Dcaron            {D}
+\definecharacter dcaron            {d}
+\definecharacter Ecaron            {E}
+\definecharacter ecaron            {e}
+\definecharacter Lcaron            {L}
+\definecharacter lcaron            {l}
+\definecharacter Ncaron            {N}
+\definecharacter ncaron            {n}
+\definecharacter Rcaron            {R}
+\definecharacter rcaron            {r}
+\definecharacter Scaron            {S}
+\definecharacter scaron            {s}
+\definecharacter Tcaron            {T}
+\definecharacter tcaron            {t}
+\definecharacter Ycaron            {Y}
+\definecharacter ycaron            {y}
+\definecharacter Zcaron            {Z}
+\definecharacter zcaron            {z}
+
+\definecharacter Lstroke           {L}
+\definecharacter lstroke           {l}
+\definecharacter Ostroke           {O}
+\definecharacter ostroke           {o}
+
+\definecharacter aumlaut           {\adiaeresis}
+\definecharacter eumlaut           {\ediaeresis}
+\definecharacter iumlaut           {\idiaeresis}
+\definecharacter oumlaut           {\odiaeresis}
+\definecharacter uumlaut           {\udiaeresis}
+
+\definecharacter Aumlaut           {\Adiaeresis}
+\definecharacter Eumlaut           {\Ediaeresis}
+\definecharacter Iumlaut           {\Idiaeresis}
+\definecharacter Oumlaut           {\Odiaeresis}
+\definecharacter Uumlaut           {\Udiaeresis}
+
+\definecharacter scommaaccent      {s}
+\definecharacter Scommaaccent      {S}
+\definecharacter tcommaaccent      {t}
+\definecharacter Tcommaaccent      {T}
+
+\definecharacter Etilde            {E}
+\definecharacter etilde            {e}
+
+\definecharacter Ahook             {A}
+\definecharacter ahook             {a}
+\definecharacter Ehook             {E}
+\definecharacter ehook             {e}
+\definecharacter Ihook             {I}
+\definecharacter ihook             {i}
+\definecharacter Ohook             {O}
+\definecharacter ohook             {o}
+\definecharacter Uhook             {U}
+\definecharacter uhook             {u}
+\definecharacter Yhook             {Y}
+\definecharacter yhook             {y}
+
+\definecharacter Acircumflexgrave  {\Acircumflex}
+\definecharacter Acircumflexacute  {\Acircumflex}
+\definecharacter Acircumflextilde  {\Acircumflex}
+\definecharacter Acircumflexhook   {\Acircumflex}
+\definecharacter acircumflexgrave  {\acircumflex}
+\definecharacter acircumflexacute  {\acircumflex}
+\definecharacter acircumflextilde  {\acircumflex}
+\definecharacter acircumflexhook   {\acircumflex}
+\definecharacter Ecircumflexgrave  {\Ecircumflex}
+\definecharacter Ecircumflexacute  {\Ecircumflex}
+\definecharacter Ecircumflextilde  {\Ecircumflex}
+\definecharacter Ecircumflexhook   {\Ecircumflex}
+\definecharacter ecircumflexgrave  {\ecircumflex}
+\definecharacter ecircumflexacute  {\ecircumflex}
+\definecharacter ecircumflextilde  {\ecircumflex}
+\definecharacter ecircumflexhook   {\ecircumflex}
+\definecharacter Ocircumflexgrave  {\Ocircumflex}
+\definecharacter Ocircumflexacute  {\Ocircumflex}
+\definecharacter Ocircumflextilde  {\Ocircumflex}
+\definecharacter Ocircumflexhook   {\Ocircumflex}
+\definecharacter ocircumflexgrave  {\ocircumflex}
+\definecharacter ocircumflexacute  {\ocircumflex}
+\definecharacter ocircumflextilde  {\ocircumflex}
+\definecharacter ocircumflexhook   {\ocircumflex}
+
+\definecharacter Abrevegrave       {A}
+\definecharacter Abreveacute       {A}
+\definecharacter Abrevetilde       {A}
+\definecharacter Abrevehook        {A}
+\definecharacter abrevegrave       {a}
+\definecharacter abreveacute       {a}
+\definecharacter abrevetilde       {a}
+\definecharacter abrevehook        {a}
+
+\definecharacter Adotbelow         {A}
+\definecharacter adotbelow         {a}
+\definecharacter Edotbelow         {E}
+\definecharacter edotbelow         {e}
+\definecharacter Idotbelow         {I}
+\definecharacter idotbelow         {i}
+\definecharacter Odotbelow         {O}
+\definecharacter odotbelow         {o}
+\definecharacter Udotbelow         {U}
+\definecharacter udotbelow         {u}
+\definecharacter Ydotbelow         {Y}
+\definecharacter ydotbelow         {y}
+\definecharacter Ohorndotbelow     {O}
+\definecharacter ohorndotbelow     {o}
+\definecharacter Uhorndotbelow     {U}
+\definecharacter uhorndotbelow     {u}
+
+\definecharacter Acircumflexdotbelow {\Acircumflex}
+\definecharacter acircumflexdotbelow {\acircumflex}
+\definecharacter Ecircumflexdotbelow {\Ecircumflex}
+\definecharacter ecircumflexdotbelow {\ecircumflex}
+\definecharacter Ocircumflexdotbelow {\Ocircumflex}
+\definecharacter ocircumflexdotbelow {\ocircumflex}
+\definecharacter Abrevedotbelow      {\Abreve}
+\definecharacter abrevedotbelow      {\abreve}
+
+\definecharacter Ohorn               {O}
+\definecharacter Ohorngrave          {O}
+\definecharacter Ohornacute          {O}
+\definecharacter Ohorntilde          {O}
+\definecharacter Ohornhook           {O}
+
+\definecharacter ohorn               {o}
+\definecharacter ohorngrave          {o}
+\definecharacter ohornacute          {o}
+\definecharacter ohorntilde          {o}
+\definecharacter ohornhook           {o}
+
+\definecharacter Uhorn               {U}
+\definecharacter Uhorngrave          {U}
+\definecharacter Uhornacute          {U}
+\definecharacter Uhorntilde          {U}
+\definecharacter Uhornhook           {U}
+
+\definecharacter uhorn               {u}
+\definecharacter uhorngrave          {u}
+\definecharacter uhornacute          {u}
+\definecharacter uhorntilde          {u}
+\definecharacter uhornhook           {u}
+
+\definecharacter Utilde              {U}
+\definecharacter utilde              {u}
+\definecharacter Itilde              {I}
+\definecharacter itilde              {i}
+\definecharacter Ygrave	    	     {Y}
+\definecharacter ygrave		         {y}
+\definecharacter Ytilde              {Y}
+\definecharacter ytilde              {y}
+
+\definecharacter dstroke             {d}
+\definecharacter Dstroke             {D}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-pdf.tex b/tex/context/base/enco-pdf.tex
deleted file mode 100644
index a03e81df2..000000000
--- a/tex/context/base/enco-pdf.tex
+++ /dev/null
@@ -1,278 +0,0 @@
-%D \module
-%D   [     file=enco-pdf,
-%D      version=1995.01.01,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=\YandY\ texnansi Encoding,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=Hans Hagen]
-%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 is the \PDF\ document encoding.
-
-\startencoding[pdfdoc] % \rawcharacter{number}
-
-\definecharacter oeligature        ^^9c
-
-\definecharacter leftguillemot     ^^ab
-\definecharacter rightguillemot    ^^bb
-
-\definecharacter Agrave            ^^c0
-\definecharacter Aacute            ^^c1
-\definecharacter Acircumflex       ^^c2
-\definecharacter Atilde            ^^c3
-\definecharacter Adiaeresis        ^^c4
-\definecharacter OAligature        ^^c5
-\definecharacter AEligature        ^^c6
-\definecharacter Ccedilla          ^^c7
-\definecharacter Egrave            ^^c8
-\definecharacter Eacute            ^^c9
-\definecharacter Ecircumflex       ^^ca
-\definecharacter Ediaeresis        ^^cb
-\definecharacter Igrave            ^^cc
-\definecharacter Iacute            ^^cd
-\definecharacter Icircumflex       ^^ce
-\definecharacter Idiaeresis        ^^cf
-
-\definecharacter Ntilde            ^^d1
-\definecharacter Ograve            ^^d2
-\definecharacter Oacute            ^^d3
-\definecharacter Ocircumflex       ^^d4
-\definecharacter Otilde            ^^d5
-\definecharacter Odiaeresis        ^^d6
-
-\definecharacter Ugrave            ^^d9
-\definecharacter Uacute            ^^da
-\definecharacter Ucircumflex       ^^db
-\definecharacter Udiaeresis        ^^dc
-\definecharacter Yacute            ^^dd
-
-\definecharacter ssharp            ^^df
-\definecharacter agrave            ^^e0
-\definecharacter aacute            ^^e1
-\definecharacter acircumflex       ^^e2
-\definecharacter atilde            ^^e3
-\definecharacter adiaeresis        ^^e4
-\definecharacter oaligature        ^^e5
-\definecharacter aeligature        ^^e6
-\definecharacter ccedilla          ^^e7
-\definecharacter egrave            ^^e8
-\definecharacter eacute            ^^e9
-\definecharacter ecircumflex       ^^ea
-\definecharacter ediaeresis        ^^eb
-\definecharacter igrave            ^^ec
-\definecharacter iacute            ^^ed
-\definecharacter icircumflex       ^^ee
-\definecharacter idiaeresis        ^^ef
-
-\definecharacter ntilde            ^^f1
-\definecharacter ograve            ^^f2
-\definecharacter oacute            ^^f3
-\definecharacter ocircumflex       ^^f4
-\definecharacter otilde            ^^f5
-\definecharacter odiaeresis        ^^f6
-
-\definecharacter ugrave            ^^f9
-\definecharacter uacute            ^^fa
-\definecharacter ucircumflex       ^^fb
-\definecharacter udiaeresis        ^^fc
-\definecharacter yacute            ^^fd
-
-\definecharacter ydiaeresis        ^^ff
-
-\definecharacter leftsubguillemot  {\leftguillemot}
-\definecharacter rightsubguillemot {\rightguillemot}
-
-\definecharacter Uhungarumlaut     {\Ucircumflex}
-\definecharacter uhungarumlaut     {\ucircumflex}
-\definecharacter Ohungarumlaut     {\Ocircumflex}
-\definecharacter ohungarumlaut     {\ocircumflex}
-
-\definecharacter Aogonek           {A}
-\definecharacter aogonek           {a}
-\definecharacter Eogonek           {E}
-\definecharacter eogonek           {e}
-\definecharacter Iogonek           {I}
-\definecharacter iogonek           {i}
-\definecharacter Uogonek           {U}
-\definecharacter uogonek           {u}
-
-\definecharacter Aring             {A}
-\definecharacter aring             {a}
-\definecharacter Uring             {U}
-\definecharacter uring             {u}
-
-\definecharacter Abreve            {A}
-\definecharacter abreve            {a}
-\definecharacter Ebreve            {E}
-\definecharacter ebreve            {e}
-\definecharacter Gbreve            {G}
-\definecharacter gbreve            {g}
-\definecharacter Ibreve            {I}
-\definecharacter ibreve            {i}
-\definecharacter Obreve            {O}
-\definecharacter obreve            {o}
-\definecharacter Ubreve            {U}
-\definecharacter ubreve            {u}
-
-\definecharacter Ccaron            {C}
-\definecharacter ccaron            {c}
-\definecharacter Dcaron            {D}
-\definecharacter dcaron            {d}
-\definecharacter Ecaron            {E}
-\definecharacter ecaron            {e}
-\definecharacter Lcaron            {L}
-\definecharacter lcaron            {l}
-\definecharacter Ncaron            {N}
-\definecharacter ncaron            {n}
-\definecharacter Rcaron            {R}
-\definecharacter rcaron            {r}
-\definecharacter Scaron            {S}
-\definecharacter scaron            {s}
-\definecharacter Tcaron            {T}
-\definecharacter tcaron            {t}
-\definecharacter Ycaron            {Y}
-\definecharacter ycaron            {y}
-\definecharacter Zcaron            {Z}
-\definecharacter zcaron            {z}
-
-\definecharacter Lstroke           {L}
-\definecharacter lstroke           {l}
-\definecharacter Ostroke           {O}
-\definecharacter ostroke           {o}
-
-\definecharacter aumlaut           {\adiaeresis}
-\definecharacter eumlaut           {\ediaeresis}
-\definecharacter iumlaut           {\idiaeresis}
-\definecharacter oumlaut           {\odiaeresis}
-\definecharacter uumlaut           {\udiaeresis}
-
-\definecharacter Aumlaut           {\Adiaeresis}
-\definecharacter Eumlaut           {\Ediaeresis}
-\definecharacter Iumlaut           {\Idiaeresis}
-\definecharacter Oumlaut           {\Odiaeresis}
-\definecharacter Uumlaut           {\Udiaeresis}
-
-\definecharacter scommaaccent      {s}
-\definecharacter Scommaaccent      {S}
-\definecharacter tcommaaccent      {t}
-\definecharacter Tcommaaccent      {T}
-
-\definecharacter Etilde            {E}
-\definecharacter etilde            {e}
-
-\definecharacter Ahook             {A}
-\definecharacter ahook             {a}
-\definecharacter Ehook             {E}
-\definecharacter ehook             {e}
-\definecharacter Ihook             {I}
-\definecharacter ihook             {i}
-\definecharacter Ohook             {O}
-\definecharacter ohook             {o}
-\definecharacter Uhook             {U}
-\definecharacter uhook             {u}
-\definecharacter Yhook             {Y}
-\definecharacter yhook             {y}
-
-\definecharacter Acircumflexgrave  {\Acircumflex}
-\definecharacter Acircumflexacute  {\Acircumflex}
-\definecharacter Acircumflextilde  {\Acircumflex}
-\definecharacter Acircumflexhook   {\Acircumflex}
-\definecharacter acircumflexgrave  {\acircumflex}
-\definecharacter acircumflexacute  {\acircumflex}
-\definecharacter acircumflextilde  {\acircumflex}
-\definecharacter acircumflexhook   {\acircumflex}
-\definecharacter Ecircumflexgrave  {\Ecircumflex}
-\definecharacter Ecircumflexacute  {\Ecircumflex}
-\definecharacter Ecircumflextilde  {\Ecircumflex}
-\definecharacter Ecircumflexhook   {\Ecircumflex}
-\definecharacter ecircumflexgrave  {\ecircumflex}
-\definecharacter ecircumflexacute  {\ecircumflex}
-\definecharacter ecircumflextilde  {\ecircumflex}
-\definecharacter ecircumflexhook   {\ecircumflex}
-\definecharacter Ocircumflexgrave  {\Ocircumflex}
-\definecharacter Ocircumflexacute  {\Ocircumflex}
-\definecharacter Ocircumflextilde  {\Ocircumflex}
-\definecharacter Ocircumflexhook   {\Ocircumflex}
-\definecharacter ocircumflexgrave  {\ocircumflex}
-\definecharacter ocircumflexacute  {\ocircumflex}
-\definecharacter ocircumflextilde  {\ocircumflex}
-\definecharacter ocircumflexhook   {\ocircumflex}
-
-\definecharacter Abrevegrave       {A}
-\definecharacter Abreveacute       {A}
-\definecharacter Abrevetilde       {A}
-\definecharacter Abrevehook        {A}
-\definecharacter abrevegrave       {a}
-\definecharacter abreveacute       {a}
-\definecharacter abrevetilde       {a}
-\definecharacter abrevehook        {a}
-
-\definecharacter Adotbelow         {A}
-\definecharacter adotbelow         {a}
-\definecharacter Edotbelow         {E}
-\definecharacter edotbelow         {e}
-\definecharacter Idotbelow         {I}
-\definecharacter idotbelow         {i}
-\definecharacter Odotbelow         {O}
-\definecharacter odotbelow         {o}
-\definecharacter Udotbelow         {U}
-\definecharacter udotbelow         {u}
-\definecharacter Ydotbelow         {Y}
-\definecharacter ydotbelow         {y}
-\definecharacter Ohorndotbelow     {O}
-\definecharacter ohorndotbelow     {o}
-\definecharacter Uhorndotbelow     {U}
-\definecharacter uhorndotbelow     {u}
-
-\definecharacter Acircumflexdotbelow {\Acircumflex}
-\definecharacter acircumflexdotbelow {\acircumflex}
-\definecharacter Ecircumflexdotbelow {\Ecircumflex}
-\definecharacter ecircumflexdotbelow {\ecircumflex}
-\definecharacter Ocircumflexdotbelow {\Ocircumflex}
-\definecharacter ocircumflexdotbelow {\ocircumflex}
-\definecharacter Abrevedotbelow      {\Abreve}
-\definecharacter abrevedotbelow      {\abreve}
-
-\definecharacter Ohorn               {O}
-\definecharacter Ohorngrave          {O}
-\definecharacter Ohornacute          {O}
-\definecharacter Ohorntilde          {O}
-\definecharacter Ohornhook           {O}
-
-\definecharacter ohorn               {o}
-\definecharacter ohorngrave          {o}
-\definecharacter ohornacute          {o}
-\definecharacter ohorntilde          {o}
-\definecharacter ohornhook           {o}
-
-\definecharacter Uhorn               {U}
-\definecharacter Uhorngrave          {U}
-\definecharacter Uhornacute          {U}
-\definecharacter Uhorntilde          {U}
-\definecharacter Uhornhook           {U}
-
-\definecharacter uhorn               {u}
-\definecharacter uhorngrave          {u}
-\definecharacter uhornacute          {u}
-\definecharacter uhorntilde          {u}
-\definecharacter uhornhook           {u}
-
-\definecharacter Utilde              {U}
-\definecharacter utilde              {u}
-\definecharacter Itilde              {I}
-\definecharacter itilde              {i}
-\definecharacter Ygrave	    	     {Y}
-\definecharacter ygrave		         {y}
-\definecharacter Ytilde              {Y}
-\definecharacter ytilde              {y}
-
-\definecharacter dstroke             {d}
-\definecharacter Dstroke             {D}
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-pfr.mkii b/tex/context/base/enco-pfr.mkii
new file mode 100644
index 000000000..b279e40aa
--- /dev/null
+++ b/tex/context/base/enco-pfr.mkii
@@ -0,0 +1,305 @@
+%D \module
+%D   [       file=enco-pfr,
+%D        version=2000.12.10, % adapted 2005.08.14 to more delayed loading
+%D          title=\CONTEXT\ Encoding Macros,
+%D       subtitle=PDF Resources,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifnum\texengine>\pdftexengine
+    \expandafter \endinput
+\fi
+
+\ifdefined\pdffontresource \else
+    \expandafter \endinput
+\fi
+
+\writestatus{loading}{ConTeXt Encoding Macros / PDF Resources}
+
+%D This is an experimental module in which we implement
+%D font resource inclusion in \PDF. One reason to include
+%D font resources is that it enables a search engine to
+%D perform a search (I'm told). This feature ws requested by
+%D Petr Ferdus from Czech.
+
+%D A simple test file may look like this (watch how we first
+%D load the encoding and then the font; previous font
+%D definitions are left untouched.)
+%D
+%D \starttyping
+%D % output=pdftex interface=en
+%D
+%D \useencoding[pfr]
+%D \setupbodyfont[csr]
+%D
+%D \starttext
+%D   test \`z \'z \bf test \sl test \bs quite funny \`z \page
+%D   test \`z \'z \bf test \sl test \bs quite funny \`z \page
+%D \stoptext
+%D \stoptyping
+%D
+%D We do our best to include a (often large) font resources
+%D only once. The current implementation is not that
+%D general which is also due to the fact that \type
+%D {\pdffontattr} is expanded instantly and persistent. A
+%D more versatile (but also slower) approach is to keep track
+%D of the fonts and either flush the information at shipout
+%D time, or at the end of the document.
+
+%D \macros
+%D   {ifincludepdffontresources}
+%D
+%D You can turn of this feature using the following switch.
+
+\newif\ifincludepdffontresources \includepdffontresourcestrue
+
+\ifx\pdfglyphtounicode\undefined \else
+    \appendtoks
+        \doif\jobsuffix{pdf}{\readfile{pdfr-def.mkii}\donothing\donothing}%
+    \to \everystarttext
+\fi
+
+% somehow we cannot preload this beast; also, it's mk dependent
+%
+% \appendtoks
+%   \doifelse{\jobsuffix}{pdf}{\loadmkiifile{pdfr-def.mkii}}%
+% \to \everystarttext
+
+% ugly, this should go to the driver spec-tpd
+
+\ifx\pdfgentounicode\undefined \else
+    \ifcase\pdfgentounicode \else
+        \expandafter \expandafter \expandafter \endinput
+    \fi
+\fi
+
+\unprotect
+
+% a problem is that there is always an ec vector added even when
+% we switch to texnansi early; this has to do with the fact that
+% we need to setup fonts at startup; this a pain when we have
+% textless documents, so we should have a way around, i.e. an
+% extension to pdftex where we can tag numbers inside user specs
+% and attributes.
+%
+% currently we need to use immediate so we end up with entries
+
+%D The name of the resource is stored in a macro, as is its
+%D object reference. A resource is only processed once. When
+%D done, the resource name is erased, and we use this fact to
+%D prevent redefinition as well as well as reloading. So, a
+%D macro defined with \type {\pdffontfileresource} can have
+%D three states:
+%D
+%D \startitemize[packed]
+%D \item undefined: not yet loaded, and not yet included
+%D \item some value: loaded, but not yet included
+%D \item empty: loaded, and already included
+%D \stopitemize
+
+\def\pdffontresource    {pdfr:\currentencoding}
+\def\pdffontfileresource{pdff:\pdffontresource}
+
+%D A resource is defined in a file prefixed by \type {pdfr-}.
+%D The following \PDF\ code is composed by Ondrej Koala Vacha (I
+%D probably mispelled this name).
+%D
+%D \starttyping
+%D \startpdffontresource[il2]
+%D /CIDInit /ProcSet findresource begin
+%D 12 dict begin
+%D   begincmap
+%D     /CIDSystemInfo
+%D       << /Registry (Adobe)
+%D          /Ordering (T1UV)
+%D          /Supplement 0
+%D       >> def
+%D     /CMapName /Adobe-Identity-UCS def
+%D     /CMapType 1 def
+%D     1 begincodespacerange
+%D       <00> 
+%D     endcodespacerange
+%D     %%FontSpecificEncoding
+%D     191 beginbfrange
+%D       <20> <20> <0020> % space         dec: 32 oct:040 hex:20
+%D       .... .... ...... . ........      .... .. ....... ......
+%D         <00ff> % dotaccent     dec:255 oct:377 hex:ff
+%D     endbfrange
+%D   endcmap
+%D CMapName currentdict /CMap defineresource pop end
+%D end
+%D \stoppdffontresource
+%D \stoptyping
+%D
+%D We don't preload such huge definitions, and process them
+%D run||time to save memory. Therefore, in the encoding
+%D vector, we only add an entry like:
+%D
+%D \starttyping
+%D \startencoding [il2]
+%D   \usepdffontresource il2
+%D \stopencoding
+%D \stoptyping
+%D
+%D This macro is defined as follows.
+
+\def\usepdffontresource #1 %
+  {\doifundefinedelse\pdffontfileresource % okay, undefined, so either
+     {\setxvalue\pdffontfileresource{#1}} % brand new, or not yet loaded
+     {\doifvaluesomething\pdffontfileresource  % only if not loaded in which
+        {\setxvalue\pdffontfileresource{#1}}}} % case it's made empty
+
+%D Watch how we check for duplicated loading. The resource
+%D itself, when asked for, is included immediately, after which
+%D we save its reference. Normally a document will have one
+%D such a resource.
+
+% \long\def\startpdffontresource[#1]#2\stoppdffontresource
+%   {\doif{#1}\currentencoding
+%     {\immediate\pdfobj useobjnum \getvalue{\pdffontresource} stream {#2}}}
+
+% alternatively we can use object references
+
+% fails when we switch back and forward between dvi/pdf mode
+%
+% \long\def\startpdffontresource[#1]#2\stoppdffontresource
+%   {\doif{#1}\currentencoding{\doifdefined\pdffontresource
+%      {\immediate\pdfobj useobjnum \getvalue{\pdffontresource} stream {#2}}}}
+
+\long\def\startpdffontresource[#1]#2\stoppdffontresource
+  {\doif{#1}\currentencoding{\doifdefined\pdffontresource
+     {\expanded{\doshipoutpdffontresource{\getvalue{\pdffontresource}}{#2}}}}}
+
+\def\doshipoutpdffontresource#1#2%
+  {\ifnum\realpageno<\plustwo
+     \doglobal\appendtoks
+       \ifcase\pdfoutput\else\immediate\pdfobj useobjnum #1 stream {#2}\fi
+     \to\everyfirstshipout
+   \else
+     \ifcase\pdfoutput\else\immediate\pdfobj useobjnum #1 stream {#2}\fi
+   \fi}
+
+% cleaner but not better:
+%
+% \newtoks \collectedpdffontresources
+%
+% \def\doshipoutpdffontresource#1#2%
+%   {\doglobal\appendtoks
+%      \ifcase\pdfoutput\else\immediate\pdfobj useobjnum #1 stream {#2}\fi
+%    \to \collectedpdffontresources}
+%
+% \def\dofluspdffontresources
+%   {\the\collectedpdffontresources
+%    \global\collectedpdffontresources\emptytoks}
+%
+% \appendtoks \dofluspdffontresources \to \everybeforeshipout
+
+%D The reference to such a vector is to be handled at font
+%D definition time, which is why we hook it into the font
+%D loading routine. A little bit of indirectness speeds up
+%D the process when this feature is disabled and keeps the
+%D macros readable.
+
+% \newevery \everyfont \relax
+
+\appendtoksonce \includepdffontresource \to \everyfont
+
+% \def\includepdffontresource
+%   {\ifincludepdffontresources
+%      \ifx\pdffontattr\undefined
+%        % we're not using (a recent version of) pdftex
+%      \else\ifcase\pdfoutput
+%        % we're not in pdf mode
+%      \else
+%        \doincludepdffontresource
+%      \fi\fi
+%    \fi}
+
+\def\includepdffontresource
+  {\ifx\pdfgentounicode\undefined
+     \expandafter\ifx\the\font\nullfont \else
+       \ifx\pdffontattr\undefined
+         % we're not using (a recent version of) pdftex
+       \else\ifcase\pdfoutput
+         % we're not in pdf mode
+       \else
+         \doincludepdffontresource
+       \fi\fi
+     \fi
+   \else\ifcase\pdfgentounicode
+     \ifincludepdffontresources
+       \expandafter\ifx\the\font\nullfont \else
+         \ifx\pdffontattr\undefined
+           % we're not using (a recent version of) pdftex
+         \else\ifcase\pdfoutput
+           % we're not in pdf mode
+         \else
+           \doincludepdffontresource
+         \fi\fi
+       \fi
+     \fi
+   \or
+     \global\let\includepdffontresource\relax % automatic, built in
+   \fi\fi}
+
+\def\dododoincludepdffontresource#1% encoding
+  {\bgroup
+   \edef\currentencoding{#1}%
+   \doifvaluesomething\pdffontfileresource
+     {\startreadingfile
+        \ignorelines % just in case \par is redefined; this thing can get called anywhere
+        \readsysfile{pdfr-\getvalue\pdffontfileresource.mkii}\donothing\donothing
+      \stopreadingfile
+      \letgvalue\pdffontfileresource\empty}%
+   \egroup}
+
+\def\doincludepdffontresource
+  {\ifcsname\s!ucmap\fontfile\endcsname\else
+     \dodoincludepdffontresource
+   \fi}
+
+\def\dodoincludepdffontresource
+  {% does this font has an encoding specified vector
+   \doifsomething\currentencoding % no \ifx
+     {% is there a pdf font encoding resource file defined
+      \ifcsname\pdffontresource\endcsname
+        % (fake) object defined
+      \else\ifcsname\pdffontfileresource\endcsname
+        % is there a resource already included
+        \doifsomething\pdffontfileresource
+          {\pdfobj reserveobjnum {}%
+           \setxvalue\pdffontresource{\the\pdflastobj}%
+           \flushatshipout{\dododoincludepdffontresource{\currentencoding}}}%
+%            \doglobal\appendetoks
+%              \noexpand\dododoincludepdffontresource{\currentencoding}%
+%            \to \everybeforeshipout}% prevent multiple loading
+      \fi\fi
+      \ifcsname\pdffontresource\endcsname
+        \expanded{\pdffontattr\font{/ToUnicode \csname\pdffontresource\endcsname\space0 R}}%
+        % do it only once for each font
+        \letgvalue{\s!ucmap\fontfile}\empty
+      \fi}}
+
+%D For the moment, we keep this definition here, if only
+%D because \type {\usepdffontencoding} is not defined in the
+%D core. In the end, this will go to \type {enco-*.tex}.
+%D
+%D Test:
+%D
+%D \starttyping
+%D \useencoding[pfr] \usetypescript[palatino][ec] \setupbodyfont[palatino]
+%D
+%D \starttext
+%D fi ff ffi
+%D \stoptext
+%D \stoptyping
+
+\startencoding [il2] \usepdffontresource il2 \stopencoding
+\startencoding [ec]  \usepdffontresource ec  \stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/enco-pfr.tex b/tex/context/base/enco-pfr.tex
deleted file mode 100644
index a90c62352..000000000
--- a/tex/context/base/enco-pfr.tex
+++ /dev/null
@@ -1,303 +0,0 @@
-%D \module
-%D   [       file=enco-pfr,
-%D        version=2000.12.10, % adapted 2005.08.14 to more delayed loading
-%D          title=\CONTEXT\ Encoding Macros,
-%D       subtitle=PDF Resources,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\ifnum\texengine>\pdftexengine
-    \endinput
-\fi
-
-\ifx\pdffontresource\undefined\else\endinput\fi
-
-\writestatus{loading}{ConTeXt Encoding Macros / PDF Resources}
-
-%D This is an experimental module in which we implement
-%D font resource inclusion in \PDF. One reason to include
-%D font resources is that it enables a search engine to
-%D perform a search (I'm told). This feature ws requested by
-%D Petr Ferdus from Czech.
-
-%D A simple test file may look like this (watch how we first
-%D load the encoding and then the font; previous font
-%D definitions are left untouched.)
-%D
-%D \starttyping
-%D % output=pdftex interface=en
-%D
-%D \useencoding[pfr]
-%D \setupbodyfont[csr]
-%D
-%D \starttext
-%D   test \`z \'z \bf test \sl test \bs quite funny \`z \page
-%D   test \`z \'z \bf test \sl test \bs quite funny \`z \page
-%D \stoptext
-%D \stoptyping
-%D
-%D We do our best to include a (often large) font resources
-%D only once. The current implementation is not that
-%D general which is also due to the fact that \type
-%D {\pdffontattr} is expanded instantly and persistent. A
-%D more versatile (but also slower) approach is to keep track
-%D of the fonts and either flush the information at shipout
-%D time, or at the end of the document.
-
-%D \macros
-%D   {ifincludepdffontresources}
-%D
-%D You can turn of this feature using the following switch.
-
-\newif\ifincludepdffontresources \includepdffontresourcestrue
-
-\ifx\pdfglyphtounicode\undefined \else
-    \appendtoks
-        \doif\jobsuffix{pdf}{\readfile{pdfr-def.tex}\donothing\donothing}%
-    \to \everystarttext
-\fi
-
-% somehow we cannot preload this beast; also, it's mk dependent
-%
-% \appendtoks
-%   \doifelse{\jobsuffix}{pdf}{\loadmkiifile{pdfr-def.tex}}%
-% \to \everystarttext
-
-% ugly, this should go to the driver spec-tpd
-
-\ifx\pdfgentounicode\undefined \else
-    \ifcase\pdfgentounicode \else
-        \expandafter \expandafter \expandafter \endinput
-    \fi
-\fi
-
-\unprotect
-
-% a problem is that there is always an ec vector added even when
-% we switch to texnansi early; this has to do with the fact that
-% we need to setup fonts at startup; this a pain when we have
-% textless documents, so we should have a way around, i.e. an
-% extension to pdftex where we can tag numbers inside user specs
-% and attributes.
-%
-% currently we need to use immediate so we end up with entries
-
-%D The name of the resource is stored in a macro, as is its
-%D object reference. A resource is only processed once. When
-%D done, the resource name is erased, and we use this fact to
-%D prevent redefinition as well as well as reloading. So, a
-%D macro defined with \type {\pdffontfileresource} can have
-%D three states:
-%D
-%D \startitemize[packed]
-%D \item undefined: not yet loaded, and not yet included
-%D \item some value: loaded, but not yet included
-%D \item empty: loaded, and already included
-%D \stopitemize
-
-\def\pdffontresource    {pdfr:\currentencoding}
-\def\pdffontfileresource{pdff:\pdffontresource}
-
-%D A resource is defined in a file prefixed by \type {pdfr-}.
-%D The following \PDF\ code is composed by Ondrej Koala Vacha (I
-%D probably mispelled this name).
-%D
-%D \starttyping
-%D \startpdffontresource[il2]
-%D /CIDInit /ProcSet findresource begin
-%D 12 dict begin
-%D   begincmap
-%D     /CIDSystemInfo
-%D       << /Registry (Adobe)
-%D          /Ordering (T1UV)
-%D          /Supplement 0
-%D       >> def
-%D     /CMapName /Adobe-Identity-UCS def
-%D     /CMapType 1 def
-%D     1 begincodespacerange
-%D       <00> 
-%D     endcodespacerange
-%D     %%FontSpecificEncoding
-%D     191 beginbfrange
-%D       <20> <20> <0020> % space         dec: 32 oct:040 hex:20
-%D       .... .... ...... . ........      .... .. ....... ......
-%D         <00ff> % dotaccent     dec:255 oct:377 hex:ff
-%D     endbfrange
-%D   endcmap
-%D CMapName currentdict /CMap defineresource pop end
-%D end
-%D \stoppdffontresource
-%D \stoptyping
-%D
-%D We don't preload such huge definitions, and process them
-%D run||time to save memory. Therefore, in the encoding
-%D vector, we only add an entry like:
-%D
-%D \starttyping
-%D \startencoding [il2]
-%D   \usepdffontresource il2
-%D \stopencoding
-%D \stoptyping
-%D
-%D This macro is defined as follows.
-
-\def\usepdffontresource #1 %
-  {\doifundefinedelse\pdffontfileresource % okay, undefined, so either
-     {\setxvalue\pdffontfileresource{#1}} % brand new, or not yet loaded
-     {\doifvaluesomething\pdffontfileresource  % only if not loaded in which
-        {\setxvalue\pdffontfileresource{#1}}}} % case it's made empty
-
-%D Watch how we check for duplicated loading. The resource
-%D itself, when asked for, is included immediately, after which
-%D we save its reference. Normally a document will have one
-%D such a resource.
-
-% \long\def\startpdffontresource[#1]#2\stoppdffontresource
-%   {\doif{#1}\currentencoding
-%     {\immediate\pdfobj useobjnum \getvalue{\pdffontresource} stream {#2}}}
-
-% alternatively we can use object references
-
-% fails when we switch back and forward between dvi/pdf mode
-%
-% \long\def\startpdffontresource[#1]#2\stoppdffontresource
-%   {\doif{#1}\currentencoding{\doifdefined\pdffontresource
-%      {\immediate\pdfobj useobjnum \getvalue{\pdffontresource} stream {#2}}}}
-
-\long\def\startpdffontresource[#1]#2\stoppdffontresource
-  {\doif{#1}\currentencoding{\doifdefined\pdffontresource
-     {\expanded{\doshipoutpdffontresource{\getvalue{\pdffontresource}}{#2}}}}}
-
-\def\doshipoutpdffontresource#1#2%
-  {\ifnum\realpageno<\plustwo
-     \doglobal\appendtoks
-       \ifcase\pdfoutput\else\immediate\pdfobj useobjnum #1 stream {#2}\fi
-     \to\everyfirstshipout
-   \else
-     \ifcase\pdfoutput\else\immediate\pdfobj useobjnum #1 stream {#2}\fi
-   \fi}
-
-% cleaner but not better:
-%
-% \newtoks \collectedpdffontresources
-%
-% \def\doshipoutpdffontresource#1#2%
-%   {\doglobal\appendtoks
-%      \ifcase\pdfoutput\else\immediate\pdfobj useobjnum #1 stream {#2}\fi
-%    \to \collectedpdffontresources}
-%
-% \def\dofluspdffontresources
-%   {\the\collectedpdffontresources
-%    \global\collectedpdffontresources\emptytoks}
-%
-% \appendtoks \dofluspdffontresources \to \everybeforeshipout
-
-%D The reference to such a vector is to be handled at font
-%D definition time, which is why we hook it into the font
-%D loading routine. A little bit of indirectness speeds up
-%D the process when this feature is disabled and keeps the
-%D macros readable.
-
-% \newevery \everyfont \relax
-
-\appendtoksonce \includepdffontresource \to \everyfont
-
-% \def\includepdffontresource
-%   {\ifincludepdffontresources
-%      \ifx\pdffontattr\undefined
-%        % we're not using (a recent version of) pdftex
-%      \else\ifcase\pdfoutput
-%        % we're not in pdf mode
-%      \else
-%        \doincludepdffontresource
-%      \fi\fi
-%    \fi}
-
-\def\includepdffontresource
-  {\ifx\pdfgentounicode\undefined
-     \expandafter\ifx\the\font\nullfont \else
-       \ifx\pdffontattr\undefined
-         % we're not using (a recent version of) pdftex
-       \else\ifcase\pdfoutput
-         % we're not in pdf mode
-       \else
-         \doincludepdffontresource
-       \fi\fi
-     \fi
-   \else\ifcase\pdfgentounicode
-     \ifincludepdffontresources
-       \expandafter\ifx\the\font\nullfont \else
-         \ifx\pdffontattr\undefined
-           % we're not using (a recent version of) pdftex
-         \else\ifcase\pdfoutput
-           % we're not in pdf mode
-         \else
-           \doincludepdffontresource
-         \fi\fi
-       \fi
-     \fi
-   \or
-     \global\let\includepdffontresource\relax % automatic, built in
-   \fi\fi}
-
-\def\dododoincludepdffontresource#1% encoding
-  {\bgroup
-   \edef\currentencoding{#1}%
-   \doifvaluesomething\pdffontfileresource
-     {\startreadingfile
-        \ignorelines % just in case \par is redefined; this thing can get called anywhere
-        \readsysfile{pdfr-\getvalue\pdffontfileresource}\donothing\donothing
-      \stopreadingfile
-      \letgvalue\pdffontfileresource\empty}%
-   \egroup}
-
-\def\doincludepdffontresource
-  {\ifcsname\s!ucmap\fontfile\endcsname\else
-     \dodoincludepdffontresource
-   \fi}
-
-\def\dodoincludepdffontresource
-  {% does this font has an encoding specified vector
-   \doifsomething\currentencoding % no \ifx
-     {% is there a pdf font encoding resource file defined
-      \ifcsname\pdffontresource\endcsname
-        % (fake) object defined
-      \else\ifcsname\pdffontfileresource\endcsname
-        % is there a resource already included
-        \doifsomething\pdffontfileresource
-          {\pdfobj reserveobjnum {}%
-           \setxvalue\pdffontresource{\the\pdflastobj}%
-           \flushatshipout{\dododoincludepdffontresource{\currentencoding}}}%
-%            \doglobal\appendetoks
-%              \noexpand\dododoincludepdffontresource{\currentencoding}%
-%            \to \everybeforeshipout}% prevent multiple loading
-      \fi\fi
-      \ifcsname\pdffontresource\endcsname
-        \expanded{\pdffontattr\font{/ToUnicode \csname\pdffontresource\endcsname\space0 R}}%
-        % do it only once for each font
-        \letgvalue{\s!ucmap\fontfile}\empty
-      \fi}}
-
-%D For the moment, we keep this definition here, if only
-%D because \type {\usepdffontencoding} is not defined in the
-%D core. In the end, this will go to \type {enco-*.tex}.
-%D
-%D Test:
-%D
-%D \starttyping
-%D \useencoding[pfr] \usetypescript[palatino][ec] \setupbodyfont[palatino]
-%D
-%D \starttext
-%D fi ff ffi
-%D \stoptext
-%D \stoptyping
-
-\startencoding [il2] \usepdffontresource il2 \stopencoding
-\startencoding [ec]  \usepdffontresource ec  \stopencoding
-
-\protect \endinput
diff --git a/tex/context/base/enco-pol.mkii b/tex/context/base/enco-pol.mkii
new file mode 100644
index 000000000..a012f0370
--- /dev/null
+++ b/tex/context/base/enco-pol.mkii
@@ -0,0 +1,276 @@
+%D \module
+%D   [     file=enco-pol,
+%D      version=2000.05.07, % 1999.28.8,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Polish Mixed Encoding,
+%D       author={Taco Hoekwater \& Hans Hagen},
+%D         date=\currentdate,
+%D    copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% This encoding will go but the regime will remain.
+
+%D Polish native encoding; normally polish users will use
+%D translate=cp1250pl in combination with ec encoding.
+
+\startmapping[pl0]
+
+\resetcaserange 128 to 255
+
+\definecaseswap 161 129 % a ogonek
+\definecaseswap 162 130 % c acute
+\definecaseswap 166 134 % e ogonek
+\definecaseswap 170 138 % l crossed
+\definecaseswap 171 139 % n acute
+\definecaseswap 177 145 % s acute
+\definecaseswap 185 153 % z acute
+\definecaseswap 187 155 % z dotaccent
+\definecaseswap 243 211 % o acute
+
+% \definecasemap 161 161 129 % a ogonek
+% \definecasemap 162 162 130 % c acute
+% \definecasemap 166 166 134 % e ogonek
+% \definecasemap 170 170 138 % l crossed
+% \definecasemap 171 171 139 % n acute
+% \definecasemap 177 177 145 % s acute
+% \definecasemap 185 185 153 % z acute
+% \definecasemap 187 187 155 % z dotaccent
+% \definecasemap 243 243 211 % o acute
+
+% \definecasemap 129 161 129  % A ogonek
+% \definecasemap 130 162 130  % C acute
+% \definecasemap 134 166 134  % E ogonek
+% \definecasemap 138 170 138  % L crossed
+% \definecasemap 139 171 139  % N acute
+% \definecasemap 145 177 145  % S acute
+% \definecasemap 153 185 153  % Z acute
+% \definecasemap 155 187 155  % Z dotaccent
+% \definecasemap 211 243 211  % O acute
+
+\stopmapping
+
+\startmapping[pl0]
+
+\definespacemap 129 999  % A ogonek
+\definespacemap 130 999  % C acute
+\definespacemap 134 999  % E ogonek
+\definespacemap 138 999  % L crossed
+\definespacemap 139 999  % N acute
+\definespacemap 211 999  % O acute
+\definespacemap 145 999  % S acute
+\definespacemap 153 999  % Z acute
+\definespacemap 155 999  % Z dot
+
+\stopmapping
+
+\startencoding[pl0][pl0]
+
+\definecharacter Aogonek    129
+\definecharacter Cacute     130
+\definecharacter Eogonek    134
+\definecharacter Lstroke    138
+\definecharacter Nacute     139
+\definecharacter Sacute     145
+\definecharacter Zacute     153
+\definecharacter Zdotaccent 155
+\definecharacter aogonek    161
+\definecharacter cacute     162
+\definecharacter eogonek    166
+\definecharacter lstroke    170
+\definecharacter nacute     171
+\definecharacter sacute     177
+\definecharacter zacute     185
+\definecharacter zdotaccent 187
+\definecharacter Oacute     211
+\definecharacter oacute     243
+
+\stopencoding
+
+\startencoding[pl0][pl0]
+
+\definecharacter leftguillemot   174
+\definecharacter rightguillemot  175
+\definecharacter guilsingleleft  174
+\definecharacter guilsingleright 175
+
+\stopencoding
+
+% obsolete
+%
+% \startencoding[pl0]
+%
+% \definesortkey {161} {a}{a}{\k a}   \definesortkey {129} {a}{a}{\k a}
+% \definesortkey {162} {c}{a}{\'c}    \definesortkey {130} {c}{a}{\'c}
+% \definesortkey {166} {e}{a}{\k e}   \definesortkey {134} {e}{a}{\k e}
+% \definesortkey {170} {l}{a}{\l }    \definesortkey {138} {l}{a}{\l }
+% \definesortkey {171} {n}{a}{\'n}    \definesortkey {139} {n}{a}{\'n}
+% \definesortkey {177} {s}{a}{\'s}    \definesortkey {145} {s}{a}{\'s}
+% \definesortkey {185} {z}{a}{\'z}    \definesortkey {153} {z}{a}{\'z}
+% \definesortkey {187} {z}{b}{\.z}    \definesortkey {155} {z}{b}{\.z}
+% \definesortkey {243} {o}{a}{\'o}    \definesortkey {211} {o}{a}{\'o}
+%
+% \definesortkey {\'c} {c}{a}{\'c}    \definesortkey {\'C} {c}{a}{\'c}
+% \definesortkey {\'n} {n}{a}{\'n}    \definesortkey {\'N} {n}{a}{\'n}
+% \definesortkey {\'o} {o}{a}{\'o}    \definesortkey {\'O} {o}{a}{\'o}
+% \definesortkey {\'s} {s}{a}{\'s}    \definesortkey {\'S} {s}{a}{\'s}
+% \definesortkey {\'z} {z}{a}{\'z}    \definesortkey {\'Z} {z}{a}{\'z}
+% \definesortkey {\.z} {z}{b}{\.z}    \definesortkey {\.Z} {z}{b}{\.z}
+% \definesortkey {\k a}{a}{a}{\k a}   \definesortkey {\k A}{a}{a}{\k a}
+% \definesortkey {\k e}{e}{a}{\k e}   \definesortkey {\k E}{e}{a}{\k e}
+% \definesortkey {\l } {l}{a}{\l}     \definesortkey {\L } {l}{a}{\l}
+%
+% \stopencoding
+
+%D Polish CP-1250 encoding.
+
+% \startmapping[pl1]
+%
+%
+% \resetcaserange 128 to 255
+%
+% \definecasemap 185 185 165  % a ogonek
+% \definecasemap 230 230 198  % c acute
+% \definecasemap 234 234 202  % e ogonek
+% \definecasemap 179 179 163  % l crossed
+% \definecasemap 241 241 209  % n acute
+% \definecasemap 243 243 211  % o acute
+% \definecasemap 156 156 140  % s acute
+% \definecasemap 159 159 143  % z acute
+% \definecasemap 191 191 175  % z dot
+%
+% \definecasemap 165 165 185  % A ogonek
+% \definecasemap 198 198 230  % C acute
+% \definecasemap 202 202 234  % E ogonek
+% \definecasemap 163 163 179  % L crossed
+% \definecasemap 209 209 241  % N acute
+% \definecasemap 211 211 243  % O acute
+% \definecasemap 140 140 156  % S acute
+% \definecasemap 143 143 159  % Z acute
+% \definecasemap 175 175 191  % Z dot
+%
+% \stopmapping
+%
+% \startmapping[pl1]
+%
+% \definespacemap 165 999  % A ogonek
+% \definespacemap 198 999  % C acute
+% \definespacemap 202 999  % E ogonek
+% \definespacemap 163 999  % L crossed
+% \definespacemap 209 999  % N acute
+% \definespacemap 211 999  % O acute
+% \definespacemap 140 999  % S acute
+% \definespacemap 143 999  % Z acute
+% \definespacemap 175 999  % Z dot
+%
+% \stopmapping
+%
+% \startencoding[pl1]
+%
+% \definecharacter Sacute     140
+% \definecharacter Zacute     143
+% \definecharacter sacute     156
+% \definecharacter zacute     159
+% \definecharacter Lstroke    163
+% \definecharacter Aogonek    165
+% \definecharacter Zdotaccent 175
+% \definecharacter lstroke    179
+% \definecharacter aogonek    185
+% \definecharacter zdotaccent 191
+% \definecharacter Cacute     198
+% \definecharacter Eogonek    202
+% \definecharacter Nacute     209
+% \definecharacter Oacute     211
+% \definecharacter cacute     230
+% \definecharacter eogonek    234
+% \definecharacter nacute     241
+% \definecharacter oacute     243
+%
+% \stopencoding
+%
+% \startencoding[pl1]
+%
+% \definecharacter leftguillemot   174
+% \definecharacter rightguillemot  175
+% \definecharacter guilsingleleft  174
+% \definecharacter guilsingleright 175
+%
+% \stopencoding
+
+%D Polish ISO-8859-2 encoding.
+
+% \startmapping[pl2]
+%
+% \resetcaserange 128 to 255
+%
+% \definecasemap 177 177 161  % a ogonek
+% \definecasemap 230 230 198  % c acute
+% \definecasemap 234 234 202  % e ogonek
+% \definecasemap 179 179 163  % l crossed
+% \definecasemap 241 241 209  % n acute
+% \definecasemap 243 243 211  % o acute
+% \definecasemap 182 182 166  % s acute
+% \definecasemap 188 188 172  % z acute
+% \definecasemap 191 191 175  % z dotaccent
+%
+% \definecasemap 161 161 177  % A ogonek
+% \definecasemap 198 198 230  % C acute
+% \definecasemap 202 202 234  % E ogonek
+% \definecasemap 163 163 179  % L crossed
+% \definecasemap 209 209 241  % N acute
+% \definecasemap 211 211 243  % O acute
+% \definecasemap 166 166 182  % S acute
+% \definecasemap 172 172 188  % Z acute
+% \definecasemap 175 175 191  % Z dotaccent
+%
+% \stopmapping
+%
+% \startmapping[pl2]
+%
+% \definespacemap 161 999  % A ogonek
+% \definespacemap 198 999  % C acute
+% \definespacemap 202 999  % E ogonek
+% \definespacemap 163 999  % L crossed
+% \definespacemap 209 999  % N acute
+% \definespacemap 211 999  % O acute
+% \definespacemap 166 999  % S acute
+% \definespacemap 172 999  % Z acute
+% \definespacemap 175 999  % Z dot
+%
+% \stopmapping
+%
+% \startencoding[pl2]
+%
+% \definecharacter Aogonek    161
+% \definecharacter Lstroke    163
+% \definecharacter Sacute     166
+% \definecharacter Zacute     172
+% \definecharacter Zdotaccent 175
+% \definecharacter aogonek    177
+% \definecharacter lstroke    179
+% \definecharacter sacute     182
+% \definecharacter zacute     188
+% \definecharacter zdotaccent 191
+% \definecharacter Cacute     198
+% \definecharacter Eogonek    202
+% \definecharacter Nacute     209
+% \definecharacter Oacute     211
+% \definecharacter cacute     230
+% \definecharacter eogonek    234
+% \definecharacter nacute     241
+% \definecharacter oacute     243
+%
+% \stopencoding
+%
+% \startencoding[pl2]
+%
+% \definecharacter leftguillemot   174
+% \definecharacter rightguillemot  175
+% \definecharacter guilsingleleft  174
+% \definecharacter guilsingleright 175
+%
+% \stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-pol.tex b/tex/context/base/enco-pol.tex
deleted file mode 100644
index a012f0370..000000000
--- a/tex/context/base/enco-pol.tex
+++ /dev/null
@@ -1,276 +0,0 @@
-%D \module
-%D   [     file=enco-pol,
-%D      version=2000.05.07, % 1999.28.8,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Polish Mixed Encoding,
-%D       author={Taco Hoekwater \& Hans Hagen},
-%D         date=\currentdate,
-%D    copyright=PRAGMA-ADE]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% This encoding will go but the regime will remain.
-
-%D Polish native encoding; normally polish users will use
-%D translate=cp1250pl in combination with ec encoding.
-
-\startmapping[pl0]
-
-\resetcaserange 128 to 255
-
-\definecaseswap 161 129 % a ogonek
-\definecaseswap 162 130 % c acute
-\definecaseswap 166 134 % e ogonek
-\definecaseswap 170 138 % l crossed
-\definecaseswap 171 139 % n acute
-\definecaseswap 177 145 % s acute
-\definecaseswap 185 153 % z acute
-\definecaseswap 187 155 % z dotaccent
-\definecaseswap 243 211 % o acute
-
-% \definecasemap 161 161 129 % a ogonek
-% \definecasemap 162 162 130 % c acute
-% \definecasemap 166 166 134 % e ogonek
-% \definecasemap 170 170 138 % l crossed
-% \definecasemap 171 171 139 % n acute
-% \definecasemap 177 177 145 % s acute
-% \definecasemap 185 185 153 % z acute
-% \definecasemap 187 187 155 % z dotaccent
-% \definecasemap 243 243 211 % o acute
-
-% \definecasemap 129 161 129  % A ogonek
-% \definecasemap 130 162 130  % C acute
-% \definecasemap 134 166 134  % E ogonek
-% \definecasemap 138 170 138  % L crossed
-% \definecasemap 139 171 139  % N acute
-% \definecasemap 145 177 145  % S acute
-% \definecasemap 153 185 153  % Z acute
-% \definecasemap 155 187 155  % Z dotaccent
-% \definecasemap 211 243 211  % O acute
-
-\stopmapping
-
-\startmapping[pl0]
-
-\definespacemap 129 999  % A ogonek
-\definespacemap 130 999  % C acute
-\definespacemap 134 999  % E ogonek
-\definespacemap 138 999  % L crossed
-\definespacemap 139 999  % N acute
-\definespacemap 211 999  % O acute
-\definespacemap 145 999  % S acute
-\definespacemap 153 999  % Z acute
-\definespacemap 155 999  % Z dot
-
-\stopmapping
-
-\startencoding[pl0][pl0]
-
-\definecharacter Aogonek    129
-\definecharacter Cacute     130
-\definecharacter Eogonek    134
-\definecharacter Lstroke    138
-\definecharacter Nacute     139
-\definecharacter Sacute     145
-\definecharacter Zacute     153
-\definecharacter Zdotaccent 155
-\definecharacter aogonek    161
-\definecharacter cacute     162
-\definecharacter eogonek    166
-\definecharacter lstroke    170
-\definecharacter nacute     171
-\definecharacter sacute     177
-\definecharacter zacute     185
-\definecharacter zdotaccent 187
-\definecharacter Oacute     211
-\definecharacter oacute     243
-
-\stopencoding
-
-\startencoding[pl0][pl0]
-
-\definecharacter leftguillemot   174
-\definecharacter rightguillemot  175
-\definecharacter guilsingleleft  174
-\definecharacter guilsingleright 175
-
-\stopencoding
-
-% obsolete
-%
-% \startencoding[pl0]
-%
-% \definesortkey {161} {a}{a}{\k a}   \definesortkey {129} {a}{a}{\k a}
-% \definesortkey {162} {c}{a}{\'c}    \definesortkey {130} {c}{a}{\'c}
-% \definesortkey {166} {e}{a}{\k e}   \definesortkey {134} {e}{a}{\k e}
-% \definesortkey {170} {l}{a}{\l }    \definesortkey {138} {l}{a}{\l }
-% \definesortkey {171} {n}{a}{\'n}    \definesortkey {139} {n}{a}{\'n}
-% \definesortkey {177} {s}{a}{\'s}    \definesortkey {145} {s}{a}{\'s}
-% \definesortkey {185} {z}{a}{\'z}    \definesortkey {153} {z}{a}{\'z}
-% \definesortkey {187} {z}{b}{\.z}    \definesortkey {155} {z}{b}{\.z}
-% \definesortkey {243} {o}{a}{\'o}    \definesortkey {211} {o}{a}{\'o}
-%
-% \definesortkey {\'c} {c}{a}{\'c}    \definesortkey {\'C} {c}{a}{\'c}
-% \definesortkey {\'n} {n}{a}{\'n}    \definesortkey {\'N} {n}{a}{\'n}
-% \definesortkey {\'o} {o}{a}{\'o}    \definesortkey {\'O} {o}{a}{\'o}
-% \definesortkey {\'s} {s}{a}{\'s}    \definesortkey {\'S} {s}{a}{\'s}
-% \definesortkey {\'z} {z}{a}{\'z}    \definesortkey {\'Z} {z}{a}{\'z}
-% \definesortkey {\.z} {z}{b}{\.z}    \definesortkey {\.Z} {z}{b}{\.z}
-% \definesortkey {\k a}{a}{a}{\k a}   \definesortkey {\k A}{a}{a}{\k a}
-% \definesortkey {\k e}{e}{a}{\k e}   \definesortkey {\k E}{e}{a}{\k e}
-% \definesortkey {\l } {l}{a}{\l}     \definesortkey {\L } {l}{a}{\l}
-%
-% \stopencoding
-
-%D Polish CP-1250 encoding.
-
-% \startmapping[pl1]
-%
-%
-% \resetcaserange 128 to 255
-%
-% \definecasemap 185 185 165  % a ogonek
-% \definecasemap 230 230 198  % c acute
-% \definecasemap 234 234 202  % e ogonek
-% \definecasemap 179 179 163  % l crossed
-% \definecasemap 241 241 209  % n acute
-% \definecasemap 243 243 211  % o acute
-% \definecasemap 156 156 140  % s acute
-% \definecasemap 159 159 143  % z acute
-% \definecasemap 191 191 175  % z dot
-%
-% \definecasemap 165 165 185  % A ogonek
-% \definecasemap 198 198 230  % C acute
-% \definecasemap 202 202 234  % E ogonek
-% \definecasemap 163 163 179  % L crossed
-% \definecasemap 209 209 241  % N acute
-% \definecasemap 211 211 243  % O acute
-% \definecasemap 140 140 156  % S acute
-% \definecasemap 143 143 159  % Z acute
-% \definecasemap 175 175 191  % Z dot
-%
-% \stopmapping
-%
-% \startmapping[pl1]
-%
-% \definespacemap 165 999  % A ogonek
-% \definespacemap 198 999  % C acute
-% \definespacemap 202 999  % E ogonek
-% \definespacemap 163 999  % L crossed
-% \definespacemap 209 999  % N acute
-% \definespacemap 211 999  % O acute
-% \definespacemap 140 999  % S acute
-% \definespacemap 143 999  % Z acute
-% \definespacemap 175 999  % Z dot
-%
-% \stopmapping
-%
-% \startencoding[pl1]
-%
-% \definecharacter Sacute     140
-% \definecharacter Zacute     143
-% \definecharacter sacute     156
-% \definecharacter zacute     159
-% \definecharacter Lstroke    163
-% \definecharacter Aogonek    165
-% \definecharacter Zdotaccent 175
-% \definecharacter lstroke    179
-% \definecharacter aogonek    185
-% \definecharacter zdotaccent 191
-% \definecharacter Cacute     198
-% \definecharacter Eogonek    202
-% \definecharacter Nacute     209
-% \definecharacter Oacute     211
-% \definecharacter cacute     230
-% \definecharacter eogonek    234
-% \definecharacter nacute     241
-% \definecharacter oacute     243
-%
-% \stopencoding
-%
-% \startencoding[pl1]
-%
-% \definecharacter leftguillemot   174
-% \definecharacter rightguillemot  175
-% \definecharacter guilsingleleft  174
-% \definecharacter guilsingleright 175
-%
-% \stopencoding
-
-%D Polish ISO-8859-2 encoding.
-
-% \startmapping[pl2]
-%
-% \resetcaserange 128 to 255
-%
-% \definecasemap 177 177 161  % a ogonek
-% \definecasemap 230 230 198  % c acute
-% \definecasemap 234 234 202  % e ogonek
-% \definecasemap 179 179 163  % l crossed
-% \definecasemap 241 241 209  % n acute
-% \definecasemap 243 243 211  % o acute
-% \definecasemap 182 182 166  % s acute
-% \definecasemap 188 188 172  % z acute
-% \definecasemap 191 191 175  % z dotaccent
-%
-% \definecasemap 161 161 177  % A ogonek
-% \definecasemap 198 198 230  % C acute
-% \definecasemap 202 202 234  % E ogonek
-% \definecasemap 163 163 179  % L crossed
-% \definecasemap 209 209 241  % N acute
-% \definecasemap 211 211 243  % O acute
-% \definecasemap 166 166 182  % S acute
-% \definecasemap 172 172 188  % Z acute
-% \definecasemap 175 175 191  % Z dotaccent
-%
-% \stopmapping
-%
-% \startmapping[pl2]
-%
-% \definespacemap 161 999  % A ogonek
-% \definespacemap 198 999  % C acute
-% \definespacemap 202 999  % E ogonek
-% \definespacemap 163 999  % L crossed
-% \definespacemap 209 999  % N acute
-% \definespacemap 211 999  % O acute
-% \definespacemap 166 999  % S acute
-% \definespacemap 172 999  % Z acute
-% \definespacemap 175 999  % Z dot
-%
-% \stopmapping
-%
-% \startencoding[pl2]
-%
-% \definecharacter Aogonek    161
-% \definecharacter Lstroke    163
-% \definecharacter Sacute     166
-% \definecharacter Zacute     172
-% \definecharacter Zdotaccent 175
-% \definecharacter aogonek    177
-% \definecharacter lstroke    179
-% \definecharacter sacute     182
-% \definecharacter zacute     188
-% \definecharacter zdotaccent 191
-% \definecharacter Cacute     198
-% \definecharacter Eogonek    202
-% \definecharacter Nacute     209
-% \definecharacter Oacute     211
-% \definecharacter cacute     230
-% \definecharacter eogonek    234
-% \definecharacter nacute     241
-% \definecharacter oacute     243
-%
-% \stopencoding
-%
-% \startencoding[pl2]
-%
-% \definecharacter leftguillemot   174
-% \definecharacter rightguillemot  175
-% \definecharacter guilsingleleft  174
-% \definecharacter guilsingleright 175
-%
-% \stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-qx.mkii b/tex/context/base/enco-qx.mkii
new file mode 100644
index 000000000..407d60bd7
--- /dev/null
+++ b/tex/context/base/enco-qx.mkii
@@ -0,0 +1,266 @@
+%D \module
+%D   [     file=enco-qx,
+%D      version=2004.04.03,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Polish QX Encoding,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% to be done
+
+%  35          numbersign
+%  95           dotaccent
+% 132        greaterequal
+% 133         approxequal
+% 137           lessequal
+% 142                 ell
+% 156                  IJ
+% 173            infinity
+% 182 threequartersemdash
+% 188                  ij
+% 247            anglearc
+% 248            diameter
+
+\startmapping[qx] % to be done
+
+\resetcaserange 128 to 128
+\resetcaserange 131 to 133
+\resetcaserange 136 to 137
+\resetcaserange 140 to 144
+\resetcaserange 148 to 148
+\resetcaserange 150 to 150
+\resetcaserange 157 to 160
+\resetcaserange 163 to 165
+\resetcaserange 168 to 169
+\resetcaserange 172 to 176
+\resetcaserange 180 to 180
+\resetcaserange 182 to 182
+\resetcaserange 189 to 191
+\resetcaserange 198 to 198
+\resetcaserange 215 to 216
+\resetcaserange 223 to 223
+\resetcaserange 230 to 230
+\resetcaserange 247 to 248
+\resetcaserange 255 to 255
+
+\definecaseswap 161 129
+\definecaseswap 162 130
+
+\definecaseswap 166 134
+\definecaseswap 167 135
+
+\definecaseswap 170 138
+\definecaseswap 171 139
+
+\definecaseswap 177 145
+\definecaseswap 178 146
+\definecaseswap 179 147
+
+\definecaseswap 181 149
+
+\definecasemaps 151 to 156 lc +32 uc   0
+\definecasemaps 183 to 188 lc   0 uc -32
+
+\definecasemaps 192 to 197 lc +32 uc   0
+\definecasemaps 224 to 229 lc   0 uc -32
+
+\definecasemaps 199 to 214 lc +32 uc   0
+\definecasemaps 231 to 246 lc   0 uc -32
+
+\definecasemaps 217 to 222 lc +32 uc   0
+\definecasemaps 249 to 254 lc   0 uc -32
+
+\stopmapping
+
+\startencoding[qx]
+
+\definecharacter textacute         19
+\definecharacter textbreve         21
+\definecharacter textcaron         20
+\definecharacter textcedilla       24
+\definecharacter textcircumflex    94
+\definecharacter textdiaeresis    127
+\definecharacter textdotaccent     94
+\definecharacter textgrave         18
+\definecharacter texthungarumlaut 125
+\definecharacter textmacron        22
+\definecharacter textogonek       150
+\definecharacter textring          23
+\definecharacter texttilde        126
+
+\definecharacter dotlessi          16
+\definecharacter dotlessj          17
+
+\definecharacter endash           123
+\definecharacter emdash           124
+
+\definecharacter aeligature        26
+\definecharacter AEligature        29
+\definecharacter oeligature        27
+\definecharacter OEligature        30
+
+\definecharacter ssharp            25
+%definecharacter Ssharp            25
+
+\definecharacter thorn            254
+\definecharacter Thorn            222
+
+\definecharacter Dstroke          208 % also Eth, mapped into enco-def
+\definecharacter eth              240
+
+\definecharacter exclamdown        60
+\definecharacter questiondown      62
+
+\definecharacter sectionmark      159
+
+\definecharacter percent           37
+\definecharacter perthousand      216
+
+\definecharacter textasciicircum  141
+\definecharacter textasciitilde   140
+\definecharacter textbackslash    198
+\definecharacter textbraceleft    157
+\definecharacter textbraceright   158
+\definecharacter textunderscore   230
+
+\definecharacter textcurrency     215
+\definecharacter textdollar        36
+\definecharacter texteuro         128
+
+\definecharacter periodcentered   189
+\definecharacter textdag          143
+\definecharacter textddag         144
+\definecharacter textdegree       148
+\definecharacter textbullet       180
+
+\definecharacter paragraphmark    176
+
+\definecharacter copyright        164
+\definecharacter registered       163
+
+\definecharacter textbrokenbar    223
+\definecharacter textellipsis       8
+\definecharacter textslash         47
+\definecharacter textpm           172
+\definecharacter textdiv          165
+\definecharacter textminus        168
+\definecharacter textmultiply     169
+\definecharacter textmu             7
+
+\definecharacter quotedbl         190
+\definecharacter quotedblbase     255
+\definecharacter quotedblleft      92
+\definecharacter quotedblright     34
+
+\definecharacter quotesingle      191
+
+\definecharacter quoteleft         96
+\definecharacter quoteright        39
+
+\definecharacter leftguillemot    174
+\definecharacter rightguillemot   175
+
+\definecharacter aacute           225
+\definecharacter Aacute           193
+\definecharacter cacute           162
+\definecharacter Cacute           130
+\definecharacter eacute           233
+\definecharacter Eacute           201
+\definecharacter iacute           237
+\definecharacter Iacute           205
+\definecharacter Nacute           139
+\definecharacter Oacute           211
+\definecharacter nacute           171
+\definecharacter oacute           243
+\definecharacter sacute           177
+\definecharacter Sacute           145
+\definecharacter uacute           250
+\definecharacter Uacute           218
+\definecharacter yacute           253
+\definecharacter Yacute           221
+\definecharacter zacute           185
+\definecharacter Zacute           153
+
+\definecharacter scaron           178
+\definecharacter Scaron           146
+\definecharacter zcaron           186
+\definecharacter Zcaron           154
+
+\definecharacter ccedilla         231
+\definecharacter Ccedilla         199
+
+\definecharacter acircumflex      226
+\definecharacter Acircumflex      194
+\definecharacter ecircumflex      234
+\definecharacter Ecircumflex      202
+\definecharacter icircumflex      238
+\definecharacter Icircumflex      206
+\definecharacter ocircumflex      244
+\definecharacter Ocircumflex      212
+\definecharacter ucircumflex      251
+\definecharacter Ucircumflex      219
+
+\definecharacter adiaeresis       228
+\definecharacter Adiaeresis       196
+\definecharacter ediaeresis       235
+\definecharacter Ediaeresis       203
+\definecharacter idiaeresis       239
+\definecharacter Idiaeresis       207
+\definecharacter odiaeresis       246
+\definecharacter Odiaeresis       214
+\definecharacter udiaeresis       252
+\definecharacter Udiaeresis       220
+\definecharacter ydiaeresis       184
+\definecharacter Ydiaeresis       152
+
+\definecharacter zdotaccent       187
+\definecharacter Zdotaccent       155
+
+\definecharacter agrave           224
+\definecharacter Agrave           192
+\definecharacter egrave           232
+\definecharacter Egrave           200
+\definecharacter igrave           236
+\definecharacter Igrave           204
+\definecharacter ograve           242
+\definecharacter Ograve           210
+\definecharacter ugrave           249
+\definecharacter Ugrave           217
+
+\definecharacter aogonek          161
+\definecharacter Aogonek          129
+\definecharacter eogonek          166
+\definecharacter Eogonek          134
+\definecharacter iogonek          167
+\definecharacter Iogonek          135
+\definecharacter uogonek          183
+\definecharacter Uogonek          151
+
+\definecharacter aring            229
+\definecharacter Aring            197
+
+\definecharacter lstroke          170
+\definecharacter Lstroke          138
+\definecharacter ostroke           28
+\definecharacter Ostroke           31
+
+\definecharacter atilde           227
+\definecharacter Atilde           195
+\definecharacter ntilde           241
+\definecharacter Ntilde           209
+\definecharacter otilde           245
+\definecharacter Otilde           213
+
+\definecharacter scommaaccent     179
+\definecharacter Scommaaccent     147
+\definecharacter tcommaaccent     181
+\definecharacter Tcommaaccent     149
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-qx.tex b/tex/context/base/enco-qx.tex
deleted file mode 100644
index 407d60bd7..000000000
--- a/tex/context/base/enco-qx.tex
+++ /dev/null
@@ -1,266 +0,0 @@
-%D \module
-%D   [     file=enco-qx,
-%D      version=2004.04.03,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Polish QX Encoding,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=PRAGMA-ADE]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% to be done
-
-%  35          numbersign
-%  95           dotaccent
-% 132        greaterequal
-% 133         approxequal
-% 137           lessequal
-% 142                 ell
-% 156                  IJ
-% 173            infinity
-% 182 threequartersemdash
-% 188                  ij
-% 247            anglearc
-% 248            diameter
-
-\startmapping[qx] % to be done
-
-\resetcaserange 128 to 128
-\resetcaserange 131 to 133
-\resetcaserange 136 to 137
-\resetcaserange 140 to 144
-\resetcaserange 148 to 148
-\resetcaserange 150 to 150
-\resetcaserange 157 to 160
-\resetcaserange 163 to 165
-\resetcaserange 168 to 169
-\resetcaserange 172 to 176
-\resetcaserange 180 to 180
-\resetcaserange 182 to 182
-\resetcaserange 189 to 191
-\resetcaserange 198 to 198
-\resetcaserange 215 to 216
-\resetcaserange 223 to 223
-\resetcaserange 230 to 230
-\resetcaserange 247 to 248
-\resetcaserange 255 to 255
-
-\definecaseswap 161 129
-\definecaseswap 162 130
-
-\definecaseswap 166 134
-\definecaseswap 167 135
-
-\definecaseswap 170 138
-\definecaseswap 171 139
-
-\definecaseswap 177 145
-\definecaseswap 178 146
-\definecaseswap 179 147
-
-\definecaseswap 181 149
-
-\definecasemaps 151 to 156 lc +32 uc   0
-\definecasemaps 183 to 188 lc   0 uc -32
-
-\definecasemaps 192 to 197 lc +32 uc   0
-\definecasemaps 224 to 229 lc   0 uc -32
-
-\definecasemaps 199 to 214 lc +32 uc   0
-\definecasemaps 231 to 246 lc   0 uc -32
-
-\definecasemaps 217 to 222 lc +32 uc   0
-\definecasemaps 249 to 254 lc   0 uc -32
-
-\stopmapping
-
-\startencoding[qx]
-
-\definecharacter textacute         19
-\definecharacter textbreve         21
-\definecharacter textcaron         20
-\definecharacter textcedilla       24
-\definecharacter textcircumflex    94
-\definecharacter textdiaeresis    127
-\definecharacter textdotaccent     94
-\definecharacter textgrave         18
-\definecharacter texthungarumlaut 125
-\definecharacter textmacron        22
-\definecharacter textogonek       150
-\definecharacter textring          23
-\definecharacter texttilde        126
-
-\definecharacter dotlessi          16
-\definecharacter dotlessj          17
-
-\definecharacter endash           123
-\definecharacter emdash           124
-
-\definecharacter aeligature        26
-\definecharacter AEligature        29
-\definecharacter oeligature        27
-\definecharacter OEligature        30
-
-\definecharacter ssharp            25
-%definecharacter Ssharp            25
-
-\definecharacter thorn            254
-\definecharacter Thorn            222
-
-\definecharacter Dstroke          208 % also Eth, mapped into enco-def
-\definecharacter eth              240
-
-\definecharacter exclamdown        60
-\definecharacter questiondown      62
-
-\definecharacter sectionmark      159
-
-\definecharacter percent           37
-\definecharacter perthousand      216
-
-\definecharacter textasciicircum  141
-\definecharacter textasciitilde   140
-\definecharacter textbackslash    198
-\definecharacter textbraceleft    157
-\definecharacter textbraceright   158
-\definecharacter textunderscore   230
-
-\definecharacter textcurrency     215
-\definecharacter textdollar        36
-\definecharacter texteuro         128
-
-\definecharacter periodcentered   189
-\definecharacter textdag          143
-\definecharacter textddag         144
-\definecharacter textdegree       148
-\definecharacter textbullet       180
-
-\definecharacter paragraphmark    176
-
-\definecharacter copyright        164
-\definecharacter registered       163
-
-\definecharacter textbrokenbar    223
-\definecharacter textellipsis       8
-\definecharacter textslash         47
-\definecharacter textpm           172
-\definecharacter textdiv          165
-\definecharacter textminus        168
-\definecharacter textmultiply     169
-\definecharacter textmu             7
-
-\definecharacter quotedbl         190
-\definecharacter quotedblbase     255
-\definecharacter quotedblleft      92
-\definecharacter quotedblright     34
-
-\definecharacter quotesingle      191
-
-\definecharacter quoteleft         96
-\definecharacter quoteright        39
-
-\definecharacter leftguillemot    174
-\definecharacter rightguillemot   175
-
-\definecharacter aacute           225
-\definecharacter Aacute           193
-\definecharacter cacute           162
-\definecharacter Cacute           130
-\definecharacter eacute           233
-\definecharacter Eacute           201
-\definecharacter iacute           237
-\definecharacter Iacute           205
-\definecharacter Nacute           139
-\definecharacter Oacute           211
-\definecharacter nacute           171
-\definecharacter oacute           243
-\definecharacter sacute           177
-\definecharacter Sacute           145
-\definecharacter uacute           250
-\definecharacter Uacute           218
-\definecharacter yacute           253
-\definecharacter Yacute           221
-\definecharacter zacute           185
-\definecharacter Zacute           153
-
-\definecharacter scaron           178
-\definecharacter Scaron           146
-\definecharacter zcaron           186
-\definecharacter Zcaron           154
-
-\definecharacter ccedilla         231
-\definecharacter Ccedilla         199
-
-\definecharacter acircumflex      226
-\definecharacter Acircumflex      194
-\definecharacter ecircumflex      234
-\definecharacter Ecircumflex      202
-\definecharacter icircumflex      238
-\definecharacter Icircumflex      206
-\definecharacter ocircumflex      244
-\definecharacter Ocircumflex      212
-\definecharacter ucircumflex      251
-\definecharacter Ucircumflex      219
-
-\definecharacter adiaeresis       228
-\definecharacter Adiaeresis       196
-\definecharacter ediaeresis       235
-\definecharacter Ediaeresis       203
-\definecharacter idiaeresis       239
-\definecharacter Idiaeresis       207
-\definecharacter odiaeresis       246
-\definecharacter Odiaeresis       214
-\definecharacter udiaeresis       252
-\definecharacter Udiaeresis       220
-\definecharacter ydiaeresis       184
-\definecharacter Ydiaeresis       152
-
-\definecharacter zdotaccent       187
-\definecharacter Zdotaccent       155
-
-\definecharacter agrave           224
-\definecharacter Agrave           192
-\definecharacter egrave           232
-\definecharacter Egrave           200
-\definecharacter igrave           236
-\definecharacter Igrave           204
-\definecharacter ograve           242
-\definecharacter Ograve           210
-\definecharacter ugrave           249
-\definecharacter Ugrave           217
-
-\definecharacter aogonek          161
-\definecharacter Aogonek          129
-\definecharacter eogonek          166
-\definecharacter Eogonek          134
-\definecharacter iogonek          167
-\definecharacter Iogonek          135
-\definecharacter uogonek          183
-\definecharacter Uogonek          151
-
-\definecharacter aring            229
-\definecharacter Aring            197
-
-\definecharacter lstroke          170
-\definecharacter Lstroke          138
-\definecharacter ostroke           28
-\definecharacter Ostroke           31
-
-\definecharacter atilde           227
-\definecharacter Atilde           195
-\definecharacter ntilde           241
-\definecharacter Ntilde           209
-\definecharacter otilde           245
-\definecharacter Otilde           213
-
-\definecharacter scommaaccent     179
-\definecharacter Scommaaccent     147
-\definecharacter tcommaaccent     181
-\definecharacter Tcommaaccent     149
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-raw.mkii b/tex/context/base/enco-raw.mkii
new file mode 100644
index 000000000..e3a46e3d7
--- /dev/null
+++ b/tex/context/base/enco-raw.mkii
@@ -0,0 +1,119 @@
+% default instelbaar maken: \enableencoding[main][fallback]
+
+\startencoding[raw]
+
+\definecharacter Acircumflex {A} \definecharacter acircumflex {a}
+\definecharacter Ccircumflex {C} \definecharacter ccircumflex {c}
+\definecharacter Ecircumflex {E} \definecharacter ecircumflex {e}
+\definecharacter Gcircumflex {G} \definecharacter gcircumflex {g}
+\definecharacter Hcircumflex {H} \definecharacter hcircumflex {h}
+\definecharacter Icircumflex {I} \definecharacter icircumflex {i}
+\definecharacter Jcircumflex {J} \definecharacter jcircumflex {j}
+\definecharacter Ocircumflex {O} \definecharacter ocircumflex {o}
+\definecharacter Scircumflex {S} \definecharacter scircumflex {s}
+\definecharacter Ucircumflex {U} \definecharacter ucircumflex {u}
+\definecharacter Wcircumflex {W} \definecharacter wcircumflex {w}
+\definecharacter Ycircumflex {Y} \definecharacter ycircumflex {y}
+
+\definecharacter Agrave {A} \definecharacter agrave {a}
+\definecharacter Egrave {E} \definecharacter egrave {e}
+\definecharacter Igrave {I} \definecharacter igrave {i}
+\definecharacter Ograve {O} \definecharacter ograve {o}
+\definecharacter Ugrave {U} \definecharacter ugrave {u}
+\definecharacter Ygrave {Y} \definecharacter ygrave {y}
+
+\definecharacter Atilde {A} \definecharacter atilde {a}
+\definecharacter Itilde {I} \definecharacter itilde {i}
+\definecharacter Otilde {O} \definecharacter otilde {o}
+\definecharacter Utilde {U} \definecharacter utilde {u}
+\definecharacter Utilde {N} \definecharacter utilde {n}
+
+\definecharacter Adiaeresis {A} \definecharacter adiaeresis {a}
+\definecharacter Ediaeresis {E} \definecharacter ediaeresis {e}
+\definecharacter Idiaeresis {I} \definecharacter idiaeresis {i}
+\definecharacter Odiaeresis {O} \definecharacter odiaeresis {o}
+\definecharacter Udiaeresis {U} \definecharacter udiaeresis {u}
+\definecharacter Ydiaeresis {Y} \definecharacter ydiaeresis {y}
+
+\definecharacter Aacute {A} \definecharacter aacute {a}
+\definecharacter Cacute {C} \definecharacter cacute {c}
+\definecharacter Eacute {E} \definecharacter eacute {e}
+\definecharacter Iacute {I} \definecharacter iacute {i}
+\definecharacter Lacute {L} \definecharacter lacute {l}
+\definecharacter Nacute {N} \definecharacter nacute {n}
+\definecharacter Oacute {O} \definecharacter oacute {o}
+\definecharacter Racute {R} \definecharacter racute {r}
+\definecharacter Sacute {S} \definecharacter sacute {s}
+\definecharacter Uacute {U} \definecharacter uacute {u}
+\definecharacter Yacute {Y} \definecharacter yacute {y}
+\definecharacter Zacute {Z} \definecharacter zacute {z}
+
+\definecharacter Dstroke {D} \definecharacter dstroke {d}
+\definecharacter Hstroke {H} \definecharacter hstroke {h}
+\definecharacter Tstroke {T} \definecharacter tstroke {t}
+
+\definecharacter Cdotaccent {C} \definecharacter cdotaccent {c}
+\definecharacter Edotaccent {E} \definecharacter edotaccent {e}
+\definecharacter Gdotaccent {G} \definecharacter gdotaccent {g}
+\definecharacter Idotaccent {I} \definecharacter idotaccent {i}
+\definecharacter Zdotaccent {Z} \definecharacter zdotaccent {z}
+
+\definecharacter Amacron {A} \definecharacter amacron {a}
+\definecharacter Emacron {E} \definecharacter emacron {e}
+\definecharacter Imacron {I} \definecharacter imacron {i}
+\definecharacter Omacron {O} \definecharacter omacron {o}
+\definecharacter Umacron {U} \definecharacter umacron {u}
+
+\definecharacter Ccedilla {C} \definecharacter ccedilla {c}
+\definecharacter Kcedilla {K} \definecharacter kcedilla {k}
+\definecharacter Lcedilla {L} \definecharacter lcedilla {l}
+\definecharacter Ncedilla {N} \definecharacter ncedilla {n}
+\definecharacter Rcedilla {R} \definecharacter rcedilla {r}
+\definecharacter Scedilla {S} \definecharacter scedilla {s}
+\definecharacter Tcedilla {T} \definecharacter tcedilla {t}
+
+\definecharacter Ohungarumlaut {O} \definecharacter ohungarumlaut {o}
+\definecharacter Uhungarumlaut {U} \definecharacter uhungarumlaut {u}
+
+\definecharacter Aogonek {A} \definecharacter aogonek {a}
+\definecharacter Eogonek {E} \definecharacter eogonek {e}
+\definecharacter Iogonek {I} \definecharacter iogonek {i}
+\definecharacter Uogonek {U} \definecharacter uogonek {u}
+
+\definecharacter Aring {A} \definecharacter aring {a}
+\definecharacter Uring {U} \definecharacter uring {u}
+
+\definecharacter Abreve {A} \definecharacter abreve {a}
+\definecharacter Ebreve {E} \definecharacter ebreve {e}
+\definecharacter Gbreve {G} \definecharacter gbreve {g}
+\definecharacter Ibreve {I} \definecharacter ibreve {i}
+\definecharacter Obreve {O} \definecharacter obreve {o}
+\definecharacter Ubreve {U} \definecharacter ubreve {u}
+
+\definecharacter Ccaron {C} \definecharacter ccaron {c}
+\definecharacter Dcaron {D} \definecharacter dcaron {d}
+\definecharacter Ecaron {E} \definecharacter ecaron {e}
+\definecharacter Lcaron {L} \definecharacter lcaron {l}
+\definecharacter Ncaron {N} \definecharacter ncaron {n}
+\definecharacter Rcaron {R} \definecharacter rcaron {r}
+\definecharacter Scaron {S} \definecharacter scaron {s}
+\definecharacter Tcaron {T} \definecharacter tcaron {t}
+\definecharacter Zcaron {Z} \definecharacter zcaron {z}
+
+\definecharacter dotlessI {I} \definecharacter dotlessi {i}
+\definecharacter dotlessJ {J} \definecharacter dotlessj {j}
+
+\definecharacter AEligature {AE} \definecharacter aeligature {ae}
+\definecharacter Lstroke    {L}  \definecharacter lstroke    {l}
+\definecharacter Ostroke    {O}  \definecharacter ostroke    {o}
+\definecharacter OEligature {OE} \definecharacter oeligature {oe}
+\definecharacter Ssharp     {SS} \definecharacter ssharp     {ss}
+\definecharacter IJligature {IJ} \definecharacter ijligature {ij}
+
+\definecharacter Aumlaut {A} \definecharacter aumlaut {a}
+\definecharacter Eumlaut {E} \definecharacter eumlaut {e}
+\definecharacter Iumlaut {I} \definecharacter iumlaut {i}
+\definecharacter Oumlaut {O} \definecharacter oumlaut {o}
+\definecharacter Uumlaut {U} \definecharacter uumlaut {u}
+
+\stopencoding
diff --git a/tex/context/base/enco-raw.tex b/tex/context/base/enco-raw.tex
deleted file mode 100644
index e3a46e3d7..000000000
--- a/tex/context/base/enco-raw.tex
+++ /dev/null
@@ -1,119 +0,0 @@
-% default instelbaar maken: \enableencoding[main][fallback]
-
-\startencoding[raw]
-
-\definecharacter Acircumflex {A} \definecharacter acircumflex {a}
-\definecharacter Ccircumflex {C} \definecharacter ccircumflex {c}
-\definecharacter Ecircumflex {E} \definecharacter ecircumflex {e}
-\definecharacter Gcircumflex {G} \definecharacter gcircumflex {g}
-\definecharacter Hcircumflex {H} \definecharacter hcircumflex {h}
-\definecharacter Icircumflex {I} \definecharacter icircumflex {i}
-\definecharacter Jcircumflex {J} \definecharacter jcircumflex {j}
-\definecharacter Ocircumflex {O} \definecharacter ocircumflex {o}
-\definecharacter Scircumflex {S} \definecharacter scircumflex {s}
-\definecharacter Ucircumflex {U} \definecharacter ucircumflex {u}
-\definecharacter Wcircumflex {W} \definecharacter wcircumflex {w}
-\definecharacter Ycircumflex {Y} \definecharacter ycircumflex {y}
-
-\definecharacter Agrave {A} \definecharacter agrave {a}
-\definecharacter Egrave {E} \definecharacter egrave {e}
-\definecharacter Igrave {I} \definecharacter igrave {i}
-\definecharacter Ograve {O} \definecharacter ograve {o}
-\definecharacter Ugrave {U} \definecharacter ugrave {u}
-\definecharacter Ygrave {Y} \definecharacter ygrave {y}
-
-\definecharacter Atilde {A} \definecharacter atilde {a}
-\definecharacter Itilde {I} \definecharacter itilde {i}
-\definecharacter Otilde {O} \definecharacter otilde {o}
-\definecharacter Utilde {U} \definecharacter utilde {u}
-\definecharacter Utilde {N} \definecharacter utilde {n}
-
-\definecharacter Adiaeresis {A} \definecharacter adiaeresis {a}
-\definecharacter Ediaeresis {E} \definecharacter ediaeresis {e}
-\definecharacter Idiaeresis {I} \definecharacter idiaeresis {i}
-\definecharacter Odiaeresis {O} \definecharacter odiaeresis {o}
-\definecharacter Udiaeresis {U} \definecharacter udiaeresis {u}
-\definecharacter Ydiaeresis {Y} \definecharacter ydiaeresis {y}
-
-\definecharacter Aacute {A} \definecharacter aacute {a}
-\definecharacter Cacute {C} \definecharacter cacute {c}
-\definecharacter Eacute {E} \definecharacter eacute {e}
-\definecharacter Iacute {I} \definecharacter iacute {i}
-\definecharacter Lacute {L} \definecharacter lacute {l}
-\definecharacter Nacute {N} \definecharacter nacute {n}
-\definecharacter Oacute {O} \definecharacter oacute {o}
-\definecharacter Racute {R} \definecharacter racute {r}
-\definecharacter Sacute {S} \definecharacter sacute {s}
-\definecharacter Uacute {U} \definecharacter uacute {u}
-\definecharacter Yacute {Y} \definecharacter yacute {y}
-\definecharacter Zacute {Z} \definecharacter zacute {z}
-
-\definecharacter Dstroke {D} \definecharacter dstroke {d}
-\definecharacter Hstroke {H} \definecharacter hstroke {h}
-\definecharacter Tstroke {T} \definecharacter tstroke {t}
-
-\definecharacter Cdotaccent {C} \definecharacter cdotaccent {c}
-\definecharacter Edotaccent {E} \definecharacter edotaccent {e}
-\definecharacter Gdotaccent {G} \definecharacter gdotaccent {g}
-\definecharacter Idotaccent {I} \definecharacter idotaccent {i}
-\definecharacter Zdotaccent {Z} \definecharacter zdotaccent {z}
-
-\definecharacter Amacron {A} \definecharacter amacron {a}
-\definecharacter Emacron {E} \definecharacter emacron {e}
-\definecharacter Imacron {I} \definecharacter imacron {i}
-\definecharacter Omacron {O} \definecharacter omacron {o}
-\definecharacter Umacron {U} \definecharacter umacron {u}
-
-\definecharacter Ccedilla {C} \definecharacter ccedilla {c}
-\definecharacter Kcedilla {K} \definecharacter kcedilla {k}
-\definecharacter Lcedilla {L} \definecharacter lcedilla {l}
-\definecharacter Ncedilla {N} \definecharacter ncedilla {n}
-\definecharacter Rcedilla {R} \definecharacter rcedilla {r}
-\definecharacter Scedilla {S} \definecharacter scedilla {s}
-\definecharacter Tcedilla {T} \definecharacter tcedilla {t}
-
-\definecharacter Ohungarumlaut {O} \definecharacter ohungarumlaut {o}
-\definecharacter Uhungarumlaut {U} \definecharacter uhungarumlaut {u}
-
-\definecharacter Aogonek {A} \definecharacter aogonek {a}
-\definecharacter Eogonek {E} \definecharacter eogonek {e}
-\definecharacter Iogonek {I} \definecharacter iogonek {i}
-\definecharacter Uogonek {U} \definecharacter uogonek {u}
-
-\definecharacter Aring {A} \definecharacter aring {a}
-\definecharacter Uring {U} \definecharacter uring {u}
-
-\definecharacter Abreve {A} \definecharacter abreve {a}
-\definecharacter Ebreve {E} \definecharacter ebreve {e}
-\definecharacter Gbreve {G} \definecharacter gbreve {g}
-\definecharacter Ibreve {I} \definecharacter ibreve {i}
-\definecharacter Obreve {O} \definecharacter obreve {o}
-\definecharacter Ubreve {U} \definecharacter ubreve {u}
-
-\definecharacter Ccaron {C} \definecharacter ccaron {c}
-\definecharacter Dcaron {D} \definecharacter dcaron {d}
-\definecharacter Ecaron {E} \definecharacter ecaron {e}
-\definecharacter Lcaron {L} \definecharacter lcaron {l}
-\definecharacter Ncaron {N} \definecharacter ncaron {n}
-\definecharacter Rcaron {R} \definecharacter rcaron {r}
-\definecharacter Scaron {S} \definecharacter scaron {s}
-\definecharacter Tcaron {T} \definecharacter tcaron {t}
-\definecharacter Zcaron {Z} \definecharacter zcaron {z}
-
-\definecharacter dotlessI {I} \definecharacter dotlessi {i}
-\definecharacter dotlessJ {J} \definecharacter dotlessj {j}
-
-\definecharacter AEligature {AE} \definecharacter aeligature {ae}
-\definecharacter Lstroke    {L}  \definecharacter lstroke    {l}
-\definecharacter Ostroke    {O}  \definecharacter ostroke    {o}
-\definecharacter OEligature {OE} \definecharacter oeligature {oe}
-\definecharacter Ssharp     {SS} \definecharacter ssharp     {ss}
-\definecharacter IJligature {IJ} \definecharacter ijligature {ij}
-
-\definecharacter Aumlaut {A} \definecharacter aumlaut {a}
-\definecharacter Eumlaut {E} \definecharacter eumlaut {e}
-\definecharacter Iumlaut {I} \definecharacter iumlaut {i}
-\definecharacter Oumlaut {O} \definecharacter oumlaut {o}
-\definecharacter Uumlaut {U} \definecharacter uumlaut {u}
-
-\stopencoding
diff --git a/tex/context/base/enco-run.mkii b/tex/context/base/enco-run.mkii
new file mode 100644
index 000000000..50fb52e15
--- /dev/null
+++ b/tex/context/base/enco-run.mkii
@@ -0,0 +1,149 @@
+%D \module
+%D   [     file=enco-run,
+%D      version=2000.27.12, % moved to runtime module
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Runtime Macros,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=Hans Hagen \& Ton Otten]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\gdef\visualizecharacters% {}'s needed
+  {\def\uchar##1##2{\hbox to 2.5em
+     {\ifcase##1\relax\red\or\blue\else\green\fi##1\hss##2}}%
+   \let\normalbuildtextaccent\buildtextaccent
+   \let\normalbottomaccent   \bottomaccent
+  %\def\char{\green\normalchar}%
+   \def\char % can be used in \oalign
+     {\bgroup\def\char{\green\normalchar\scratchcounter\egroup}%
+      \afterassignment\char\scratchcounter}%
+   \def\buildtextaccent{\let\green\empty\blue\normalbuildtextaccent}%
+   \def\bottomaccent{\let\green\empty\red\normalbottomaccent}}
+
+\unexpanded\gdef\visualizecharacterslegend
+  {\hbox
+     {\edef\banner{\currentencoding\space\fontname\font}%
+      \tttf\banner:\space
+      {\blue composed}\space{\red bottom}\space{\green char}\space raw}}
+
+\gdef\showaccents
+  {\bgroup
+   \savefont
+   \setuptextrules[\c!bodyfont=,\c!style=]
+   \starttextrule{\visualizecharacterslegend}
+   \whitespace
+   \restorefont\setupinterlinespace
+   \visualizecharacters
+   \def\do##1%
+     {{\def\dodo####1%
+         {\hss\hbox to 1em{\hss\expanded{##1####1\recurselevel}\hss}}%
+       \hbox to \hsize
+         {\strut
+          \localcolortrue
+          \hbox to 2em{\tttf\string##1\hss}%
+          \dorecurse{26}{\dodo\character}}%
+       \hbox to \hsize
+         {\strut
+          \localcolortrue
+          \hskip2em
+          \dorecurse{26}{\dodo\Character}}}%
+       \par}
+   \do\'\do\`\do\^\do\~\do\"
+   \do\H\do\r\do\v\do\u\do\=
+   \do\.\do\b\do\d\do\k\do\c
+   \stoptextrule
+   \egroup}
+
+\gdef\showcharacters
+  {\bgroup
+   \savefont
+   \setuptextrules[\c!bodyfont=,\c!style=]
+   \starttextrule{\visualizecharacterslegend}
+   \whitespace
+   \dontcomplain
+   \forgetall
+   \def\startencoding[##1]{}
+   \def\stopencoding{\endinput}
+   \dimen0=\zeropoint
+   \dimen2=\zeropoint
+   \def\definecharacter ##1 ##2 %
+     {\setbox0=\hbox spread 1em{\getvalue{##1}}%
+      \ifdim\wd0>\dimen0 \dimen0=\wd0 \fi
+      \setbox2=\hbox spread 1em{\box0 \tttf##1}
+      \ifdim\wd2>\dimen2 \dimen2=\wd2 \fi}%
+   \readsysfile{\f!encodingprefix def}{}{}
+   \edef\encwidth{\the\dimen0}
+   \dimen0=\hsize
+   \advance\dimen0 2em
+   \advance\dimen2 2em
+   \divide \dimen0 by \dimen2 \advance\dimen0 1sp
+   \edef\enccols{\number\dimen0}
+   \visualizecharacters
+   \startcolumns[\c!n=\enccols,\c!distance=2em]
+   \restorefont\setupinterlinespace
+   \def\definecharacter ##1 ##2 %
+     {\setbox0=\hbox to \hsize{\localcolortrue\hbox to \encwidth{\getvalue{##1}\hss}\tttf##1}%
+      \ht0\strutheight \dp0\strutdepth \box0 \allowbreak}
+   \readsysfile{\f!encodingprefix def}{}{}
+   \stopcolumns
+   \stoptextrule
+   \egroup}
+
+% \hbox
+%   {\font\test=uplr8t \test \ruledhbox{t}
+%    \font\test=uplr8r \test \ruledhbox{t}}
+
+\ifnum\texengine=\pdftexengine
+
+    \gdef\showhyphenations#1%
+      {\starttabulate[|le|l|]
+       \NC language \NC \currentlanguage\ (internal code:\the\normallanguage)    \NC \NR
+       \NC font     \NC \fontname\font                                           \NC \NR
+       \NC encoding \NC \ifx\@@fontencoding\empty not set\else\@@fontencoding\fi \NC \NR
+       \NC mapping  \NC \ifx\@@fontmapping \empty not set\else\@@fontmapping \fi \NC \NR
+       \NC handling \NC \ifx\@@fonthandling\empty not set\else\@@fonthandling\fi \NC \NR
+       \NC sample   \NC \hyphenatedword{#1}                                      \NC \NR
+       \stoptabulate}
+
+    \gdef\showmapping
+      {\dostepwiserecurse{128}{255}{1}
+          {\hbox\bgroup
+             \hbox to 2em{\hss\recurselevel}%
+             \hbox to 2em{\hss\char\recurselevel\hss}%
+             \hbox to 3em{\hss\ifcase\lccode\recurselevel\else\the \lccode\recurselevel\fi}%
+             \hbox to 2em{\hss\ifcase\lccode\recurselevel\else\char\lccode\recurselevel\fi\hss}%
+             \hbox to 3em{\hss\ifcase\lccode\recurselevel\else\the \uccode\recurselevel\fi}%
+             \hbox to 2em{\hss\ifcase\uccode\recurselevel\else\char\uccode\recurselevel\fi\hss}%
+           \egroup
+           \endgraf}}
+
+    \gdef\showcharacterbounds
+      {\bgroup
+       \localcolortrue
+       \dorecurse{255}
+         {\ifdim\fontcharwd\font\recurselevel>\zeropoint
+            \noindent\ruledhbox{\darkgray\char\recurselevel}\space
+          \fi}\unskip
+       \egroup}
+
+\else
+
+    \gdef\showhyphenations#1%
+      {\starttabulate[|le|l|]
+       \NC language \NC \currentlanguage\ (internal code:\the\normallanguage) \NC \NR
+       \NC font     \NC \fontname\font                                        \NC \NR
+       \NC sample   \NC \hyphenatedword{#1}                                   \NC \NR
+       \stoptabulate}
+
+    \globallet\showmapping\relax
+
+    \globallet\showcharacterbounds\relax
+
+\fi
+
+\protect \endinput
diff --git a/tex/context/base/enco-run.tex b/tex/context/base/enco-run.tex
deleted file mode 100644
index 50fb52e15..000000000
--- a/tex/context/base/enco-run.tex
+++ /dev/null
@@ -1,149 +0,0 @@
-%D \module
-%D   [     file=enco-run,
-%D      version=2000.27.12, % moved to runtime module
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Runtime Macros,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=Hans Hagen \& Ton Otten]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\unprotect
-
-\gdef\visualizecharacters% {}'s needed
-  {\def\uchar##1##2{\hbox to 2.5em
-     {\ifcase##1\relax\red\or\blue\else\green\fi##1\hss##2}}%
-   \let\normalbuildtextaccent\buildtextaccent
-   \let\normalbottomaccent   \bottomaccent
-  %\def\char{\green\normalchar}%
-   \def\char % can be used in \oalign
-     {\bgroup\def\char{\green\normalchar\scratchcounter\egroup}%
-      \afterassignment\char\scratchcounter}%
-   \def\buildtextaccent{\let\green\empty\blue\normalbuildtextaccent}%
-   \def\bottomaccent{\let\green\empty\red\normalbottomaccent}}
-
-\unexpanded\gdef\visualizecharacterslegend
-  {\hbox
-     {\edef\banner{\currentencoding\space\fontname\font}%
-      \tttf\banner:\space
-      {\blue composed}\space{\red bottom}\space{\green char}\space raw}}
-
-\gdef\showaccents
-  {\bgroup
-   \savefont
-   \setuptextrules[\c!bodyfont=,\c!style=]
-   \starttextrule{\visualizecharacterslegend}
-   \whitespace
-   \restorefont\setupinterlinespace
-   \visualizecharacters
-   \def\do##1%
-     {{\def\dodo####1%
-         {\hss\hbox to 1em{\hss\expanded{##1####1\recurselevel}\hss}}%
-       \hbox to \hsize
-         {\strut
-          \localcolortrue
-          \hbox to 2em{\tttf\string##1\hss}%
-          \dorecurse{26}{\dodo\character}}%
-       \hbox to \hsize
-         {\strut
-          \localcolortrue
-          \hskip2em
-          \dorecurse{26}{\dodo\Character}}}%
-       \par}
-   \do\'\do\`\do\^\do\~\do\"
-   \do\H\do\r\do\v\do\u\do\=
-   \do\.\do\b\do\d\do\k\do\c
-   \stoptextrule
-   \egroup}
-
-\gdef\showcharacters
-  {\bgroup
-   \savefont
-   \setuptextrules[\c!bodyfont=,\c!style=]
-   \starttextrule{\visualizecharacterslegend}
-   \whitespace
-   \dontcomplain
-   \forgetall
-   \def\startencoding[##1]{}
-   \def\stopencoding{\endinput}
-   \dimen0=\zeropoint
-   \dimen2=\zeropoint
-   \def\definecharacter ##1 ##2 %
-     {\setbox0=\hbox spread 1em{\getvalue{##1}}%
-      \ifdim\wd0>\dimen0 \dimen0=\wd0 \fi
-      \setbox2=\hbox spread 1em{\box0 \tttf##1}
-      \ifdim\wd2>\dimen2 \dimen2=\wd2 \fi}%
-   \readsysfile{\f!encodingprefix def}{}{}
-   \edef\encwidth{\the\dimen0}
-   \dimen0=\hsize
-   \advance\dimen0 2em
-   \advance\dimen2 2em
-   \divide \dimen0 by \dimen2 \advance\dimen0 1sp
-   \edef\enccols{\number\dimen0}
-   \visualizecharacters
-   \startcolumns[\c!n=\enccols,\c!distance=2em]
-   \restorefont\setupinterlinespace
-   \def\definecharacter ##1 ##2 %
-     {\setbox0=\hbox to \hsize{\localcolortrue\hbox to \encwidth{\getvalue{##1}\hss}\tttf##1}%
-      \ht0\strutheight \dp0\strutdepth \box0 \allowbreak}
-   \readsysfile{\f!encodingprefix def}{}{}
-   \stopcolumns
-   \stoptextrule
-   \egroup}
-
-% \hbox
-%   {\font\test=uplr8t \test \ruledhbox{t}
-%    \font\test=uplr8r \test \ruledhbox{t}}
-
-\ifnum\texengine=\pdftexengine
-
-    \gdef\showhyphenations#1%
-      {\starttabulate[|le|l|]
-       \NC language \NC \currentlanguage\ (internal code:\the\normallanguage)    \NC \NR
-       \NC font     \NC \fontname\font                                           \NC \NR
-       \NC encoding \NC \ifx\@@fontencoding\empty not set\else\@@fontencoding\fi \NC \NR
-       \NC mapping  \NC \ifx\@@fontmapping \empty not set\else\@@fontmapping \fi \NC \NR
-       \NC handling \NC \ifx\@@fonthandling\empty not set\else\@@fonthandling\fi \NC \NR
-       \NC sample   \NC \hyphenatedword{#1}                                      \NC \NR
-       \stoptabulate}
-
-    \gdef\showmapping
-      {\dostepwiserecurse{128}{255}{1}
-          {\hbox\bgroup
-             \hbox to 2em{\hss\recurselevel}%
-             \hbox to 2em{\hss\char\recurselevel\hss}%
-             \hbox to 3em{\hss\ifcase\lccode\recurselevel\else\the \lccode\recurselevel\fi}%
-             \hbox to 2em{\hss\ifcase\lccode\recurselevel\else\char\lccode\recurselevel\fi\hss}%
-             \hbox to 3em{\hss\ifcase\lccode\recurselevel\else\the \uccode\recurselevel\fi}%
-             \hbox to 2em{\hss\ifcase\uccode\recurselevel\else\char\uccode\recurselevel\fi\hss}%
-           \egroup
-           \endgraf}}
-
-    \gdef\showcharacterbounds
-      {\bgroup
-       \localcolortrue
-       \dorecurse{255}
-         {\ifdim\fontcharwd\font\recurselevel>\zeropoint
-            \noindent\ruledhbox{\darkgray\char\recurselevel}\space
-          \fi}\unskip
-       \egroup}
-
-\else
-
-    \gdef\showhyphenations#1%
-      {\starttabulate[|le|l|]
-       \NC language \NC \currentlanguage\ (internal code:\the\normallanguage) \NC \NR
-       \NC font     \NC \fontname\font                                        \NC \NR
-       \NC sample   \NC \hyphenatedword{#1}                                   \NC \NR
-       \stoptabulate}
-
-    \globallet\showmapping\relax
-
-    \globallet\showcharacterbounds\relax
-
-\fi
-
-\protect \endinput
diff --git a/tex/context/base/enco-t5.mkii b/tex/context/base/enco-t5.mkii
new file mode 100644
index 000000000..251c68765
--- /dev/null
+++ b/tex/context/base/enco-t5.mkii
@@ -0,0 +1,244 @@
+%D \module
+%D   [     file=enco-t5,
+%D      version=2004.11.16,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=New Vietnamese Encoding,
+%D       author=Hans Hagen \& Adam Lindsay,
+%D         date=\currentdate,
+%D    copyright=PRAGMA \& Adam Lindsay]
+%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 module is derived from the enco-x5 encoding, but now
+%D approaches the world with named glyphs.
+
+\startencoding[t5]
+
+\definecasemaps 128 to 159 lc +32 uc   0
+
+\definecasemaps 160 to 191 lc   0 uc -32
+
+\definecasemaps 192 to 223 lc +32 uc   0
+
+\definecasemaps 224 to 225 lc   0 uc -32
+
+\definecasemap 26 26 27 \definecasemap 27 26 27
+\definecasemap 28 28 29 \definecasemap 29 28 29
+\definecasemap 30 30 31 \definecasemap 31 30 31
+
+\definecharacter textgrave             0
+\definecharacter textacute             1
+\definecharacter textcircumflex        2
+\definecharacter texttilde             3
+\definecharacter textdiaeresis         4
+\definecharacter textbottomdot         5
+\definecharacter textring              6
+\definecharacter textcaron             7
+\definecharacter textbreve             8
+\definecharacter textmacron            9
+\definecharacter textdotaccent        10
+\definecharacter textcedilla          11
+\definecharacter texthookabove        12
+\definecharacter textogonek           {}
+
+\definecharacter quotesinglebase      13
+\definecharacter guilsingleleft       14
+\definecharacter guilsingleright      15
+\definecharacter quotedblleft         16
+\definecharacter quotedblright        17
+\definecharacter quotedblbase         18
+\definecharacter leftguillemot        19
+\definecharacter rightguillemot       20
+\definecharacter endash               21
+\definecharacter emdash               22
+
+\definecharacter cwm                  23
+\definecharacter zeroinferior         24
+\definecharacter Yhook                26
+\definecharacter yhook                27
+\definecharacter Ydotbelow            28
+\definecharacter ydotbelow            29
+\definecharacter Dstroke              30
+\definecharacter dstroke              31
+\definecharacter textvisiblespace     32
+
+\definecharacter dotlessi             25
+%definecharacter DJ                   30
+%definecharacter dj                   31
+\definecharacter Agrave              128
+\definecharacter Aacute              129
+\definecharacter Atilde              130
+\definecharacter Ahook               131
+\definecharacter Adotbelow           132
+\definecharacter Acircumflex         133
+\definecharacter Acircumflexgrave    134
+\definecharacter Acircumflexacute    135
+\definecharacter Acircumflextilde    136
+\definecharacter Acircumflexhook     137
+\definecharacter Acircumflexdotbelow 138
+\definecharacter Abreve              139
+\definecharacter Abrevegrave         140
+\definecharacter Abreveacute         141
+\definecharacter Abrevetilde         142
+\definecharacter Abrevehook          143
+\definecharacter Abrevedotbelow      144
+\definecharacter Egrave              145
+\definecharacter Eacute              146
+\definecharacter Etilde              147
+\definecharacter Ehook               148
+\definecharacter Edotbelow           149
+\definecharacter Ecircumflex         150
+\definecharacter Ecircumflexgrave    151
+\definecharacter Ecircumflexacute    152
+\definecharacter Ecircumflextilde    153
+\definecharacter Ecircumflexhook     154
+\definecharacter Ecircumflexdotbelow 155
+\definecharacter Igrave              156
+\definecharacter Iacute              157
+\definecharacter Itilde              158
+\definecharacter Ihook               159
+\definecharacter agrave              160
+\definecharacter aacute              161
+\definecharacter atilde              162
+\definecharacter ahook               163
+\definecharacter adotbelow           164
+\definecharacter acircumflex         165
+\definecharacter acircumflexgrave    166
+\definecharacter acircumflexacute    167
+\definecharacter acircumflextilde    168
+\definecharacter acircumflexhook     169
+\definecharacter acircumflexdotbelow 170
+\definecharacter abreve              171
+\definecharacter abrevegrave         172
+\definecharacter abreveacute         173
+\definecharacter abrevetilde         174
+\definecharacter abrevehook          175
+\definecharacter abrevedotbelow      176
+\definecharacter egrave              177
+\definecharacter eacute              178
+\definecharacter etilde              179
+\definecharacter ehook               180
+\definecharacter edotbelow           181
+\definecharacter ecircumflex         182
+\definecharacter ecircumflexgrave    183
+\definecharacter ecircumflexacute    184
+\definecharacter ecircumflextilde    185
+\definecharacter ecircumflexhook     186
+\definecharacter ecircumflexdotbelow 187
+\definecharacter igrave              188
+\definecharacter iacute              189
+\definecharacter itilde              190
+\definecharacter ihook               191
+\definecharacter Idotbelow           192
+\definecharacter Ograve              193
+\definecharacter Oacute              194
+\definecharacter Otilde              195
+\definecharacter Ohook               196
+\definecharacter Odotbelow           197
+\definecharacter Ocircumflex         198
+\definecharacter Ocircumflexgrave    199
+\definecharacter Ocircumflexacute    200
+\definecharacter Ocircumflextilde    201
+\definecharacter Ocircumflexhook     202
+\definecharacter Ocircumflexdotbelow 203
+\definecharacter Ohorn               204
+\definecharacter Ohorngrave          205
+\definecharacter Ohornacute          206
+\definecharacter Ohorntilde          207
+\definecharacter Ohornhook           208
+\definecharacter Ohorndotbelow       209
+\definecharacter Ugrave              210
+\definecharacter Uacute              211
+\definecharacter Utilde              212
+\definecharacter Uhook               213
+\definecharacter Udotbelow           214
+\definecharacter Uhorn               215
+\definecharacter Uhorngrave          216
+\definecharacter Uhornacute          217
+\definecharacter Uhorntilde          218
+\definecharacter Uhornhook           219
+\definecharacter Uhorndotbelow       220
+\definecharacter Ytilde              223
+\definecharacter idotbelow           224
+\definecharacter ograve              225
+\definecharacter oacute              226
+\definecharacter otilde              227
+\definecharacter ohook               228
+\definecharacter odotbelow           229
+\definecharacter ocircumflex         230
+\definecharacter ocircumflexgrave    231
+\definecharacter ocircumflexacute    232
+\definecharacter ocircumflextilde    233
+\definecharacter ocircumflexhook     234
+\definecharacter ocircumflexdotbelow 235
+\definecharacter ohorn               236
+\definecharacter ohorngrave          237
+\definecharacter ohornacute          238
+\definecharacter ohorntilde          239
+\definecharacter ohornhook           240
+\definecharacter ohorndotbelow       241
+\definecharacter ugrave              242
+\definecharacter uacute              243
+\definecharacter utilde              244
+\definecharacter uhook               245
+\definecharacter udotbelow           246
+\definecharacter uhorn               247
+\definecharacter uhorngrave          248
+\definecharacter uhornacute          249
+\definecharacter uhorntilde          250
+\definecharacter uhornhook           251
+\definecharacter uhorndotbelow       252
+\definecharacter ygrave              253
+\definecharacter yacute              254
+\definecharacter ytilde              255
+
+\stopencoding
+
+\endinput
+
+% \startencoding [x5]
+%
+% \definecharacter aa {\xfiveencodedaa}
+% \definecharacter AA {\xfiveencodedAA}
+%
+% \stopencoding
+%
+% \def\xfiveencodedaa%
+%   {\accent23a}
+%
+% \def\xfiveencodedAA%
+%   {\leavevmode
+%    \setbox\zerocount\hbox{h}%
+%    \dimen@\ht\zerocount
+%    \advance\dimen@ -1ex
+%    \rlap{\raise.67\dimen@\hbox{\char23}}A}
+
+% \quotesinglbase     13
+% \guilsinglleft      14
+% \guilsinglright     15
+% \textquotedblleft   16
+% \textquotedblright  17
+% \quotedblbase       18
+% \guillemotleft      19
+% \guillemotright     20
+% \textendash         21
+% \textemdash         22
+% \textcompwordmark   23
+% \textperthousand    \% \char 24
+% \textpertenthousand \%\char 24\char 24
+% \textvisiblespace   32
+% \textquotedbl       `\"
+% \textdollar         `\$
+% \textquoteright     `\'
+% \textless           `\<
+% \textgreater        `\>
+% \textbackslash      `\
+% \textasciicircum    `\^
+% \textunderscore     95
+% \textquoteleft      `\`
+% \textbraceleft      `\{
+% \textbar            `\|
+% \textbraceright     `\}
+% \textasciitilde     `\~
diff --git a/tex/context/base/enco-t5.tex b/tex/context/base/enco-t5.tex
deleted file mode 100644
index 251c68765..000000000
--- a/tex/context/base/enco-t5.tex
+++ /dev/null
@@ -1,244 +0,0 @@
-%D \module
-%D   [     file=enco-t5,
-%D      version=2004.11.16,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=New Vietnamese Encoding,
-%D       author=Hans Hagen \& Adam Lindsay,
-%D         date=\currentdate,
-%D    copyright=PRAGMA \& Adam Lindsay]
-%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 module is derived from the enco-x5 encoding, but now
-%D approaches the world with named glyphs.
-
-\startencoding[t5]
-
-\definecasemaps 128 to 159 lc +32 uc   0
-
-\definecasemaps 160 to 191 lc   0 uc -32
-
-\definecasemaps 192 to 223 lc +32 uc   0
-
-\definecasemaps 224 to 225 lc   0 uc -32
-
-\definecasemap 26 26 27 \definecasemap 27 26 27
-\definecasemap 28 28 29 \definecasemap 29 28 29
-\definecasemap 30 30 31 \definecasemap 31 30 31
-
-\definecharacter textgrave             0
-\definecharacter textacute             1
-\definecharacter textcircumflex        2
-\definecharacter texttilde             3
-\definecharacter textdiaeresis         4
-\definecharacter textbottomdot         5
-\definecharacter textring              6
-\definecharacter textcaron             7
-\definecharacter textbreve             8
-\definecharacter textmacron            9
-\definecharacter textdotaccent        10
-\definecharacter textcedilla          11
-\definecharacter texthookabove        12
-\definecharacter textogonek           {}
-
-\definecharacter quotesinglebase      13
-\definecharacter guilsingleleft       14
-\definecharacter guilsingleright      15
-\definecharacter quotedblleft         16
-\definecharacter quotedblright        17
-\definecharacter quotedblbase         18
-\definecharacter leftguillemot        19
-\definecharacter rightguillemot       20
-\definecharacter endash               21
-\definecharacter emdash               22
-
-\definecharacter cwm                  23
-\definecharacter zeroinferior         24
-\definecharacter Yhook                26
-\definecharacter yhook                27
-\definecharacter Ydotbelow            28
-\definecharacter ydotbelow            29
-\definecharacter Dstroke              30
-\definecharacter dstroke              31
-\definecharacter textvisiblespace     32
-
-\definecharacter dotlessi             25
-%definecharacter DJ                   30
-%definecharacter dj                   31
-\definecharacter Agrave              128
-\definecharacter Aacute              129
-\definecharacter Atilde              130
-\definecharacter Ahook               131
-\definecharacter Adotbelow           132
-\definecharacter Acircumflex         133
-\definecharacter Acircumflexgrave    134
-\definecharacter Acircumflexacute    135
-\definecharacter Acircumflextilde    136
-\definecharacter Acircumflexhook     137
-\definecharacter Acircumflexdotbelow 138
-\definecharacter Abreve              139
-\definecharacter Abrevegrave         140
-\definecharacter Abreveacute         141
-\definecharacter Abrevetilde         142
-\definecharacter Abrevehook          143
-\definecharacter Abrevedotbelow      144
-\definecharacter Egrave              145
-\definecharacter Eacute              146
-\definecharacter Etilde              147
-\definecharacter Ehook               148
-\definecharacter Edotbelow           149
-\definecharacter Ecircumflex         150
-\definecharacter Ecircumflexgrave    151
-\definecharacter Ecircumflexacute    152
-\definecharacter Ecircumflextilde    153
-\definecharacter Ecircumflexhook     154
-\definecharacter Ecircumflexdotbelow 155
-\definecharacter Igrave              156
-\definecharacter Iacute              157
-\definecharacter Itilde              158
-\definecharacter Ihook               159
-\definecharacter agrave              160
-\definecharacter aacute              161
-\definecharacter atilde              162
-\definecharacter ahook               163
-\definecharacter adotbelow           164
-\definecharacter acircumflex         165
-\definecharacter acircumflexgrave    166
-\definecharacter acircumflexacute    167
-\definecharacter acircumflextilde    168
-\definecharacter acircumflexhook     169
-\definecharacter acircumflexdotbelow 170
-\definecharacter abreve              171
-\definecharacter abrevegrave         172
-\definecharacter abreveacute         173
-\definecharacter abrevetilde         174
-\definecharacter abrevehook          175
-\definecharacter abrevedotbelow      176
-\definecharacter egrave              177
-\definecharacter eacute              178
-\definecharacter etilde              179
-\definecharacter ehook               180
-\definecharacter edotbelow           181
-\definecharacter ecircumflex         182
-\definecharacter ecircumflexgrave    183
-\definecharacter ecircumflexacute    184
-\definecharacter ecircumflextilde    185
-\definecharacter ecircumflexhook     186
-\definecharacter ecircumflexdotbelow 187
-\definecharacter igrave              188
-\definecharacter iacute              189
-\definecharacter itilde              190
-\definecharacter ihook               191
-\definecharacter Idotbelow           192
-\definecharacter Ograve              193
-\definecharacter Oacute              194
-\definecharacter Otilde              195
-\definecharacter Ohook               196
-\definecharacter Odotbelow           197
-\definecharacter Ocircumflex         198
-\definecharacter Ocircumflexgrave    199
-\definecharacter Ocircumflexacute    200
-\definecharacter Ocircumflextilde    201
-\definecharacter Ocircumflexhook     202
-\definecharacter Ocircumflexdotbelow 203
-\definecharacter Ohorn               204
-\definecharacter Ohorngrave          205
-\definecharacter Ohornacute          206
-\definecharacter Ohorntilde          207
-\definecharacter Ohornhook           208
-\definecharacter Ohorndotbelow       209
-\definecharacter Ugrave              210
-\definecharacter Uacute              211
-\definecharacter Utilde              212
-\definecharacter Uhook               213
-\definecharacter Udotbelow           214
-\definecharacter Uhorn               215
-\definecharacter Uhorngrave          216
-\definecharacter Uhornacute          217
-\definecharacter Uhorntilde          218
-\definecharacter Uhornhook           219
-\definecharacter Uhorndotbelow       220
-\definecharacter Ytilde              223
-\definecharacter idotbelow           224
-\definecharacter ograve              225
-\definecharacter oacute              226
-\definecharacter otilde              227
-\definecharacter ohook               228
-\definecharacter odotbelow           229
-\definecharacter ocircumflex         230
-\definecharacter ocircumflexgrave    231
-\definecharacter ocircumflexacute    232
-\definecharacter ocircumflextilde    233
-\definecharacter ocircumflexhook     234
-\definecharacter ocircumflexdotbelow 235
-\definecharacter ohorn               236
-\definecharacter ohorngrave          237
-\definecharacter ohornacute          238
-\definecharacter ohorntilde          239
-\definecharacter ohornhook           240
-\definecharacter ohorndotbelow       241
-\definecharacter ugrave              242
-\definecharacter uacute              243
-\definecharacter utilde              244
-\definecharacter uhook               245
-\definecharacter udotbelow           246
-\definecharacter uhorn               247
-\definecharacter uhorngrave          248
-\definecharacter uhornacute          249
-\definecharacter uhorntilde          250
-\definecharacter uhornhook           251
-\definecharacter uhorndotbelow       252
-\definecharacter ygrave              253
-\definecharacter yacute              254
-\definecharacter ytilde              255
-
-\stopencoding
-
-\endinput
-
-% \startencoding [x5]
-%
-% \definecharacter aa {\xfiveencodedaa}
-% \definecharacter AA {\xfiveencodedAA}
-%
-% \stopencoding
-%
-% \def\xfiveencodedaa%
-%   {\accent23a}
-%
-% \def\xfiveencodedAA%
-%   {\leavevmode
-%    \setbox\zerocount\hbox{h}%
-%    \dimen@\ht\zerocount
-%    \advance\dimen@ -1ex
-%    \rlap{\raise.67\dimen@\hbox{\char23}}A}
-
-% \quotesinglbase     13
-% \guilsinglleft      14
-% \guilsinglright     15
-% \textquotedblleft   16
-% \textquotedblright  17
-% \quotedblbase       18
-% \guillemotleft      19
-% \guillemotright     20
-% \textendash         21
-% \textemdash         22
-% \textcompwordmark   23
-% \textperthousand    \% \char 24
-% \textpertenthousand \%\char 24\char 24
-% \textvisiblespace   32
-% \textquotedbl       `\"
-% \textdollar         `\$
-% \textquoteright     `\'
-% \textless           `\<
-% \textgreater        `\>
-% \textbackslash      `\
-% \textasciicircum    `\^
-% \textunderscore     95
-% \textquoteleft      `\`
-% \textbraceleft      `\{
-% \textbar            `\|
-% \textbraceright     `\}
-% \textasciitilde     `\~
diff --git a/tex/context/base/enco-tbo.mkii b/tex/context/base/enco-tbo.mkii
new file mode 100644
index 000000000..475be4602
--- /dev/null
+++ b/tex/context/base/enco-tbo.mkii
@@ -0,0 +1,222 @@
+%D \module
+%D   [     file=enco-tbo,
+%D      version=2000.05.07, % 2001.8.4,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=TeXBaseOne Encoding,
+%D       author={Patrick Gundlach, Hans Hagen},
+%D         date=\currentdate,
+%D    copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startmapping[8r]
+
+\resetcaserange 128 to 255
+
+\definecasemap 228 228 196 \definecasemap 196 228 196
+\definecasemap 235 235 203 \definecasemap 203 235 203
+\definecasemap 239 239 207 \definecasemap 207 239 207
+\definecasemap 246 246 214 \definecasemap 214 246 214
+\definecasemap 252 252 220 \definecasemap 220 252 220
+\definecasemap 255 255 159 \definecasemap 159 255 159
+
+\definecasemap 225 225 193 \definecasemap 193 225 193
+\definecasemap 233 233 201 \definecasemap 201 233 201
+\definecasemap 237 237 205 \definecasemap 205 237 205
+\definecasemap 243 243 211 \definecasemap 211 243 211
+\definecasemap 250 250 218 \definecasemap 218 250 218
+\definecasemap 253 253 221 \definecasemap 221 253 221
+
+\definecasemap 224 224 192 \definecasemap 192 224 192
+\definecasemap 232 232 200 \definecasemap 200 232 200
+\definecasemap 236 236 204 \definecasemap 204 236 204
+\definecasemap 242 242 210 \definecasemap 210 242 210
+\definecasemap 249 249 217 \definecasemap 217 249 217
+
+\definecasemap 226 226 194 \definecasemap 194 226 194
+\definecasemap 234 234 202 \definecasemap 202 234 202
+\definecasemap 238 238 206 \definecasemap 206 238 206
+\definecasemap 244 244 212 \definecasemap 212 244 212
+\definecasemap 251 251 219 \definecasemap 219 251 219
+
+\definecasemap 227 227 195 \definecasemap 195 227 195
+\definecasemap 241 241 209 \definecasemap 209 241 209
+\definecasemap 245 245 213 \definecasemap 213 245 213
+
+\stopmapping
+
+\startencoding[8r]
+
+\definecharacter textacute         180
+\definecharacter textbreve          11
+\definecharacter textcaron          16
+\definecharacter textcedilla       184
+\definecharacter textcircumflex    136
+\definecharacter textdiaeresis     168
+\definecharacter textdotaccent       1
+\definecharacter textgrave          30
+\definecharacter texthungarumlaut    5
+\definecharacter textmacron        175
+\definecharacter textogonek          8
+\definecharacter textring            9
+\definecharacter texttilde         152
+
+\definecharacter dotlessi           17
+%definecharacter dotlessj           18
+
+\definecharacter endash            150
+\definecharacter emdash            151
+
+\definecharacter oeligature        156
+\definecharacter OEligature        140
+\definecharacter aeligature        230
+\definecharacter AEligature        198
+
+\definecharacter ssharp            223
+
+\definecharacter thorn             254
+\definecharacter Thorn             222
+
+\definecharacter exclamdown        161
+\definecharacter questiondown      191
+
+\definecharacter copyright         169
+\definecharacter registered        174
+\definecharacter trademark         153
+
+\definecharacter sectionmark       167
+\definecharacter paragraphmark     182
+
+\definecharacter onequarter        188
+\definecharacter onehalf           189
+\definecharacter threequarter      190
+\definecharacter onesuperior       185
+\definecharacter twosuperior       178
+\definecharacter threesuperior     179
+
+\definecharacter textcent          162
+\definecharacter textcurrency      164
+\definecharacter texteuro          128
+\definecharacter textflorin        131
+\definecharacter textsterling      163
+\definecharacter textyen           165
+
+\definecharacter percent            37
+\definecharacter perthousand       137
+
+\definecharacter periodcentered    183
+\definecharacter softhyphen        173
+
+\definecharacter textasciicircum    94
+\definecharacter textasciitilde    126
+\definecharacter textslash          47
+\definecharacter textbackslash      92
+\definecharacter textbraceleft     123
+\definecharacter textbraceright    125
+\definecharacter textunderscore     95
+
+\definecharacter textbrokenbar     166
+\definecharacter textbullet        149
+\definecharacter textdag           134
+\definecharacter textddag          135
+\definecharacter textdegree        176
+\definecharacter textdiv           247
+\definecharacter textellipsis      133
+\definecharacter textfraction        4
+\definecharacter textlognot        172
+\definecharacter textminus          12
+\definecharacter textmu            181
+\definecharacter textmultiply      215
+\definecharacter textpm            177
+
+\definecharacter quotedbl           34
+\definecharacter quotedblbase      132
+\definecharacter quotedblleft      147
+\definecharacter quotedblright     148
+
+\definecharacter quotesingle        31
+\definecharacter quotesinglebase   130
+
+\definecharacter quoteleft          96
+\definecharacter quoteright         39
+
+\definecharacter guilsingleleft    139
+\definecharacter guilsingleright   155
+\definecharacter leftguillemot     171
+\definecharacter rightguillemot    187
+
+\definecharacter aacute            225
+\definecharacter Aacute            193
+\definecharacter eacute            233
+\definecharacter Eacute            201
+\definecharacter iacute            237
+\definecharacter Iacute            205
+\definecharacter oacute            243
+\definecharacter Oacute            211
+\definecharacter uacute            250
+\definecharacter Uacute            218
+\definecharacter Yacute            221
+\definecharacter yacute            253
+
+\definecharacter scaron            154
+\definecharacter Scaron            138
+%definecharacter Zcaron            141
+
+\definecharacter ccedilla          231
+\definecharacter Ccedilla          199
+
+\definecharacter acircumflex       226
+\definecharacter Acircumflex       194
+\definecharacter ecircumflex       234
+\definecharacter Ecircumflex       202
+\definecharacter icircumflex       238
+\definecharacter Icircumflex       206
+\definecharacter ocircumflex       244
+\definecharacter Ocircumflex       212
+\definecharacter ucircumflex       251
+\definecharacter Ucircumflex       219
+
+\definecharacter adiaeresis        228
+\definecharacter Adiaeresis        196
+\definecharacter ediaeresis        235
+\definecharacter Ediaeresis        203
+\definecharacter idiaeresis        239
+\definecharacter Idiaeresis        207
+\definecharacter odiaeresis        246
+\definecharacter Odiaeresis        214
+\definecharacter udiaeresis        252
+\definecharacter Udiaeresis        220
+\definecharacter ydiaeresis        255
+\definecharacter Ydiaeresis        159
+
+\definecharacter agrave            224
+\definecharacter Agrave            192
+\definecharacter egrave            232
+\definecharacter Egrave            200
+\definecharacter igrave            236
+\definecharacter Igrave            204
+\definecharacter ograve            242
+\definecharacter Ograve            210
+\definecharacter ugrave            249
+\definecharacter Ugrave            217
+
+\definecharacter aring             229
+\definecharacter Aring             197
+
+\definecharacter lstroke             7
+\definecharacter Lstroke             6
+\definecharacter ostroke           248
+\definecharacter Ostroke           216
+
+\definecharacter atilde            227
+\definecharacter Atilde            195
+\definecharacter ntilde            241
+\definecharacter Ntilde            209
+\definecharacter otilde            245
+\definecharacter Otilde            213
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-tbo.tex b/tex/context/base/enco-tbo.tex
deleted file mode 100644
index 475be4602..000000000
--- a/tex/context/base/enco-tbo.tex
+++ /dev/null
@@ -1,222 +0,0 @@
-%D \module
-%D   [     file=enco-tbo,
-%D      version=2000.05.07, % 2001.8.4,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=TeXBaseOne Encoding,
-%D       author={Patrick Gundlach, Hans Hagen},
-%D         date=\currentdate,
-%D    copyright=PRAGMA-ADE]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\startmapping[8r]
-
-\resetcaserange 128 to 255
-
-\definecasemap 228 228 196 \definecasemap 196 228 196
-\definecasemap 235 235 203 \definecasemap 203 235 203
-\definecasemap 239 239 207 \definecasemap 207 239 207
-\definecasemap 246 246 214 \definecasemap 214 246 214
-\definecasemap 252 252 220 \definecasemap 220 252 220
-\definecasemap 255 255 159 \definecasemap 159 255 159
-
-\definecasemap 225 225 193 \definecasemap 193 225 193
-\definecasemap 233 233 201 \definecasemap 201 233 201
-\definecasemap 237 237 205 \definecasemap 205 237 205
-\definecasemap 243 243 211 \definecasemap 211 243 211
-\definecasemap 250 250 218 \definecasemap 218 250 218
-\definecasemap 253 253 221 \definecasemap 221 253 221
-
-\definecasemap 224 224 192 \definecasemap 192 224 192
-\definecasemap 232 232 200 \definecasemap 200 232 200
-\definecasemap 236 236 204 \definecasemap 204 236 204
-\definecasemap 242 242 210 \definecasemap 210 242 210
-\definecasemap 249 249 217 \definecasemap 217 249 217
-
-\definecasemap 226 226 194 \definecasemap 194 226 194
-\definecasemap 234 234 202 \definecasemap 202 234 202
-\definecasemap 238 238 206 \definecasemap 206 238 206
-\definecasemap 244 244 212 \definecasemap 212 244 212
-\definecasemap 251 251 219 \definecasemap 219 251 219
-
-\definecasemap 227 227 195 \definecasemap 195 227 195
-\definecasemap 241 241 209 \definecasemap 209 241 209
-\definecasemap 245 245 213 \definecasemap 213 245 213
-
-\stopmapping
-
-\startencoding[8r]
-
-\definecharacter textacute         180
-\definecharacter textbreve          11
-\definecharacter textcaron          16
-\definecharacter textcedilla       184
-\definecharacter textcircumflex    136
-\definecharacter textdiaeresis     168
-\definecharacter textdotaccent       1
-\definecharacter textgrave          30
-\definecharacter texthungarumlaut    5
-\definecharacter textmacron        175
-\definecharacter textogonek          8
-\definecharacter textring            9
-\definecharacter texttilde         152
-
-\definecharacter dotlessi           17
-%definecharacter dotlessj           18
-
-\definecharacter endash            150
-\definecharacter emdash            151
-
-\definecharacter oeligature        156
-\definecharacter OEligature        140
-\definecharacter aeligature        230
-\definecharacter AEligature        198
-
-\definecharacter ssharp            223
-
-\definecharacter thorn             254
-\definecharacter Thorn             222
-
-\definecharacter exclamdown        161
-\definecharacter questiondown      191
-
-\definecharacter copyright         169
-\definecharacter registered        174
-\definecharacter trademark         153
-
-\definecharacter sectionmark       167
-\definecharacter paragraphmark     182
-
-\definecharacter onequarter        188
-\definecharacter onehalf           189
-\definecharacter threequarter      190
-\definecharacter onesuperior       185
-\definecharacter twosuperior       178
-\definecharacter threesuperior     179
-
-\definecharacter textcent          162
-\definecharacter textcurrency      164
-\definecharacter texteuro          128
-\definecharacter textflorin        131
-\definecharacter textsterling      163
-\definecharacter textyen           165
-
-\definecharacter percent            37
-\definecharacter perthousand       137
-
-\definecharacter periodcentered    183
-\definecharacter softhyphen        173
-
-\definecharacter textasciicircum    94
-\definecharacter textasciitilde    126
-\definecharacter textslash          47
-\definecharacter textbackslash      92
-\definecharacter textbraceleft     123
-\definecharacter textbraceright    125
-\definecharacter textunderscore     95
-
-\definecharacter textbrokenbar     166
-\definecharacter textbullet        149
-\definecharacter textdag           134
-\definecharacter textddag          135
-\definecharacter textdegree        176
-\definecharacter textdiv           247
-\definecharacter textellipsis      133
-\definecharacter textfraction        4
-\definecharacter textlognot        172
-\definecharacter textminus          12
-\definecharacter textmu            181
-\definecharacter textmultiply      215
-\definecharacter textpm            177
-
-\definecharacter quotedbl           34
-\definecharacter quotedblbase      132
-\definecharacter quotedblleft      147
-\definecharacter quotedblright     148
-
-\definecharacter quotesingle        31
-\definecharacter quotesinglebase   130
-
-\definecharacter quoteleft          96
-\definecharacter quoteright         39
-
-\definecharacter guilsingleleft    139
-\definecharacter guilsingleright   155
-\definecharacter leftguillemot     171
-\definecharacter rightguillemot    187
-
-\definecharacter aacute            225
-\definecharacter Aacute            193
-\definecharacter eacute            233
-\definecharacter Eacute            201
-\definecharacter iacute            237
-\definecharacter Iacute            205
-\definecharacter oacute            243
-\definecharacter Oacute            211
-\definecharacter uacute            250
-\definecharacter Uacute            218
-\definecharacter Yacute            221
-\definecharacter yacute            253
-
-\definecharacter scaron            154
-\definecharacter Scaron            138
-%definecharacter Zcaron            141
-
-\definecharacter ccedilla          231
-\definecharacter Ccedilla          199
-
-\definecharacter acircumflex       226
-\definecharacter Acircumflex       194
-\definecharacter ecircumflex       234
-\definecharacter Ecircumflex       202
-\definecharacter icircumflex       238
-\definecharacter Icircumflex       206
-\definecharacter ocircumflex       244
-\definecharacter Ocircumflex       212
-\definecharacter ucircumflex       251
-\definecharacter Ucircumflex       219
-
-\definecharacter adiaeresis        228
-\definecharacter Adiaeresis        196
-\definecharacter ediaeresis        235
-\definecharacter Ediaeresis        203
-\definecharacter idiaeresis        239
-\definecharacter Idiaeresis        207
-\definecharacter odiaeresis        246
-\definecharacter Odiaeresis        214
-\definecharacter udiaeresis        252
-\definecharacter Udiaeresis        220
-\definecharacter ydiaeresis        255
-\definecharacter Ydiaeresis        159
-
-\definecharacter agrave            224
-\definecharacter Agrave            192
-\definecharacter egrave            232
-\definecharacter Egrave            200
-\definecharacter igrave            236
-\definecharacter Igrave            204
-\definecharacter ograve            242
-\definecharacter Ograve            210
-\definecharacter ugrave            249
-\definecharacter Ugrave            217
-
-\definecharacter aring             229
-\definecharacter Aring             197
-
-\definecharacter lstroke             7
-\definecharacter Lstroke             6
-\definecharacter ostroke           248
-\definecharacter Ostroke           216
-
-\definecharacter atilde            227
-\definecharacter Atilde            195
-\definecharacter ntilde            241
-\definecharacter Ntilde            209
-\definecharacter otilde            245
-\definecharacter Otilde            213
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-uc.mkii b/tex/context/base/enco-uc.mkii
new file mode 100644
index 000000000..981eb6ae4
--- /dev/null
+++ b/tex/context/base/enco-uc.mkii
@@ -0,0 +1,1091 @@
+%D \module
+%D   [     file=enco-uc,
+%D      version=2000.xx.xx, % and later
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Unicode (backwards mapping),
+%D       author={Adam Lindsay \& Hans Hagen},
+%D         date=\currentdate,
+%D    copyright=PRAGMA ADE]
+%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 An alternative approach would be to misuse the utf vectors, but they
+%D don't carry enough info around.
+
+% todo : \defineucharacter hebrewAlef 5 "D0
+
+\startencoding[uc]
+
+\definecharacter Agrave        {\uchar0{192}}
+\definecharacter Aacute        {\uchar0{193}}
+\definecharacter Acircumflex   {\uchar0{194}}
+\definecharacter Atilde        {\uchar0{195}}
+\definecharacter Adiaeresis    {\uchar0{196}}
+\definecharacter Aring         {\uchar0{197}}
+\definecharacter AEligature    {\uchar0{198}}
+\definecharacter Ccedilla      {\uchar0{199}}
+\definecharacter Egrave        {\uchar0{200}}
+\definecharacter Eacute        {\uchar0{201}}
+\definecharacter Ediaeresis    {\uchar0{203}}
+\definecharacter Igrave        {\uchar0{204}}
+\definecharacter Iacute        {\uchar0{205}}
+\definecharacter Icircumflex   {\uchar0{206}}
+\definecharacter Idiaeresis    {\uchar0{207}}
+\definecharacter Eth           {\uchar0{208}}
+\definecharacter Ntilde        {\uchar0{209}}
+\definecharacter Ograve        {\uchar0{210}}
+\definecharacter Oacute        {\uchar0{211}}
+\definecharacter Ocircumflex   {\uchar0{212}}
+\definecharacter Otilde        {\uchar0{213}}
+\definecharacter Odiaeresis    {\uchar0{214}}
+
+\definecharacter Ostroke       {\uchar0{216}}
+\definecharacter Ugrave        {\uchar0{217}}
+\definecharacter Uacute        {\uchar0{218}}
+\definecharacter Uhungarumlaut {\uchar0{219}}
+\definecharacter Udiaeresis    {\uchar0{220}}
+\definecharacter Yacute        {\uchar0{221}}
+\definecharacter Thorn         {\uchar0{222}}
+\definecharacter ssharp        {\uchar0{223}}
+\definecharacter agrave        {\uchar0{224}}
+\definecharacter aacute        {\uchar0{225}}
+\definecharacter acircumflex   {\uchar0{226}}
+\definecharacter atilde        {\uchar0{227}}
+\definecharacter adiaeresis    {\uchar0{228}}
+\definecharacter aring         {\uchar0{229}}
+\definecharacter aeligature    {\uchar0{230}}
+\definecharacter ccedilla      {\uchar0{231}}
+\definecharacter egrave        {\uchar0{232}}
+\definecharacter eacute        {\uchar0{233}}
+\definecharacter ecircumflex   {\uchar0{234}}
+\definecharacter ediaeresis    {\uchar0{235}}
+\definecharacter igrave        {\uchar0{236}}
+\definecharacter iacute        {\uchar0{237}}
+\definecharacter icircumflex   {\uchar0{238}}
+\definecharacter idiaeresis    {\uchar0{239}}
+\definecharacter eth           {\uchar0{240}}
+\definecharacter ntilde        {\uchar0{241}}
+\definecharacter ograve        {\uchar0{242}}
+\definecharacter oacute        {\uchar0{243}}
+\definecharacter ocircumflex   {\uchar0{244}}
+\definecharacter otilde        {\uchar0{245}}
+\definecharacter odiaeresis    {\uchar0{246}}
+
+\definecharacter ostroke       {\uchar0{248}}
+\definecharacter ugrave        {\uchar0{249}}
+\definecharacter uacute        {\uchar0{250}}
+\definecharacter ucircumflex   {\uchar0{251}}
+\definecharacter udiaeresis    {\uchar0{252}}
+\definecharacter yacute        {\uchar0{253}}
+\definecharacter thorn         {\uchar0{254}}
+\definecharacter ydiaeresis    {\uchar0{255}}
+
+\definecharacter Amacron       {\uchar1{0}}
+\definecharacter amacron       {\uchar1{1}}
+\definecharacter Abreve        {\uchar1{2}}
+\definecharacter abreve        {\uchar1{3}}
+\definecharacter Aogonek       {\uchar1{4}}
+\definecharacter aogonek       {\uchar1{5}}
+\definecharacter Cacute        {\uchar1{6}}
+\definecharacter cacute        {\uchar1{7}}
+\definecharacter Ccircumflex   {\uchar1{8}}
+\definecharacter ccircumflex   {\uchar1{9}}
+\definecharacter Cdotaccent    {\uchar1{10}}
+\definecharacter cdotaccent    {\uchar1{11}}
+\definecharacter Ccaron        {\uchar1{12}}
+\definecharacter ccaron        {\uchar1{13}}
+\definecharacter Dcaron        {\uchar1{14}}
+\definecharacter dcaron        {\uchar1{15}}
+\definecharacter Dstroke       {\uchar1{16}}
+\definecharacter dstroke       {\uchar1{17}}
+\definecharacter Emacron       {\uchar1{18}}
+\definecharacter emacron       {\uchar1{19}}
+\definecharacter Ebreve        {\uchar1{20}}
+\definecharacter ebreve        {\uchar1{21}}
+\definecharacter Edotaccent    {\uchar1{22}}
+\definecharacter edotaccent    {\uchar1{23}}
+\definecharacter Eogonek       {\uchar1{24}}
+\definecharacter eogonek       {\uchar1{25}}
+\definecharacter Ecaron        {\uchar1{26}}
+\definecharacter ecaron        {\uchar1{27}}
+\definecharacter Gcircumflex   {\uchar1{28}}
+\definecharacter gcircumflex   {\uchar1{29}}
+\definecharacter Gbreve        {\uchar1{30}}
+\definecharacter gbreve        {\uchar1{31}}
+\definecharacter Gdotaccent    {\uchar1{32}}
+\definecharacter gdotaccent    {\uchar1{33}}
+\definecharacter Gcommaaccent  {\uchar1{34}}
+\definecharacter gcommaaccent  {\uchar1{35}}
+\definecharacter Hcircumflex   {\uchar1{36}}
+\definecharacter hcircumflex   {\uchar1{37}}
+\definecharacter Hstroke       {\uchar1{38}}
+\definecharacter hstroke       {\uchar1{39}}
+\definecharacter Itilde        {\uchar1{40}}
+\definecharacter itilde        {\uchar1{41}}
+\definecharacter Imacron       {\uchar1{42}}
+\definecharacter imacron       {\uchar1{43}}
+\definecharacter Ibreve        {\uchar1{44}}
+\definecharacter ibreve        {\uchar1{45}}
+\definecharacter Iogonek       {\uchar1{46}}
+\definecharacter iogonek       {\uchar1{47}}
+\definecharacter Idotaccent    {\uchar1{48}}
+\definecharacter dotlessi      {\uchar1{49}}
+\definecharacter IJligature    {\uchar1{50}}
+\definecharacter ijligature    {\uchar1{51}}
+\definecharacter Jcircumflex   {\uchar1{52}}
+\definecharacter jcircumflex   {\uchar1{53}}
+\definecharacter Kcommaaccent  {\uchar1{54}}
+\definecharacter kcommaaccent  {\uchar1{55}}
+\definecharacter kkra          {\uchar1{56}}
+\definecharacter Lacute        {\uchar1{57}}
+\definecharacter lacute        {\uchar1{58}}
+\definecharacter Lcommaaccent  {\uchar1{59}}
+\definecharacter lcommaaccent  {\uchar1{60}}
+\definecharacter Lcaron        {\uchar1{61}}
+\definecharacter lcaron        {\uchar1{62}}
+\definecharacter Ldotmiddle    {\uchar1{63}}
+\definecharacter ldotmiddle    {\uchar1{64}}
+\definecharacter Lstroke       {\uchar1{65}}
+\definecharacter lstroke       {\uchar1{66}}
+\definecharacter Nacute        {\uchar1{67}}
+\definecharacter nacute        {\uchar1{68}}
+\definecharacter Ncommaaccent  {\uchar1{69}}
+\definecharacter ncommaaccent  {\uchar1{70}}
+\definecharacter Ncaron        {\uchar1{71}}
+\definecharacter ncaron        {\uchar1{72}}
+\definecharacter napostrophe   {\uchar1{73}}
+\definecharacter Neng          {\uchar1{74}}
+\definecharacter neng          {\uchar1{75}}
+\definecharacter Omacron       {\uchar1{76}}
+\definecharacter omacron       {\uchar1{77}}
+\definecharacter Obreve        {\uchar1{78}}
+\definecharacter obreve        {\uchar1{79}}
+\definecharacter Ohungarumlaut {\uchar1{80}}
+\definecharacter ohungarumlaut {\uchar1{81}}
+\definecharacter OEligature    {\uchar1{82}}
+\definecharacter oeligature    {\uchar1{83}}
+\definecharacter Racute        {\uchar1{84}}
+\definecharacter racute        {\uchar1{85}}
+\definecharacter Rcommaaccent  {\uchar1{86}}
+\definecharacter rcommaaccent  {\uchar1{87}}
+\definecharacter Rcaron        {\uchar1{88}}
+\definecharacter rcaron        {\uchar1{89}}
+\definecharacter Sacute        {\uchar1{90}}
+\definecharacter sacute        {\uchar1{91}}
+\definecharacter Scircumflex   {\uchar1{92}}
+\definecharacter scircumflex   {\uchar1{93}}
+\definecharacter Scedilla      {\uchar1{94}}
+\definecharacter scedilla      {\uchar1{95}}
+\definecharacter Scaron        {\uchar1{96}}
+\definecharacter scaron        {\uchar1{97}}
+\definecharacter Tcedilla      {\uchar1{98}}
+\definecharacter tcedilla      {\uchar1{99}}
+\definecharacter Tcaron        {\uchar1{100}}
+\definecharacter tcaron        {\uchar1{101}}
+\definecharacter Tstroke       {\uchar1{102}}
+\definecharacter tstroke       {\uchar1{103}}
+\definecharacter Utilde        {\uchar1{104}}
+\definecharacter utilde        {\uchar1{105}}
+\definecharacter Umacron       {\uchar1{106}}
+\definecharacter umacron       {\uchar1{107}}
+\definecharacter Ubreve        {\uchar1{108}}
+\definecharacter ubreve        {\uchar1{109}}
+\definecharacter Uring         {\uchar1{110}}
+\definecharacter uring         {\uchar1{111}}
+\definecharacter Uhungarumlaut {\uchar1{112}}
+\definecharacter uhungarumlaut {\uchar1{113}}
+\definecharacter Uogonek       {\uchar1{114}}
+\definecharacter uogonek       {\uchar1{115}}
+\definecharacter Wcircumflex   {\uchar1{116}}
+\definecharacter wcircumflex   {\uchar1{117}}
+\definecharacter Ycircumflex   {\uchar1{118}}
+\definecharacter ycircumflex   {\uchar1{119}}
+\definecharacter Ydiaeresis    {\uchar1{120}}
+\definecharacter Zacute        {\uchar1{121}}
+\definecharacter zacute        {\uchar1{122}}
+\definecharacter Zdotaccent    {\uchar1{123}}
+\definecharacter zdotaccent    {\uchar1{124}}
+\definecharacter Zcaron        {\uchar1{125}}
+\definecharacter zcaron        {\uchar1{126}}
+\definecharacter slong         {\uchar1{127}}
+
+\stopencoding
+
+\startencoding[uc]
+
+\definecharacter endash          {\uchar{32}{19}}
+\definecharacter emdash          {\uchar{32}{20}}
+\definecharacter quoteleft       {\uchar{32}{24}}
+\definecharacter quoteright      {\uchar{32}{25}}
+\definecharacter quotesinglebase {\uchar{32}{26}}
+
+\definecharacter quotedblleft    {\uchar{32}{28}}
+\definecharacter quotedblright   {\uchar{32}{29}}
+\definecharacter quotedblbase    {\uchar{32}{30}}
+
+\definecharacter leftguillemot   {\uchar0{171}}
+\definecharacter rightguillemot  {\uchar0{187}}
+
+\definecharacter guilsingleleft  {\uchar{32}{57}}
+\definecharacter guilsingleright {\uchar{32}{58}}
+
+\stopencoding
+
+%D Adam Lindsay's additions
+
+\startencoding[uc]
+
+\definecharacter exclamdown       {\uchar0{161}}
+\definecharacter textcent         {\uchar0{162}}
+\definecharacter textsterling     {\uchar0{163}}
+\definecharacter textcurrency     {\uchar0{164}}
+\definecharacter textyen          {\uchar0{165}}
+\definecharacter textbrokenbar    {\uchar0{166}}
+\definecharacter sectionmark      {\uchar0{167}}
+\definecharacter textdiaresis     {\uchar0{168}}
+\definecharacter copyright        {\uchar0{169}}
+
+\definecharacter textlognot       {\uchar0{172}}
+\definecharacter softhyphen       {\uchar0{173}}
+\definecharacter registered       {\uchar0{174}}
+\definecharacter textmacron       {\uchar0{175}}
+\definecharacter textdegree       {\uchar0{176}}
+\definecharacter textpm           {\uchar0{177}}
+\definecharacter twosuperior      {\uchar0{178}}
+\definecharacter threesuperior    {\uchar0{179}}
+\definecharacter textacute        {\uchar0{180}}
+\definecharacter textmu           {\uchar0{181}}
+\definecharacter paragraphmark    {\uchar0{182}}
+\definecharacter periodcentered   {\uchar0{183}}
+\definecharacter textcedilla      {\uchar0{184}}
+\definecharacter onesuperior      {\uchar0{185}}
+
+\definecharacter textgrave        {\uchar3{0}}
+\definecharacter textacute        {\uchar3{1}}
+\definecharacter textcircumflex   {\uchar3{2}}
+\definecharacter texttilde        {\uchar3{3}}
+\definecharacter textmacron       {\uchar3{4}}
+\definecharacter textbreve        {\uchar3{6}}
+\definecharacter textdotaccent    {\uchar3{7}}
+\definecharacter textdiaeresis    {\uchar3{8}}
+\definecharacter textring         {\uchar3{10}}
+\definecharacter texthungarumlaut {\uchar3{11}}
+\definecharacter textcaron        {\uchar3{12}}
+\definecharacter textogonek       {\uchar3{40}}
+
+\definecharacter percent          {\uchar0{37}}
+\definecharacter textunderscore   {\uchar0{95}}
+
+\definecharacter ordfeminine      {\uchar0{170}}
+\definecharacter ordmasculine     {\uchar0{186}}
+\definecharacter onequarter       {\uchar0{188}}
+\definecharacter onehalf          {\uchar0{189}}
+\definecharacter threequarter     {\uchar0{190}}
+\definecharacter questiondown     {\uchar0{191}}
+
+\definecharacter textmultiply     {\uchar0{215}}
+\definecharacter textdiv          {\uchar0{247}}
+
+\definecharacter textminus        {\uchar{32}{18}}
+\definecharacter textdag          {\uchar{32}{32}}
+\definecharacter textddag         {\uchar{32}{33}}
+\definecharacter textbullet       {\uchar{32}{34}}
+\definecharacter textellipsis     {\uchar{32}{38}}
+\definecharacter perthousand      {\uchar{32}{48}}
+
+%new:
+\definecharacter Scommaaccent     {\uchar2{24}}
+\definecharacter scommaaccent     {\uchar2{25}}
+\definecharacter Tcommaaccent     {\uchar2{26}}
+\definecharacter tcommaaccent     {\uchar2{27}}
+
+\stopencoding
+
+%D Mojca's and Taco's additions:
+
+\startencoding[uc]
+
+\definecharacter textasciicircum  {\uchar{0}{94}}  % 5e
+\definecharacter textgrave        {\uchar{0}{96}}  % 60
+\definecharacter textdiaeresis    {\uchar{0}{168}} % a8
+%definecharacter textmacron       {\uchar{0}{175}} % af
+%definecharacter textacute        {\uchar{0}{180}} % b4
+%definecharacter textcedilla      {\uchar{0}{184}} % b8
+\definecharacter textcircumflex   {\uchar{2}{198}} % c6
+\definecharacter textcaron        {\uchar{2}{199}} % c7
+\definecharacter textbreve        {\uchar{2}{216}} % d8
+\definecharacter textdotaccent    {\uchar{2}{217}} % d9
+\definecharacter textring         {\uchar{2}{218}} % da
+\definecharacter textogonek       {\uchar{2}{219}} % db
+\definecharacter texttilde        {\uchar{2}{220}} % dc
+\definecharacter texthungarumlaut {\uchar{2}{221}} % dd
+
+\stopencoding
+
+%D Vietnamese:
+
+\startencoding[uc]
+
+\definecharacter   Ohorn                {\uchar1{160}}
+\definecharacter   ohorn                {\uchar1{161}}
+\definecharacter   Uhorn                {\uchar1{175}}
+\definecharacter   uhorn                {\uchar1{176}}
+
+\definecharacter   Yhook                {\uchar{30}{246}}
+\definecharacter   yhook                {\uchar{30}{247}}
+\definecharacter   Ydotbelow            {\uchar{30}{244}}
+\definecharacter   ydotbelow            {\uchar{30}{245}}
+\definecharacter   Ahook                {\uchar{30}{162}}
+\definecharacter   Adotbelow            {\uchar{30}{160}}
+\definecharacter   Acircumflexgrave     {\uchar{30}{166}}
+\definecharacter   Acircumflexacute     {\uchar{30}{164}}
+\definecharacter   Acircumflextilde     {\uchar{30}{170}}
+\definecharacter   Acircumflexhook      {\uchar{30}{168}}
+\definecharacter   Acircumflexdotbelow  {\uchar{30}{172}}
+\definecharacter   Abrevegrave          {\uchar{30}{176}}
+\definecharacter   Abreveacute          {\uchar{30}{174}}
+\definecharacter   Abrevetilde          {\uchar{30}{180}}
+\definecharacter   Abrevehook           {\uchar{30}{178}}
+\definecharacter   Abrevedotbelow       {\uchar{30}{182}}
+\definecharacter   Ehook                {\uchar{30}{186}}
+\definecharacter   Edotbelow            {\uchar{30}{184}}
+\definecharacter   Ecircumflexgrave     {\uchar{30}{192}}
+\definecharacter   Ecircumflexacute     {\uchar{30}{190}}
+\definecharacter   Ecircumflextilde     {\uchar{30}{196}}
+\definecharacter   Ecircumflexhook      {\uchar{30}{194}}
+\definecharacter   Ecircumflexdotbelow  {\uchar{30}{198}}
+\definecharacter   Ihook                {\uchar{30}{200}}
+\definecharacter   ahook                {\uchar{30}{163}}
+\definecharacter   adotbelow            {\uchar{30}{161}}
+\definecharacter   acircumflexgrave     {\uchar{30}{167}}
+\definecharacter   acircumflexacute     {\uchar{30}{165}}
+\definecharacter   acircumflextilde     {\uchar{30}{171}}
+\definecharacter   acircumflexhook      {\uchar{30}{169}}
+\definecharacter   acircumflexdotbelow  {\uchar{30}{173}}
+\definecharacter   abrevegrave          {\uchar{30}{177}}
+\definecharacter   abreveacute          {\uchar{30}{175}}
+\definecharacter   abrevetilde          {\uchar{30}{181}}
+\definecharacter   abrevehook           {\uchar{30}{179}}
+\definecharacter   abrevedotbelow       {\uchar{30}{183}}
+\definecharacter   ehook                {\uchar{30}{187}}
+\definecharacter   edotbelow            {\uchar{30}{185}}
+\definecharacter   ecircumflexgrave     {\uchar{30}{193}}
+\definecharacter   ecircumflexacute     {\uchar{30}{191}}
+\definecharacter   ecircumflextilde     {\uchar{30}{197}}
+\definecharacter   ecircumflexhook      {\uchar{30}{195}}
+\definecharacter   ecircumflexdotbelow  {\uchar{30}{199}}
+\definecharacter   ihook                {\uchar{30}{201}}
+\definecharacter   Idotbelow            {\uchar{30}{202}}
+\definecharacter   Ohook                {\uchar{30}{206}}
+\definecharacter   Odotbelow            {\uchar{30}{204}}
+\definecharacter   Ocircumflexgrave     {\uchar{30}{210}}
+\definecharacter   Ocircumflexacute     {\uchar{30}{208}}
+\definecharacter   Ocircumflextilde     {\uchar{30}{214}}
+\definecharacter   Ocircumflexhook      {\uchar{30}{212}}
+\definecharacter   Ocircumflexdotbelow  {\uchar{30}{216}}
+\definecharacter   Ohorngrave           {\uchar{30}{220}}
+\definecharacter   Ohornacute           {\uchar{30}{218}}
+\definecharacter   Ohorntilde           {\uchar{30}{224}}
+\definecharacter   Ohornhook            {\uchar{30}{222}}
+\definecharacter   Ohorndotbelow        {\uchar{30}{226}}
+\definecharacter   Uhook                {\uchar{30}{230}}
+\definecharacter   Udotbelow            {\uchar{30}{228}}
+\definecharacter   Uhorngrave           {\uchar{30}{234}}
+\definecharacter   Uhornacute           {\uchar{30}{232}}
+\definecharacter   Uhorntilde           {\uchar{30}{238}}
+\definecharacter   Uhornhook            {\uchar{30}{236}}
+\definecharacter   Uhorndotbelow        {\uchar{30}{240}}
+\definecharacter   Ytilde               {\uchar{30}{248}}
+\definecharacter   idotbelow            {\uchar{30}{203}}
+\definecharacter   ohook                {\uchar{30}{207}}
+\definecharacter   odotbelow            {\uchar{30}{205}}
+\definecharacter   ocircumflexgrave     {\uchar{30}{211}}
+\definecharacter   ocircumflexacute     {\uchar{30}{209}}
+\definecharacter   ocircumflextilde     {\uchar{30}{215}}
+\definecharacter   ocircumflexhook      {\uchar{30}{213}}
+\definecharacter   ocircumflexdotbelow  {\uchar{30}{217}}
+\definecharacter   ohorngrave           {\uchar{30}{221}}
+\definecharacter   ohornacute           {\uchar{30}{219}}
+\definecharacter   ohorntilde           {\uchar{30}{225}}
+\definecharacter   ohornhook            {\uchar{30}{223}}
+\definecharacter   ohorndotbelow        {\uchar{30}{227}}
+\definecharacter   uhook                {\uchar{30}{231}}
+\definecharacter   udotbelow            {\uchar{30}{229}}
+\definecharacter   uhorngrave           {\uchar{30}{235}}
+\definecharacter   uhornacute           {\uchar{30}{233}}
+\definecharacter   uhorntilde           {\uchar{30}{239}}
+\definecharacter   uhornhook            {\uchar{30}{237}}
+\definecharacter   uhorndotbelow        {\uchar{30}{241}}
+\definecharacter   ytilde               {\uchar{30}{249}}
+
+\definecharacter   Etilde               {\uchar{30}{188}}
+\definecharacter   etilde               {\uchar{30}{189}}
+\definecharacter   Ygrave               {\uchar{30}{242}}
+\definecharacter   ygrave               {\uchar{30}{243}}
+
+\stopencoding
+
+% Greek:
+
+\startencoding[uc]
+
+\definecharacter greekAlphatonos         {\uchar3{134}}
+\definecharacter greekEpsilontonos       {\uchar3{136}}
+\definecharacter greekEtatonos           {\uchar3{137}}
+\definecharacter greekIotatonos          {\uchar3{138}}
+\definecharacter greekOmicrontonos       {\uchar3{140}}
+\definecharacter greekUpsilontonos       {\uchar3{142}}
+\definecharacter greekOmegatonos         {\uchar3{143}}
+\definecharacter greekiotadialytikatonos {\uchar3{144}}
+\definecharacter greekAlpha              {\uchar3{145}}
+\definecharacter greekBeta               {\uchar3{146}}
+\definecharacter greekGamma              {\uchar3{147}}
+\definecharacter greekDelta              {\uchar3{148}}
+\definecharacter greekEpsilon            {\uchar3{149}}
+\definecharacter greekZeta               {\uchar3{150}}
+\definecharacter greekEta                {\uchar3{151}}
+\definecharacter greekTheta              {\uchar3{152}}
+\definecharacter greekIota               {\uchar3{153}}
+\definecharacter greekKappa              {\uchar3{154}}
+\definecharacter greekLambda             {\uchar3{155}}
+\definecharacter greekMu                 {\uchar3{156}}
+\definecharacter greekNu                 {\uchar3{157}}
+\definecharacter greekXi                 {\uchar3{158}}
+\definecharacter greekOmicron            {\uchar3{159}}
+\definecharacter greekPi                 {\uchar3{160}}
+\definecharacter greekRho                {\uchar3{161}}
+\definecharacter greekSigma              {\uchar3{163}}
+\definecharacter greekTau                {\uchar3{164}}
+\definecharacter greekUpsilon            {\uchar3{165}}
+\definecharacter greekPhi                {\uchar3{166}}
+\definecharacter greekChi                {\uchar3{167}}
+\definecharacter greekPsi                {\uchar3{168}}
+\definecharacter greekOmega              {\uchar3{169}}
+
+\definecharacter greekalpha              {\uchar3{177}}
+\definecharacter greekbeta               {\uchar3{178}}
+\definecharacter greekgamma              {\uchar3{179}}
+\definecharacter greekdelta              {\uchar3{180}}
+\definecharacter greekepsilon            {\uchar3{181}}
+\definecharacter greekzeta               {\uchar3{182}}
+\definecharacter greeketa                {\uchar3{183}}
+\definecharacter greektheta              {\uchar3{184}}
+\definecharacter greekiota               {\uchar3{185}}
+\definecharacter greekkappa              {\uchar3{186}}
+\definecharacter greeklambda             {\uchar3{187}}
+\definecharacter greekmu                 {\uchar3{188}}
+\definecharacter greeknu                 {\uchar3{189}}
+\definecharacter greekxi                 {\uchar3{190}}
+\definecharacter greekomicron            {\uchar3{191}}
+\definecharacter greekpi                 {\uchar3{192}}
+\definecharacter greekrho                {\uchar3{193}}
+\definecharacter greekfinalsigma         {\uchar3{194}}
+\definecharacter greeksigma              {\uchar3{195}}
+\definecharacter greektau                {\uchar3{196}}
+\definecharacter greekupsilon            {\uchar3{197}}
+\definecharacter greekphi                {\uchar3{198}}
+\definecharacter greekchi                {\uchar3{199}}
+\definecharacter greekpsi                {\uchar3{200}}
+\definecharacter greekomega              {\uchar3{201}}
+\definecharacter greekiotadialytika      {\uchar3{202}}
+\definecharacter greekupsilondialytika   {\uchar3{203}}
+\definecharacter greekomicrontonos       {\uchar3{204}}
+\definecharacter greekupsilontonos       {\uchar3{205}}
+\definecharacter greekomegatonos         {\uchar3{206}}
+
+\definecharacter greekIotadialytika          {\uchar3{170}}
+\definecharacter greekUpsilondialytika       {\uchar3{171}}
+
+\definecharacter greekalphatonos             {\uchar3{172}}
+\definecharacter greekepsilontonos           {\uchar3{173}}
+\definecharacter greeketatonos               {\uchar3{174}}
+\definecharacter greekiotatonos              {\uchar3{175}}
+\definecharacter greekupsilondialytikatonos  {\uchar3{176}}
+
+% new:
+\definecharacter greekthetaalt               {\uchar3{209}}
+\definecharacter greekphialt                 {\uchar3{213}}
+\definecharacter greekpialt                  {\uchar3{214}}
+\definecharacter greekrhoalt                 {\uchar3{241}}
+\definecharacter greekepsilonalt             {\uchar3{245}}
+
+\stopencoding
+
+% Cyrillic:
+
+\startencoding[uc]
+
+\definecharacter cyrillicA     {\uchar4{16}}
+\definecharacter cyrillicB     {\uchar4{17}}
+\definecharacter cyrillicV     {\uchar4{18}}
+\definecharacter cyrillicG     {\uchar4{19}}
+\definecharacter cyrillicD     {\uchar4{20}}
+\definecharacter cyrillicE     {\uchar4{21}}
+\definecharacter cyrillicZH    {\uchar4{22}}
+\definecharacter cyrillicZ     {\uchar4{23}}
+\definecharacter cyrillicI     {\uchar4{24}}
+\definecharacter cyrillicISHRT {\uchar4{25}}
+\definecharacter cyrillicK     {\uchar4{26}}
+\definecharacter cyrillicL     {\uchar4{27}}
+\definecharacter cyrillicM     {\uchar4{28}}
+\definecharacter cyrillicN     {\uchar4{29}}
+\definecharacter cyrillicO     {\uchar4{30}}
+\definecharacter cyrillicP     {\uchar4{31}}
+\definecharacter cyrillicR     {\uchar4{32}}
+\definecharacter cyrillicS     {\uchar4{33}}
+\definecharacter cyrillicT     {\uchar4{34}}
+\definecharacter cyrillicU     {\uchar4{35}}
+\definecharacter cyrillicF     {\uchar4{36}}
+\definecharacter cyrillicH     {\uchar4{37}}
+\definecharacter cyrillicC     {\uchar4{38}}
+\definecharacter cyrillicCH    {\uchar4{39}}
+\definecharacter cyrillicSH    {\uchar4{40}}
+\definecharacter cyrillicSHCH  {\uchar4{41}}
+\definecharacter cyrillicHRDSN {\uchar4{42}}
+\definecharacter cyrillicERY   {\uchar4{43}}
+\definecharacter cyrillicSFTSN {\uchar4{44}}
+\definecharacter cyrillicEREV  {\uchar4{45}}
+\definecharacter cyrillicYU    {\uchar4{46}}
+\definecharacter cyrillicYA    {\uchar4{47}}
+
+\definecharacter cyrillica     {\uchar4{48}}
+\definecharacter cyrillicb     {\uchar4{49}}
+\definecharacter cyrillicv     {\uchar4{50}}
+\definecharacter cyrillicg     {\uchar4{51}}
+\definecharacter cyrillicd     {\uchar4{52}}
+\definecharacter cyrillice     {\uchar4{53}}
+\definecharacter cyrilliczh    {\uchar4{54}}
+\definecharacter cyrillicz     {\uchar4{55}}
+\definecharacter cyrillici     {\uchar4{56}}
+\definecharacter cyrillicishrt {\uchar4{57}}
+\definecharacter cyrillick     {\uchar4{58}}
+\definecharacter cyrillicl     {\uchar4{59}}
+\definecharacter cyrillicm     {\uchar4{60}}
+\definecharacter cyrillicn     {\uchar4{61}}
+\definecharacter cyrillico     {\uchar4{62}}
+\definecharacter cyrillicp     {\uchar4{63}}
+\definecharacter cyrillicr     {\uchar4{64}}
+\definecharacter cyrillics     {\uchar4{65}}
+\definecharacter cyrillict     {\uchar4{66}}
+\definecharacter cyrillicu     {\uchar4{67}}
+\definecharacter cyrillicf     {\uchar4{68}}
+\definecharacter cyrillich     {\uchar4{69}}
+\definecharacter cyrillicc     {\uchar4{70}}
+\definecharacter cyrillicch    {\uchar4{71}}
+\definecharacter cyrillicsh    {\uchar4{72}}
+\definecharacter cyrillicshch  {\uchar4{73}}
+\definecharacter cyrillichrdsn {\uchar4{74}}
+\definecharacter cyrillicery   {\uchar4{75}}
+\definecharacter cyrillicsftsn {\uchar4{76}}
+\definecharacter cyrillicerev  {\uchar4{77}}
+\definecharacter cyrillicyu    {\uchar4{78}}
+\definecharacter cyrillicya    {\uchar4{79}}
+
+%D I tried to figure out what these were, but the unicode
+%D tables suggested they were the same as cyrillici, which was
+%D already defined! So, a temporary definition:
+
+% \def\cyrillicII{\cyrillicI}
+% \def\cyrillicii{\cyrillici}
+
+%D a guess derived from looking at enco-cyr suggests that this is
+%D identical to the Roman I/i pair. To me, that sounds like
+%D CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I in the UC tables!
+
+\definecharacter cyrillicII    {\uchar4{6}}
+\definecharacter cyrillicii    {\uchar4{86}}
+
+%D Guessing that tlir6a corresponds with t2a encoding as advertised,
+%D here are some more, cos I had some spare time: (AL)
+
+\definecharacter cyrillicDJE    {\uchar4{2}}
+\definecharacter cyrillicTSHE   {\uchar4{11}}
+%definecharacter cyrillicSHHA   132
+%definecharacter cyrillicZHDSC  133
+\definecharacter cyrillicZDSC   {\uchar4{152}}
+\definecharacter cyrillicLJE    {\uchar4{9}}
+\definecharacter cyrillicYI     {\uchar4{7}}
+\definecharacter cyrillicAE     {\uchar4{212}}
+%definecharacter cyrillicNDSC   141
+%definecharacter cyrillicNG     142
+\definecharacter cyrillicDZE    {\uchar4{5}}
+%definecharacter cyrillicOTLD   144
+\definecharacter cyrillicSDSC   {\uchar4{170}}
+\definecharacter cyrillicUSHRT  {\uchar4{14}}
+%definecharacter cyrillicY      147
+%definecharacter cyrillicYHCRS  148
+%definecharacter cyrillicHDSC   149
+\definecharacter cyrillicDZHE   {\uchar4{15}}
+\definecharacter cyrillicIE     {\uchar4{4}}
+\definecharacter cyrillicNJE    {\uchar4{10}}
+\definecharacter cyrillicYO     {\uchar4{1}}
+
+\definecharacter cyrillicdje    {\uchar4{82}}
+\definecharacter cyrillictshe   {\uchar4{91}}
+%definecharacter cyrillicshha   164
+%definecharacter cyrilliczhdsc  165
+\definecharacter cyrilliczdsc   {\uchar4{153}}
+\definecharacter cyrilliclje    {\uchar4{89}}
+\definecharacter cyrillicyi     {\uchar4{87}}
+\definecharacter cyrillicae     {\uchar4{213}}
+%definecharacter cyrillicndsc   173
+%definecharacter cyrillicng     174
+\definecharacter cyrillicdze    {\uchar4{85}}
+%definecharacter cyrillicotld   176
+\definecharacter cyrillicsdsc   {\uchar4{171}}
+\definecharacter cyrillicushrt  {\uchar4{94}}
+%definecharacter cyrillicy      179
+%definecharacter cyrillicyhcrs  180
+%definecharacter cyrillichdsc   181
+\definecharacter cyrillicdzhe   {\uchar4{95}}
+\definecharacter cyrillicie     {\uchar4{84}}
+\definecharacter cyrillicnje    {\uchar4{90}}
+\definecharacter cyrillicyo     {\uchar4{81}}
+
+% is there overlap with the above definitions
+
+\definecharacter cyrillicEgrave             {\uchar4{0}}
+\definecharacter cyrillicGJE                {\uchar4{3}}
+\definecharacter cyrillicJE                 {\uchar4{8}}
+\definecharacter cyrillicKJE                {\uchar4{12}}
+\definecharacter cyrillicIgrave             {\uchar4{13}}
+\definecharacter cyrillicegrave             {\uchar4{80}}
+\definecharacter cyrillicgje                {\uchar4{83}}
+\definecharacter cyrillicje                 {\uchar4{88}}
+\definecharacter cyrillickje                {\uchar4{92}}
+\definecharacter cyrillicigrave             {\uchar4{93}}
+\definecharacter cyrillicOMEGA              {\uchar4{96}}
+\definecharacter cyrillicomega              {\uchar4{97}}
+\definecharacter cyrillicYAT                {\uchar4{98}}
+\definecharacter cyrillicyat                {\uchar4{99}}
+\definecharacter cyrillicEiotified          {\uchar4{100}}
+\definecharacter cyrilliceiotified          {\uchar4{101}}
+\definecharacter cyrillicLITTLEYUS          {\uchar4{102}}
+\definecharacter cyrilliclittleyus          {\uchar4{103}}
+\definecharacter cyrillicLITTLEYUSiotified  {\uchar4{104}}
+\definecharacter cyrilliclittleyusiotified  {\uchar4{105}}
+\definecharacter cyrillicBIGYUS             {\uchar4{106}}
+\definecharacter cyrillicbigyus             {\uchar4{107}}
+\definecharacter cyrillicBIGYUSiotified     {\uchar4{108}}
+\definecharacter cyrillicbigyusiotified     {\uchar4{109}}
+\definecharacter cyrillicKSI                {\uchar4{110}}
+\definecharacter cyrillicksi                {\uchar4{111}}
+\definecharacter cyrillicPSI                {\uchar4{112}}
+\definecharacter cyrillicpsi                {\uchar4{113}}
+\definecharacter cyrillicFITA               {\uchar4{114}}
+\definecharacter cyrillicfita               {\uchar4{115}}
+\definecharacter cyrillicIZHITSA            {\uchar4{116}}
+\definecharacter cyrillicizhitsa            {\uchar4{117}}
+\definecharacter cyrillicIZHITSAdoublegrave {\uchar4{118}}
+\definecharacter cyrillicizhitsadoublegrave {\uchar4{119}}
+\definecharacter cyrillicUK                 {\uchar4{120}}
+\definecharacter cyrillicuk                 {\uchar4{121}}
+\definecharacter cyrillicOMEGAround         {\uchar4{122}}
+\definecharacter cyrillicomegaround         {\uchar4{123}}
+\definecharacter cyrillicOMEGAtitlo         {\uchar4{124}}
+\definecharacter cyrillicomegatitlo         {\uchar4{125}}
+\definecharacter cyrillicOT                 {\uchar4{126}}
+\definecharacter cyrillicot                 {\uchar4{127}}
+\definecharacter cyrillicKOPPA              {\uchar4{128}}
+\definecharacter cyrillickoppa              {\uchar4{129}}
+\definecharacter cyrillicTITLO              {\uchar4{131}}
+\definecharacter cyrillicPALATALIZATION     {\uchar4{132}}
+\definecharacter cyrillicDASIAPNEUMATA      {\uchar4{133}}
+\definecharacter cyrillicPSILIPNEUMATA      {\uchar4{134}}
+\definecharacter cyrillicISHRTtail          {\uchar4{138}}
+\definecharacter cyrillicishrttail          {\uchar4{139}}
+\definecharacter cyrillicSEMISOFT           {\uchar4{140}}
+\definecharacter cyrillicsemisoft           {\uchar4{141}}
+\definecharacter cyrillicERtick             {\uchar4{142}}
+\definecharacter cyrillicertick             {\uchar4{143}}
+\definecharacter cyrillicGHEupturn          {\uchar4{144}}
+\definecharacter cyrillicgheupturn          {\uchar4{145}}
+\definecharacter cyrillicGHEstroke          {\uchar4{146}}
+\definecharacter cyrillicghestroke          {\uchar4{147}}
+\definecharacter cyrillicGHEmidhook         {\uchar4{148}}
+\definecharacter cyrillicghemidhook         {\uchar4{149}}
+\definecharacter cyrillicZHEdescender       {\uchar4{150}}
+\definecharacter cyrilliczhedescender       {\uchar4{151}}
+\definecharacter cyrillicZDSC               {\uchar4{152}}
+\definecharacter cyrilliczdsc               {\uchar4{153}}
+\definecharacter cyrillicKADC               {\uchar4{154}}
+\definecharacter cyrillickadc               {\uchar4{155}}
+\definecharacter cyrillicKAvertstroke       {\uchar4{156}}
+\definecharacter cyrillickavertstroke       {\uchar4{157}}
+\definecharacter cyrillicKAstroke           {\uchar4{158}}
+\definecharacter cyrillickastroke           {\uchar4{159}}
+\definecharacter cyrillicKAbashkir          {\uchar4{160}}
+\definecharacter cyrillickabashkir          {\uchar4{161}}
+\definecharacter cyrillicENDC               {\uchar4{162}}
+\definecharacter cyrillicendc               {\uchar4{163}}
+\definecharacter cyrillicENGHE              {\uchar4{164}}
+\definecharacter cyrillicenghe              {\uchar4{165}}
+\definecharacter cyrillicPEmidhook          {\uchar4{166}}
+\definecharacter cyrillicpemidhook          {\uchar4{167}}
+\definecharacter cyrillicHA                 {\uchar4{168}}
+\definecharacter cyrillicha                 {\uchar4{169}}
+%definecharacter cyrillicSDSC               {\uchar4{170}} % already defined
+%definecharacter cyrilliccdsc               {\uchar4{171}} % already defined
+\definecharacter cyrillicTEDC               {\uchar4{172}}
+\definecharacter cyrillictedc               {\uchar4{173}}
+\definecharacter cyrillicYstr               {\uchar4{174}}
+\definecharacter cyrillicystr               {\uchar4{175}}
+\definecharacter cyrillicYstrstroke         {\uchar4{176}}
+\definecharacter cyrillicystrstroke         {\uchar4{177}}
+\definecharacter cyrillicHADC               {\uchar4{178}}
+\definecharacter cyrillichadc               {\uchar4{179}}
+\definecharacter cyrillicTETSE              {\uchar4{180}}
+\definecharacter cyrillictetse              {\uchar4{181}}
+\definecharacter cyrillicCHEDC              {\uchar4{182}}
+\definecharacter cyrillicchedc              {\uchar4{183}}
+\definecharacter cyrillicCHEvertstroke      {\uchar4{184}}
+\definecharacter cyrillicchevertstroke      {\uchar4{185}}
+\definecharacter cyrillicSHHA               {\uchar4{186}}
+\definecharacter cyrillicshha               {\uchar4{187}}
+\definecharacter cyrillicCHEabkhasian       {\uchar4{188}}
+\definecharacter cyrilliccheabkhasian       {\uchar4{189}}
+\definecharacter cyrillicCHEDCabkhasian     {\uchar4{190}}
+\definecharacter cyrillicchedcabkhasian     {\uchar4{191}}
+\definecharacter cyrillicPALOCHKA           {\uchar4{192}}
+\definecharacter cyrillicZHEbreve           {\uchar4{193}}
+\definecharacter cyrilliczhebreve           {\uchar4{194}}
+\definecharacter cyrillicKAhook             {\uchar4{195}}
+\definecharacter cyrillickahook             {\uchar4{196}}
+\definecharacter cyrillicELtail             {\uchar4{197}}
+\definecharacter cyrilliceltail             {\uchar4{198}}
+\definecharacter cyrillicENhook             {\uchar4{199}}
+\definecharacter cyrillicenhook             {\uchar4{200}}
+\definecharacter cyrillicENtail             {\uchar4{201}}
+\definecharacter cyrillicentail             {\uchar4{202}}
+\definecharacter cyrillicCHEkhakassian      {\uchar4{203}}
+\definecharacter cyrillicchekhakassian      {\uchar4{204}}
+\definecharacter cyrillicEMtail             {\uchar4{205}}
+\definecharacter cyrillicemtail             {\uchar4{206}}
+\definecharacter cyrillicAbreve             {\uchar4{208}}
+\definecharacter cyrillicabreve             {\uchar4{209}}
+\definecharacter cyrillicAdiaeresis         {\uchar4{210}}
+\definecharacter cyrillicadiaeresis         {\uchar4{211}}
+%definecharacter cyrillicAE                 {\uchar4{212}} % already defined
+%definecharacter cyrillicae                 {\uchar4{213}} % already defined
+\definecharacter cyrillicEbreve             {\uchar4{214}}
+\definecharacter cyrillicebreve             {\uchar4{215}}
+\definecharacter cyrillicSCHWA              {\uchar4{216}}
+\definecharacter cyrillicschwa              {\uchar4{217}}
+\definecharacter cyrillicSCHWAdiaeresis     {\uchar4{218}}
+\definecharacter cyrillicschwadiaeresis     {\uchar4{219}}
+\definecharacter cyrillicZHEdiaeresis       {\uchar4{220}}
+\definecharacter cyrilliczhediaeresis       {\uchar4{221}}
+\definecharacter cyrillicZEdiaeresis        {\uchar4{222}}
+\definecharacter cyrilliczediaeresis        {\uchar4{223}}
+\definecharacter cyrillicDZEabkhasian       {\uchar4{224}}
+\definecharacter cyrillicdzeabkhasian       {\uchar4{225}}
+\definecharacter cyrillicImacron            {\uchar4{226}}
+\definecharacter cyrillicimacron            {\uchar4{227}}
+\definecharacter cyrillicIdiaeresis         {\uchar4{228}}
+\definecharacter cyrillicidiaeresis         {\uchar4{229}}
+\definecharacter cyrillicOdiaeresis         {\uchar4{230}}
+\definecharacter cyrillicodiaeresis         {\uchar4{231}}
+\definecharacter cyrillicObarred            {\uchar4{232}}
+\definecharacter cyrillicobarred            {\uchar4{233}}
+\definecharacter cyrillicObarreddiaeresis   {\uchar4{234}}
+\definecharacter cyrillicobarreddiaeresis   {\uchar4{235}}
+\definecharacter cyrillicEdiaeresis         {\uchar4{236}}
+\definecharacter cyrillicediaeresis         {\uchar4{237}}
+\definecharacter cyrillicUmacron            {\uchar4{238}}
+\definecharacter cyrillicumacron            {\uchar4{239}}
+\definecharacter cyrillicUdiaeresis         {\uchar4{240}}
+\definecharacter cyrillicudiaeresis         {\uchar4{241}}
+\definecharacter cyrillicUdoubleacute       {\uchar4{242}}
+\definecharacter cyrillicudoubleacute       {\uchar4{243}}
+\definecharacter cyrillicCHEdiaeresis       {\uchar4{244}}
+\definecharacter cyrillicchediaeresis       {\uchar4{245}}
+\definecharacter cyrillicYERUdiaeresis      {\uchar4{248}}
+\definecharacter cyrillicyerudiaeresis      {\uchar4{249}}
+
+\stopencoding
+
+% Greek Extended
+
+\startencoding[uc]
+
+\definecharacter greekalphapsili                     {\uchar{31}{0}}
+\definecharacter greekalphadasia                     {\uchar{31}{1}}
+\definecharacter greekalphapsilivaria                {\uchar{31}{2}}
+\definecharacter greekalphadasiavaria                {\uchar{31}{3}}
+\definecharacter greekalphapsilitonos                {\uchar{31}{4}}
+\definecharacter greekalphadasiatonos                {\uchar{31}{5}}
+\definecharacter greekalphapsiliperispomeni          {\uchar{31}{6}}
+\definecharacter greekalphadasiaperispomeni          {\uchar{31}{7}}
+\definecharacter greekAlphapsili                     {\uchar{31}{8}}
+\definecharacter greekAlphadasia                     {\uchar{31}{9}}
+\definecharacter greekAlphapsilivaria                {\uchar{31}{10}}
+\definecharacter greekAlphadasiavaria                {\uchar{31}{11}}
+\definecharacter greekAlphapsilitonos                {\uchar{31}{12}}
+\definecharacter greekAlphadasiatonos                {\uchar{31}{13}}
+\definecharacter greekAlphapsiliperispomeni          {\uchar{31}{14}}
+\definecharacter greekAlphadasiaperispomeni          {\uchar{31}{15}}
+\definecharacter greekepsilonpsili                   {\uchar{31}{16}} % 1f10
+\definecharacter greekepsilondasia                   {\uchar{31}{17}}
+\definecharacter greekepsilonpsilivaria              {\uchar{31}{18}}
+\definecharacter greekepsilondasiavaria              {\uchar{31}{19}}
+\definecharacter greekepsilonpsilitonos              {\uchar{31}{20}}
+\definecharacter greekepsilondasiatonos              {\uchar{31}{21}}
+\definecharacter greekEpsilonpsili                   {\uchar{31}{24}}
+\definecharacter greekEpsilondasia                   {\uchar{31}{25}}
+\definecharacter greekEpsilonpsilivaria              {\uchar{31}{26}}
+\definecharacter greekEpsilondasiavaria              {\uchar{31}{27}}
+\definecharacter greekEpsilonpsilitonos              {\uchar{31}{28}}
+\definecharacter greekEpsilondasiatonos              {\uchar{31}{29}}
+\definecharacter greeketapsili                       {\uchar{31}{32}} % 1f20
+\definecharacter greeketadasia                       {\uchar{31}{33}}
+\definecharacter greeketapsilivaria                  {\uchar{31}{34}}
+\definecharacter greeketadasiavaria                  {\uchar{31}{35}}
+\definecharacter greeketapsilitonos                  {\uchar{31}{36}}
+\definecharacter greeketadasiatonos                  {\uchar{31}{37}}
+\definecharacter greeketapsiliperispomeni            {\uchar{31}{38}}
+\definecharacter greeketadasiaperispomeni            {\uchar{31}{39}}
+\definecharacter greekEtapsili                       {\uchar{31}{40}}
+\definecharacter greekEtadasia                       {\uchar{31}{41}}
+\definecharacter greekEtapsilivaria                  {\uchar{31}{42}}
+\definecharacter greekEtadasiavaria                  {\uchar{31}{43}}
+\definecharacter greekEtapsilitonos                  {\uchar{31}{44}}
+\definecharacter greekEtadasiatonos                  {\uchar{31}{45}}
+\definecharacter greekEtapsiliperispomeni            {\uchar{31}{46}}
+\definecharacter greekEtadasiaperispomeni            {\uchar{31}{47}}
+\definecharacter greekiotapsili                      {\uchar{31}{48}} % 1f30
+\definecharacter greekiotadasia                      {\uchar{31}{49}}
+\definecharacter greekiotapsilivaria                 {\uchar{31}{50}}
+\definecharacter greekiotadasiavaria                 {\uchar{31}{51}}
+\definecharacter greekiotapsilitonos                 {\uchar{31}{52}}
+\definecharacter greekiotadasiatonos                 {\uchar{31}{53}}
+\definecharacter greekiotapsiliperispomeni           {\uchar{31}{54}}
+\definecharacter greekiotadasiaperispomeni           {\uchar{31}{55}}
+\definecharacter greekIotapsili                      {\uchar{31}{56}}
+\definecharacter greekIotadasia                      {\uchar{31}{57}}
+\definecharacter greekIotapsilivaria                 {\uchar{31}{58}}
+\definecharacter greekIotadasiavaria                 {\uchar{31}{59}}
+\definecharacter greekIotapsilitonos                 {\uchar{31}{60}}
+\definecharacter greekIotadasiatonos                 {\uchar{31}{61}}
+\definecharacter greekIotapsiliperispomeni           {\uchar{31}{62}}
+\definecharacter greekIotadasiaperispomeni           {\uchar{31}{63}}
+\definecharacter greekomicronpsili                   {\uchar{31}{64}} % 1f40
+\definecharacter greekomicrondasia                   {\uchar{31}{65}}
+\definecharacter greekomicronpsilivaria              {\uchar{31}{66}}
+\definecharacter greekomicrondasiavaria              {\uchar{31}{67}}
+\definecharacter greekomicronpsilitonos              {\uchar{31}{68}}
+\definecharacter greekomicrondasiatonos              {\uchar{31}{69}}
+\definecharacter greekOmicronpsili                   {\uchar{31}{72}}
+\definecharacter greekOmicrondasia                   {\uchar{31}{73}}
+\definecharacter greekOmicronpsilivaria              {\uchar{31}{74}}
+\definecharacter greekOmicrondasiavaria              {\uchar{31}{75}}
+\definecharacter greekOmicronpsilitonos              {\uchar{31}{76}}
+\definecharacter greekOmicrondasiatonos              {\uchar{31}{77}}
+\definecharacter greekupsilonpsili                   {\uchar{31}{80}} % 1f50
+\definecharacter greekupsilondasia                   {\uchar{31}{81}}
+\definecharacter greekupsilonpsilivaria              {\uchar{31}{82}}
+\definecharacter greekupsilondasiavaria              {\uchar{31}{83}}
+\definecharacter greekupsilonpsilitonos              {\uchar{31}{84}}
+\definecharacter greekupsilondasiatonos              {\uchar{31}{85}}
+\definecharacter greekupsilonpsiliperispomeni        {\uchar{31}{86}}
+\definecharacter greekupsilondasiaperispomeni        {\uchar{31}{87}}
+\definecharacter greekUpsilondasia                   {\uchar{31}{89}}
+\definecharacter greekUpsilondasiavaria              {\uchar{31}{91}}
+\definecharacter greekUpsilondasiatonos              {\uchar{31}{93}}
+\definecharacter greekUpsilondasiaperispomeni        {\uchar{31}{95}}
+\definecharacter greekomegapsili                     {\uchar{31}{96}} % 1f60
+\definecharacter greekomegadasia                     {\uchar{31}{97}}
+\definecharacter greekomegapsilivaria                {\uchar{31}{98}}
+\definecharacter greekomegadasiavaria                {\uchar{31}{99}}
+\definecharacter greekomegapsilitonos                {\uchar{31}{100}}
+\definecharacter greekomegadasiatonos                {\uchar{31}{101}}
+\definecharacter greekomegapsiliperispomeni          {\uchar{31}{102}}
+\definecharacter greekomegadasiaperispomeni          {\uchar{31}{103}}
+\definecharacter greekOmegapsili                     {\uchar{31}{104}}
+\definecharacter greekOmegadasia                     {\uchar{31}{105}}
+\definecharacter greekOmegapsilivaria                {\uchar{31}{106}}
+\definecharacter greekOmegadasiavaria                {\uchar{31}{107}}
+\definecharacter greekOmegapsilitonos                {\uchar{31}{108}}
+\definecharacter greekOmegadasiatonos                {\uchar{31}{109}}
+\definecharacter greekOmegapsiliperispomeni          {\uchar{31}{110}}
+\definecharacter greekOmegadasiaperispomeni          {\uchar{31}{111}}
+\definecharacter greekalphavaria                     {\uchar{31}{112}} % 1f70
+\definecharacter greekalphaoxia                      {\uchar{31}{113}}
+\definecharacter greekepsilonvaria                   {\uchar{31}{114}}
+\definecharacter greekepsilonoxia                    {\uchar{31}{115}}
+\definecharacter greeketavaria                       {\uchar{31}{116}}
+\definecharacter greeketaoxia                        {\uchar{31}{117}}
+\definecharacter greekiotavaria                      {\uchar{31}{118}}
+\definecharacter greekiotaoxia                       {\uchar{31}{119}}
+\definecharacter greekomicronvaria                   {\uchar{31}{120}}
+\definecharacter greekomicronoxia                    {\uchar{31}{121}}
+\definecharacter greekupsilonvaria                   {\uchar{31}{122}}
+\definecharacter greekupsilonoxia                    {\uchar{31}{123}}
+\definecharacter greekomegavaria                     {\uchar{31}{124}}
+\definecharacter greekomegaoxia                      {\uchar{31}{125}}
+\definecharacter greekalphaiotasubpsili              {\uchar{31}{128}} % 1f80
+\definecharacter greekalphaiotasubdasia              {\uchar{31}{129}}
+\definecharacter greekalphaiotasubpsilivaria         {\uchar{31}{130}}
+\definecharacter greekalphaiotasubdasiavaria         {\uchar{31}{131}}
+\definecharacter greekalphaiotasubpsilitonos         {\uchar{31}{132}}
+\definecharacter greekalphaiotasubdasiatonos         {\uchar{31}{133}}
+\definecharacter greekalphaiotasubpsiliperispomeni   {\uchar{31}{134}}
+\definecharacter greekalphaiotasubdasiaperispomeni   {\uchar{31}{135}}
+\definecharacter greekAlphaiotasubpsili              {\uchar{31}{136}}
+\definecharacter greekAlphaiotasubdasia              {\uchar{31}{137}}
+\definecharacter greekAlphaiotasubpsilivaria         {\uchar{31}{138}}
+\definecharacter greekAlphaiotasubdasiavaria         {\uchar{31}{139}}
+\definecharacter greekAlphaiotasubpsilitonos         {\uchar{31}{140}}
+\definecharacter greekAlphaiotasubdasiatonos         {\uchar{31}{141}}
+\definecharacter greekAlphaiotasubpsiliperispomeni   {\uchar{31}{142}}
+\definecharacter greekAlphaiotasubdasiaperispomeni   {\uchar{31}{143}}
+\definecharacter greeketaiotasubpsili                {\uchar{31}{144}} % 1f90
+\definecharacter greeketaiotasubdasia                {\uchar{31}{145}}
+\definecharacter greeketaiotasubpsilivaria           {\uchar{31}{146}}
+\definecharacter greeketaiotasubdasiavaria           {\uchar{31}{147}}
+\definecharacter greeketaiotasubpsilitonos           {\uchar{31}{148}}
+\definecharacter greeketaiotasubdasiatonos           {\uchar{31}{149}}
+\definecharacter greeketaiotasubpsiliperispomeni     {\uchar{31}{150}}
+\definecharacter greeketaiotasubdasiaperispomeni     {\uchar{31}{151}}
+\definecharacter greekEtaiotasubpsili                {\uchar{31}{152}}
+\definecharacter greekEtaiotasubdasia                {\uchar{31}{153}}
+\definecharacter greekEtaiotasubpsilivaria           {\uchar{31}{154}}
+\definecharacter greekEtaiotasubdasiavaria           {\uchar{31}{155}}
+\definecharacter greekEtaiotasubpsilitonos           {\uchar{31}{156}}
+\definecharacter greekEtaiotasubdasiatonos           {\uchar{31}{157}}
+\definecharacter greekEtaiotasubpsiliperispomeni     {\uchar{31}{158}}
+\definecharacter greekEtaiotasubdasiaperispomeni     {\uchar{31}{159}}
+\definecharacter greekomegaiotasubpsili              {\uchar{31}{160}} % 1fa0
+\definecharacter greekomegaiotasubdasia              {\uchar{31}{161}}
+\definecharacter greekomegaiotasubpsilivaria         {\uchar{31}{162}}
+\definecharacter greekomegaiotasubdasiavaria         {\uchar{31}{163}}
+\definecharacter greekomegaiotasubpsilitonos         {\uchar{31}{164}}
+\definecharacter greekomegaiotasubdasiatonos         {\uchar{31}{165}}
+\definecharacter greekomegaiotasubpsiliperispomeni   {\uchar{31}{166}}
+\definecharacter greekomegaiotasubdasiaperispomeni   {\uchar{31}{167}}
+\definecharacter greekOmegaiotasubpsili              {\uchar{31}{168}}
+\definecharacter greekOmegaiotasubdasia              {\uchar{31}{169}}
+\definecharacter greekOmegaiotasubpsilivaria         {\uchar{31}{170}}
+\definecharacter greekOmegaiotasubdasiavaria         {\uchar{31}{171}}
+\definecharacter greekOmegaiotasubpsilitonos         {\uchar{31}{172}}
+\definecharacter greekOmegaiotasubdasiatonos         {\uchar{31}{173}}
+\definecharacter greekOmegaiotasubpsiliperispomeni   {\uchar{31}{174}}
+\definecharacter greekOmegaiotasubdasiaperispomeni   {\uchar{31}{175}}
+\definecharacter greekalphavrachy                    {\uchar{31}{176}} % 1fb0
+\definecharacter greekalphamacron                    {\uchar{31}{177}}
+\definecharacter greekalphaiotasubvaria              {\uchar{31}{178}}
+\definecharacter greekalphaiotasub                   {\uchar{31}{179}}
+\definecharacter greekalphaiotasubtonos              {\uchar{31}{180}}
+\definecharacter greekalphaperispomeni               {\uchar{31}{182}}
+\definecharacter greekalphaiotasubperispomeni        {\uchar{31}{183}}
+\definecharacter greekAlphavrachy                    {\uchar{31}{184}}
+\definecharacter greekAlphamacron                    {\uchar{31}{185}}
+\definecharacter greekAlphavaria                     {\uchar{31}{186}}
+\definecharacter greekAlphatonos                     {\uchar{31}{187}}
+\definecharacter greekAlphaiotasub                   {\uchar{31}{188}}
+\definecharacter greekCoronis                        {\uchar{31}{189}}
+\definecharacter greekprosgegrammeni                 {\uchar{31}{190}}
+\definecharacter greekpsili                          {\uchar{31}{191}}
+\definecharacter greekperispomeni                    {\uchar{31}{192}} % 1fc0
+\definecharacter greekdialytikaperispomeni           {\uchar{31}{193}}
+\definecharacter greeketaiotasubvaria                {\uchar{31}{194}}
+\definecharacter greeketaiotasub                     {\uchar{31}{195}}
+\definecharacter greeketaiotasubtonos                {\uchar{31}{196}}
+\definecharacter greeketaperispomeni                 {\uchar{31}{198}}
+\definecharacter greeketaiotasubperispomeni          {\uchar{31}{199}}
+\definecharacter greekEpsilonvaria                   {\uchar{31}{200}}
+\definecharacter greekEpsilontonos                   {\uchar{31}{201}}
+\definecharacter greekEtavaria                       {\uchar{31}{202}}
+\definecharacter greekEtatonos                       {\uchar{31}{203}}
+\definecharacter greekEtaiotasub                     {\uchar{31}{204}}
+\definecharacter greekpsilivaria                     {\uchar{31}{205}}
+\definecharacter greekpsilitonos                     {\uchar{31}{206}}
+\definecharacter greekpsiliperispomeni               {\uchar{31}{207}}
+\definecharacter greekiotavrachy                     {\uchar{31}{208}} % 1fd0
+\definecharacter greekiotamacron                     {\uchar{31}{209}}
+\definecharacter greekiotadialytikavaria             {\uchar{31}{210}}
+\definecharacter greekiotadialytikatonos             {\uchar{31}{211}}
+\definecharacter greekiotaperispomeni                {\uchar{31}{214}}
+\definecharacter greekiotadialytikaperispomeni       {\uchar{31}{215}}
+\definecharacter greekIotavrachy                     {\uchar{31}{216}}
+\definecharacter greekIotamacron                     {\uchar{31}{217}}
+\definecharacter greekIotavaria                      {\uchar{31}{218}}
+\definecharacter greekIotatonos                      {\uchar{31}{219}}
+\definecharacter greekdasiavaria                     {\uchar{31}{221}}
+\definecharacter greekdasiatonos                     {\uchar{31}{222}}
+\definecharacter greekdasiaperispomeni               {\uchar{31}{223}}
+\definecharacter greekupsilonvrachy                  {\uchar{31}{224}} % 1fe0
+\definecharacter greekupsilonmacron                  {\uchar{31}{225}}
+\definecharacter greekupsilondialytikavaria          {\uchar{31}{226}}
+\definecharacter greekupsilondialytikatonos          {\uchar{31}{227}}
+\definecharacter greekrhopsili                       {\uchar{31}{228}}
+\definecharacter greekrhodasia                       {\uchar{31}{229}}
+\definecharacter greekupsilonperispomeni             {\uchar{31}{230}}
+\definecharacter greekupsilondialytikaperispomeni    {\uchar{31}{231}}
+\definecharacter greekUpsilonvrachy                  {\uchar{31}{232}}
+\definecharacter greekUpsilonmacron                  {\uchar{31}{233}}
+\definecharacter greekUpsilonvaria                   {\uchar{31}{234}}
+\definecharacter greekUpsilontonos                   {\uchar{31}{235}}
+\definecharacter greekRhodasia                       {\uchar{31}{236}}
+\definecharacter greekdialytikavaria                 {\uchar{31}{237}}
+\definecharacter greekdialytikatonos                 {\uchar{31}{238}}
+\definecharacter greekvaria                          {\uchar{31}{239}}
+\definecharacter greekomegaiotasubvaria              {\uchar{31}{242}}
+\definecharacter greekomegaiotasub                   {\uchar{31}{243}}
+\definecharacter greekomegaiotasubtonos              {\uchar{31}{244}}
+\definecharacter greekomegaperispomeni               {\uchar{31}{246}}
+\definecharacter greekomegaiotasubperispomeni        {\uchar{31}{247}}
+\definecharacter greekOmicronvaria                   {\uchar{31}{248}}
+\definecharacter greekOmicrontonos                   {\uchar{31}{249}}
+\definecharacter greekOmegavaria                     {\uchar{31}{250}}
+\definecharacter greekOmegatonos                     {\uchar{31}{251}}
+\definecharacter greekOmegaiotasub                   {\uchar{31}{252}}
+\definecharacter greekoxia                           {\uchar{31}{253}}
+\definecharacter greekdasia                          {\uchar{31}{254}}
+\definecharacter greeksigmalunate                    {\uchar3{242}}
+\definecharacter greekSigmalunate                    {\uchar3{249}}
+\definecharacter greeksampi                          {\uchar3{225}}
+\definecharacter greekdigamma                        {\uchar3{221}}
+\definecharacter greekstigma                         {\uchar3{219}}
+\definecharacter greeknumkoppa                       {\uchar3{223}}
+\definecharacter greekkoppa                          {\uchar3{217}}
+\definecharacter greekupsilondiaeresis               {\uchar3{203}}
+
+\stopencoding
+
+% Hebrew:
+
+\startencoding[uc]
+
+\definecharacter hebrewAlef          {\uchar5{208}} %  05D0
+\definecharacter hebrewBet           {\uchar5{209}}
+\definecharacter hebrewGimel         {\uchar5{210}}
+\definecharacter hebrewDalet         {\uchar5{211}}
+\definecharacter hebrewHe            {\uchar5{212}}
+\definecharacter hebrewVav           {\uchar5{213}}
+\definecharacter hebrewZayin         {\uchar5{214}}
+\definecharacter hebrewHet           {\uchar5{215}}
+\definecharacter hebrewTet           {\uchar5{216}}
+\definecharacter hebrewYod           {\uchar5{217}}
+\definecharacter hebrewKaffinal      {\uchar5{218}}
+\definecharacter hebrewKaf           {\uchar5{219}}
+\definecharacter hebrewLamed         {\uchar5{220}}
+\definecharacter hebrewMemfinal      {\uchar5{221}}
+\definecharacter hebrewMem           {\uchar5{222}}
+\definecharacter hebrewNunfinal      {\uchar5{223}}
+\definecharacter hebrewNun           {\uchar5{224}}
+\definecharacter hebrewSamekh        {\uchar5{225}}
+\definecharacter hebrewAyin          {\uchar5{226}}
+\definecharacter hebrewPefinal       {\uchar5{227}}
+\definecharacter hebrewPe            {\uchar5{228}}
+\definecharacter hebrewTsadifinal    {\uchar5{229}}
+\definecharacter hebrewTsadi         {\uchar5{230}}
+\definecharacter hebrewQof           {\uchar5{231}}
+\definecharacter hebrewResh          {\uchar5{232}}
+\definecharacter hebrewShin          {\uchar5{233}}
+\definecharacter hebrewTav           {\uchar5{234}} % 05EA
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-uc.tex b/tex/context/base/enco-uc.tex
deleted file mode 100644
index 981eb6ae4..000000000
--- a/tex/context/base/enco-uc.tex
+++ /dev/null
@@ -1,1091 +0,0 @@
-%D \module
-%D   [     file=enco-uc,
-%D      version=2000.xx.xx, % and later
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Unicode (backwards mapping),
-%D       author={Adam Lindsay \& Hans Hagen},
-%D         date=\currentdate,
-%D    copyright=PRAGMA ADE]
-%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 An alternative approach would be to misuse the utf vectors, but they
-%D don't carry enough info around.
-
-% todo : \defineucharacter hebrewAlef 5 "D0
-
-\startencoding[uc]
-
-\definecharacter Agrave        {\uchar0{192}}
-\definecharacter Aacute        {\uchar0{193}}
-\definecharacter Acircumflex   {\uchar0{194}}
-\definecharacter Atilde        {\uchar0{195}}
-\definecharacter Adiaeresis    {\uchar0{196}}
-\definecharacter Aring         {\uchar0{197}}
-\definecharacter AEligature    {\uchar0{198}}
-\definecharacter Ccedilla      {\uchar0{199}}
-\definecharacter Egrave        {\uchar0{200}}
-\definecharacter Eacute        {\uchar0{201}}
-\definecharacter Ediaeresis    {\uchar0{203}}
-\definecharacter Igrave        {\uchar0{204}}
-\definecharacter Iacute        {\uchar0{205}}
-\definecharacter Icircumflex   {\uchar0{206}}
-\definecharacter Idiaeresis    {\uchar0{207}}
-\definecharacter Eth           {\uchar0{208}}
-\definecharacter Ntilde        {\uchar0{209}}
-\definecharacter Ograve        {\uchar0{210}}
-\definecharacter Oacute        {\uchar0{211}}
-\definecharacter Ocircumflex   {\uchar0{212}}
-\definecharacter Otilde        {\uchar0{213}}
-\definecharacter Odiaeresis    {\uchar0{214}}
-
-\definecharacter Ostroke       {\uchar0{216}}
-\definecharacter Ugrave        {\uchar0{217}}
-\definecharacter Uacute        {\uchar0{218}}
-\definecharacter Uhungarumlaut {\uchar0{219}}
-\definecharacter Udiaeresis    {\uchar0{220}}
-\definecharacter Yacute        {\uchar0{221}}
-\definecharacter Thorn         {\uchar0{222}}
-\definecharacter ssharp        {\uchar0{223}}
-\definecharacter agrave        {\uchar0{224}}
-\definecharacter aacute        {\uchar0{225}}
-\definecharacter acircumflex   {\uchar0{226}}
-\definecharacter atilde        {\uchar0{227}}
-\definecharacter adiaeresis    {\uchar0{228}}
-\definecharacter aring         {\uchar0{229}}
-\definecharacter aeligature    {\uchar0{230}}
-\definecharacter ccedilla      {\uchar0{231}}
-\definecharacter egrave        {\uchar0{232}}
-\definecharacter eacute        {\uchar0{233}}
-\definecharacter ecircumflex   {\uchar0{234}}
-\definecharacter ediaeresis    {\uchar0{235}}
-\definecharacter igrave        {\uchar0{236}}
-\definecharacter iacute        {\uchar0{237}}
-\definecharacter icircumflex   {\uchar0{238}}
-\definecharacter idiaeresis    {\uchar0{239}}
-\definecharacter eth           {\uchar0{240}}
-\definecharacter ntilde        {\uchar0{241}}
-\definecharacter ograve        {\uchar0{242}}
-\definecharacter oacute        {\uchar0{243}}
-\definecharacter ocircumflex   {\uchar0{244}}
-\definecharacter otilde        {\uchar0{245}}
-\definecharacter odiaeresis    {\uchar0{246}}
-
-\definecharacter ostroke       {\uchar0{248}}
-\definecharacter ugrave        {\uchar0{249}}
-\definecharacter uacute        {\uchar0{250}}
-\definecharacter ucircumflex   {\uchar0{251}}
-\definecharacter udiaeresis    {\uchar0{252}}
-\definecharacter yacute        {\uchar0{253}}
-\definecharacter thorn         {\uchar0{254}}
-\definecharacter ydiaeresis    {\uchar0{255}}
-
-\definecharacter Amacron       {\uchar1{0}}
-\definecharacter amacron       {\uchar1{1}}
-\definecharacter Abreve        {\uchar1{2}}
-\definecharacter abreve        {\uchar1{3}}
-\definecharacter Aogonek       {\uchar1{4}}
-\definecharacter aogonek       {\uchar1{5}}
-\definecharacter Cacute        {\uchar1{6}}
-\definecharacter cacute        {\uchar1{7}}
-\definecharacter Ccircumflex   {\uchar1{8}}
-\definecharacter ccircumflex   {\uchar1{9}}
-\definecharacter Cdotaccent    {\uchar1{10}}
-\definecharacter cdotaccent    {\uchar1{11}}
-\definecharacter Ccaron        {\uchar1{12}}
-\definecharacter ccaron        {\uchar1{13}}
-\definecharacter Dcaron        {\uchar1{14}}
-\definecharacter dcaron        {\uchar1{15}}
-\definecharacter Dstroke       {\uchar1{16}}
-\definecharacter dstroke       {\uchar1{17}}
-\definecharacter Emacron       {\uchar1{18}}
-\definecharacter emacron       {\uchar1{19}}
-\definecharacter Ebreve        {\uchar1{20}}
-\definecharacter ebreve        {\uchar1{21}}
-\definecharacter Edotaccent    {\uchar1{22}}
-\definecharacter edotaccent    {\uchar1{23}}
-\definecharacter Eogonek       {\uchar1{24}}
-\definecharacter eogonek       {\uchar1{25}}
-\definecharacter Ecaron        {\uchar1{26}}
-\definecharacter ecaron        {\uchar1{27}}
-\definecharacter Gcircumflex   {\uchar1{28}}
-\definecharacter gcircumflex   {\uchar1{29}}
-\definecharacter Gbreve        {\uchar1{30}}
-\definecharacter gbreve        {\uchar1{31}}
-\definecharacter Gdotaccent    {\uchar1{32}}
-\definecharacter gdotaccent    {\uchar1{33}}
-\definecharacter Gcommaaccent  {\uchar1{34}}
-\definecharacter gcommaaccent  {\uchar1{35}}
-\definecharacter Hcircumflex   {\uchar1{36}}
-\definecharacter hcircumflex   {\uchar1{37}}
-\definecharacter Hstroke       {\uchar1{38}}
-\definecharacter hstroke       {\uchar1{39}}
-\definecharacter Itilde        {\uchar1{40}}
-\definecharacter itilde        {\uchar1{41}}
-\definecharacter Imacron       {\uchar1{42}}
-\definecharacter imacron       {\uchar1{43}}
-\definecharacter Ibreve        {\uchar1{44}}
-\definecharacter ibreve        {\uchar1{45}}
-\definecharacter Iogonek       {\uchar1{46}}
-\definecharacter iogonek       {\uchar1{47}}
-\definecharacter Idotaccent    {\uchar1{48}}
-\definecharacter dotlessi      {\uchar1{49}}
-\definecharacter IJligature    {\uchar1{50}}
-\definecharacter ijligature    {\uchar1{51}}
-\definecharacter Jcircumflex   {\uchar1{52}}
-\definecharacter jcircumflex   {\uchar1{53}}
-\definecharacter Kcommaaccent  {\uchar1{54}}
-\definecharacter kcommaaccent  {\uchar1{55}}
-\definecharacter kkra          {\uchar1{56}}
-\definecharacter Lacute        {\uchar1{57}}
-\definecharacter lacute        {\uchar1{58}}
-\definecharacter Lcommaaccent  {\uchar1{59}}
-\definecharacter lcommaaccent  {\uchar1{60}}
-\definecharacter Lcaron        {\uchar1{61}}
-\definecharacter lcaron        {\uchar1{62}}
-\definecharacter Ldotmiddle    {\uchar1{63}}
-\definecharacter ldotmiddle    {\uchar1{64}}
-\definecharacter Lstroke       {\uchar1{65}}
-\definecharacter lstroke       {\uchar1{66}}
-\definecharacter Nacute        {\uchar1{67}}
-\definecharacter nacute        {\uchar1{68}}
-\definecharacter Ncommaaccent  {\uchar1{69}}
-\definecharacter ncommaaccent  {\uchar1{70}}
-\definecharacter Ncaron        {\uchar1{71}}
-\definecharacter ncaron        {\uchar1{72}}
-\definecharacter napostrophe   {\uchar1{73}}
-\definecharacter Neng          {\uchar1{74}}
-\definecharacter neng          {\uchar1{75}}
-\definecharacter Omacron       {\uchar1{76}}
-\definecharacter omacron       {\uchar1{77}}
-\definecharacter Obreve        {\uchar1{78}}
-\definecharacter obreve        {\uchar1{79}}
-\definecharacter Ohungarumlaut {\uchar1{80}}
-\definecharacter ohungarumlaut {\uchar1{81}}
-\definecharacter OEligature    {\uchar1{82}}
-\definecharacter oeligature    {\uchar1{83}}
-\definecharacter Racute        {\uchar1{84}}
-\definecharacter racute        {\uchar1{85}}
-\definecharacter Rcommaaccent  {\uchar1{86}}
-\definecharacter rcommaaccent  {\uchar1{87}}
-\definecharacter Rcaron        {\uchar1{88}}
-\definecharacter rcaron        {\uchar1{89}}
-\definecharacter Sacute        {\uchar1{90}}
-\definecharacter sacute        {\uchar1{91}}
-\definecharacter Scircumflex   {\uchar1{92}}
-\definecharacter scircumflex   {\uchar1{93}}
-\definecharacter Scedilla      {\uchar1{94}}
-\definecharacter scedilla      {\uchar1{95}}
-\definecharacter Scaron        {\uchar1{96}}
-\definecharacter scaron        {\uchar1{97}}
-\definecharacter Tcedilla      {\uchar1{98}}
-\definecharacter tcedilla      {\uchar1{99}}
-\definecharacter Tcaron        {\uchar1{100}}
-\definecharacter tcaron        {\uchar1{101}}
-\definecharacter Tstroke       {\uchar1{102}}
-\definecharacter tstroke       {\uchar1{103}}
-\definecharacter Utilde        {\uchar1{104}}
-\definecharacter utilde        {\uchar1{105}}
-\definecharacter Umacron       {\uchar1{106}}
-\definecharacter umacron       {\uchar1{107}}
-\definecharacter Ubreve        {\uchar1{108}}
-\definecharacter ubreve        {\uchar1{109}}
-\definecharacter Uring         {\uchar1{110}}
-\definecharacter uring         {\uchar1{111}}
-\definecharacter Uhungarumlaut {\uchar1{112}}
-\definecharacter uhungarumlaut {\uchar1{113}}
-\definecharacter Uogonek       {\uchar1{114}}
-\definecharacter uogonek       {\uchar1{115}}
-\definecharacter Wcircumflex   {\uchar1{116}}
-\definecharacter wcircumflex   {\uchar1{117}}
-\definecharacter Ycircumflex   {\uchar1{118}}
-\definecharacter ycircumflex   {\uchar1{119}}
-\definecharacter Ydiaeresis    {\uchar1{120}}
-\definecharacter Zacute        {\uchar1{121}}
-\definecharacter zacute        {\uchar1{122}}
-\definecharacter Zdotaccent    {\uchar1{123}}
-\definecharacter zdotaccent    {\uchar1{124}}
-\definecharacter Zcaron        {\uchar1{125}}
-\definecharacter zcaron        {\uchar1{126}}
-\definecharacter slong         {\uchar1{127}}
-
-\stopencoding
-
-\startencoding[uc]
-
-\definecharacter endash          {\uchar{32}{19}}
-\definecharacter emdash          {\uchar{32}{20}}
-\definecharacter quoteleft       {\uchar{32}{24}}
-\definecharacter quoteright      {\uchar{32}{25}}
-\definecharacter quotesinglebase {\uchar{32}{26}}
-
-\definecharacter quotedblleft    {\uchar{32}{28}}
-\definecharacter quotedblright   {\uchar{32}{29}}
-\definecharacter quotedblbase    {\uchar{32}{30}}
-
-\definecharacter leftguillemot   {\uchar0{171}}
-\definecharacter rightguillemot  {\uchar0{187}}
-
-\definecharacter guilsingleleft  {\uchar{32}{57}}
-\definecharacter guilsingleright {\uchar{32}{58}}
-
-\stopencoding
-
-%D Adam Lindsay's additions
-
-\startencoding[uc]
-
-\definecharacter exclamdown       {\uchar0{161}}
-\definecharacter textcent         {\uchar0{162}}
-\definecharacter textsterling     {\uchar0{163}}
-\definecharacter textcurrency     {\uchar0{164}}
-\definecharacter textyen          {\uchar0{165}}
-\definecharacter textbrokenbar    {\uchar0{166}}
-\definecharacter sectionmark      {\uchar0{167}}
-\definecharacter textdiaresis     {\uchar0{168}}
-\definecharacter copyright        {\uchar0{169}}
-
-\definecharacter textlognot       {\uchar0{172}}
-\definecharacter softhyphen       {\uchar0{173}}
-\definecharacter registered       {\uchar0{174}}
-\definecharacter textmacron       {\uchar0{175}}
-\definecharacter textdegree       {\uchar0{176}}
-\definecharacter textpm           {\uchar0{177}}
-\definecharacter twosuperior      {\uchar0{178}}
-\definecharacter threesuperior    {\uchar0{179}}
-\definecharacter textacute        {\uchar0{180}}
-\definecharacter textmu           {\uchar0{181}}
-\definecharacter paragraphmark    {\uchar0{182}}
-\definecharacter periodcentered   {\uchar0{183}}
-\definecharacter textcedilla      {\uchar0{184}}
-\definecharacter onesuperior      {\uchar0{185}}
-
-\definecharacter textgrave        {\uchar3{0}}
-\definecharacter textacute        {\uchar3{1}}
-\definecharacter textcircumflex   {\uchar3{2}}
-\definecharacter texttilde        {\uchar3{3}}
-\definecharacter textmacron       {\uchar3{4}}
-\definecharacter textbreve        {\uchar3{6}}
-\definecharacter textdotaccent    {\uchar3{7}}
-\definecharacter textdiaeresis    {\uchar3{8}}
-\definecharacter textring         {\uchar3{10}}
-\definecharacter texthungarumlaut {\uchar3{11}}
-\definecharacter textcaron        {\uchar3{12}}
-\definecharacter textogonek       {\uchar3{40}}
-
-\definecharacter percent          {\uchar0{37}}
-\definecharacter textunderscore   {\uchar0{95}}
-
-\definecharacter ordfeminine      {\uchar0{170}}
-\definecharacter ordmasculine     {\uchar0{186}}
-\definecharacter onequarter       {\uchar0{188}}
-\definecharacter onehalf          {\uchar0{189}}
-\definecharacter threequarter     {\uchar0{190}}
-\definecharacter questiondown     {\uchar0{191}}
-
-\definecharacter textmultiply     {\uchar0{215}}
-\definecharacter textdiv          {\uchar0{247}}
-
-\definecharacter textminus        {\uchar{32}{18}}
-\definecharacter textdag          {\uchar{32}{32}}
-\definecharacter textddag         {\uchar{32}{33}}
-\definecharacter textbullet       {\uchar{32}{34}}
-\definecharacter textellipsis     {\uchar{32}{38}}
-\definecharacter perthousand      {\uchar{32}{48}}
-
-%new:
-\definecharacter Scommaaccent     {\uchar2{24}}
-\definecharacter scommaaccent     {\uchar2{25}}
-\definecharacter Tcommaaccent     {\uchar2{26}}
-\definecharacter tcommaaccent     {\uchar2{27}}
-
-\stopencoding
-
-%D Mojca's and Taco's additions:
-
-\startencoding[uc]
-
-\definecharacter textasciicircum  {\uchar{0}{94}}  % 5e
-\definecharacter textgrave        {\uchar{0}{96}}  % 60
-\definecharacter textdiaeresis    {\uchar{0}{168}} % a8
-%definecharacter textmacron       {\uchar{0}{175}} % af
-%definecharacter textacute        {\uchar{0}{180}} % b4
-%definecharacter textcedilla      {\uchar{0}{184}} % b8
-\definecharacter textcircumflex   {\uchar{2}{198}} % c6
-\definecharacter textcaron        {\uchar{2}{199}} % c7
-\definecharacter textbreve        {\uchar{2}{216}} % d8
-\definecharacter textdotaccent    {\uchar{2}{217}} % d9
-\definecharacter textring         {\uchar{2}{218}} % da
-\definecharacter textogonek       {\uchar{2}{219}} % db
-\definecharacter texttilde        {\uchar{2}{220}} % dc
-\definecharacter texthungarumlaut {\uchar{2}{221}} % dd
-
-\stopencoding
-
-%D Vietnamese:
-
-\startencoding[uc]
-
-\definecharacter   Ohorn                {\uchar1{160}}
-\definecharacter   ohorn                {\uchar1{161}}
-\definecharacter   Uhorn                {\uchar1{175}}
-\definecharacter   uhorn                {\uchar1{176}}
-
-\definecharacter   Yhook                {\uchar{30}{246}}
-\definecharacter   yhook                {\uchar{30}{247}}
-\definecharacter   Ydotbelow            {\uchar{30}{244}}
-\definecharacter   ydotbelow            {\uchar{30}{245}}
-\definecharacter   Ahook                {\uchar{30}{162}}
-\definecharacter   Adotbelow            {\uchar{30}{160}}
-\definecharacter   Acircumflexgrave     {\uchar{30}{166}}
-\definecharacter   Acircumflexacute     {\uchar{30}{164}}
-\definecharacter   Acircumflextilde     {\uchar{30}{170}}
-\definecharacter   Acircumflexhook      {\uchar{30}{168}}
-\definecharacter   Acircumflexdotbelow  {\uchar{30}{172}}
-\definecharacter   Abrevegrave          {\uchar{30}{176}}
-\definecharacter   Abreveacute          {\uchar{30}{174}}
-\definecharacter   Abrevetilde          {\uchar{30}{180}}
-\definecharacter   Abrevehook           {\uchar{30}{178}}
-\definecharacter   Abrevedotbelow       {\uchar{30}{182}}
-\definecharacter   Ehook                {\uchar{30}{186}}
-\definecharacter   Edotbelow            {\uchar{30}{184}}
-\definecharacter   Ecircumflexgrave     {\uchar{30}{192}}
-\definecharacter   Ecircumflexacute     {\uchar{30}{190}}
-\definecharacter   Ecircumflextilde     {\uchar{30}{196}}
-\definecharacter   Ecircumflexhook      {\uchar{30}{194}}
-\definecharacter   Ecircumflexdotbelow  {\uchar{30}{198}}
-\definecharacter   Ihook                {\uchar{30}{200}}
-\definecharacter   ahook                {\uchar{30}{163}}
-\definecharacter   adotbelow            {\uchar{30}{161}}
-\definecharacter   acircumflexgrave     {\uchar{30}{167}}
-\definecharacter   acircumflexacute     {\uchar{30}{165}}
-\definecharacter   acircumflextilde     {\uchar{30}{171}}
-\definecharacter   acircumflexhook      {\uchar{30}{169}}
-\definecharacter   acircumflexdotbelow  {\uchar{30}{173}}
-\definecharacter   abrevegrave          {\uchar{30}{177}}
-\definecharacter   abreveacute          {\uchar{30}{175}}
-\definecharacter   abrevetilde          {\uchar{30}{181}}
-\definecharacter   abrevehook           {\uchar{30}{179}}
-\definecharacter   abrevedotbelow       {\uchar{30}{183}}
-\definecharacter   ehook                {\uchar{30}{187}}
-\definecharacter   edotbelow            {\uchar{30}{185}}
-\definecharacter   ecircumflexgrave     {\uchar{30}{193}}
-\definecharacter   ecircumflexacute     {\uchar{30}{191}}
-\definecharacter   ecircumflextilde     {\uchar{30}{197}}
-\definecharacter   ecircumflexhook      {\uchar{30}{195}}
-\definecharacter   ecircumflexdotbelow  {\uchar{30}{199}}
-\definecharacter   ihook                {\uchar{30}{201}}
-\definecharacter   Idotbelow            {\uchar{30}{202}}
-\definecharacter   Ohook                {\uchar{30}{206}}
-\definecharacter   Odotbelow            {\uchar{30}{204}}
-\definecharacter   Ocircumflexgrave     {\uchar{30}{210}}
-\definecharacter   Ocircumflexacute     {\uchar{30}{208}}
-\definecharacter   Ocircumflextilde     {\uchar{30}{214}}
-\definecharacter   Ocircumflexhook      {\uchar{30}{212}}
-\definecharacter   Ocircumflexdotbelow  {\uchar{30}{216}}
-\definecharacter   Ohorngrave           {\uchar{30}{220}}
-\definecharacter   Ohornacute           {\uchar{30}{218}}
-\definecharacter   Ohorntilde           {\uchar{30}{224}}
-\definecharacter   Ohornhook            {\uchar{30}{222}}
-\definecharacter   Ohorndotbelow        {\uchar{30}{226}}
-\definecharacter   Uhook                {\uchar{30}{230}}
-\definecharacter   Udotbelow            {\uchar{30}{228}}
-\definecharacter   Uhorngrave           {\uchar{30}{234}}
-\definecharacter   Uhornacute           {\uchar{30}{232}}
-\definecharacter   Uhorntilde           {\uchar{30}{238}}
-\definecharacter   Uhornhook            {\uchar{30}{236}}
-\definecharacter   Uhorndotbelow        {\uchar{30}{240}}
-\definecharacter   Ytilde               {\uchar{30}{248}}
-\definecharacter   idotbelow            {\uchar{30}{203}}
-\definecharacter   ohook                {\uchar{30}{207}}
-\definecharacter   odotbelow            {\uchar{30}{205}}
-\definecharacter   ocircumflexgrave     {\uchar{30}{211}}
-\definecharacter   ocircumflexacute     {\uchar{30}{209}}
-\definecharacter   ocircumflextilde     {\uchar{30}{215}}
-\definecharacter   ocircumflexhook      {\uchar{30}{213}}
-\definecharacter   ocircumflexdotbelow  {\uchar{30}{217}}
-\definecharacter   ohorngrave           {\uchar{30}{221}}
-\definecharacter   ohornacute           {\uchar{30}{219}}
-\definecharacter   ohorntilde           {\uchar{30}{225}}
-\definecharacter   ohornhook            {\uchar{30}{223}}
-\definecharacter   ohorndotbelow        {\uchar{30}{227}}
-\definecharacter   uhook                {\uchar{30}{231}}
-\definecharacter   udotbelow            {\uchar{30}{229}}
-\definecharacter   uhorngrave           {\uchar{30}{235}}
-\definecharacter   uhornacute           {\uchar{30}{233}}
-\definecharacter   uhorntilde           {\uchar{30}{239}}
-\definecharacter   uhornhook            {\uchar{30}{237}}
-\definecharacter   uhorndotbelow        {\uchar{30}{241}}
-\definecharacter   ytilde               {\uchar{30}{249}}
-
-\definecharacter   Etilde               {\uchar{30}{188}}
-\definecharacter   etilde               {\uchar{30}{189}}
-\definecharacter   Ygrave               {\uchar{30}{242}}
-\definecharacter   ygrave               {\uchar{30}{243}}
-
-\stopencoding
-
-% Greek:
-
-\startencoding[uc]
-
-\definecharacter greekAlphatonos         {\uchar3{134}}
-\definecharacter greekEpsilontonos       {\uchar3{136}}
-\definecharacter greekEtatonos           {\uchar3{137}}
-\definecharacter greekIotatonos          {\uchar3{138}}
-\definecharacter greekOmicrontonos       {\uchar3{140}}
-\definecharacter greekUpsilontonos       {\uchar3{142}}
-\definecharacter greekOmegatonos         {\uchar3{143}}
-\definecharacter greekiotadialytikatonos {\uchar3{144}}
-\definecharacter greekAlpha              {\uchar3{145}}
-\definecharacter greekBeta               {\uchar3{146}}
-\definecharacter greekGamma              {\uchar3{147}}
-\definecharacter greekDelta              {\uchar3{148}}
-\definecharacter greekEpsilon            {\uchar3{149}}
-\definecharacter greekZeta               {\uchar3{150}}
-\definecharacter greekEta                {\uchar3{151}}
-\definecharacter greekTheta              {\uchar3{152}}
-\definecharacter greekIota               {\uchar3{153}}
-\definecharacter greekKappa              {\uchar3{154}}
-\definecharacter greekLambda             {\uchar3{155}}
-\definecharacter greekMu                 {\uchar3{156}}
-\definecharacter greekNu                 {\uchar3{157}}
-\definecharacter greekXi                 {\uchar3{158}}
-\definecharacter greekOmicron            {\uchar3{159}}
-\definecharacter greekPi                 {\uchar3{160}}
-\definecharacter greekRho                {\uchar3{161}}
-\definecharacter greekSigma              {\uchar3{163}}
-\definecharacter greekTau                {\uchar3{164}}
-\definecharacter greekUpsilon            {\uchar3{165}}
-\definecharacter greekPhi                {\uchar3{166}}
-\definecharacter greekChi                {\uchar3{167}}
-\definecharacter greekPsi                {\uchar3{168}}
-\definecharacter greekOmega              {\uchar3{169}}
-
-\definecharacter greekalpha              {\uchar3{177}}
-\definecharacter greekbeta               {\uchar3{178}}
-\definecharacter greekgamma              {\uchar3{179}}
-\definecharacter greekdelta              {\uchar3{180}}
-\definecharacter greekepsilon            {\uchar3{181}}
-\definecharacter greekzeta               {\uchar3{182}}
-\definecharacter greeketa                {\uchar3{183}}
-\definecharacter greektheta              {\uchar3{184}}
-\definecharacter greekiota               {\uchar3{185}}
-\definecharacter greekkappa              {\uchar3{186}}
-\definecharacter greeklambda             {\uchar3{187}}
-\definecharacter greekmu                 {\uchar3{188}}
-\definecharacter greeknu                 {\uchar3{189}}
-\definecharacter greekxi                 {\uchar3{190}}
-\definecharacter greekomicron            {\uchar3{191}}
-\definecharacter greekpi                 {\uchar3{192}}
-\definecharacter greekrho                {\uchar3{193}}
-\definecharacter greekfinalsigma         {\uchar3{194}}
-\definecharacter greeksigma              {\uchar3{195}}
-\definecharacter greektau                {\uchar3{196}}
-\definecharacter greekupsilon            {\uchar3{197}}
-\definecharacter greekphi                {\uchar3{198}}
-\definecharacter greekchi                {\uchar3{199}}
-\definecharacter greekpsi                {\uchar3{200}}
-\definecharacter greekomega              {\uchar3{201}}
-\definecharacter greekiotadialytika      {\uchar3{202}}
-\definecharacter greekupsilondialytika   {\uchar3{203}}
-\definecharacter greekomicrontonos       {\uchar3{204}}
-\definecharacter greekupsilontonos       {\uchar3{205}}
-\definecharacter greekomegatonos         {\uchar3{206}}
-
-\definecharacter greekIotadialytika          {\uchar3{170}}
-\definecharacter greekUpsilondialytika       {\uchar3{171}}
-
-\definecharacter greekalphatonos             {\uchar3{172}}
-\definecharacter greekepsilontonos           {\uchar3{173}}
-\definecharacter greeketatonos               {\uchar3{174}}
-\definecharacter greekiotatonos              {\uchar3{175}}
-\definecharacter greekupsilondialytikatonos  {\uchar3{176}}
-
-% new:
-\definecharacter greekthetaalt               {\uchar3{209}}
-\definecharacter greekphialt                 {\uchar3{213}}
-\definecharacter greekpialt                  {\uchar3{214}}
-\definecharacter greekrhoalt                 {\uchar3{241}}
-\definecharacter greekepsilonalt             {\uchar3{245}}
-
-\stopencoding
-
-% Cyrillic:
-
-\startencoding[uc]
-
-\definecharacter cyrillicA     {\uchar4{16}}
-\definecharacter cyrillicB     {\uchar4{17}}
-\definecharacter cyrillicV     {\uchar4{18}}
-\definecharacter cyrillicG     {\uchar4{19}}
-\definecharacter cyrillicD     {\uchar4{20}}
-\definecharacter cyrillicE     {\uchar4{21}}
-\definecharacter cyrillicZH    {\uchar4{22}}
-\definecharacter cyrillicZ     {\uchar4{23}}
-\definecharacter cyrillicI     {\uchar4{24}}
-\definecharacter cyrillicISHRT {\uchar4{25}}
-\definecharacter cyrillicK     {\uchar4{26}}
-\definecharacter cyrillicL     {\uchar4{27}}
-\definecharacter cyrillicM     {\uchar4{28}}
-\definecharacter cyrillicN     {\uchar4{29}}
-\definecharacter cyrillicO     {\uchar4{30}}
-\definecharacter cyrillicP     {\uchar4{31}}
-\definecharacter cyrillicR     {\uchar4{32}}
-\definecharacter cyrillicS     {\uchar4{33}}
-\definecharacter cyrillicT     {\uchar4{34}}
-\definecharacter cyrillicU     {\uchar4{35}}
-\definecharacter cyrillicF     {\uchar4{36}}
-\definecharacter cyrillicH     {\uchar4{37}}
-\definecharacter cyrillicC     {\uchar4{38}}
-\definecharacter cyrillicCH    {\uchar4{39}}
-\definecharacter cyrillicSH    {\uchar4{40}}
-\definecharacter cyrillicSHCH  {\uchar4{41}}
-\definecharacter cyrillicHRDSN {\uchar4{42}}
-\definecharacter cyrillicERY   {\uchar4{43}}
-\definecharacter cyrillicSFTSN {\uchar4{44}}
-\definecharacter cyrillicEREV  {\uchar4{45}}
-\definecharacter cyrillicYU    {\uchar4{46}}
-\definecharacter cyrillicYA    {\uchar4{47}}
-
-\definecharacter cyrillica     {\uchar4{48}}
-\definecharacter cyrillicb     {\uchar4{49}}
-\definecharacter cyrillicv     {\uchar4{50}}
-\definecharacter cyrillicg     {\uchar4{51}}
-\definecharacter cyrillicd     {\uchar4{52}}
-\definecharacter cyrillice     {\uchar4{53}}
-\definecharacter cyrilliczh    {\uchar4{54}}
-\definecharacter cyrillicz     {\uchar4{55}}
-\definecharacter cyrillici     {\uchar4{56}}
-\definecharacter cyrillicishrt {\uchar4{57}}
-\definecharacter cyrillick     {\uchar4{58}}
-\definecharacter cyrillicl     {\uchar4{59}}
-\definecharacter cyrillicm     {\uchar4{60}}
-\definecharacter cyrillicn     {\uchar4{61}}
-\definecharacter cyrillico     {\uchar4{62}}
-\definecharacter cyrillicp     {\uchar4{63}}
-\definecharacter cyrillicr     {\uchar4{64}}
-\definecharacter cyrillics     {\uchar4{65}}
-\definecharacter cyrillict     {\uchar4{66}}
-\definecharacter cyrillicu     {\uchar4{67}}
-\definecharacter cyrillicf     {\uchar4{68}}
-\definecharacter cyrillich     {\uchar4{69}}
-\definecharacter cyrillicc     {\uchar4{70}}
-\definecharacter cyrillicch    {\uchar4{71}}
-\definecharacter cyrillicsh    {\uchar4{72}}
-\definecharacter cyrillicshch  {\uchar4{73}}
-\definecharacter cyrillichrdsn {\uchar4{74}}
-\definecharacter cyrillicery   {\uchar4{75}}
-\definecharacter cyrillicsftsn {\uchar4{76}}
-\definecharacter cyrillicerev  {\uchar4{77}}
-\definecharacter cyrillicyu    {\uchar4{78}}
-\definecharacter cyrillicya    {\uchar4{79}}
-
-%D I tried to figure out what these were, but the unicode
-%D tables suggested they were the same as cyrillici, which was
-%D already defined! So, a temporary definition:
-
-% \def\cyrillicII{\cyrillicI}
-% \def\cyrillicii{\cyrillici}
-
-%D a guess derived from looking at enco-cyr suggests that this is
-%D identical to the Roman I/i pair. To me, that sounds like
-%D CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I in the UC tables!
-
-\definecharacter cyrillicII    {\uchar4{6}}
-\definecharacter cyrillicii    {\uchar4{86}}
-
-%D Guessing that tlir6a corresponds with t2a encoding as advertised,
-%D here are some more, cos I had some spare time: (AL)
-
-\definecharacter cyrillicDJE    {\uchar4{2}}
-\definecharacter cyrillicTSHE   {\uchar4{11}}
-%definecharacter cyrillicSHHA   132
-%definecharacter cyrillicZHDSC  133
-\definecharacter cyrillicZDSC   {\uchar4{152}}
-\definecharacter cyrillicLJE    {\uchar4{9}}
-\definecharacter cyrillicYI     {\uchar4{7}}
-\definecharacter cyrillicAE     {\uchar4{212}}
-%definecharacter cyrillicNDSC   141
-%definecharacter cyrillicNG     142
-\definecharacter cyrillicDZE    {\uchar4{5}}
-%definecharacter cyrillicOTLD   144
-\definecharacter cyrillicSDSC   {\uchar4{170}}
-\definecharacter cyrillicUSHRT  {\uchar4{14}}
-%definecharacter cyrillicY      147
-%definecharacter cyrillicYHCRS  148
-%definecharacter cyrillicHDSC   149
-\definecharacter cyrillicDZHE   {\uchar4{15}}
-\definecharacter cyrillicIE     {\uchar4{4}}
-\definecharacter cyrillicNJE    {\uchar4{10}}
-\definecharacter cyrillicYO     {\uchar4{1}}
-
-\definecharacter cyrillicdje    {\uchar4{82}}
-\definecharacter cyrillictshe   {\uchar4{91}}
-%definecharacter cyrillicshha   164
-%definecharacter cyrilliczhdsc  165
-\definecharacter cyrilliczdsc   {\uchar4{153}}
-\definecharacter cyrilliclje    {\uchar4{89}}
-\definecharacter cyrillicyi     {\uchar4{87}}
-\definecharacter cyrillicae     {\uchar4{213}}
-%definecharacter cyrillicndsc   173
-%definecharacter cyrillicng     174
-\definecharacter cyrillicdze    {\uchar4{85}}
-%definecharacter cyrillicotld   176
-\definecharacter cyrillicsdsc   {\uchar4{171}}
-\definecharacter cyrillicushrt  {\uchar4{94}}
-%definecharacter cyrillicy      179
-%definecharacter cyrillicyhcrs  180
-%definecharacter cyrillichdsc   181
-\definecharacter cyrillicdzhe   {\uchar4{95}}
-\definecharacter cyrillicie     {\uchar4{84}}
-\definecharacter cyrillicnje    {\uchar4{90}}
-\definecharacter cyrillicyo     {\uchar4{81}}
-
-% is there overlap with the above definitions
-
-\definecharacter cyrillicEgrave             {\uchar4{0}}
-\definecharacter cyrillicGJE                {\uchar4{3}}
-\definecharacter cyrillicJE                 {\uchar4{8}}
-\definecharacter cyrillicKJE                {\uchar4{12}}
-\definecharacter cyrillicIgrave             {\uchar4{13}}
-\definecharacter cyrillicegrave             {\uchar4{80}}
-\definecharacter cyrillicgje                {\uchar4{83}}
-\definecharacter cyrillicje                 {\uchar4{88}}
-\definecharacter cyrillickje                {\uchar4{92}}
-\definecharacter cyrillicigrave             {\uchar4{93}}
-\definecharacter cyrillicOMEGA              {\uchar4{96}}
-\definecharacter cyrillicomega              {\uchar4{97}}
-\definecharacter cyrillicYAT                {\uchar4{98}}
-\definecharacter cyrillicyat                {\uchar4{99}}
-\definecharacter cyrillicEiotified          {\uchar4{100}}
-\definecharacter cyrilliceiotified          {\uchar4{101}}
-\definecharacter cyrillicLITTLEYUS          {\uchar4{102}}
-\definecharacter cyrilliclittleyus          {\uchar4{103}}
-\definecharacter cyrillicLITTLEYUSiotified  {\uchar4{104}}
-\definecharacter cyrilliclittleyusiotified  {\uchar4{105}}
-\definecharacter cyrillicBIGYUS             {\uchar4{106}}
-\definecharacter cyrillicbigyus             {\uchar4{107}}
-\definecharacter cyrillicBIGYUSiotified     {\uchar4{108}}
-\definecharacter cyrillicbigyusiotified     {\uchar4{109}}
-\definecharacter cyrillicKSI                {\uchar4{110}}
-\definecharacter cyrillicksi                {\uchar4{111}}
-\definecharacter cyrillicPSI                {\uchar4{112}}
-\definecharacter cyrillicpsi                {\uchar4{113}}
-\definecharacter cyrillicFITA               {\uchar4{114}}
-\definecharacter cyrillicfita               {\uchar4{115}}
-\definecharacter cyrillicIZHITSA            {\uchar4{116}}
-\definecharacter cyrillicizhitsa            {\uchar4{117}}
-\definecharacter cyrillicIZHITSAdoublegrave {\uchar4{118}}
-\definecharacter cyrillicizhitsadoublegrave {\uchar4{119}}
-\definecharacter cyrillicUK                 {\uchar4{120}}
-\definecharacter cyrillicuk                 {\uchar4{121}}
-\definecharacter cyrillicOMEGAround         {\uchar4{122}}
-\definecharacter cyrillicomegaround         {\uchar4{123}}
-\definecharacter cyrillicOMEGAtitlo         {\uchar4{124}}
-\definecharacter cyrillicomegatitlo         {\uchar4{125}}
-\definecharacter cyrillicOT                 {\uchar4{126}}
-\definecharacter cyrillicot                 {\uchar4{127}}
-\definecharacter cyrillicKOPPA              {\uchar4{128}}
-\definecharacter cyrillickoppa              {\uchar4{129}}
-\definecharacter cyrillicTITLO              {\uchar4{131}}
-\definecharacter cyrillicPALATALIZATION     {\uchar4{132}}
-\definecharacter cyrillicDASIAPNEUMATA      {\uchar4{133}}
-\definecharacter cyrillicPSILIPNEUMATA      {\uchar4{134}}
-\definecharacter cyrillicISHRTtail          {\uchar4{138}}
-\definecharacter cyrillicishrttail          {\uchar4{139}}
-\definecharacter cyrillicSEMISOFT           {\uchar4{140}}
-\definecharacter cyrillicsemisoft           {\uchar4{141}}
-\definecharacter cyrillicERtick             {\uchar4{142}}
-\definecharacter cyrillicertick             {\uchar4{143}}
-\definecharacter cyrillicGHEupturn          {\uchar4{144}}
-\definecharacter cyrillicgheupturn          {\uchar4{145}}
-\definecharacter cyrillicGHEstroke          {\uchar4{146}}
-\definecharacter cyrillicghestroke          {\uchar4{147}}
-\definecharacter cyrillicGHEmidhook         {\uchar4{148}}
-\definecharacter cyrillicghemidhook         {\uchar4{149}}
-\definecharacter cyrillicZHEdescender       {\uchar4{150}}
-\definecharacter cyrilliczhedescender       {\uchar4{151}}
-\definecharacter cyrillicZDSC               {\uchar4{152}}
-\definecharacter cyrilliczdsc               {\uchar4{153}}
-\definecharacter cyrillicKADC               {\uchar4{154}}
-\definecharacter cyrillickadc               {\uchar4{155}}
-\definecharacter cyrillicKAvertstroke       {\uchar4{156}}
-\definecharacter cyrillickavertstroke       {\uchar4{157}}
-\definecharacter cyrillicKAstroke           {\uchar4{158}}
-\definecharacter cyrillickastroke           {\uchar4{159}}
-\definecharacter cyrillicKAbashkir          {\uchar4{160}}
-\definecharacter cyrillickabashkir          {\uchar4{161}}
-\definecharacter cyrillicENDC               {\uchar4{162}}
-\definecharacter cyrillicendc               {\uchar4{163}}
-\definecharacter cyrillicENGHE              {\uchar4{164}}
-\definecharacter cyrillicenghe              {\uchar4{165}}
-\definecharacter cyrillicPEmidhook          {\uchar4{166}}
-\definecharacter cyrillicpemidhook          {\uchar4{167}}
-\definecharacter cyrillicHA                 {\uchar4{168}}
-\definecharacter cyrillicha                 {\uchar4{169}}
-%definecharacter cyrillicSDSC               {\uchar4{170}} % already defined
-%definecharacter cyrilliccdsc               {\uchar4{171}} % already defined
-\definecharacter cyrillicTEDC               {\uchar4{172}}
-\definecharacter cyrillictedc               {\uchar4{173}}
-\definecharacter cyrillicYstr               {\uchar4{174}}
-\definecharacter cyrillicystr               {\uchar4{175}}
-\definecharacter cyrillicYstrstroke         {\uchar4{176}}
-\definecharacter cyrillicystrstroke         {\uchar4{177}}
-\definecharacter cyrillicHADC               {\uchar4{178}}
-\definecharacter cyrillichadc               {\uchar4{179}}
-\definecharacter cyrillicTETSE              {\uchar4{180}}
-\definecharacter cyrillictetse              {\uchar4{181}}
-\definecharacter cyrillicCHEDC              {\uchar4{182}}
-\definecharacter cyrillicchedc              {\uchar4{183}}
-\definecharacter cyrillicCHEvertstroke      {\uchar4{184}}
-\definecharacter cyrillicchevertstroke      {\uchar4{185}}
-\definecharacter cyrillicSHHA               {\uchar4{186}}
-\definecharacter cyrillicshha               {\uchar4{187}}
-\definecharacter cyrillicCHEabkhasian       {\uchar4{188}}
-\definecharacter cyrilliccheabkhasian       {\uchar4{189}}
-\definecharacter cyrillicCHEDCabkhasian     {\uchar4{190}}
-\definecharacter cyrillicchedcabkhasian     {\uchar4{191}}
-\definecharacter cyrillicPALOCHKA           {\uchar4{192}}
-\definecharacter cyrillicZHEbreve           {\uchar4{193}}
-\definecharacter cyrilliczhebreve           {\uchar4{194}}
-\definecharacter cyrillicKAhook             {\uchar4{195}}
-\definecharacter cyrillickahook             {\uchar4{196}}
-\definecharacter cyrillicELtail             {\uchar4{197}}
-\definecharacter cyrilliceltail             {\uchar4{198}}
-\definecharacter cyrillicENhook             {\uchar4{199}}
-\definecharacter cyrillicenhook             {\uchar4{200}}
-\definecharacter cyrillicENtail             {\uchar4{201}}
-\definecharacter cyrillicentail             {\uchar4{202}}
-\definecharacter cyrillicCHEkhakassian      {\uchar4{203}}
-\definecharacter cyrillicchekhakassian      {\uchar4{204}}
-\definecharacter cyrillicEMtail             {\uchar4{205}}
-\definecharacter cyrillicemtail             {\uchar4{206}}
-\definecharacter cyrillicAbreve             {\uchar4{208}}
-\definecharacter cyrillicabreve             {\uchar4{209}}
-\definecharacter cyrillicAdiaeresis         {\uchar4{210}}
-\definecharacter cyrillicadiaeresis         {\uchar4{211}}
-%definecharacter cyrillicAE                 {\uchar4{212}} % already defined
-%definecharacter cyrillicae                 {\uchar4{213}} % already defined
-\definecharacter cyrillicEbreve             {\uchar4{214}}
-\definecharacter cyrillicebreve             {\uchar4{215}}
-\definecharacter cyrillicSCHWA              {\uchar4{216}}
-\definecharacter cyrillicschwa              {\uchar4{217}}
-\definecharacter cyrillicSCHWAdiaeresis     {\uchar4{218}}
-\definecharacter cyrillicschwadiaeresis     {\uchar4{219}}
-\definecharacter cyrillicZHEdiaeresis       {\uchar4{220}}
-\definecharacter cyrilliczhediaeresis       {\uchar4{221}}
-\definecharacter cyrillicZEdiaeresis        {\uchar4{222}}
-\definecharacter cyrilliczediaeresis        {\uchar4{223}}
-\definecharacter cyrillicDZEabkhasian       {\uchar4{224}}
-\definecharacter cyrillicdzeabkhasian       {\uchar4{225}}
-\definecharacter cyrillicImacron            {\uchar4{226}}
-\definecharacter cyrillicimacron            {\uchar4{227}}
-\definecharacter cyrillicIdiaeresis         {\uchar4{228}}
-\definecharacter cyrillicidiaeresis         {\uchar4{229}}
-\definecharacter cyrillicOdiaeresis         {\uchar4{230}}
-\definecharacter cyrillicodiaeresis         {\uchar4{231}}
-\definecharacter cyrillicObarred            {\uchar4{232}}
-\definecharacter cyrillicobarred            {\uchar4{233}}
-\definecharacter cyrillicObarreddiaeresis   {\uchar4{234}}
-\definecharacter cyrillicobarreddiaeresis   {\uchar4{235}}
-\definecharacter cyrillicEdiaeresis         {\uchar4{236}}
-\definecharacter cyrillicediaeresis         {\uchar4{237}}
-\definecharacter cyrillicUmacron            {\uchar4{238}}
-\definecharacter cyrillicumacron            {\uchar4{239}}
-\definecharacter cyrillicUdiaeresis         {\uchar4{240}}
-\definecharacter cyrillicudiaeresis         {\uchar4{241}}
-\definecharacter cyrillicUdoubleacute       {\uchar4{242}}
-\definecharacter cyrillicudoubleacute       {\uchar4{243}}
-\definecharacter cyrillicCHEdiaeresis       {\uchar4{244}}
-\definecharacter cyrillicchediaeresis       {\uchar4{245}}
-\definecharacter cyrillicYERUdiaeresis      {\uchar4{248}}
-\definecharacter cyrillicyerudiaeresis      {\uchar4{249}}
-
-\stopencoding
-
-% Greek Extended
-
-\startencoding[uc]
-
-\definecharacter greekalphapsili                     {\uchar{31}{0}}
-\definecharacter greekalphadasia                     {\uchar{31}{1}}
-\definecharacter greekalphapsilivaria                {\uchar{31}{2}}
-\definecharacter greekalphadasiavaria                {\uchar{31}{3}}
-\definecharacter greekalphapsilitonos                {\uchar{31}{4}}
-\definecharacter greekalphadasiatonos                {\uchar{31}{5}}
-\definecharacter greekalphapsiliperispomeni          {\uchar{31}{6}}
-\definecharacter greekalphadasiaperispomeni          {\uchar{31}{7}}
-\definecharacter greekAlphapsili                     {\uchar{31}{8}}
-\definecharacter greekAlphadasia                     {\uchar{31}{9}}
-\definecharacter greekAlphapsilivaria                {\uchar{31}{10}}
-\definecharacter greekAlphadasiavaria                {\uchar{31}{11}}
-\definecharacter greekAlphapsilitonos                {\uchar{31}{12}}
-\definecharacter greekAlphadasiatonos                {\uchar{31}{13}}
-\definecharacter greekAlphapsiliperispomeni          {\uchar{31}{14}}
-\definecharacter greekAlphadasiaperispomeni          {\uchar{31}{15}}
-\definecharacter greekepsilonpsili                   {\uchar{31}{16}} % 1f10
-\definecharacter greekepsilondasia                   {\uchar{31}{17}}
-\definecharacter greekepsilonpsilivaria              {\uchar{31}{18}}
-\definecharacter greekepsilondasiavaria              {\uchar{31}{19}}
-\definecharacter greekepsilonpsilitonos              {\uchar{31}{20}}
-\definecharacter greekepsilondasiatonos              {\uchar{31}{21}}
-\definecharacter greekEpsilonpsili                   {\uchar{31}{24}}
-\definecharacter greekEpsilondasia                   {\uchar{31}{25}}
-\definecharacter greekEpsilonpsilivaria              {\uchar{31}{26}}
-\definecharacter greekEpsilondasiavaria              {\uchar{31}{27}}
-\definecharacter greekEpsilonpsilitonos              {\uchar{31}{28}}
-\definecharacter greekEpsilondasiatonos              {\uchar{31}{29}}
-\definecharacter greeketapsili                       {\uchar{31}{32}} % 1f20
-\definecharacter greeketadasia                       {\uchar{31}{33}}
-\definecharacter greeketapsilivaria                  {\uchar{31}{34}}
-\definecharacter greeketadasiavaria                  {\uchar{31}{35}}
-\definecharacter greeketapsilitonos                  {\uchar{31}{36}}
-\definecharacter greeketadasiatonos                  {\uchar{31}{37}}
-\definecharacter greeketapsiliperispomeni            {\uchar{31}{38}}
-\definecharacter greeketadasiaperispomeni            {\uchar{31}{39}}
-\definecharacter greekEtapsili                       {\uchar{31}{40}}
-\definecharacter greekEtadasia                       {\uchar{31}{41}}
-\definecharacter greekEtapsilivaria                  {\uchar{31}{42}}
-\definecharacter greekEtadasiavaria                  {\uchar{31}{43}}
-\definecharacter greekEtapsilitonos                  {\uchar{31}{44}}
-\definecharacter greekEtadasiatonos                  {\uchar{31}{45}}
-\definecharacter greekEtapsiliperispomeni            {\uchar{31}{46}}
-\definecharacter greekEtadasiaperispomeni            {\uchar{31}{47}}
-\definecharacter greekiotapsili                      {\uchar{31}{48}} % 1f30
-\definecharacter greekiotadasia                      {\uchar{31}{49}}
-\definecharacter greekiotapsilivaria                 {\uchar{31}{50}}
-\definecharacter greekiotadasiavaria                 {\uchar{31}{51}}
-\definecharacter greekiotapsilitonos                 {\uchar{31}{52}}
-\definecharacter greekiotadasiatonos                 {\uchar{31}{53}}
-\definecharacter greekiotapsiliperispomeni           {\uchar{31}{54}}
-\definecharacter greekiotadasiaperispomeni           {\uchar{31}{55}}
-\definecharacter greekIotapsili                      {\uchar{31}{56}}
-\definecharacter greekIotadasia                      {\uchar{31}{57}}
-\definecharacter greekIotapsilivaria                 {\uchar{31}{58}}
-\definecharacter greekIotadasiavaria                 {\uchar{31}{59}}
-\definecharacter greekIotapsilitonos                 {\uchar{31}{60}}
-\definecharacter greekIotadasiatonos                 {\uchar{31}{61}}
-\definecharacter greekIotapsiliperispomeni           {\uchar{31}{62}}
-\definecharacter greekIotadasiaperispomeni           {\uchar{31}{63}}
-\definecharacter greekomicronpsili                   {\uchar{31}{64}} % 1f40
-\definecharacter greekomicrondasia                   {\uchar{31}{65}}
-\definecharacter greekomicronpsilivaria              {\uchar{31}{66}}
-\definecharacter greekomicrondasiavaria              {\uchar{31}{67}}
-\definecharacter greekomicronpsilitonos              {\uchar{31}{68}}
-\definecharacter greekomicrondasiatonos              {\uchar{31}{69}}
-\definecharacter greekOmicronpsili                   {\uchar{31}{72}}
-\definecharacter greekOmicrondasia                   {\uchar{31}{73}}
-\definecharacter greekOmicronpsilivaria              {\uchar{31}{74}}
-\definecharacter greekOmicrondasiavaria              {\uchar{31}{75}}
-\definecharacter greekOmicronpsilitonos              {\uchar{31}{76}}
-\definecharacter greekOmicrondasiatonos              {\uchar{31}{77}}
-\definecharacter greekupsilonpsili                   {\uchar{31}{80}} % 1f50
-\definecharacter greekupsilondasia                   {\uchar{31}{81}}
-\definecharacter greekupsilonpsilivaria              {\uchar{31}{82}}
-\definecharacter greekupsilondasiavaria              {\uchar{31}{83}}
-\definecharacter greekupsilonpsilitonos              {\uchar{31}{84}}
-\definecharacter greekupsilondasiatonos              {\uchar{31}{85}}
-\definecharacter greekupsilonpsiliperispomeni        {\uchar{31}{86}}
-\definecharacter greekupsilondasiaperispomeni        {\uchar{31}{87}}
-\definecharacter greekUpsilondasia                   {\uchar{31}{89}}
-\definecharacter greekUpsilondasiavaria              {\uchar{31}{91}}
-\definecharacter greekUpsilondasiatonos              {\uchar{31}{93}}
-\definecharacter greekUpsilondasiaperispomeni        {\uchar{31}{95}}
-\definecharacter greekomegapsili                     {\uchar{31}{96}} % 1f60
-\definecharacter greekomegadasia                     {\uchar{31}{97}}
-\definecharacter greekomegapsilivaria                {\uchar{31}{98}}
-\definecharacter greekomegadasiavaria                {\uchar{31}{99}}
-\definecharacter greekomegapsilitonos                {\uchar{31}{100}}
-\definecharacter greekomegadasiatonos                {\uchar{31}{101}}
-\definecharacter greekomegapsiliperispomeni          {\uchar{31}{102}}
-\definecharacter greekomegadasiaperispomeni          {\uchar{31}{103}}
-\definecharacter greekOmegapsili                     {\uchar{31}{104}}
-\definecharacter greekOmegadasia                     {\uchar{31}{105}}
-\definecharacter greekOmegapsilivaria                {\uchar{31}{106}}
-\definecharacter greekOmegadasiavaria                {\uchar{31}{107}}
-\definecharacter greekOmegapsilitonos                {\uchar{31}{108}}
-\definecharacter greekOmegadasiatonos                {\uchar{31}{109}}
-\definecharacter greekOmegapsiliperispomeni          {\uchar{31}{110}}
-\definecharacter greekOmegadasiaperispomeni          {\uchar{31}{111}}
-\definecharacter greekalphavaria                     {\uchar{31}{112}} % 1f70
-\definecharacter greekalphaoxia                      {\uchar{31}{113}}
-\definecharacter greekepsilonvaria                   {\uchar{31}{114}}
-\definecharacter greekepsilonoxia                    {\uchar{31}{115}}
-\definecharacter greeketavaria                       {\uchar{31}{116}}
-\definecharacter greeketaoxia                        {\uchar{31}{117}}
-\definecharacter greekiotavaria                      {\uchar{31}{118}}
-\definecharacter greekiotaoxia                       {\uchar{31}{119}}
-\definecharacter greekomicronvaria                   {\uchar{31}{120}}
-\definecharacter greekomicronoxia                    {\uchar{31}{121}}
-\definecharacter greekupsilonvaria                   {\uchar{31}{122}}
-\definecharacter greekupsilonoxia                    {\uchar{31}{123}}
-\definecharacter greekomegavaria                     {\uchar{31}{124}}
-\definecharacter greekomegaoxia                      {\uchar{31}{125}}
-\definecharacter greekalphaiotasubpsili              {\uchar{31}{128}} % 1f80
-\definecharacter greekalphaiotasubdasia              {\uchar{31}{129}}
-\definecharacter greekalphaiotasubpsilivaria         {\uchar{31}{130}}
-\definecharacter greekalphaiotasubdasiavaria         {\uchar{31}{131}}
-\definecharacter greekalphaiotasubpsilitonos         {\uchar{31}{132}}
-\definecharacter greekalphaiotasubdasiatonos         {\uchar{31}{133}}
-\definecharacter greekalphaiotasubpsiliperispomeni   {\uchar{31}{134}}
-\definecharacter greekalphaiotasubdasiaperispomeni   {\uchar{31}{135}}
-\definecharacter greekAlphaiotasubpsili              {\uchar{31}{136}}
-\definecharacter greekAlphaiotasubdasia              {\uchar{31}{137}}
-\definecharacter greekAlphaiotasubpsilivaria         {\uchar{31}{138}}
-\definecharacter greekAlphaiotasubdasiavaria         {\uchar{31}{139}}
-\definecharacter greekAlphaiotasubpsilitonos         {\uchar{31}{140}}
-\definecharacter greekAlphaiotasubdasiatonos         {\uchar{31}{141}}
-\definecharacter greekAlphaiotasubpsiliperispomeni   {\uchar{31}{142}}
-\definecharacter greekAlphaiotasubdasiaperispomeni   {\uchar{31}{143}}
-\definecharacter greeketaiotasubpsili                {\uchar{31}{144}} % 1f90
-\definecharacter greeketaiotasubdasia                {\uchar{31}{145}}
-\definecharacter greeketaiotasubpsilivaria           {\uchar{31}{146}}
-\definecharacter greeketaiotasubdasiavaria           {\uchar{31}{147}}
-\definecharacter greeketaiotasubpsilitonos           {\uchar{31}{148}}
-\definecharacter greeketaiotasubdasiatonos           {\uchar{31}{149}}
-\definecharacter greeketaiotasubpsiliperispomeni     {\uchar{31}{150}}
-\definecharacter greeketaiotasubdasiaperispomeni     {\uchar{31}{151}}
-\definecharacter greekEtaiotasubpsili                {\uchar{31}{152}}
-\definecharacter greekEtaiotasubdasia                {\uchar{31}{153}}
-\definecharacter greekEtaiotasubpsilivaria           {\uchar{31}{154}}
-\definecharacter greekEtaiotasubdasiavaria           {\uchar{31}{155}}
-\definecharacter greekEtaiotasubpsilitonos           {\uchar{31}{156}}
-\definecharacter greekEtaiotasubdasiatonos           {\uchar{31}{157}}
-\definecharacter greekEtaiotasubpsiliperispomeni     {\uchar{31}{158}}
-\definecharacter greekEtaiotasubdasiaperispomeni     {\uchar{31}{159}}
-\definecharacter greekomegaiotasubpsili              {\uchar{31}{160}} % 1fa0
-\definecharacter greekomegaiotasubdasia              {\uchar{31}{161}}
-\definecharacter greekomegaiotasubpsilivaria         {\uchar{31}{162}}
-\definecharacter greekomegaiotasubdasiavaria         {\uchar{31}{163}}
-\definecharacter greekomegaiotasubpsilitonos         {\uchar{31}{164}}
-\definecharacter greekomegaiotasubdasiatonos         {\uchar{31}{165}}
-\definecharacter greekomegaiotasubpsiliperispomeni   {\uchar{31}{166}}
-\definecharacter greekomegaiotasubdasiaperispomeni   {\uchar{31}{167}}
-\definecharacter greekOmegaiotasubpsili              {\uchar{31}{168}}
-\definecharacter greekOmegaiotasubdasia              {\uchar{31}{169}}
-\definecharacter greekOmegaiotasubpsilivaria         {\uchar{31}{170}}
-\definecharacter greekOmegaiotasubdasiavaria         {\uchar{31}{171}}
-\definecharacter greekOmegaiotasubpsilitonos         {\uchar{31}{172}}
-\definecharacter greekOmegaiotasubdasiatonos         {\uchar{31}{173}}
-\definecharacter greekOmegaiotasubpsiliperispomeni   {\uchar{31}{174}}
-\definecharacter greekOmegaiotasubdasiaperispomeni   {\uchar{31}{175}}
-\definecharacter greekalphavrachy                    {\uchar{31}{176}} % 1fb0
-\definecharacter greekalphamacron                    {\uchar{31}{177}}
-\definecharacter greekalphaiotasubvaria              {\uchar{31}{178}}
-\definecharacter greekalphaiotasub                   {\uchar{31}{179}}
-\definecharacter greekalphaiotasubtonos              {\uchar{31}{180}}
-\definecharacter greekalphaperispomeni               {\uchar{31}{182}}
-\definecharacter greekalphaiotasubperispomeni        {\uchar{31}{183}}
-\definecharacter greekAlphavrachy                    {\uchar{31}{184}}
-\definecharacter greekAlphamacron                    {\uchar{31}{185}}
-\definecharacter greekAlphavaria                     {\uchar{31}{186}}
-\definecharacter greekAlphatonos                     {\uchar{31}{187}}
-\definecharacter greekAlphaiotasub                   {\uchar{31}{188}}
-\definecharacter greekCoronis                        {\uchar{31}{189}}
-\definecharacter greekprosgegrammeni                 {\uchar{31}{190}}
-\definecharacter greekpsili                          {\uchar{31}{191}}
-\definecharacter greekperispomeni                    {\uchar{31}{192}} % 1fc0
-\definecharacter greekdialytikaperispomeni           {\uchar{31}{193}}
-\definecharacter greeketaiotasubvaria                {\uchar{31}{194}}
-\definecharacter greeketaiotasub                     {\uchar{31}{195}}
-\definecharacter greeketaiotasubtonos                {\uchar{31}{196}}
-\definecharacter greeketaperispomeni                 {\uchar{31}{198}}
-\definecharacter greeketaiotasubperispomeni          {\uchar{31}{199}}
-\definecharacter greekEpsilonvaria                   {\uchar{31}{200}}
-\definecharacter greekEpsilontonos                   {\uchar{31}{201}}
-\definecharacter greekEtavaria                       {\uchar{31}{202}}
-\definecharacter greekEtatonos                       {\uchar{31}{203}}
-\definecharacter greekEtaiotasub                     {\uchar{31}{204}}
-\definecharacter greekpsilivaria                     {\uchar{31}{205}}
-\definecharacter greekpsilitonos                     {\uchar{31}{206}}
-\definecharacter greekpsiliperispomeni               {\uchar{31}{207}}
-\definecharacter greekiotavrachy                     {\uchar{31}{208}} % 1fd0
-\definecharacter greekiotamacron                     {\uchar{31}{209}}
-\definecharacter greekiotadialytikavaria             {\uchar{31}{210}}
-\definecharacter greekiotadialytikatonos             {\uchar{31}{211}}
-\definecharacter greekiotaperispomeni                {\uchar{31}{214}}
-\definecharacter greekiotadialytikaperispomeni       {\uchar{31}{215}}
-\definecharacter greekIotavrachy                     {\uchar{31}{216}}
-\definecharacter greekIotamacron                     {\uchar{31}{217}}
-\definecharacter greekIotavaria                      {\uchar{31}{218}}
-\definecharacter greekIotatonos                      {\uchar{31}{219}}
-\definecharacter greekdasiavaria                     {\uchar{31}{221}}
-\definecharacter greekdasiatonos                     {\uchar{31}{222}}
-\definecharacter greekdasiaperispomeni               {\uchar{31}{223}}
-\definecharacter greekupsilonvrachy                  {\uchar{31}{224}} % 1fe0
-\definecharacter greekupsilonmacron                  {\uchar{31}{225}}
-\definecharacter greekupsilondialytikavaria          {\uchar{31}{226}}
-\definecharacter greekupsilondialytikatonos          {\uchar{31}{227}}
-\definecharacter greekrhopsili                       {\uchar{31}{228}}
-\definecharacter greekrhodasia                       {\uchar{31}{229}}
-\definecharacter greekupsilonperispomeni             {\uchar{31}{230}}
-\definecharacter greekupsilondialytikaperispomeni    {\uchar{31}{231}}
-\definecharacter greekUpsilonvrachy                  {\uchar{31}{232}}
-\definecharacter greekUpsilonmacron                  {\uchar{31}{233}}
-\definecharacter greekUpsilonvaria                   {\uchar{31}{234}}
-\definecharacter greekUpsilontonos                   {\uchar{31}{235}}
-\definecharacter greekRhodasia                       {\uchar{31}{236}}
-\definecharacter greekdialytikavaria                 {\uchar{31}{237}}
-\definecharacter greekdialytikatonos                 {\uchar{31}{238}}
-\definecharacter greekvaria                          {\uchar{31}{239}}
-\definecharacter greekomegaiotasubvaria              {\uchar{31}{242}}
-\definecharacter greekomegaiotasub                   {\uchar{31}{243}}
-\definecharacter greekomegaiotasubtonos              {\uchar{31}{244}}
-\definecharacter greekomegaperispomeni               {\uchar{31}{246}}
-\definecharacter greekomegaiotasubperispomeni        {\uchar{31}{247}}
-\definecharacter greekOmicronvaria                   {\uchar{31}{248}}
-\definecharacter greekOmicrontonos                   {\uchar{31}{249}}
-\definecharacter greekOmegavaria                     {\uchar{31}{250}}
-\definecharacter greekOmegatonos                     {\uchar{31}{251}}
-\definecharacter greekOmegaiotasub                   {\uchar{31}{252}}
-\definecharacter greekoxia                           {\uchar{31}{253}}
-\definecharacter greekdasia                          {\uchar{31}{254}}
-\definecharacter greeksigmalunate                    {\uchar3{242}}
-\definecharacter greekSigmalunate                    {\uchar3{249}}
-\definecharacter greeksampi                          {\uchar3{225}}
-\definecharacter greekdigamma                        {\uchar3{221}}
-\definecharacter greekstigma                         {\uchar3{219}}
-\definecharacter greeknumkoppa                       {\uchar3{223}}
-\definecharacter greekkoppa                          {\uchar3{217}}
-\definecharacter greekupsilondiaeresis               {\uchar3{203}}
-
-\stopencoding
-
-% Hebrew:
-
-\startencoding[uc]
-
-\definecharacter hebrewAlef          {\uchar5{208}} %  05D0
-\definecharacter hebrewBet           {\uchar5{209}}
-\definecharacter hebrewGimel         {\uchar5{210}}
-\definecharacter hebrewDalet         {\uchar5{211}}
-\definecharacter hebrewHe            {\uchar5{212}}
-\definecharacter hebrewVav           {\uchar5{213}}
-\definecharacter hebrewZayin         {\uchar5{214}}
-\definecharacter hebrewHet           {\uchar5{215}}
-\definecharacter hebrewTet           {\uchar5{216}}
-\definecharacter hebrewYod           {\uchar5{217}}
-\definecharacter hebrewKaffinal      {\uchar5{218}}
-\definecharacter hebrewKaf           {\uchar5{219}}
-\definecharacter hebrewLamed         {\uchar5{220}}
-\definecharacter hebrewMemfinal      {\uchar5{221}}
-\definecharacter hebrewMem           {\uchar5{222}}
-\definecharacter hebrewNunfinal      {\uchar5{223}}
-\definecharacter hebrewNun           {\uchar5{224}}
-\definecharacter hebrewSamekh        {\uchar5{225}}
-\definecharacter hebrewAyin          {\uchar5{226}}
-\definecharacter hebrewPefinal       {\uchar5{227}}
-\definecharacter hebrewPe            {\uchar5{228}}
-\definecharacter hebrewTsadifinal    {\uchar5{229}}
-\definecharacter hebrewTsadi         {\uchar5{230}}
-\definecharacter hebrewQof           {\uchar5{231}}
-\definecharacter hebrewResh          {\uchar5{232}}
-\definecharacter hebrewShin          {\uchar5{233}}
-\definecharacter hebrewTav           {\uchar5{234}} % 05EA
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-vis.mkii b/tex/context/base/enco-vis.mkii
new file mode 100644
index 000000000..3c1fd7765
--- /dev/null
+++ b/tex/context/base/enco-vis.mkii
@@ -0,0 +1,3 @@
+% temporary module, needed for downward compatibility
+
+\input regi-vis.tex \enableregime[viscii] \endinput 
diff --git a/tex/context/base/enco-vis.tex b/tex/context/base/enco-vis.tex
deleted file mode 100644
index 3c1fd7765..000000000
--- a/tex/context/base/enco-vis.tex
+++ /dev/null
@@ -1,3 +0,0 @@
-% temporary module, needed for downward compatibility
-
-\input regi-vis.tex \enableregime[viscii] \endinput 
diff --git a/tex/context/base/enco-vna.mkii b/tex/context/base/enco-vna.mkii
new file mode 100644
index 000000000..05753f37b
--- /dev/null
+++ b/tex/context/base/enco-vna.mkii
@@ -0,0 +1,145 @@
+%D \module
+%D   [     file=enco-vna,
+%D      version=1999.12.12,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Vietnamese Accents,
+%D       author=Han The Thanh & Adam Lindsay & Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=PRAGMA]
+%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 module is originally derived from the some files Han The Thanh
+%D prepared for \LATEX. The dual accent support is still preliminary,
+%D but works ok. It's now adapted to named glyphs, and is activated by
+%D \type {\useencoding[thisfile]}.
+
+%D This was apparently buggy from the start: there is nothing to
+%D disambiguate \type {\ohorn} from \type {\ohook}. Both are entered
+%D with \type {\h{o}} (AL)!
+
+%D Once stable, this code will move to \type {enco-acc.tex}.
+
+\startencoding[default]
+
+\defineaccent h  A       {\Ahook}
+\defineaccent d  A       {\Adotbelow}
+\defineaccent ` ^A       {\Acircumflexgrave}
+\defineaccent ' ^A       {\Acircumflexacute}
+\defineaccent ~ ^A       {\Acircumflextilde}
+\defineaccent h ^A       {\Acircumflexhook}
+\defineaccent d ^A       {\Acircumflexdotbelow}
+\defineaccent ` uA       {\Abrevegrave}
+\defineaccent ' uA       {\Abreveacute}
+\defineaccent ~ uA       {\Abrevetilde}
+\defineaccent h uA       {\Abrevehook}
+\defineaccent d uA       {\Abrevedotbelow}
+\defineaccent h  E       {\Ehook}
+\defineaccent d  E       {\Edotbelow}
+\defineaccent ` ^E       {\Ecircumflexgrave}
+\defineaccent ' ^E       {\Ecircumflexacute}
+\defineaccent ~ ^E       {\Ecircumflextilde}
+\defineaccent h ^E       {\Ecircumflexhook}
+\defineaccent d ^E       {\Ecircumflexdotbelow}
+\defineaccent h  I       {\Ihook}
+\defineaccent d  I       {\Idotbelow}
+\defineaccent h  O       {\Ohook}
+\defineaccent d  O       {\Odotbelow}
+\defineaccent ` ^O       {\Ocircumflexgrave}
+\defineaccent ' ^O       {\Ocircumflexacute}
+\defineaccent ~ ^O       {\Ocircumflextilde}
+\defineaccent h ^O       {\Ocircumflexhook}
+\defineaccent d ^O       {\Ocircumflexdotbelow}
+%defineaccent h  O       {\Ohorn}                % !!! conflict with \Ohook!
+\defineaccent ` hO       {\Ohorngrave}
+\defineaccent ` {\Ohorn} {\Ohorngrave}
+\defineaccent ' hO       {\Ohornacute}
+\defineaccent ' {\Ohorn} {\Ohornacute}
+\defineaccent ~ hO       {\Ohorntilde}
+\defineaccent ~ {\Ohorn} {\Ohorntilde}
+\defineaccent h hO       {\Ohornhook}
+\defineaccent h {\Ohorn} {\Ohornhook}
+\defineaccent d hO       {\Ohorndotbelow}
+\defineaccent d {\Ohorn} {\Ohorndotbelow}
+\defineaccent h  U       {\Uhook}
+\defineaccent d  U       {\Udotbelow}
+%defineaccent h  U       {\Uhorn}                % !!! conflict with \Uhook! honestly, people!
+\defineaccent ` hU       {\Uhorngrave}
+\defineaccent ` {\Uhorn} {\Uhorngrave}
+\defineaccent ' hU       {\Uhornacute}
+\defineaccent ' {\Uhorn} {\Uhornacute}
+\defineaccent ~ hU       {\Uhorntilde}
+\defineaccent ~ {\Uhorn} {\Uhorntilde}
+\defineaccent h hU       {\Uhornhook}
+\defineaccent h {\Uhorn} {\Uhornhook}
+\defineaccent d hU       {\Uhorndotbelow}
+\defineaccent d {\Uhorn} {\Uhorndotbelow}
+\defineaccent `  Y       {\Ygrave}
+\defineaccent '  Y       {\Yacute}
+\defineaccent ~  Y       {\Ytilde}
+\defineaccent h  Y       {\Yhook}
+\defineaccent d  Y       {\Ydotbelow}
+\defineaccent h  a       {\ahook}
+\defineaccent d  a       {\adotbelow}
+\defineaccent ` ^a       {\acircumflexgrave}
+\defineaccent ' ^a       {\acircumflexacute}
+\defineaccent ~ ^a       {\acircumflextilde}
+\defineaccent h ^a       {\acircumflexhook}
+\defineaccent d ^a       {\acircumflexdotbelow}
+\defineaccent ` ua       {\abrevegrave}
+\defineaccent ' ua       {\abreveacute}
+\defineaccent ~ ua       {\abrevetilde}
+\defineaccent h ua       {\abrevehook}
+\defineaccent d ua       {\abrevedotbelow}
+\defineaccent h  e       {\ehook}
+\defineaccent d  e       {\edotbelow}
+\defineaccent ` ^e       {\ecircumflexgrave}
+\defineaccent ' ^e       {\ecircumflexacute}
+\defineaccent ~ ^e       {\ecircumflextilde}
+\defineaccent h ^e       {\ecircumflexhook}
+\defineaccent d ^e       {\ecircumflexdotbelow}
+\defineaccent h  i       {\ihook}
+\defineaccent d  i       {\idotbelow}
+\defineaccent h  o       {\ohook}
+\defineaccent d  o       {\odotbelow}
+\defineaccent ^  o       {\ocircumflex}
+\defineaccent ` ^o       {\ocircumflexgrave}
+\defineaccent ' ^o       {\ocircumflexacute}
+\defineaccent ~ ^o       {\ocircumflextilde}
+\defineaccent h ^o       {\ocircumflexhook}
+\defineaccent d ^o       {\ocircumflexdotbelow}
+%defineaccent h  o       {\ohorn}                % !!!
+\defineaccent ` ho       {\ohorngrave}
+\defineaccent ' ho       {\ohornacute}
+\defineaccent ~ ho       {\ohorntilde}
+\defineaccent h ho       {\ohornhook}
+\defineaccent d ho       {\ohorndotbelow}
+\defineaccent ` {\ohorn} {\ohorngrave}
+\defineaccent ' {\ohorn} {\ohornacute}
+\defineaccent ~ {\ohorn} {\ohorntilde}
+\defineaccent h {\ohorn} {\ohornhook}
+\defineaccent d {\ohorn} {\ohorndotbelow}
+\defineaccent h  u       {\uhook}
+\defineaccent d  u       {\udotbelow}
+%defineaccent h  u       {\uhorn}                % !!!
+\defineaccent ` hu       {\uhorngrave}
+\defineaccent ' hu       {\uhornacute}
+\defineaccent ~ hu       {\uhorntilde}
+\defineaccent h hu       {\uhornhook}
+\defineaccent d hu       {\uhorndotbelow}
+\defineaccent ` {\uhorn} {\uhorngrave}
+\defineaccent ' {\uhorn} {\uhornacute}
+\defineaccent ~ {\uhorn} {\uhorntilde}
+\defineaccent h {\uhorn} {\uhornhook}
+\defineaccent d {\uhorn} {\uhorndotbelow}
+\defineaccent `  y       {\ygrave}
+\defineaccent '  y       {\yacute}
+\defineaccent ~  y       {\ytilde}
+\defineaccent h  y       {\yhook}
+\defineaccent d  y       {\ydotbelow}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-vna.tex b/tex/context/base/enco-vna.tex
deleted file mode 100644
index 05753f37b..000000000
--- a/tex/context/base/enco-vna.tex
+++ /dev/null
@@ -1,145 +0,0 @@
-%D \module
-%D   [     file=enco-vna,
-%D      version=1999.12.12,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Vietnamese Accents,
-%D       author=Han The Thanh & Adam Lindsay & Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=PRAGMA]
-%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 module is originally derived from the some files Han The Thanh
-%D prepared for \LATEX. The dual accent support is still preliminary,
-%D but works ok. It's now adapted to named glyphs, and is activated by
-%D \type {\useencoding[thisfile]}.
-
-%D This was apparently buggy from the start: there is nothing to
-%D disambiguate \type {\ohorn} from \type {\ohook}. Both are entered
-%D with \type {\h{o}} (AL)!
-
-%D Once stable, this code will move to \type {enco-acc.tex}.
-
-\startencoding[default]
-
-\defineaccent h  A       {\Ahook}
-\defineaccent d  A       {\Adotbelow}
-\defineaccent ` ^A       {\Acircumflexgrave}
-\defineaccent ' ^A       {\Acircumflexacute}
-\defineaccent ~ ^A       {\Acircumflextilde}
-\defineaccent h ^A       {\Acircumflexhook}
-\defineaccent d ^A       {\Acircumflexdotbelow}
-\defineaccent ` uA       {\Abrevegrave}
-\defineaccent ' uA       {\Abreveacute}
-\defineaccent ~ uA       {\Abrevetilde}
-\defineaccent h uA       {\Abrevehook}
-\defineaccent d uA       {\Abrevedotbelow}
-\defineaccent h  E       {\Ehook}
-\defineaccent d  E       {\Edotbelow}
-\defineaccent ` ^E       {\Ecircumflexgrave}
-\defineaccent ' ^E       {\Ecircumflexacute}
-\defineaccent ~ ^E       {\Ecircumflextilde}
-\defineaccent h ^E       {\Ecircumflexhook}
-\defineaccent d ^E       {\Ecircumflexdotbelow}
-\defineaccent h  I       {\Ihook}
-\defineaccent d  I       {\Idotbelow}
-\defineaccent h  O       {\Ohook}
-\defineaccent d  O       {\Odotbelow}
-\defineaccent ` ^O       {\Ocircumflexgrave}
-\defineaccent ' ^O       {\Ocircumflexacute}
-\defineaccent ~ ^O       {\Ocircumflextilde}
-\defineaccent h ^O       {\Ocircumflexhook}
-\defineaccent d ^O       {\Ocircumflexdotbelow}
-%defineaccent h  O       {\Ohorn}                % !!! conflict with \Ohook!
-\defineaccent ` hO       {\Ohorngrave}
-\defineaccent ` {\Ohorn} {\Ohorngrave}
-\defineaccent ' hO       {\Ohornacute}
-\defineaccent ' {\Ohorn} {\Ohornacute}
-\defineaccent ~ hO       {\Ohorntilde}
-\defineaccent ~ {\Ohorn} {\Ohorntilde}
-\defineaccent h hO       {\Ohornhook}
-\defineaccent h {\Ohorn} {\Ohornhook}
-\defineaccent d hO       {\Ohorndotbelow}
-\defineaccent d {\Ohorn} {\Ohorndotbelow}
-\defineaccent h  U       {\Uhook}
-\defineaccent d  U       {\Udotbelow}
-%defineaccent h  U       {\Uhorn}                % !!! conflict with \Uhook! honestly, people!
-\defineaccent ` hU       {\Uhorngrave}
-\defineaccent ` {\Uhorn} {\Uhorngrave}
-\defineaccent ' hU       {\Uhornacute}
-\defineaccent ' {\Uhorn} {\Uhornacute}
-\defineaccent ~ hU       {\Uhorntilde}
-\defineaccent ~ {\Uhorn} {\Uhorntilde}
-\defineaccent h hU       {\Uhornhook}
-\defineaccent h {\Uhorn} {\Uhornhook}
-\defineaccent d hU       {\Uhorndotbelow}
-\defineaccent d {\Uhorn} {\Uhorndotbelow}
-\defineaccent `  Y       {\Ygrave}
-\defineaccent '  Y       {\Yacute}
-\defineaccent ~  Y       {\Ytilde}
-\defineaccent h  Y       {\Yhook}
-\defineaccent d  Y       {\Ydotbelow}
-\defineaccent h  a       {\ahook}
-\defineaccent d  a       {\adotbelow}
-\defineaccent ` ^a       {\acircumflexgrave}
-\defineaccent ' ^a       {\acircumflexacute}
-\defineaccent ~ ^a       {\acircumflextilde}
-\defineaccent h ^a       {\acircumflexhook}
-\defineaccent d ^a       {\acircumflexdotbelow}
-\defineaccent ` ua       {\abrevegrave}
-\defineaccent ' ua       {\abreveacute}
-\defineaccent ~ ua       {\abrevetilde}
-\defineaccent h ua       {\abrevehook}
-\defineaccent d ua       {\abrevedotbelow}
-\defineaccent h  e       {\ehook}
-\defineaccent d  e       {\edotbelow}
-\defineaccent ` ^e       {\ecircumflexgrave}
-\defineaccent ' ^e       {\ecircumflexacute}
-\defineaccent ~ ^e       {\ecircumflextilde}
-\defineaccent h ^e       {\ecircumflexhook}
-\defineaccent d ^e       {\ecircumflexdotbelow}
-\defineaccent h  i       {\ihook}
-\defineaccent d  i       {\idotbelow}
-\defineaccent h  o       {\ohook}
-\defineaccent d  o       {\odotbelow}
-\defineaccent ^  o       {\ocircumflex}
-\defineaccent ` ^o       {\ocircumflexgrave}
-\defineaccent ' ^o       {\ocircumflexacute}
-\defineaccent ~ ^o       {\ocircumflextilde}
-\defineaccent h ^o       {\ocircumflexhook}
-\defineaccent d ^o       {\ocircumflexdotbelow}
-%defineaccent h  o       {\ohorn}                % !!!
-\defineaccent ` ho       {\ohorngrave}
-\defineaccent ' ho       {\ohornacute}
-\defineaccent ~ ho       {\ohorntilde}
-\defineaccent h ho       {\ohornhook}
-\defineaccent d ho       {\ohorndotbelow}
-\defineaccent ` {\ohorn} {\ohorngrave}
-\defineaccent ' {\ohorn} {\ohornacute}
-\defineaccent ~ {\ohorn} {\ohorntilde}
-\defineaccent h {\ohorn} {\ohornhook}
-\defineaccent d {\ohorn} {\ohorndotbelow}
-\defineaccent h  u       {\uhook}
-\defineaccent d  u       {\udotbelow}
-%defineaccent h  u       {\uhorn}                % !!!
-\defineaccent ` hu       {\uhorngrave}
-\defineaccent ' hu       {\uhornacute}
-\defineaccent ~ hu       {\uhorntilde}
-\defineaccent h hu       {\uhornhook}
-\defineaccent d hu       {\uhorndotbelow}
-\defineaccent ` {\uhorn} {\uhorngrave}
-\defineaccent ' {\uhorn} {\uhornacute}
-\defineaccent ~ {\uhorn} {\uhorntilde}
-\defineaccent h {\uhorn} {\uhornhook}
-\defineaccent d {\uhorn} {\uhorndotbelow}
-\defineaccent `  y       {\ygrave}
-\defineaccent '  y       {\yacute}
-\defineaccent ~  y       {\ytilde}
-\defineaccent h  y       {\yhook}
-\defineaccent d  y       {\ydotbelow}
-
-\stopencoding
-
-\endinput
diff --git a/tex/context/base/enco-win.mkii b/tex/context/base/enco-win.mkii
new file mode 100644
index 000000000..826371d8a
--- /dev/null
+++ b/tex/context/base/enco-win.mkii
@@ -0,0 +1,7 @@
+% temporary module, needed for downward compatibility
+
+%\input regi-win.tex 
+
+\enableregime[windows] 
+
+\endinput 
diff --git a/tex/context/base/enco-win.tex b/tex/context/base/enco-win.tex
deleted file mode 100644
index 826371d8a..000000000
--- a/tex/context/base/enco-win.tex
+++ /dev/null
@@ -1,7 +0,0 @@
-% temporary module, needed for downward compatibility
-
-%\input regi-win.tex 
-
-\enableregime[windows] 
-
-\endinput 
diff --git a/tex/context/base/enco-x5.mkii b/tex/context/base/enco-x5.mkii
new file mode 100644
index 000000000..f82ec6c5c
--- /dev/null
+++ b/tex/context/base/enco-x5.mkii
@@ -0,0 +1,218 @@
+%D \module
+%D   [     file=enco-x5,
+%D      version=1999.12.12,
+%D        title=\CONTEXT\ Encoding Macros,
+%D     subtitle=Vietnamese Encoding,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=Hans Hagen]
+%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 module is derived from the some files Han The Thanh
+%D prepared for \LATEX. The dual accent support is still
+%D preliminary, but works ok.
+
+\startencoding[x5]
+
+\definecharacter textgrave         0
+\definecharacter textacute         1
+\definecharacter textcircumflex    2
+\definecharacter texttilde         3
+\definecharacter textdiaeresis     4
+\definecharacter texthungarumlaut  5
+\definecharacter textring          6
+\definecharacter textcaron         7
+\definecharacter textbreve         8
+\definecharacter textmacron        9
+\definecharacter textdotaccent    10
+\definecharacter textcedilla      11
+\definecharacter textogonek       12
+
+\definecharacter dotlessi         25
+\definecharacter DJ               30
+\definecharacter dj               31
+
+\defineaccent `  A 128
+\defineaccent '  A 129
+\defineaccent ~  A 130
+\defineaccent h  A 131
+\defineaccent d  A 132
+\defineaccent ^  A 133
+\defineaccent ` ^A 134
+\defineaccent ' ^A 135
+\defineaccent ~ ^A 136
+\defineaccent h ^A 137
+\defineaccent d ^A 138
+\defineaccent u  A 139
+\defineaccent ` uA 140
+\defineaccent ' uA 141
+\defineaccent ~ uA 142
+\defineaccent h uA 143
+\defineaccent d uA 144
+\defineaccent `  E 145
+\defineaccent '  E 146
+\defineaccent ~  E 147
+\defineaccent h  E 148
+\defineaccent d  E 149
+\defineaccent ^  E 150
+\defineaccent ` ^E 151
+\defineaccent ' ^E 152
+\defineaccent ~ ^E 153
+\defineaccent h ^E 154
+\defineaccent d ^E 155
+\defineaccent `  I 156
+\defineaccent '  I 157
+\defineaccent ~  I 158
+\defineaccent h  I 159
+\defineaccent d  I 192
+\defineaccent `  O 193
+\defineaccent '  O 194
+\defineaccent ~  O 195
+\defineaccent h  O 196
+\defineaccent d  O 197
+\defineaccent ^  O 198
+\defineaccent ` ^O 199
+\defineaccent ' ^O 200
+\defineaccent ~ ^O 201
+\defineaccent h ^O 202
+\defineaccent d ^O 203
+\defineaccent h  O 204
+\defineaccent ` hO 205
+\defineaccent ' hO 206
+\defineaccent ~ hO 207
+\defineaccent h hO 208
+\defineaccent d hO 209
+\defineaccent `  U 210
+\defineaccent '  U 211
+\defineaccent ~  U 212
+\defineaccent h  U 213
+\defineaccent d  U 214
+\defineaccent h  U 215
+\defineaccent ` hU 216
+\defineaccent ' hU 217
+\defineaccent ~ hU 218
+\defineaccent h hU 219
+\defineaccent d hU 220
+\defineaccent `  Y 221
+\defineaccent '  Y 222
+\defineaccent ~  Y 223
+\defineaccent h  Y  26
+\defineaccent d  Y  28
+\defineaccent `  a 160
+\defineaccent '  a 161
+\defineaccent ~  a 162
+\defineaccent h  a 163
+\defineaccent d  a 164
+\defineaccent ^  a 165
+\defineaccent ` ^a 166
+\defineaccent ' ^a 167
+\defineaccent ~ ^a 168
+\defineaccent h ^a 169
+\defineaccent d ^a 170
+\defineaccent u  a 171
+\defineaccent ` ua 172
+\defineaccent ' ua 173
+\defineaccent ~ ua 174
+\defineaccent h ua 175
+\defineaccent d ua 176
+\defineaccent `  e 177
+\defineaccent '  e 178
+\defineaccent ~  e 179
+\defineaccent h  e 180
+\defineaccent d  e 181
+\defineaccent ^  e 182
+\defineaccent ` ^e 183
+\defineaccent ' ^e 184
+\defineaccent ~ ^e 185
+\defineaccent h ^e 186
+\defineaccent d ^e 187
+\defineaccent `  i 188
+\defineaccent '  i 189
+\defineaccent ~  i 190
+\defineaccent h  i 191
+\defineaccent d  i 224
+\defineaccent `  o 225
+\defineaccent '  o 226
+\defineaccent ~  o 227
+\defineaccent h  o 228
+\defineaccent d  o 229
+\defineaccent ^  o 230
+\defineaccent ` ^o 231
+\defineaccent ' ^o 232
+\defineaccent ~ ^o 233
+\defineaccent h ^o 234
+\defineaccent d ^o 235
+\defineaccent h  o 236
+\defineaccent ` ho 237
+\defineaccent ' ho 238
+\defineaccent ~ ho 239
+\defineaccent h ho 240
+\defineaccent d ho 241
+\defineaccent `  u 242
+\defineaccent '  u 243
+\defineaccent ~  u 244
+\defineaccent h  u 245
+\defineaccent d  u 246
+\defineaccent h  u 247
+\defineaccent ` hu 248
+\defineaccent ' hu 249
+\defineaccent ~ hu 250
+\defineaccent h hu 251
+\defineaccent d hu 252
+\defineaccent `  y 253
+\defineaccent '  y 254
+\defineaccent ~  y 255
+\defineaccent h  y  27
+\defineaccent d  y  29
+
+\stopencoding
+
+\endinput
+
+% \startencoding [x5]
+%
+% \definecharacter aa {\xfiveencodedaa}
+% \definecharacter AA {\xfiveencodedAA}
+%
+% \stopencoding
+%
+% \def\xfiveencodedaa%
+%   {\accent23a}
+%
+% \def\xfiveencodedAA%
+%   {\leavevmode
+%    \setbox\zerocount\hbox{h}%
+%    \dimen@\ht\zerocount
+%    \advance\dimen@ -1ex
+%    \rlap{\raise.67\dimen@\hbox{\char23}}A}
+
+% \quotesinglbase     13
+% \guilsinglleft      14
+% \guilsinglright     15
+% \textquotedblleft   16
+% \textquotedblright  17
+% \quotedblbase       18
+% \guillemotleft      19
+% \guillemotright     20
+% \textendash         21
+% \textemdash         22
+% \textcompwordmark   23
+% \textperthousand    \% \char 24
+% \textpertenthousand \%\char 24\char 24
+% \textvisiblespace   32
+% \textquotedbl       `\"
+% \textdollar         `\$
+% \textquoteright     `\'
+% \textless           `\<
+% \textgreater        `\>
+% \textbackslash      `\
+% \textasciicircum    `\^
+% \textunderscore     95
+% \textquoteleft      `\`
+% \textbraceleft      `\{
+% \textbar            `\|
+% \textbraceright     `\}
+% \textasciitilde     `\~
diff --git a/tex/context/base/enco-x5.tex b/tex/context/base/enco-x5.tex
deleted file mode 100644
index f82ec6c5c..000000000
--- a/tex/context/base/enco-x5.tex
+++ /dev/null
@@ -1,218 +0,0 @@
-%D \module
-%D   [     file=enco-x5,
-%D      version=1999.12.12,
-%D        title=\CONTEXT\ Encoding Macros,
-%D     subtitle=Vietnamese Encoding,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=Hans Hagen]
-%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 module is derived from the some files Han The Thanh
-%D prepared for \LATEX. The dual accent support is still
-%D preliminary, but works ok.
-
-\startencoding[x5]
-
-\definecharacter textgrave         0
-\definecharacter textacute         1
-\definecharacter textcircumflex    2
-\definecharacter texttilde         3
-\definecharacter textdiaeresis     4
-\definecharacter texthungarumlaut  5
-\definecharacter textring          6
-\definecharacter textcaron         7
-\definecharacter textbreve         8
-\definecharacter textmacron        9
-\definecharacter textdotaccent    10
-\definecharacter textcedilla      11
-\definecharacter textogonek       12
-
-\definecharacter dotlessi         25
-\definecharacter DJ               30
-\definecharacter dj               31
-
-\defineaccent `  A 128
-\defineaccent '  A 129
-\defineaccent ~  A 130
-\defineaccent h  A 131
-\defineaccent d  A 132
-\defineaccent ^  A 133
-\defineaccent ` ^A 134
-\defineaccent ' ^A 135
-\defineaccent ~ ^A 136
-\defineaccent h ^A 137
-\defineaccent d ^A 138
-\defineaccent u  A 139
-\defineaccent ` uA 140
-\defineaccent ' uA 141
-\defineaccent ~ uA 142
-\defineaccent h uA 143
-\defineaccent d uA 144
-\defineaccent `  E 145
-\defineaccent '  E 146
-\defineaccent ~  E 147
-\defineaccent h  E 148
-\defineaccent d  E 149
-\defineaccent ^  E 150
-\defineaccent ` ^E 151
-\defineaccent ' ^E 152
-\defineaccent ~ ^E 153
-\defineaccent h ^E 154
-\defineaccent d ^E 155
-\defineaccent `  I 156
-\defineaccent '  I 157
-\defineaccent ~  I 158
-\defineaccent h  I 159
-\defineaccent d  I 192
-\defineaccent `  O 193
-\defineaccent '  O 194
-\defineaccent ~  O 195
-\defineaccent h  O 196
-\defineaccent d  O 197
-\defineaccent ^  O 198
-\defineaccent ` ^O 199
-\defineaccent ' ^O 200
-\defineaccent ~ ^O 201
-\defineaccent h ^O 202
-\defineaccent d ^O 203
-\defineaccent h  O 204
-\defineaccent ` hO 205
-\defineaccent ' hO 206
-\defineaccent ~ hO 207
-\defineaccent h hO 208
-\defineaccent d hO 209
-\defineaccent `  U 210
-\defineaccent '  U 211
-\defineaccent ~  U 212
-\defineaccent h  U 213
-\defineaccent d  U 214
-\defineaccent h  U 215
-\defineaccent ` hU 216
-\defineaccent ' hU 217
-\defineaccent ~ hU 218
-\defineaccent h hU 219
-\defineaccent d hU 220
-\defineaccent `  Y 221
-\defineaccent '  Y 222
-\defineaccent ~  Y 223
-\defineaccent h  Y  26
-\defineaccent d  Y  28
-\defineaccent `  a 160
-\defineaccent '  a 161
-\defineaccent ~  a 162
-\defineaccent h  a 163
-\defineaccent d  a 164
-\defineaccent ^  a 165
-\defineaccent ` ^a 166
-\defineaccent ' ^a 167
-\defineaccent ~ ^a 168
-\defineaccent h ^a 169
-\defineaccent d ^a 170
-\defineaccent u  a 171
-\defineaccent ` ua 172
-\defineaccent ' ua 173
-\defineaccent ~ ua 174
-\defineaccent h ua 175
-\defineaccent d ua 176
-\defineaccent `  e 177
-\defineaccent '  e 178
-\defineaccent ~  e 179
-\defineaccent h  e 180
-\defineaccent d  e 181
-\defineaccent ^  e 182
-\defineaccent ` ^e 183
-\defineaccent ' ^e 184
-\defineaccent ~ ^e 185
-\defineaccent h ^e 186
-\defineaccent d ^e 187
-\defineaccent `  i 188
-\defineaccent '  i 189
-\defineaccent ~  i 190
-\defineaccent h  i 191
-\defineaccent d  i 224
-\defineaccent `  o 225
-\defineaccent '  o 226
-\defineaccent ~  o 227
-\defineaccent h  o 228
-\defineaccent d  o 229
-\defineaccent ^  o 230
-\defineaccent ` ^o 231
-\defineaccent ' ^o 232
-\defineaccent ~ ^o 233
-\defineaccent h ^o 234
-\defineaccent d ^o 235
-\defineaccent h  o 236
-\defineaccent ` ho 237
-\defineaccent ' ho 238
-\defineaccent ~ ho 239
-\defineaccent h ho 240
-\defineaccent d ho 241
-\defineaccent `  u 242
-\defineaccent '  u 243
-\defineaccent ~  u 244
-\defineaccent h  u 245
-\defineaccent d  u 246
-\defineaccent h  u 247
-\defineaccent ` hu 248
-\defineaccent ' hu 249
-\defineaccent ~ hu 250
-\defineaccent h hu 251
-\defineaccent d hu 252
-\defineaccent `  y 253
-\defineaccent '  y 254
-\defineaccent ~  y 255
-\defineaccent h  y  27
-\defineaccent d  y  29
-
-\stopencoding
-
-\endinput
-
-% \startencoding [x5]
-%
-% \definecharacter aa {\xfiveencodedaa}
-% \definecharacter AA {\xfiveencodedAA}
-%
-% \stopencoding
-%
-% \def\xfiveencodedaa%
-%   {\accent23a}
-%
-% \def\xfiveencodedAA%
-%   {\leavevmode
-%    \setbox\zerocount\hbox{h}%
-%    \dimen@\ht\zerocount
-%    \advance\dimen@ -1ex
-%    \rlap{\raise.67\dimen@\hbox{\char23}}A}
-
-% \quotesinglbase     13
-% \guilsinglleft      14
-% \guilsinglright     15
-% \textquotedblleft   16
-% \textquotedblright  17
-% \quotedblbase       18
-% \guillemotleft      19
-% \guillemotright     20
-% \textendash         21
-% \textemdash         22
-% \textcompwordmark   23
-% \textperthousand    \% \char 24
-% \textpertenthousand \%\char 24\char 24
-% \textvisiblespace   32
-% \textquotedbl       `\"
-% \textdollar         `\$
-% \textquoteright     `\'
-% \textless           `\<
-% \textgreater        `\>
-% \textbackslash      `\
-% \textasciicircum    `\^
-% \textunderscore     95
-% \textquoteleft      `\`
-% \textbraceleft      `\{
-% \textbar            `\|
-% \textbraceright     `\}
-% \textasciitilde     `\~
diff --git a/tex/context/base/filt-bas.mkii b/tex/context/base/filt-bas.mkii
new file mode 100644
index 000000000..ca3bc3d70
--- /dev/null
+++ b/tex/context/base/filt-bas.mkii
@@ -0,0 +1,63 @@
+%D \module
+%D   [       file=filt-bas,
+%D        version=2000.09.19,
+%D          title=\CONTEXT\ Filter Macros,
+%D       subtitle=A Base Collection,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for 
+%C details. 
+
+% BEWARE: THIS IS A TEST MODULE, NAMES MAY CHANGE!
+
+\definefiltersynonym [utf8 to unicode16] [inutf8]
+
+\definefiltersynonym [persian fix]       [FarsiToArabic]
+\definefiltersynonym [arabic analysis]   [uni2cuni]
+\definefiltersynonym [arabic glyphs]     [cuni2oar]
+
+\definefiltersequence
+  [farsi]
+  [utf8 to unicode16,
+   persian fix,
+   arabic analysis,
+   arabic glyphs]
+
+\definefiltersynonym [basic context analysis step1]     [bcaa-1]
+\definefiltersynonym [basic context analysis step2]     [bcaa-2]
+\definefiltersynonym [basic context analysis step3]     [bcaa-3]
+\definefiltersynonym [farsi processing for uomarab]     [uomarab-farsi]
+
+\definefiltersynonym [basic presentation forms to sf]   [bpftosf]
+
+\definefiltersynonym [omega persian fix]                [FarsiToArabic]
+\definefiltersynonym [omega arabic analysis]            [uni2cuni]
+\definefiltersynonym [omega arabic glyphs]              [cuni2oar]
+
+\definefiltersequence
+  [farsi-1]
+  [utf8 to unicode16,
+   omega persian fix,
+   omega arabic analysis,
+   omega arabic glyphs]
+
+\definefiltersequence
+  [farsi-2]
+  [utf8 to unicode16,
+   basic context analysis step1,
+   basic context analysis step2,
+   basic context analysis step3,
+   farsi processing for uomarab]
+
+\definefiltersequence
+  [farsi-3]
+  [utf8 to unicode16,
+   basic context analysis step1,
+   basic context analysis step2,
+   basic context analysis step3,
+   basic presentation forms to sf]
+
+\endinput
diff --git a/tex/context/base/filt-bas.tex b/tex/context/base/filt-bas.tex
deleted file mode 100644
index ca3bc3d70..000000000
--- a/tex/context/base/filt-bas.tex
+++ /dev/null
@@ -1,63 +0,0 @@
-%D \module
-%D   [       file=filt-bas,
-%D        version=2000.09.19,
-%D          title=\CONTEXT\ Filter Macros,
-%D       subtitle=A Base Collection,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for 
-%C details. 
-
-% BEWARE: THIS IS A TEST MODULE, NAMES MAY CHANGE!
-
-\definefiltersynonym [utf8 to unicode16] [inutf8]
-
-\definefiltersynonym [persian fix]       [FarsiToArabic]
-\definefiltersynonym [arabic analysis]   [uni2cuni]
-\definefiltersynonym [arabic glyphs]     [cuni2oar]
-
-\definefiltersequence
-  [farsi]
-  [utf8 to unicode16,
-   persian fix,
-   arabic analysis,
-   arabic glyphs]
-
-\definefiltersynonym [basic context analysis step1]     [bcaa-1]
-\definefiltersynonym [basic context analysis step2]     [bcaa-2]
-\definefiltersynonym [basic context analysis step3]     [bcaa-3]
-\definefiltersynonym [farsi processing for uomarab]     [uomarab-farsi]
-
-\definefiltersynonym [basic presentation forms to sf]   [bpftosf]
-
-\definefiltersynonym [omega persian fix]                [FarsiToArabic]
-\definefiltersynonym [omega arabic analysis]            [uni2cuni]
-\definefiltersynonym [omega arabic glyphs]              [cuni2oar]
-
-\definefiltersequence
-  [farsi-1]
-  [utf8 to unicode16,
-   omega persian fix,
-   omega arabic analysis,
-   omega arabic glyphs]
-
-\definefiltersequence
-  [farsi-2]
-  [utf8 to unicode16,
-   basic context analysis step1,
-   basic context analysis step2,
-   basic context analysis step3,
-   farsi processing for uomarab]
-
-\definefiltersequence
-  [farsi-3]
-  [utf8 to unicode16,
-   basic context analysis step1,
-   basic context analysis step2,
-   basic context analysis step3,
-   basic presentation forms to sf]
-
-\endinput
diff --git a/tex/context/base/filt-ini.mkii b/tex/context/base/filt-ini.mkii
new file mode 100644
index 000000000..6e1a16e9a
--- /dev/null
+++ b/tex/context/base/filt-ini.mkii
@@ -0,0 +1,121 @@
+%D \module
+%D   [       file=filt-ini,
+%D        version=2000.09.19,
+%D          title=\CONTEXT\ Filter Macros,
+%D       subtitle=Initialization,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Filter Macros / Initialization}
+
+% \ifx\OmegaVersion\undefined
+
+%            \let\definefiltersynonym  \gobbledoubleempty
+%            \let\definefiltersequence \gobbledoubleempty
+% \unexpanded\def\usefiltersequence   {\gobblesingleempty}
+%            \let\usefilter            \gobblesingleempty
+%            \let\truefiltername       \gobbleoneargument
+
+%   \expandafter \endinput
+% \fi
+
+\unprotect
+
+%D The real work starts here.
+
+% We need the {\??ot::#1} check because otherwise aleph will crash. Taco's
+% torture test:
+%
+% \ocp\ArabicContext = contextual
+%
+% \dorecurse {5000} {
+%     \message{[\recurselevel]}
+%     \ocplist\Arabic=\addbeforeocplist 1 \ArabicContext \nullocplist
+% }
+
+%D \macros
+%D   {definefiltersynonym}
+
+\def\definefiltersynonym
+  {\dodoubleargument\dodefinefiltersynonym}
+
+\def\dodefinefiltersynonym[#1][#2]%
+  {\setvalue{\??or#1}{#2}}
+
+%D \macros
+%D   {truefiltername}
+
+\def\truefiltername#1%
+  {\ifundefined{\??or#1}#1\else\truefiltername{\getvalue{\??or#1}}\fi}
+
+%D \macros
+%D   {definefiltersequence}
+
+\def\definefiltersequence
+  {\dodoubleargument\dodefinefiltersequence}
+
+% \def\dodefinefiltersequence[#1][#2]%
+%   {\setvalue{\??ot#1}{#2}}
+
+\def\dodefinefiltersequence[#1][#2]%
+  {\setxvalue{\??ot#1}{#2}%
+   \letgvalue{\??ot::#1}\v!stop}
+
+%D \macros
+%D   {usefiltersequence}
+%D
+
+\def\magicocpnumber{1}
+
+% one can do:
+%
+%  \definefiltersequence
+%    [farsi]
+%    [utf8 to unicode16=>5,
+%     persian fix,
+%     arabic analysis=>3,
+%     arabic glyphs]
+%
+% so, => is used to signal a priority
+
+\def\dodousefiltersequence#1%
+  {\expandafter\ocp\csname\??or:#1\endcsname=\truefiltername{#1}\relax
+   \splitstring#1\at=>\to\!!stringa\and\!!stringb
+   \edef\!!stringb{\number\ifx\!!stringb\empty\magicocpnumber\else\!!stringb\fi}%
+   \appendetoks
+     \noexpand\addbeforeocplist
+     \!!stringb\space
+     \expandafter\noexpand\csname\??or:\!!stringa\endcsname
+   \to \scratchtoks}
+
+\unexpanded\def\usefiltersequence[#1]%
+  {\doifdefined{\??ot::#1}%
+     {\doifvalue{\??ot::#1}\v!stop
+         {\scratchtoks\emptytoks
+          \expanded{\processcommalist[\getvalue{\??ot#1}]}\dodousefiltersequence
+          \expanded{\global\ocplist\csname\??ot:#1\endcsname=\the\scratchtoks}\nullocplist
+          \letgvalue{\??ot::#1}\v!start}%
+       \expanded{\pushocplist\csname\??ot:#1\endcsname}\relax}}
+
+%D \macros
+%D   {usefilter}
+
+\def\dousefilter#1%
+  {\doifundefined{\c!file\f!filterprefix#1}%
+     {\letvalue{\c!file\f!filterprefix#1}\empty
+      \makeshortfilename[\truefilename{\f!filterprefix#1}]%
+      \startreadingfile
+        \readsysfile{\shortfilename.mkii}
+          {\showmessage\m!filters1{#1}}
+          {\showmessage\m!filters2{#1}}%
+      \stopreadingfile}}
+
+\def\usefilter[#1]%
+  {\processcommalist[#1]\dousefilter}
+
+\protect \endinput
diff --git a/tex/context/base/filt-ini.tex b/tex/context/base/filt-ini.tex
deleted file mode 100644
index 49b32bdd8..000000000
--- a/tex/context/base/filt-ini.tex
+++ /dev/null
@@ -1,133 +0,0 @@
-%D \module
-%D   [       file=filt-ini,
-%D        version=2000.09.19,
-%D          title=\CONTEXT\ Filter Macros,
-%D       subtitle=Initialization,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Filter Macros / Initialization}
-
-% \ifx\OmegaVersion\undefined
-
-%            \let\definefiltersynonym  \gobbledoubleempty
-%            \let\definefiltersequence \gobbledoubleempty
-% \unexpanded\def\usefiltersequence   {\gobblesingleempty}
-%            \let\usefilter            \gobblesingleempty
-%            \let\truefiltername       \gobbleoneargument
-
-%   \expandafter \endinput
-% \fi
-
-\unprotect
-
-%D The real work starts here.
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% We need the {\??ot::#1} check because otherwise aleph will crash. Taco's
-% torture test:
-%
-% \ocp\ArabicContext = contextual
-%
-% \dorecurse {5000} {
-%     \message{[\recurselevel]}
-%     \ocplist\Arabic=\addbeforeocplist 1 \ArabicContext \nullocplist
-% }
-
-%D \macros
-%D   {definefiltersynonym}
-
-\def\definefiltersynonym
-  {\dodoubleargument\dodefinefiltersynonym}
-
-\def\dodefinefiltersynonym[#1][#2]%
-  {\setvalue{\??or#1}{#2}}
-
-%D \macros
-%D   {truefiltername}
-
-\def\truefiltername#1%
-  {\ifundefined{\??or#1}#1\else\truefiltername{\getvalue{\??or#1}}\fi}
-
-%D \macros
-%D   {definefiltersequence}
-
-\def\definefiltersequence
-  {\dodoubleargument\dodefinefiltersequence}
-
-% \def\dodefinefiltersequence[#1][#2]%
-%   {\setvalue{\??ot#1}{#2}}
-
-\def\dodefinefiltersequence[#1][#2]%
-  {\setxvalue{\??ot#1}{#2}%
-   \letgvalue{\??ot::#1}\v!stop}
-
-%D \macros
-%D   {usefiltersequence}
-%D
-
-\def\magicocpnumber{1}
-
-% one can do:
-%
-%  \definefiltersequence
-%    [farsi]
-%    [utf8 to unicode16=>5,
-%     persian fix,
-%     arabic analysis=>3,
-%     arabic glyphs]
-%
-% so, => is used to signal a priority
-
-\def\dodousefiltersequence#1%
-  {\expandafter\ocp\csname\??or:#1\endcsname=\truefiltername{#1}\relax
-   \splitstring#1\at=>\to\!!stringa\and\!!stringb
-   \edef\!!stringb{\number\ifx\!!stringb\empty\magicocpnumber\else\!!stringb\fi}%
-   \appendetoks
-     \noexpand\addbeforeocplist
-     \!!stringb\space
-     \expandafter\noexpand\csname\??or:\!!stringa\endcsname
-   \to \scratchtoks}
-
-\unexpanded\def\usefiltersequence[#1]%
-  {\doifdefined{\??ot::#1}%
-     {\doifvalue{\??ot::#1}\v!stop
-         {\scratchtoks\emptytoks
-          \expanded{\processcommalist[\getvalue{\??ot#1}]}\dodousefiltersequence
-          \expanded{\global\ocplist\csname\??ot:#1\endcsname=\the\scratchtoks}\nullocplist
-          \letgvalue{\??ot::#1}\v!start}%
-       \expanded{\pushocplist\csname\??ot:#1\endcsname}\relax}}
-
-%D \macros
-%D   {usefilter}
-
-\def\dousefilter#1%
-  {\doifundefined{\c!file\f!filterprefix#1}%
-     {\letvalue{\c!file\f!filterprefix#1}\empty
-      \makeshortfilename[\truefilename{\f!filterprefix#1}]%
-      \startreadingfile
-        \readsysfile\shortfilename
-          {\showmessage\m!filters1{#1}}
-          {\showmessage\m!filters2{#1}}%
-      \stopreadingfile}}
-
-\def\usefilter[#1]%
-  {\processcommalist[#1]\dousefilter}
-
-\protect \endinput
diff --git a/tex/context/base/font-arb.mkii b/tex/context/base/font-arb.mkii
new file mode 100644
index 000000000..3ec0395f3
--- /dev/null
+++ b/tex/context/base/font-arb.mkii
@@ -0,0 +1,5 @@
+\unprotected \writestatus\m!systems{load ARABTEX as a module instead}
+
+\usemodule[arabtex]
+
+\endinput
diff --git a/tex/context/base/font-arb.tex b/tex/context/base/font-arb.tex
deleted file mode 100644
index 3ec0395f3..000000000
--- a/tex/context/base/font-arb.tex
+++ /dev/null
@@ -1,5 +0,0 @@
-\unprotected \writestatus\m!systems{load ARABTEX as a module instead}
-
-\usemodule[arabtex]
-
-\endinput
diff --git a/tex/context/base/font-bfm.mkii b/tex/context/base/font-bfm.mkii
new file mode 100644
index 000000000..23e3176c4
--- /dev/null
+++ b/tex/context/base/font-bfm.mkii
@@ -0,0 +1,196 @@
+%D \module
+%D   [       file=font-bfm,
+%D        version=2003.11.25,
+%D          title=\CONTEXT\ Font Macros,
+%D       subtitle=Mixed Normal and Bold Math,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Font Macros / Mixed Bold Math Support}
+
+%D The following example demonstrates how to use normal, bold, and mixed
+%D normal|/|bold math. Since not everyone has the Lucida on his|/|her
+%D machine we don't show the result.
+%D
+%D \starttyping
+%D \setupformulas
+%D   [method=bold]
+%D
+%D \definetypeface [mainface] [rm] [serif]    [lucida] [default] [encoding=texnansi]
+%D \definetypeface [mainface] [tt] [mono]     [lucida] [default] [encoding=texnansi]
+%D \definetypeface [mainface] [ss] [sans]     [lucida] [default] [encoding=texnansi]
+%D \definetypeface [mainface] [mm] [math]     [lucida] [default] [encoding=texnansi]
+%D \definetypeface [mainface] [mm] [bfmath]   [lucida] [default] [encoding=texnansi]
+%D
+%D \definetypeface [boldmath] [rm] [serif]    [lucida] [default] [encoding=texnansi]
+%D \definetypeface [boldmath] [tt] [mono]     [lucida] [default] [encoding=texnansi]
+%D \definetypeface [boldmath] [ss] [sans]     [lucida] [default] [encoding=texnansi]
+%D \definetypeface [boldmath] [mm] [boldmath] [lucida] [default] [encoding=texnansi]
+%D
+%D \switchtobodyfont[mainface]
+%D
+%D \startlines
+%D $\mainface x=10 \Gamma \Delta \alpha \delta \zeta$
+%D $\boldmath x=10 \Gamma \Delta \alpha \delta \zeta$
+%D \stoplines
+%D
+%D \startformula
+%D   x=12=\fontbody  \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[mainface]
+%D   x=12=\fontbody  \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath]
+%D   x=12=\fontbody  \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,8pt]
+%D   x=8=\fontbody  \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,12pt,small]
+%D   x=12s=\fontbody  \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,small]
+%D   x=s=\fontbody  \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,10pt]
+%D   x=10=\fontbody  \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,11pt,small]
+%D   x=11s=\fontbody  \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,9pt]
+%D   x=9=\fontbody \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startlines
+%D \formula{1=2x}
+%D \formula[boldmath]{1=2x}
+%D \formula[mainface]{1=2x}
+%D \formula[mainface]{1 \theta \Gamma = \bfm 1 \beta \hbox{\sl test}\Gamma \alpha ' x x}
+%D \formula[mainface]{1 \theta \Gamma = {\bfm 1 \beta \hbox{\sl test}\Gamma \alpha ' x} x}
+%D \stoplines
+%D \stoptyping
+
+\unprotect
+
+%D \TEX\ has some hard wired expectations about where to look for
+%D certain characters.  This means that we cannot overload the families
+%D 0 upto~3. Also, since we use C upto~F  for math as well, we are left
+%D with the range 4 upto~B.
+
+\chardef\mrbffam\itfam \edef\c!mrbf{\c!mr\c!bf} \let\hexmrbffam\hexitfam % 4 it
+\chardef\exbffam\slfam \edef\c!exbf{\c!ex\c!bf} \let\hexexbffam\hexslfam % 5 sl
+\chardef\mibffam\bffam \edef\c!mibf{\c!mi\c!bf} \let\hexmibffam\hexbffam % 6 bf
+\chardef\sybffam\nnfam \edef\c!sybf{\c!sy\c!bf} \let\hexsybffam\hexnnfam % 7 nn
+\chardef\mabffam\bsfam \edef\c!mabf{\c!ma\c!bf} \let\hexmabffam\hexbsfam % 8 bs
+\chardef\mbbffam\bifam \edef\c!mbbf{\c!mb\c!bf} \let\hexmbbffam\hexbifam % 9 bi
+\chardef\mcbffam\scfam \edef\c!mcbf{\c!mc\c!bf} \let\hexmcbffam\hexscfam % A sc
+\chardef\mdbffam\scfam \edef\c!mdbf{\c!mc\c!bf} \let\hexmdbffam\hexscfam % B tf % tricky
+
+%D The next bunch of code looks horrible and tricky but one has to keep in
+%D mind that because \TEX\ makes several passes over the math list we need to
+%D make sure that grouping is handled well. Later assignments to a family
+%D overload previous ones, the last one counts.
+
+\newtoks \boldmathstrategies
+\newtoks \boldsymbstrategies
+
+\appendtoks
+  \dosetmathfamily\mrbffam\textface\scriptface\scriptscriptface\c!mrbf\mrfallback
+  \dosetmathfamily\mibffam\textface\scriptface\scriptscriptface\c!mibf\empty
+  \dosetmathfamily\sybffam\textface\scriptface\scriptscriptface\c!sybf\empty
+  \dosetmathfamily\exbffam\textface\textface  \textface        \c!exbf\empty
+  \dosetmathfamily\mabffam\textface\scriptface\scriptscriptface\c!mabf\empty
+  \dosetmathfamily\mbbffam\textface\scriptface\scriptscriptface\c!mbbf\empty
+  \dosetmathfamily\mcbffam\textface\scriptface\scriptscriptface\c!mcbf\empty
+\to \boldmathstrategies
+
+\appendtoks
+  \dosetskewchar\mifam\defaultskewcharmi
+  \dosetskewchar\syfam\defaultskewcharsy
+\to \boldmathstrategies
+
+\appendtoks
+  \dosetsymbfamily\mrbffam\textface\scriptface\scriptscriptface\c!mrbf
+  \dosetsymbfamily\mibffam\textface\scriptface\scriptscriptface\c!mibf
+  \dosetsymbfamily\sybffam\textface\scriptface\scriptscriptface\c!sybf
+  \dosetsymbfamily\exbffam\textface\textface  \textface        \c!exbf
+  \dosetsymbfamily\mabffam\textface\scriptface\scriptscriptface\c!mabf
+  \dosetsymbfamily\mbbffam\textface\scriptface\scriptscriptface\c!mbbf
+  \dosetsymbfamily\mcbffam\textface\scriptface\scriptscriptface\c!mcbf
+\to \boldsymbstrategies
+
+%D Here comes the real mess (due to semi||global settings en multiple
+%D passes over the math list once the input is expanded.
+
+\newevery \everyboldfacemath  \relax
+\chardef  \boldfacemathmethod \zerocount
+
+\appendtoks
+  \ifcase\boldfacemathmethod \else \the\boldmathstrategies \fi
+\to \mathstrategies
+
+\appendtoks
+  \ifcase\boldfacemathmethod \else \the\boldsymbstrategies \fi
+\to \symbstrategies
+
+\appendtoks
+  \let\mrfam\mrbffam \let\c!mr\c!mrbf \let\hexmrfam\hexmrbffam
+  \let\mifam\mibffam \let\c!mi\c!mibf \let\hexmifam\hexmibffam
+  \let\syfam\sybffam \let\c!sy\c!sybf \let\hexsyfam\hexsybffam
+  \let\exfam\exbffam \let\c!ex\c!exbf \let\hexexfam\hexexbffam
+  \let\mafam\mabffam \let\c!ma\c!mabf \let\hexmafam\hexmabffam
+  \let\mbfam\mbbffam \let\c!mb\c!mbbf \let\hexmbfam\hexmbbffam
+  \let\mcfam\mcbffam \let\c!mc\c!mcbf \let\hexmcfam\hexmcbffam
+\to \everyboldfacemath
+
+\appendtoks
+  \let\mathsubfamily\c!bf
+\to \everyboldfacemath
+
+\appendtoks
+  \synchronizemath \aftergroup\synchronizemath
+\to \everyboldfacemath
+
+%D \macros
+%D   {boldfacemath, bfm, autoboldfacemath}
+%D
+%D These are the user commands, with \type {\bfm} being the most comfortable.
+
+\def\boldfacemath    {\ifcase\boldfacemathmethod\else\the\everyboldfacemath\fi}
+\def\bfm             {\boldfacemath} % no \let, so that we can redefine
+\def\autoboldfacemath{\appendtoks\ifcase\boldfacemathmethod\else\let\bf\boldfacemath\fi\to\everymathematics}
+
+%D We hook this feature into the formula mechanism.
+
+\setupformulas
+  [\c!method=\v!normal]
+
+\appendtoks
+  \doifelse{\formulaparameter\c!method}\v!bold
+    {\chardef\boldfacemathmethod\plusone}
+    {\chardef\boldfacemathmethod\zerocount}%
+\to \everysetupformulas
+
+%D Of course this only works when bfmath fonts are set up (see example at
+%D the top of this file) and bold math is enabled:
+%D
+%D \starttyping
+%D \setupformulas
+%D   [method=bold]
+%D \stoptyping
+
+\protect \endinput
diff --git a/tex/context/base/font-bfm.tex b/tex/context/base/font-bfm.tex
deleted file mode 100644
index 23e3176c4..000000000
--- a/tex/context/base/font-bfm.tex
+++ /dev/null
@@ -1,196 +0,0 @@
-%D \module
-%D   [       file=font-bfm,
-%D        version=2003.11.25,
-%D          title=\CONTEXT\ Font Macros,
-%D       subtitle=Mixed Normal and Bold Math,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Font Macros / Mixed Bold Math Support}
-
-%D The following example demonstrates how to use normal, bold, and mixed
-%D normal|/|bold math. Since not everyone has the Lucida on his|/|her
-%D machine we don't show the result.
-%D
-%D \starttyping
-%D \setupformulas
-%D   [method=bold]
-%D
-%D \definetypeface [mainface] [rm] [serif]    [lucida] [default] [encoding=texnansi]
-%D \definetypeface [mainface] [tt] [mono]     [lucida] [default] [encoding=texnansi]
-%D \definetypeface [mainface] [ss] [sans]     [lucida] [default] [encoding=texnansi]
-%D \definetypeface [mainface] [mm] [math]     [lucida] [default] [encoding=texnansi]
-%D \definetypeface [mainface] [mm] [bfmath]   [lucida] [default] [encoding=texnansi]
-%D
-%D \definetypeface [boldmath] [rm] [serif]    [lucida] [default] [encoding=texnansi]
-%D \definetypeface [boldmath] [tt] [mono]     [lucida] [default] [encoding=texnansi]
-%D \definetypeface [boldmath] [ss] [sans]     [lucida] [default] [encoding=texnansi]
-%D \definetypeface [boldmath] [mm] [boldmath] [lucida] [default] [encoding=texnansi]
-%D
-%D \switchtobodyfont[mainface]
-%D
-%D \startlines
-%D $\mainface x=10 \Gamma \Delta \alpha \delta \zeta$
-%D $\boldmath x=10 \Gamma \Delta \alpha \delta \zeta$
-%D \stoplines
-%D
-%D \startformula
-%D   x=12=\fontbody  \Gamma \Delta \alpha \delta \zeta
-%D \stopformula
-%D
-%D \startformula[mainface]
-%D   x=12=\fontbody  \Gamma \Delta \alpha \delta \zeta
-%D \stopformula
-%D
-%D \startformula[boldmath]
-%D   x=12=\fontbody  \Gamma \Delta \alpha \delta \zeta
-%D \stopformula
-%D
-%D \startformula[boldmath,8pt]
-%D   x=8=\fontbody  \Gamma \Delta \alpha \delta \zeta
-%D \stopformula
-%D
-%D \startformula[boldmath,12pt,small]
-%D   x=12s=\fontbody  \Gamma \Delta \alpha \delta \zeta
-%D \stopformula
-%D
-%D \startformula[boldmath,small]
-%D   x=s=\fontbody  \Gamma \Delta \alpha \delta \zeta
-%D \stopformula
-%D
-%D \startformula[boldmath,10pt]
-%D   x=10=\fontbody  \Gamma \Delta \alpha \delta \zeta
-%D \stopformula
-%D
-%D \startformula[boldmath,11pt,small]
-%D   x=11s=\fontbody  \Gamma \Delta \alpha \delta \zeta
-%D \stopformula
-%D
-%D \startformula[boldmath,9pt]
-%D   x=9=\fontbody \Gamma \Delta \alpha \delta \zeta
-%D \stopformula
-%D
-%D \startlines
-%D \formula{1=2x}
-%D \formula[boldmath]{1=2x}
-%D \formula[mainface]{1=2x}
-%D \formula[mainface]{1 \theta \Gamma = \bfm 1 \beta \hbox{\sl test}\Gamma \alpha ' x x}
-%D \formula[mainface]{1 \theta \Gamma = {\bfm 1 \beta \hbox{\sl test}\Gamma \alpha ' x} x}
-%D \stoplines
-%D \stoptyping
-
-\unprotect
-
-%D \TEX\ has some hard wired expectations about where to look for
-%D certain characters.  This means that we cannot overload the families
-%D 0 upto~3. Also, since we use C upto~F  for math as well, we are left
-%D with the range 4 upto~B.
-
-\chardef\mrbffam\itfam \edef\c!mrbf{\c!mr\c!bf} \let\hexmrbffam\hexitfam % 4 it
-\chardef\exbffam\slfam \edef\c!exbf{\c!ex\c!bf} \let\hexexbffam\hexslfam % 5 sl
-\chardef\mibffam\bffam \edef\c!mibf{\c!mi\c!bf} \let\hexmibffam\hexbffam % 6 bf
-\chardef\sybffam\nnfam \edef\c!sybf{\c!sy\c!bf} \let\hexsybffam\hexnnfam % 7 nn
-\chardef\mabffam\bsfam \edef\c!mabf{\c!ma\c!bf} \let\hexmabffam\hexbsfam % 8 bs
-\chardef\mbbffam\bifam \edef\c!mbbf{\c!mb\c!bf} \let\hexmbbffam\hexbifam % 9 bi
-\chardef\mcbffam\scfam \edef\c!mcbf{\c!mc\c!bf} \let\hexmcbffam\hexscfam % A sc
-\chardef\mdbffam\scfam \edef\c!mdbf{\c!mc\c!bf} \let\hexmdbffam\hexscfam % B tf % tricky
-
-%D The next bunch of code looks horrible and tricky but one has to keep in
-%D mind that because \TEX\ makes several passes over the math list we need to
-%D make sure that grouping is handled well. Later assignments to a family
-%D overload previous ones, the last one counts.
-
-\newtoks \boldmathstrategies
-\newtoks \boldsymbstrategies
-
-\appendtoks
-  \dosetmathfamily\mrbffam\textface\scriptface\scriptscriptface\c!mrbf\mrfallback
-  \dosetmathfamily\mibffam\textface\scriptface\scriptscriptface\c!mibf\empty
-  \dosetmathfamily\sybffam\textface\scriptface\scriptscriptface\c!sybf\empty
-  \dosetmathfamily\exbffam\textface\textface  \textface        \c!exbf\empty
-  \dosetmathfamily\mabffam\textface\scriptface\scriptscriptface\c!mabf\empty
-  \dosetmathfamily\mbbffam\textface\scriptface\scriptscriptface\c!mbbf\empty
-  \dosetmathfamily\mcbffam\textface\scriptface\scriptscriptface\c!mcbf\empty
-\to \boldmathstrategies
-
-\appendtoks
-  \dosetskewchar\mifam\defaultskewcharmi
-  \dosetskewchar\syfam\defaultskewcharsy
-\to \boldmathstrategies
-
-\appendtoks
-  \dosetsymbfamily\mrbffam\textface\scriptface\scriptscriptface\c!mrbf
-  \dosetsymbfamily\mibffam\textface\scriptface\scriptscriptface\c!mibf
-  \dosetsymbfamily\sybffam\textface\scriptface\scriptscriptface\c!sybf
-  \dosetsymbfamily\exbffam\textface\textface  \textface        \c!exbf
-  \dosetsymbfamily\mabffam\textface\scriptface\scriptscriptface\c!mabf
-  \dosetsymbfamily\mbbffam\textface\scriptface\scriptscriptface\c!mbbf
-  \dosetsymbfamily\mcbffam\textface\scriptface\scriptscriptface\c!mcbf
-\to \boldsymbstrategies
-
-%D Here comes the real mess (due to semi||global settings en multiple
-%D passes over the math list once the input is expanded.
-
-\newevery \everyboldfacemath  \relax
-\chardef  \boldfacemathmethod \zerocount
-
-\appendtoks
-  \ifcase\boldfacemathmethod \else \the\boldmathstrategies \fi
-\to \mathstrategies
-
-\appendtoks
-  \ifcase\boldfacemathmethod \else \the\boldsymbstrategies \fi
-\to \symbstrategies
-
-\appendtoks
-  \let\mrfam\mrbffam \let\c!mr\c!mrbf \let\hexmrfam\hexmrbffam
-  \let\mifam\mibffam \let\c!mi\c!mibf \let\hexmifam\hexmibffam
-  \let\syfam\sybffam \let\c!sy\c!sybf \let\hexsyfam\hexsybffam
-  \let\exfam\exbffam \let\c!ex\c!exbf \let\hexexfam\hexexbffam
-  \let\mafam\mabffam \let\c!ma\c!mabf \let\hexmafam\hexmabffam
-  \let\mbfam\mbbffam \let\c!mb\c!mbbf \let\hexmbfam\hexmbbffam
-  \let\mcfam\mcbffam \let\c!mc\c!mcbf \let\hexmcfam\hexmcbffam
-\to \everyboldfacemath
-
-\appendtoks
-  \let\mathsubfamily\c!bf
-\to \everyboldfacemath
-
-\appendtoks
-  \synchronizemath \aftergroup\synchronizemath
-\to \everyboldfacemath
-
-%D \macros
-%D   {boldfacemath, bfm, autoboldfacemath}
-%D
-%D These are the user commands, with \type {\bfm} being the most comfortable.
-
-\def\boldfacemath    {\ifcase\boldfacemathmethod\else\the\everyboldfacemath\fi}
-\def\bfm             {\boldfacemath} % no \let, so that we can redefine
-\def\autoboldfacemath{\appendtoks\ifcase\boldfacemathmethod\else\let\bf\boldfacemath\fi\to\everymathematics}
-
-%D We hook this feature into the formula mechanism.
-
-\setupformulas
-  [\c!method=\v!normal]
-
-\appendtoks
-  \doifelse{\formulaparameter\c!method}\v!bold
-    {\chardef\boldfacemathmethod\plusone}
-    {\chardef\boldfacemathmethod\zerocount}%
-\to \everysetupformulas
-
-%D Of course this only works when bfmath fonts are set up (see example at
-%D the top of this file) and bold math is enabled:
-%D
-%D \starttyping
-%D \setupformulas
-%D   [method=bold]
-%D \stoptyping
-
-\protect \endinput
diff --git a/tex/context/base/font-chi.mkii b/tex/context/base/font-chi.mkii
new file mode 100644
index 000000000..0acf710d5
--- /dev/null
+++ b/tex/context/base/font-chi.mkii
@@ -0,0 +1,1156 @@
+%D \module
+%D   [       file=font-chi,
+%D        version=1999.10.10,
+%D          title=\CONTEXT\ Font Macros,
+%D       subtitle=Chinese,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D    suggestions=Wang Lei,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifx\handlechineseunicodeglyph\undefined \else \endinput \fi
+
+% NOT YET ADAPTED TO THE NEW FONT MACROS
+
+%D The first implementation (most of which is here) is based on
+%D the specific font layout. This is because not all glyphs are
+%D available in uniciode, which means that we cannot use
+%D unicode codepoints (yet); if it were possible we could use
+%D just one table per input encoding.
+
+\writestatus{loading}{ConTeXt Font Macros / Chinese}
+
+% much will to typo-chi.tex
+
+%D Still to be implemented:
+%D
+%D \startitemize
+%D \item columns left right touch
+%D \item distance = (hsize-n*bodyfontsize)/(n-1)
+%D \item char grids
+%D \item char tables
+%D \item all kind of rotated combinations
+%D \item hanging puctuation
+%D \item a few more encodings
+%D \item rotation list
+%D \stopitemize
+
+%M \setupbodyfont[chi]
+%M
+%M \def\WangLei{\purechinese{\uchar{205}{245}\uchar{192}{218}}}
+
+\useencoding[chi]
+
+%D When \WangLei\ sent me a mail asking if \CONTEXT\ was able
+%D to support Chinese, I wasn't sure if the answer could be
+%D yes. I knew that those languages, rich of glyphs, were
+%D typeset by \TEX, so in principle it should be possible. I
+%D asked or some more input and was told that there were
+%D \LATEX\ styles regarding those languages. When I unzipped
+%D the accompanying files, it became clear that I had to
+%D implement support for Chinese from scratch. There was a
+%D multitude of font, with rather unfamiliar encodings, a
+%D large collection of files with |<|at least for me|>|
+%D unknown purposes, and worse, the documentation was mainly
+%D in Chinese.
+%D
+%D So, \WangLei\ and I started exchanging some emails and it
+%D soon became clear that supporting Chinese was not that
+%D complicated at all. It mostly came to dealing with handling
+%D \UNICODE\ fonts. It also became clear that everything
+%D Chinese took place in the upper region of the eight bit
+%D character set. I wrote some macros that could process the
+%D small \type {Hello World} file \WangLei\ had send me, and
+%D after some bug fixes real Chinese came out. I started to
+%D like the look and fel of Chinese glyphs, so on we went.
+%D
+%D The first comments concerned spacing. The mix of English
+%D and Chinese demands some rather deliberate handling of
+%D spacing. Breaking lines was not so much a problem, and
+%D could be solved by adding some glue between Chinese glyphs.
+%D
+%D In the meantime had asked \WangLei\ for some language bound
+%D labels and texts, and implementing these was rather
+%D straightforward. But, there were still some issues to deal
+%D with: conversion of numbers, date handling and index
+%D sorting.
+%D
+%D I consider(ed) writing Chinese support to be a nice puzzle,
+%D since I have to act on chinese \CONTEXT\ code, where I only
+%D understand the \CONTEXT\ part. The drawings \WangLei\ made
+%D me (in drawing packages) were of great help. Since I write
+%D these modules from scratch, although I fall back on some
+%D basic encoding and font modules, I consider them to be
+%D rather clean. This cannot be said of all \CONTEXT\ font
+%D modules \type {-)}.
+
+\unprotect
+
+%D Because Chinese glyphs have more height than the average
+%D Latin glyph, and at the same time don't have much depth,
+%D we adapt the scale.
+%D
+%D Before and after the glyph we have to deal with Chinese
+%D spacing. Special attention is given to punctuation.
+%D
+%D \starttyping
+%D [some short nice chinese text with () and english]
+%D \stoptyping
+%D
+%D We insert a bit of stretch and introduce a signal to
+%D keep track of previous characters. We use a similar
+%D method in the units module, which may be a nice
+%D introduction to using signals.
+
+%D \macros
+%D   {chineseunicodescale, chineseinterglyphskip,
+%D    chineseunicodeheight, chineseunicodedepth, chinesespace}
+%D
+%D There are a few variables, that can be (re|)|set
+%D depending on the current font. They default to:
+
+% hm, why don't we use the normal unicodestrut mechanism?
+
+\def\chineseunicodescale  {1.00} % not smaller than .85
+\def\chineseunicodeheight {1.00}
+\def\chineseunicodedepth  {1.00}
+\def\chineseinterglyphskip{0pt   \!!plus .05em \!!minus .01em}
+\def\chinesesurroundskip  {.25em \!!plus .15em \!!minus .05em}
+
+%D We define a few signals. As said, another example of
+%D using signals can be found in the module \type {m-units}.
+
+\newsignal\chineseLsignal % left boundary character
+\newsignal\chineseRsignal % right boundary character
+\newsignal\chineseSsignal % any other character (symbol)
+
+\chardef\chineseBstatus=0 % 0=unknown 1=left 2=right 3=chinese 4=nospace
+\chardef\chineseAstatus=0 % 0=unknown 1=left 2=right 3=space
+\chardef\chineseSstatus=0 % 0=unknown 1=left 2=right
+
+\sfcode`(=2000  % a temporary hack
+
+\def\chinesenobreak
+ {\relax
+  \iftracechinese
+    \nobreak
+    \kern-.5pt\color[red]{\vrule\!!width1pt}\kern-.5pt
+    \nobreak
+  \else
+    \nobreak
+  \fi}
+
+\newif\ifcorrectchineseboundarychars
+
+\def\chineseunskip
+  {\unskip\unskip\unskip\unskip}
+
+\def\insertchineseglyph
+  {\iftracechinese\tracedchineseglyph\else\insertunicodeglyph\fi}
+
+\newif\ifverticalchinese
+
+\def\handlechineseunicodeglyph
+  {\ifinpagebody
+     \horizontalchineseunicodeglyph
+   \else\ifverticalchinese
+     \verticalchineseunicodeglyph
+   \else
+     \horizontalchineseunicodeglyph
+   \fi\fi}
+
+% chinese classes: left=1|right=2|center=3
+
+\chardef\plusfour=4
+
+\def\analyzechineseunicodeglyph % beware, no zerocount !
+  {\chardef\chineseSstatus0\getvalue{uc\number\unicodeposition}\relax}
+
+\def\analyzechineseunicodeenviroment
+  {% left
+   \ifx (\nextutoken              \chardef\chineseAstatus\plusone   \else
+   \ifx [\nextutoken              \chardef\chineseAstatus\plusone   \else
+   % right
+   \ifx ,\nextutoken              \chardef\chineseAstatus\plustwo   \else
+   \ifx .\nextutoken              \chardef\chineseAstatus\plustwo   \else
+   \ifx ?\nextutoken              \chardef\chineseAstatus\plustwo   \else
+   \ifx ;\nextutoken              \chardef\chineseAstatus\plustwo   \else
+   \ifx :\nextutoken              \chardef\chineseAstatus\plustwo   \else
+   \ifx !\nextutoken              \chardef\chineseAstatus\plustwo   \else
+   \ifx )\nextutoken              \chardef\chineseAstatus\plustwo   \else
+   \ifx ]\nextutoken              \chardef\chineseAstatus\plustwo   \else
+   % space
+   \ifx\nextutoken\blankspace     \chardef\chineseAstatus\plusthree \else
+   \ifx\nextutoken\space          \chardef\chineseAstatus\plusthree \else
+                                  \chardef\chineseAstatus\zerocount
+   % unknown
+   \fi\fi\fi\fi\fi \fi\fi\fi\fi\fi \fi\fi
+   % maybe save the last skip?
+   \chardef\chineseBstatus\ifdim\lastskip=\zeropoint\plusfour\else\zerocount\fi
+   \ifdim\lastskip=\chineseLsignal \chardef\chineseBstatus\plusone   \else
+   \ifdim\lastskip=\chineseRsignal \chardef\chineseBstatus\plustwo   \else
+   \ifdim\lastskip=\chineseSsignal \chardef\chineseBstatus\plusthree \else
+     \scratchskip=\lastskip \unskip
+     \ifdim\lastskip=\chineseLsignal \chardef\chineseBstatus\plusone   \else
+     \ifdim\lastskip=\chineseRsignal \chardef\chineseBstatus\plustwo   \else
+     \ifdim\lastskip=\chineseSsignal \chardef\chineseBstatus\plusthree \else
+       \space\scratchskip=\lastskip \unskip
+       \setbox\scratchbox=\hbox\bgroup
+         (\space
+         \ifdim\lastskip=\scratchskip
+           \egroup \chardef\chineseBstatus\plusone
+         \else
+           \egroup
+           \ifdim\scratchskip=\zeropoint \chardef\chineseBstatus\plusfour \fi
+         \fi
+     \fi\fi\fi
+   \fi\fi\fi}
+
+\def\horizontalchineseunicodeglyph
+  {\relax
+   \ifhmode\else\dontleavehmode\fi % added
+   \setunicodescale\chineseunicodescale % redundant
+   \setunicodestrut\chineseunicodeheight\chineseunicodedepth % redundant
+   \ifprocessingverbatim
+     \iftracechinese
+       \ruledhbox{\insertunicodeglyph}%
+     \else
+       \insertunicodeglyph
+     \fi
+   \else\ifx\nextutoken\relax
+       \insertunicodeglyph
+   \else
+     \analyzechineseunicodeglyph
+     \analyzechineseunicodeenviroment
+     \ifcase\chineseSstatus\relax
+       \ifcase\chineseBstatus\relax
+         \chineseunskip
+         \hskip\chinesesurroundskip      % unknown
+       \or
+         \chineseunskip
+         \chinesenobreak                 % left
+       \or
+         \ifcorrectchineseboundarychars\else\chineseunskip\fi
+         \hskip\chineseinterglyphskip    % right
+       \or
+         \chineseunskip
+         \hskip\chineseinterglyphskip    % chinese
+       \or
+                                         % whatever
+       \fi
+       \insertchineseglyph
+       \ifcase\chineseAstatus\relax
+         \hskip\chineseinterglyphskip    % unknown
+         \hskip\chinesesurroundskip
+         \ifcase\chineseSstatus
+           \hskip\chineseSsignal
+         \or
+           \hskip\chineseLsignal
+         \else
+           \hskip\chineseRsignal
+         \fi
+       \or
+         \hskip\chineseinterglyphskip    % left
+         \chinesenobreak
+         \hskip\chineseLsignal
+       \or
+         \chinesenobreak                 % right
+         \hskip\chineseinterglyphskip
+         \chinesenobreak
+         \hskip\chineseRsignal
+       \or
+         \hskip\chineseinterglyphskip    % space
+         \hskip\chinesesurroundskip
+         \hskip\chineseSsignal
+       \fi
+     \or % left
+       \ifcorrectchineseboundarychars
+         \let\unicodecharcommand\chineseleftcharcommand
+       \fi
+       \chineseunskip
+       \insertchineseglyph
+       \chinesenobreak
+       \hskip\chineseLsignal
+     \or % right
+       \ifcorrectchineseboundarychars
+         \let\unicodecharcommand\chineserightcharcommand
+       \fi
+       \chineseunskip
+       \chinesenobreak
+       \insertchineseglyph
+       \hskip\chineseRsignal
+     \else % center
+       \chineseunskip
+       \chinesenobreak
+       \insertchineseglyph
+       \hskip\chineseinterglyphskip
+       \hskip\chineseRsignal
+     \fi\fi
+     \aftergroup\ignorespaces            % watch this
+   \fi}
+
+\def\verticalchineseunicodeglyph
+  {\relax
+   \ifprocessingverbatim % to do
+     \horizontalchineseunicodeglyph
+   \else
+     \setunicodescale\chineseunicodescale % redundant
+     \setunicodestrut\chineseunicodeheight\chineseunicodedepth % redundant
+     \ifx\nextutoken\relax
+       \insertchineseglyph
+       \ifvmode % catches \hbox{...}, actually \hbox should be \vbox -)
+         \nointerlineskip
+       \fi
+       \allowbreak
+     \else
+       \analyzechineseunicodeglyph
+       \setbox\scratchbox\hbox to \hsize
+         {\hss
+          \ifcase\chineseSstatus\relax
+            \insertchineseglyph
+          \else % left / right
+            \setbox\scratchbox\hbox{\insertchineseglyph}%
+            \rotate[\c!rotation=270]{\box\scratchbox}%
+          \fi
+          \hss}%
+       \ht\scratchbox\unicodeheight\strutht
+       \dp\scratchbox\unicodedepth \strutdp
+       \ifvmode % catches \hbox{...}, actually \hbox should be \vbox -)
+         \nointerlineskip
+       \fi
+       \ifcase\prevchineseSstatus\relax
+         \ifnum\chineseSstatus=\plustwo \par\nobreak\else\allowbreak\fi
+       \or % left
+         \par\nobreak
+       \or % right
+         \ifnum\chineseSstatus=\plustwo \par\nobreak\else\allowbreak\fi
+       \fi
+       \global\chardef\prevchineseSstatus\chineseSstatus % pagebody ...
+       \box\scratchbox\par
+     \fi
+     \aftergroup\ignorespaces                           % watch this
+   \fi}
+
+%D \macros
+%D   {setupchinese,startvertical,nochinese}
+%D
+%D The previous macros implement horizontal as well as
+%D vertical typesetting. Vertical typesetting is implemented
+%D on top of the multi||column routines.
+
+\def\setupchinese
+  {\dodoubleargument\getparameters[\??vt]}
+
+\def\startvertical
+  {\dosingleempty\dostartvertical}
+
+\def\dostartvertical[#1]%
+  {\bgroup
+   \def\maxnofcolumns{25}%
+   \verticalchinesetrue
+   \global\chardef\prevchineseSstatus\zerocount
+   \let\nochinese\nochineseinvertical
+   \doif\@@vtn\v!fit
+     {\dimen0=\textwidth    \advance\dimen0 \@@vtdistance
+      \dimen2=\bodyfontsize \advance\dimen2 \@@vtdistance
+      \divide\dimen0 \number\dimen2
+      \edef\@@vtn{\number\dimen0}}%
+   \startcolumns
+     [\c!direction=\@@vtdirection,
+      \c!balance=\@@vtbalance,
+      \c!distance=\@@vtdistance,
+      \c!n=\@@vtn,
+      #1]}
+
+\def\stopvertical
+  {\stopcolumns
+   \egroup}
+
+\setupchinese
+  [\c!direction=\v!left,
+   \c!balance=\v!no,
+   \c!n=\v!fit,
+   \c!distance=1.5\bodyfontsize]
+
+%D We can set up vertical typesetting with \type
+%D {\setupchinese}.
+
+%D \macros
+%D   {nochineseinvertical}
+%D
+%D English (non chinese) text is typeset rotated:
+
+\def\nochineseinvertical#1%
+  {\par
+   \setbox\scratchbox\hbox{\strut#1}
+   \getnoflines{\wd\scratchbox}
+   \setbox\scratchbox\hbox to \noflines\openlineheight
+     {\hss\box\scratchbox\hss}
+   \hbox to \hsize
+     {\hss
+      \rotate
+        [\c!rotation=270]
+        {\vbox to \ht\scratchbox{\vss\box\scratchbox\vss}}%
+      \hss}
+   \par}
+
+%D \macros
+%D   {correctchineseboundarychars}
+%D
+%D Careful reading of the previous macro learns that we
+%D treat left and right glyphs differently. When we say
+%D
+%D \starttyping
+%D \correctchineseboundarycharstrue
+%D \stoptyping
+%D
+%D For the moment correction in on by default.
+
+\correctchineseboundarycharstrue
+
+\def\chineserightcharcommand#1%
+  {\iftracechinese\ruledhbox\else\hbox\fi \!!to .5em{#1\hss}%
+   \hskip.25em\!!plus .25em\relax}%
+
+\def\chineseleftcharcommand#1%
+  {\ifnum\chineseBstatus<4 \hskip.25em \!!plus .25em\relax\fi
+   \iftracechinese\ruledhbox\else\hbox\fi \!!to .5em{\hss#1}}%
+
+% \def\chineserightcharcommand#1%
+%   {\setbox\scratchbox=\hbox{#1}%
+%    \scratchdimen=.5em
+%    \ifdim\wd\scratchbox>\scratchdimen
+%      \iftracechinese\ruledhbox\else\hbox\fi \!!to \scratchdimen
+%        {\box\scratchbox\hss}%
+%      \hskip.5\scratchdimen\!!plus.5\scratchdimen\relax
+%    \else
+%      \box\scratchbox
+%    \fi}
+
+% \def\chineseleftcharcommand#1%
+%   {\setbox\scratchbox=\hbox{#1}%
+%    \scratchdimen=.5em
+%    \ifdim\wd\scratchbox>\scratchdimen
+%      \ifnum\chineseBstatus<4
+%        \hskip.5\scratchdimen\!!plus.5\scratchdimen\relax
+%      \fi
+%      \iftracechinese\ruledhbox\else\hbox\fi \!!to \scratchdimen
+%        {\hss\box\scratchbox}%
+%    \else
+%      \box\scratchbox
+%    \fi}
+
+%D The long list of numbers in the previous macro identify the
+%D characters where special care is needed for breaking lines.
+%D A linebreak is not permitted before:
+%D
+%D \def\DoIt #1 #2 %
+%D   {\hbox{\hbox to 2em{\uchar{#1}{#2}\hss}#1 #2}\par}
+%D
+%D \startcolumns[n=5]
+%D \DoIt 161 162 \DoIt 161 163 \DoIt 161 164 \DoIt 161 167 \DoIt 161 173
+%D \DoIt 161 175 \DoIt 161 177 \DoIt 161 179 \DoIt 161 181 \DoIt 161 183
+%D \DoIt 161 185 \DoIt 161 187 \DoIt 161 189 \DoIt 161 191 \DoIt 161 227
+%D \DoIt 161 228 \DoIt 161 229 \DoIt 163 161 \DoIt 163 162 \DoIt 163 167
+%D \DoIt 163 169 \DoIt 163 172 \DoIt 163 174 \DoIt 163 186 \DoIt 163 187
+%D \DoIt 163 190 \DoIt 163 191 \DoIt 163 221 \DoIt 163 253
+%D \stopcolumns
+%D
+%D A linebreak is not permitted after the following glyphs:
+%D
+%D \startcolumns[n=5]
+%D \DoIt 161 174 \DoIt 161 176 \DoIt 161 178 \DoIt 161 180 \DoIt 161 182
+%D \DoIt 161 184 \DoIt 161 186 \DoIt 161 188 \DoIt 161 190 \DoIt 163 168
+%D \DoIt 163 219 \DoIt 163 224 \DoIt 163 251
+%D \stopcolumns
+
+%D \macros
+%D   {tracechinesetrue, showchinesetracelegend}
+%D
+%D When we say \type {\tracechinesetrue}, we get some
+%D insight in the way \CONTEXT\ handles the Chinese glyphs.
+%D The symbols and color used represent:
+%D
+%D \showchinesetracelegend
+
+\newif\iftracechinese
+
+\def\showchinesetracelegend
+  {\definetabulate[\s!dummy][|c|l|l|l|]%
+   \startdummy
+     \HL
+     \NC \bf key \NC \bf meaning        \NC \bf glyph              \NC \bf keys  \NC\NR
+     \HL
+     \NC u \NC unknown character type   \NC \color[green]{current} \NC u l r     \NC\NR
+     \NC l \NC left boundary character  \NC \color[red]{previous}  \NC u l r c n \NC\NR
+     \NC r \NC right boundary character \NC \color[blue]{next}     \NC u l r s   \NC\NR
+     \NC c \NC chinese character        \NC                        \NC           \NC\NR
+     \NC s \NC following space          \NC                        \NC           \NC\NR
+     \NC n \NC no preceding space       \NC                        \NC           \NC\NR
+     \HL
+   \stopdummy}
+
+\def\tracedchineseglyph
+  {\dontleavehmode
+   \ruledhbox
+     {\setbox\scratchbox\hbox{\insertunicodeglyph}%
+      \hbox to \wd\scratchbox
+        {\localcolortrue
+         \copy\scratchbox
+         \infofont
+         \hskip-\wd\scratchbox
+         \hbox to \wd\scratchbox
+           {\hss
+            \color[green]{\ifcase\chineseSstatus\relax u\or l\or r\fi}%
+            \hss}%
+         \hskip-\wd\scratchbox
+         \lower\dp\scratchbox\hbox to \wd\scratchbox
+           {\hss
+            \color[red]{\ifcase\chineseBstatus\relax u\or l\or r\or c\or n\fi}%
+            \hss
+            \color[blue]{\ifcase\chineseAstatus\relax u\or l\or r\or s\fi}%
+            \hss}}}}
+
+%D The following example shows how tracing works.
+%D
+%D \start \tracechinesetrue
+%D һθǽܶĵ֧֡ĵ
+%D ѯ \nochinese{\CONTEXT} ǷܴʱѾԹ
+%D еĺ꼯ûеõζŶĵֻ֧û
+%D ʵ֡
+%D
+%D һ(θ) () ܶĵ֧֡ĵ,
+%D ѯ\nochinese{\CONTEXT}ǷܴʱѾ
+%D Թеĺ꼯ûеõζŶĵ֧
+%D ûʵ֡.
+%D \stop
+
+%D Because fonts are defined each time a \UNICODE\ is
+%D encountered |<|which is less inefficient than one would
+%D imagine, because \TEX\ is optimized quite well in this
+%D repect|>| we can define macros like this to take care of
+%D font switches. When available, one can add definitions
+%D for italic, slanted, bold fonts and combinations of these.
+
+%D \macros
+%D   {chinesenumber}
+%D
+%D The chinese numbering systems rather straightforward. First
+%D there are the digits:
+%D
+%D \starttabulate[|c|c|c|c|c|c|c|c|c|c|]
+%D \NC 0 \NC 1 \NC 2 \NC 3 \NC 4 \NC 5 \NC 6 \NC 7 \NC 8 \NC 9 \NC\NR
+%D \NC \chinesenumber{0} \NC \chinesenumber{1} \NC \chinesenumber{2}
+%D \NC \chinesenumber{3} \NC \chinesenumber{4} \NC \chinesenumber{5}
+%D \NC \chinesenumber{6} \NC \chinesenumber{7} \NC \chinesenumber{8}
+%D \NC \chinesenumber{9} \NC\NR
+%D \stoptabulate
+%D
+%D Apart from these numbers, we have dedicated representations
+%D of some powers of~$10$.
+%D
+%D \starttabulate[|c|c|c|c|c|]
+%D \NC 10 \NC 100 \NC 1000 \NC 10000 \NC 100000000 \NC\NR
+%D \NC \chinesenumber{10} \NC \chinesenumber{100}
+%D \NC \chinesenumber{1000} \NC \chinesenumber{10000}
+%D \NC \chinesenumber{100000000} \NC\NR
+%D \stoptabulate
+%D
+%D The number~12 is a combination of $1\times10+2$, or:
+%D \chinesenumber {12}, while~22 becomes \chinesenumber {22}.
+%D The numbers below 20 are treated a bit different, just like
+%D numbers with series of $0$'s. So $2\times10$ comes out as
+%D two glyphs, but $1\times10$ as one, because in the latter
+%D case the~$1$ is redundant. The same is true for the powers
+%D of~10.
+%D
+%D \starttabulate[|r|r|r|r|r|r|]
+%D \NC     1 \NC \chinesenumber     {1} \NC
+%D         9 \NC \chinesenumber     {9} \NC
+%D         4 \NC \chinesenumber     {4} \NC\NR
+%D \NC    11 \NC \chinesenumber    {11} \NC
+%D        99 \NC \chinesenumber    {99} \NC
+%D        16 \NC \chinesenumber    {16} \NC\NR
+%D \NC   111 \NC \chinesenumber   {111} \NC
+%D       999 \NC \chinesenumber   {999} \NC
+%D       256 \NC \chinesenumber   {256} \NC\NR
+%D \NC  1111 \NC \chinesenumber  {1111} \NC
+%D      9999 \NC \chinesenumber  {9999} \NC
+%D     65536 \NC \chinesenumber {65536} \NC\NR
+%D \stoptabulate
+%D
+%D The implementation is rather simple. For internal purposes,
+%D we let zero expand to~0. The digits $0-9$ and numbers $10$,
+%D $100$, $1000$, $10000$ and $100000000$ are hard coded.
+
+% This was the first implementation, before \WangLei\ asked
+% me to look into Big Five encoding, so, like everthing in
+% \TEX, things become a bit more complicated, but also more
+% versatile.
+%
+% \starttypen
+% \def\chinesedigit#1%
+%   {\ifnum      #1=100000000 \uchar{210}{218}% 100000000
+%    \else\ifnum #1=10000     \uchar{205}{242}% 10000
+%    \else\ifnum #1=1000      \uchar{199}{167}% 1000
+%    \else\ifnum #1=100       \uchar{176}{217}% 100
+%    \else\ifnum #1=10        \uchar{202}{174}% 10
+%    \else\ifcase#1           \uchar{193}{227}% 0
+%    \or                      \uchar{210}{187}% 1
+%    \or                      \uchar{182}{254}% 2
+%    \or                      \uchar{200}{253}% 3
+%    \or                      \uchar{203}{196}% 4
+%    \or                      \uchar{206}{229}% 5
+%    \or                      \uchar{193}{249}% 6
+%    \or                      \uchar{198}{223}% 7
+%    \or                      \uchar{176}{203}% 8
+%    \or                      \uchar{190}{197}% 9
+%    \fi\fi\fi\fi\fi\fi}
+% \stoptypen
+
+%D We will implement four methods, the one described earlier,
+%D a derived one with capitalized characters, an extended
+%D version of the first method, and a rather Arabic method.
+%D
+%D \starttabulate[|l|l|]
+%D \HL
+%D \NC \bf command                      \NC \bf number 39                 \NC\NR
+%D \HL
+%D \NC \type{\normalchinesenumber}      \NC \normalchinesenumber     {39} \NC\NR
+%D \NC \type{\capitalizedchinesenumber} \NC \capitalizedchinesenumber{39} \NC\NR
+%D \NC \type{\arabicchinesenumber}      \NC \arabicchinesenumber     {39} \NC\NR
+%D \NC \type{\extendedchinesenumber}    \NC \extendedchinesenumber   {39} \NC\NR
+%D \HL
+%D \stoptabulate
+%D
+%D We use a dirty trick to enable Chinese Capital Digits. In
+%D the encoding vectors, we define these by appending a suffix
+%D \type {*} to the digit, which in the following macro is
+%D appended or not (by passing \type {\empty}).
+
+\def\chinesedigit#1#2% #2: suffix, here * or \empty
+  {\udigit{\chineseencoding}{\number#1#2}}
+
+% Normal Chinese Number
+
+\def\normalchinesenumber#1%
+  {\expandafter\dochinesenumber\number#1\relax\empty}
+
+\def\dochinesenumber#1#2\relax#3%
+  {\ifnum#1#2<10 % 1-10
+     \chinesedigit{#1}#3%
+   \else\ifnum#1#2<20 % 11-99
+     \chinesedigit{10}#3%
+     \dodochinesenumberA#2\relax#3%
+   \else
+     \dodochinesenumber#1#2\relax#3%
+   \fi\fi}
+
+\def\dodochinesenumber#1#2\relax#3%
+  {\ifnum#1=0
+     \chinesedigit{0}#3%
+     \dododochinesenumber0#2\relax#3%
+   \else\ifnum#1#2<10 % 1-10
+     \chinesedigit{#1#2}#3%
+     \dodochinesenumberA#2\relax#3%
+   \else\ifnum#1#2<100 % 11-99
+     \dodochinesenumber#1\relax#3%
+     \chinesedigit{10}#3%
+     \dodochinesenumberA#2\relax#3%
+   \else\ifnum#1#2<1000 % 100-999
+     \dodochinesenumber#1\relax#3%
+     \chinesedigit{100}#3%
+     \dodochinesenumberA#2\relax#3%
+   \else\ifnum#1#2<10000 % 1000-9999
+     \dodochinesenumber#1\relax#3%
+     \chinesedigit{1000}#3%
+     \dodochinesenumberA#2\relax#3%
+   \else\ifnum#1#2<100000 % 10000-99999
+     \dodochinesenumber#1\relax#3%
+     \chinesedigit{10000}#3%
+     \dodochinesenumberA#2\relax#3%
+   \else\ifnum#1#2<1000000 % 100000-999999
+     \dodochinesenumberB#1#2\relax#3%
+   \else\ifnum#1#2<10000000 % 1000000-9999999
+     \dodochinesenumberC#1#2\relax#3%
+   \else\ifnum#1#2<100000000 % 10000000-99999999
+     \dodochinesenumberD#1#2\relax#3%
+   \else\ifnum#1#2<1000000000 % 10000000-99999999
+     \dochinesenumber#1\relax#3%
+     \chinesedigit{100000000}#3%
+     \dododochinesenumber#2\relax#3%
+   \else
+     \dodochinesenumberE#1#2\relax#3%
+   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+\def\dododochinesenumber#1#2\relax#3%
+  {\ifnum#1=0
+     \ifnum0#2>0 \dododochinesenumber#2\relax#3\fi
+   \else
+     \dodochinesenumber#1#2\relax#3%
+   \fi}
+
+\def\dodochinesenumberA#1\relax#2%
+  {\ifcase0#1 \else\dodochinesenumber#1\relax#2\fi}
+
+\def\dodochinesenumberB#1#2#3\relax#4%
+  {\dochinesenumber#1#2\relax#4%
+   \chinesedigit{10000}#4%
+   \dododochinesenumber#3\relax#4}
+
+\def\dodochinesenumberC#1#2#3#4\relax#5%
+  {\dochinesenumber#1#2#3\relax#5%
+   \chinesedigit{10000}#5%
+   \dododochinesenumber#4\relax#5}
+
+\def\dodochinesenumberD#1#2#3#4#5\relax#6%
+  {\dochinesenumber#1#2#3#4\relax#6%
+   \chinesedigit{10000}#6%
+   \dododochinesenumber#5\relax#6}
+
+\def\dodochinesenumberE#1#2#3\relax#4%
+  {\dochinesenumber#1#2\relax#4%
+   \chinesedigit{100000000}#4%
+   \dododochinesenumber#3\relax#4}
+
+% Capitalized Chinese Number
+
+\def\capitalizedchinesenumber#1%
+  {\expandafter\dochinesenumber\number#1\relax*}
+
+% Extended Chinese Number
+
+\def\extendedchinesenumber#1%
+  {\expandafter\doextendedchinesenumber\number#1\relax}
+
+\def\doextendedchinesenumber#1#2\relax%
+  {\ifnum     #1#2<20 %  0-19
+     \dochinesenumber#1#2\relax\empty
+   \else\ifnum#1#2<30 % 20-29
+     \chinesedigit{20}\empty
+     \ifcase#2\else\chinesedigit{2#2}\fi
+   \else\ifnum#1#2<40 % 30-39
+     \chinesedigit{30}\empty
+     \ifcase#2\else\chinesedigit{3#2}\fi
+   \else
+     \dochinesenumber#1#2\relax\empty
+   \fi\fi\fi}
+
+% Arabic Chinese Number
+
+\def\arabicchinesenumber#1%
+  {\expandafter\doarabicchinesenumber\number#1@\relax}
+
+\def\doarabicchinesenumber#1#2\relax
+  {\if#1@\else
+     \chinesedigit{#1}\empty
+     \doarabicchinesenumber#2\relax
+   \fi}
+
+% The short call:
+
+\def\chinesenumber{\normalchinesenumber}
+
+% \dorecurse{40}
+%   {\hbox
+%      {\processingverbatimtrue
+%       \hbox to 1cm{\hss\recurselevel}\quad
+%       \hbox to 3cm{\hss\strut\normalchinesenumber     {\recurselevel}}\quad
+%       \hbox to 3cm{\hss\strut\capitalizedchinesenumber{\recurselevel}}\quad
+%       \hbox to 3cm{\hss\strut\arabicchinesenumber     {\recurselevel}}\quad
+%       \hbox to 3cm{\hss\strut\extendedchinesenumber   {\recurselevel}}\crlf}}
+
+%D The next table demonstates the correctness of the
+%D conversion macro.
+%D
+%D \startbuffer
+%D \starttable[|l|l|l|l|l|l|]
+%D \HL
+%D \NC number     \NC converter                  \NC hard coded \NC
+%D     number     \NC converter                  \NC hard coded\NC \SR
+%D \HL
+%D \NC 1          \NC \chinesenumber{1}          \NC һ \NC
+%D     0          \NC \chinesenumber{0}          \NC  \NC\FR
+%D \NC 11         \NC \chinesenumber{11}         \NC ʮһ \NC
+%D     10         \NC \chinesenumber{10}         \NC ʮ  \NC\MR
+%D \NC 111        \NC \chinesenumber{111}        \NC һһʮһ \NC
+%D     100        \NC \chinesenumber{100}        \NC һ \NC\MR
+%D \NC 101        \NC \chinesenumber{101}        \NC һһ \NC
+%D     120        \NC \chinesenumber{120}        \NC һٶʮ \NC\MR
+%D \NC 1111       \NC \chinesenumber{1111}       \NC һǧһһʮһ \NC
+%D     1000       \NC \chinesenumber{1000}       \NC һǧ \NC\MR
+%D \NC 1001       \NC \chinesenumber{1001}       \NC һǧһ \NC
+%D     1020       \NC \chinesenumber{1020}       \NC һǧʮ \NC\MR
+%D \NC 11111      \NC \chinesenumber{11111}      \NC һһǧһһʮһ \NC
+%D     10000      \NC \chinesenumber{10000}      \NC һ \NC\MR
+%D \NC 10001      \NC \chinesenumber{10001}      \NC һһ \NC
+%D     10200      \NC \chinesenumber{10200}      \NC һ \NC\LR
+%D \HL
+%D \NC 111111     \NC \chinesenumber{111111}     \NC ʮһһǧһһʮһ \NC
+%D     100000     \NC \chinesenumber{100000}     \NC ʮ \NC\FR
+%D \NC 1111111    \NC \chinesenumber{1111111}    \NC һһʮһһǧһһʮһ \NC
+%D     1000000    \NC \chinesenumber{1000000}    \NC һ \NC\MR
+%D \NC 11111111   \NC \chinesenumber{11111111}   \NC һǧһһʮһһǧһһʮһ \NC
+%D     10000000   \NC \chinesenumber{10000000}   \NC һǧ \NC\MR
+%D \NC 111111111  \NC \chinesenumber{111111111}  \NC һһǧһһʮһһǧһһʮһ \NC
+%D     100000000  \NC \chinesenumber{100000000}  \NC һ \NC\MR
+%D \NC 1111111111 \NC \chinesenumber{1111111111} \NC ʮһһǧһһʮһһǧһһʮһ \NC
+%D     1000000000 \NC \chinesenumber{1000000000} \NC ʮ \NC\LR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \placetable{Some Chinese number examples.}{\getbuffer}
+
+%D Although the conversion can be hooked into most commands
+%D that deal with numbers |<|those familiar with \TEX\ macro
+%D programming will notice that the macro if fully
+%D expandable|>| in many cases Chinese documents use western
+%D digits. So, in practice, the change that the next example
+%D shows up, is minimal.
+%D
+%D \starttabulate[|r|r|c|]
+%D \NC  2546 \NC \chinesenumber  {2546} \NC     \NC\NR
+%D \NC  9258 \NC \chinesenumber  {9258} \NC $+$ \NC\NR
+%D \HL
+%D \NC 11804 \NC \chinesenumber {11804} \NC     \NC\NR
+%D \stoptabulate
+%D
+%D While in arabic arithmics addition leads to more digits, in
+%D Chinese the number of glyphs can (temporary) decrease.
+%D Given that the number of people dealing with Chinese is
+%D considerably larger than the number of latin speaking
+%D people, a successor of \TEX\ definitely must provide a
+%D \type {\chinesenumeral} primitive.
+
+\defineconversion [c]                  [\normalchinesenumber]
+\defineconversion [chinese]            [\normalchinesenumber]
+\defineconversion [nc]                 [\normalchinesenumber]
+\defineconversion [normalchinese]      [\normalchinesenumber]
+\defineconversion [cc]                 [\capitalizedchinesenumber]
+\defineconversion [capitalizedchinese] [\capitalizedchinesenumber]
+\defineconversion [ec]                 [\extendedchinesenumber]
+\defineconversion [extendedchinese]    [\extendedchinesenumber]
+\defineconversion [ac]                 [\arabicchinesenumber]
+\defineconversion [arabicchinese]      [\arabicchinesenumber]
+
+%D Date conversion:
+
+\defineconversion [cn] [\v!day]   [\chinesenumber]
+\defineconversion [cn] [\v!month] [\chinesenumber]
+\defineconversion [cn] [\v!year]  [\chinesenumber]
+
+%D \macros
+%D   {SimChi, TraChi}
+%D
+%D These components enable us to construct dedicated Chinese
+%D font switches, like:
+
+\setupunicodefont
+  [chinese]
+  [       \c!scale=\chineseunicodescale,
+         \c!height=\chineseunicodeheight,
+          \c!depth=\chineseunicodedepth,
+          \c!strut=\v!yes,
+ \c!interlinespace=\v!yes,
+     \c!conversion=\chinesenumber,
+       \c!commands=\setchineseencoding, % needed for digits
+        \c!command=\handlechineseunicodeglyph]
+
+%D For the moment, this encoding is implemented rather ugly. The
+%D trick is to move the encoding value from the current font
+%D definition to the \type {\chineseencoding} macro.
+
+\let\chineseencoding\empty
+
+\def\setchineseencoding % normally SomeChineseRegular
+  {\getfontfileparameters\unicodestyle
+   \ifx\currentfontfileencoding\undefined \else
+     \let\chineseencoding\currentfontfileencoding
+   \fi}
+
+%D We could have said:
+%D
+%D \starttyping
+%D \defineunicodefont
+%D   [SimChi]
+%D   [SimplifiedChinese]
+%D   [\c!scale=\chineseunicodescale,
+%D    \c!height=\chineseunicodeheight,
+%D    \c!depth=\chineseunicodedepth,
+%D    \c!conversion=\chinesenumber,
+%D    \c!commands=\setchineseencoding, % needed for digits
+%D    \c!command=\handlechineseunicodeglyph]
+%D \stoptyping
+%D
+%D However, the former definitions is more general. Next we
+%D map a few fonts:
+
+\definefontsynonym [SimplifiedChineseRegular]      [gbsong]   [encoding=gbk]
+\definefontsynonym [SimplifiedChineseSlanted]      [gbsongsl] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseItalic]       [gbsongsl] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseBold]         [gbhei]    [encoding=gbk]
+\definefontsynonym [SimplifiedChineseBoldSlanted]  [gbheisl]  [encoding=gbk]
+\definefontsynonym [SimplifiedChineseBoldItalic]   [gbheisl]  [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseRegular]     [b5song]   [encoding=big5]
+\definefontsynonym [TraditionalChineseSlanted]     [b5songsl] [encoding=big5]
+\definefontsynonym [TraditionalChineseItalic]      [b5songsl] [encoding=big5]
+\definefontsynonym [TraditionalChineseBold]        [b5hei]    [encoding=big5]
+\definefontsynonym [TraditionalChineseBoldSlanted] [b5heisl]  [encoding=big5]
+\definefontsynonym [TraditionalChineseBoldItalic]  [b5heisl]  [encoding=big5]
+
+% we need to move this to typescripts
+
+\doifelse \currentregime {utf} {
+
+    \definefontsynonym [SimplifiedChineseRegular]     [ChineseRegular]
+    \definefontsynonym [SimplifiedChineseSlanted]     [ChineseSlanted]
+    \definefontsynonym [SimplifiedChineseItalic]      [ChineseItalic]
+    \definefontsynonym [SimplifiedChineseBold]        [ChineseBold]
+    \definefontsynonym [SimplifiedChineseBoldSlanted] [ChineseBoldSlanted]
+    \definefontsynonym [SimplifiedChineseBoldItalic]  [ChineseBoldItalic]
+
+    \definefontsynonym [TraditionalChineseRegular]    [ChineseRegular]
+    \definefontsynonym [TraditionalChineseSlanted]    [ChineseSlanted]
+    \definefontsynonym [TraditionalChineseItalic]     [ChineseItalic]
+    \definefontsynonym [TraditionalChineseBold]       [ChineseBold]
+    \definefontsynonym [TraditionalChineseBoldSlanted][ChineseBoldSlanted]
+    \definefontsynonym [TraditionalChineseBoldItalic] [ChineseBoldItalic]
+
+    \definefontsynonym [ChineseRegular]    [uni-htsong-][encoding=cjk-uni]
+    \definefontsynonym [ChineseSlanted]    [uni-htsong-][encoding=cjk-uni]
+    \definefontsynonym [ChineseItalic]     [uni-htsong-][encoding=cjk-uni]
+    \definefontsynonym [ChineseBold]       [uni-hthei-] [encoding=cjk-uni]
+    \definefontsynonym [ChineseBoldSlanted][uni-hthei-] [encoding=cjk-uni]
+    \definefontsynonym [ChineseBoldItalic] [uni-hthei-] [encoding=cjk-uni]
+
+    \loadmapfile[uni-htsong.map]
+    \loadmapfile[uni-htfs.map]
+    \loadmapfile[uni-hthei.map]
+    \loadmapfile[uni-htkai.map]
+
+} {
+
+    \loadmapfile[gbk]
+
+}
+
+\defineunicodefont [SimChi] [SimplifiedChinese]  [chinese]
+\defineunicodefont [TraChi] [TraditionalChinese] [chinese]
+
+%D We default to these so called Simplified Chinese fonts.
+
+\SimChi
+
+%D In addition to these fonts, we (pre|)|define some commonly
+%D used fonts:
+
+\definefontsynonym [SimplifiedChineseSongTiRegular]        [gbsong]   [encoding=gbk]
+\definefontsynonym [SimplifiedChineseSongTiSlanted]        [gbsongsl] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseSongTiBold]           [gbsong]   [encoding=gbk]
+\definefontsynonym [SimplifiedChineseSongTiBoldSlanted]    [gbsongsl] [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseSongTiRegular]       [b5song]   [encoding=big5]
+\definefontsynonym [TraditionalChineseSongTiSlanted]       [b5songsl] [encoding=big5]
+\definefontsynonym [TraditionalChineseSongTiBold]          [b5song]   [encoding=big5]
+\definefontsynonym [TraditionalChineseSongTiBoldSlanted]   [b5songsl] [encoding=big5]
+
+\definefontsynonym [SimplifiedChineseHeiTiRegular]         [gbhei]    [encoding=gbk]
+\definefontsynonym [SimplifiedChineseHeiTiSlanted]         [gbheisl]  [encoding=gbk]
+\definefontsynonym [SimplifiedChineseHeiTiBold]            [gbhei]    [encoding=gbk]
+\definefontsynonym [SimplifiedChineseHeiTiBoldSlanted]     [gbheisl]  [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseHeiTiRegular]        [b5hei]    [encoding=big5]
+\definefontsynonym [TraditionalChineseHeiTiSlanted]        [b5heisl]  [encoding=big5]
+\definefontsynonym [TraditionalChineseHeiTiBold]           [b5hei]    [encoding=big5]
+\definefontsynonym [TraditionalChineseHeiTiBoldSlanted]    [b5heisl]  [encoding=big5]
+
+\definefontsynonym [SimplifiedChineseKaiTiRegular]         [gbkai]    [encoding=gbk]
+\definefontsynonym [SimplifiedChineseKaiTiSlanted]         [gbkaisl]  [encoding=gbk]
+\definefontsynonym [SimplifiedChineseKaiTiBold]            [gbkai]    [encoding=gbk]
+\definefontsynonym [SimplifiedChineseKaiTiBoldSlanted]     [gbkaisl]  [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseKaiTiRegular]        [b5kai]    [encoding=big5]
+\definefontsynonym [TraditionalChineseKaiTiSlanted]        [b5kaisl]  [encoding=big5]
+\definefontsynonym [TraditionalChineseKaiTiBold]           [b5kai]    [encoding=big5]
+\definefontsynonym [TraditionalChineseKaiTiBoldSlanted]    [b5kaisl]  [encoding=big5]
+
+\definefontsynonym [SimplifiedChineseFangSongRegular]      [gbfs]     [encoding=gbk]
+\definefontsynonym [SimplifiedChineseFangSongSlanted]      [gbfssl]   [encoding=gbk]
+\definefontsynonym [SimplifiedChineseFangSongBold]         [gbfs]     [encoding=gbk]
+\definefontsynonym [SimplifiedChineseFangSongBoldSlanted]  [gbfssl]   [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseFangSongRegular]     [b5fs]     [encoding=big5]
+\definefontsynonym [TraditionalChineseFangSongSlanted]     [b5fssl]   [encoding=big5]
+\definefontsynonym [TraditionalChineseFangSongBold]        [b5fs]     [encoding=big5]
+\definefontsynonym [TraditionalChineseFangSongBoldSlanted] [b5fssl]   [encoding=big5]
+
+\definefontsynonym [SimplifiedChineseLiShuRegular]         [gbli]     [encoding=gbk]
+\definefontsynonym [SimplifiedChineseLiShuSlanted]         [gblisl]   [encoding=gbk]
+\definefontsynonym [SimplifiedChineseLiShuBold]            [gbli]     [encoding=gbk]
+\definefontsynonym [SimplifiedChineseLiShuBoldSlanted]     [gblisl]   [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseLiShuRegular]        [b5li]     [encoding=big5]
+\definefontsynonym [TraditionalChineseLiShuSlanted]        [b5lisl]   [encoding=big5]
+\definefontsynonym [TraditionalChineseLiShuBold]           [b5li]     [encoding=big5]
+\definefontsynonym [TraditionalChineseLiShuBoldSlanted]    [b5lisl]   [encoding=big5]
+
+%D The following definitions provide us the commands to switch
+%D to these fonts.
+
+\defineunicodefont [SimSongTi]   [SimplifiedChineseSongTi]    [chinese]
+\defineunicodefont [TraSongTi]   [TraditionalChineseSongTi]   [chinese]
+
+\defineunicodefont [SimHeiTi]    [SimplifiedChineseHeiTi]     [chinese]
+\defineunicodefont [TraHeiTi]    [TraditionalChineseHeiTi]    [chinese]
+
+\defineunicodefont [SimKaiTi]    [SimplifiedChineseKaiTi]     [chinese]
+\defineunicodefont [TraKaiTi]    [TraditionalChineseKaiTi]    [chinese]
+
+\defineunicodefont [SimFangSong] [SimplifiedChineseFangSong]  [chinese]
+\defineunicodefont [TraFangSong] [TraditionalChineseFangSong] [chinese]
+
+\defineunicodefont [SimLiShu]    [SimplifiedChineseLiShu]     [chinese]
+\defineunicodefont [TraLiShu]    [TraditionalChineseLiShu]    [chinese]
+
+% \definealternativestyle [ChineseTitleFont] [\bfd\SimKaiTi] []
+
+%D \macros
+%D   {purechinese}
+%D
+%D Use this macro to suppress spacing around Chinese text.
+
+\def\purechinese#1% evt geen rek
+  {\hskip\chineseSsignal\relax
+   #1\unskip\unskip\unskip
+   \hskip\chineseSsignal\relax}
+
+%D \macros
+%D   {stillchinese}
+%D
+%D Use the next macro when you want the next item to be put
+%D tight to the previous chinese character.
+
+\def\stillchinese
+  {\hskip\chineseSsignal\relax}
+
+%D \macros
+%D   {nochinese}
+%D
+%D When we want to be sure of non||Chinese inline text,
+%D we can package the for instance english text in \type
+%D {\nochinese}.
+
+\def\nochinese#1%
+  {\unskip\unskip\unskip
+   \hskip\chinesesurroundskip
+   \hskip\chineseinterglyphskip\relax
+   #1%
+   \hskip\chineseinterglyphskip\relax
+   \hskip\chinesesurroundskip
+   \ignorespaces}
+
+%D \macros
+%D   {chisize}
+%D
+%D Chinese font sizes are specified in a different way,
+%D using positive and negative numbers:
+
+\def\chisize#1%
+  {\ifnum#11<0 % a trick to catch -0
+     \ifcase#1\space36\or24\or18\or15\or12\or9\or\else6.5\fi
+   \else
+     \ifcase#1\space42\or26\or22\or16\or14\or10.5\or7.5\or5.5\else5\fi
+   \fi pt}
+
+%D So:
+%D
+%D \startbuffer
+%D [\chisize{-1}] [\chisize{7}] [\chisize{+4}]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives:
+%D
+%D \getbuffer
+%D
+%D The full range of sizes is:
+%D
+%D \starttabulate[|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|]
+%D \NC          8 \NC         7 \NC         -6 \NC         6 \NC
+%D             -5 \NC         5 \NC         -4 \NC         4 \NC
+%D             -3 \NC         3 \NC         -2 \NC         2 \NC
+%D             -1 \NC         1 \NC         -0 \NC         0 \NC\NR
+%D \NC\chisize {8}\NC\chisize{7}\NC\chisize{-6}\NC\chisize{6}\NC
+%D    \chisize{-5}\NC\chisize{5}\NC\chisize{-4}\NC\chisize{4}\NC
+%D    \chisize{-3}\NC\chisize{3}\NC\chisize{-2}\NC\chisize{2}\NC
+%D    \chisize{-1}\NC\chisize{1}\NC\chisize{-0}\NC\chisize{0}\NC\NR
+%D \stoptabulate
+
+%D Now it's time for some real Chinese. This example
+%D also shows that font switching is supported.
+%D
+%D \startnarrower
+%D \midaligned{\tfd ˮͷ}
+%D \blank
+%D \midaligned{\tfb ﵩƪ滳ɡ}
+%D \blank
+%D \midaligned{\tfb }
+%D \blank
+%D ¼ʱУѾ졣֪ϹڣϦǺꣿ˷ȥ
+%D ֿ¥ߴʤŪӰ˼䣿
+%D \blank
+%D תͻߡӦкޣƫʱԲбϣ
+%D Բȱ¹ȫԸ˳ãǧﹲ濾ꡣ
+%D \stopnarrower
+%D
+%D The english translation is:
+%D
+%D \startnarrower
+%D \midaligned{\tfd Tune: Prelude to the Melody of Water}
+%D \blank
+%D \midaligned{\tfb On the night of the Mid||Autumn Festival of
+%D 1076, I drank happily till dawn and wrote this in my cups
+%D while thinking of Zi||you.}
+%D \blank
+%D \midaligned{\tfb Su Shi}
+%D \blank
+%D How long will the bright moon appear? Wine||cup in hand, I
+%D ask the sky. I do not know waht time of year it would be
+%D tonight in the palace on high. Riding the wind, there I
+%D would fly, yet I fear the crystal palace would be far too
+%D high and cold for me. I rise and dance, with my shadow I
+%D play. On high as on earth, would it be as gay?
+%D \blank
+%D The moon goes round the mansion red though gauze||draped
+%D windows soft to shed her light upon the sleepless bed.
+%D Against man she should have no spite. Why then when people
+%D part is she oft full and bright? Men have sorrow and joy,
+%D they part or meet again; The moon may be bright or dim, she
+%D may wax or wane. There has been nothing perfect since the
+%D olden days. So let us wish that man will live long as he
+%D can! Though miles apart, we'll share the beauty she
+%D displays.
+%D \stopnarrower
+
+%D This package is written in the city of Hasselt, a pretty
+%D small town in the |<|compared to China real small|>|
+%D Netherlands. Like most dutch cities, even this small one
+%D has a chinese restaurant, run by chinese, speaking chinese,
+%D and |<|indeed|>| writing chinese. Eating there will never
+%D be the same, since now I can at least pretend to know the
+%D glyphs all around the place. The numbers should pose me no
+%D problems, but I fear I will never manage to recognize those
+%D scribles they draw on their pads when thay take your order.
+
+%D To make our lives more easy, we put it here (too):
+
+\setuptyping[\c!tab=\v!no]
+
+\protect \endinput
diff --git a/tex/context/base/font-chi.tex b/tex/context/base/font-chi.tex
deleted file mode 100644
index 0acf710d5..000000000
--- a/tex/context/base/font-chi.tex
+++ /dev/null
@@ -1,1156 +0,0 @@
-%D \module
-%D   [       file=font-chi,
-%D        version=1999.10.10,
-%D          title=\CONTEXT\ Font Macros,
-%D       subtitle=Chinese,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D    suggestions=Wang Lei,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\ifx\handlechineseunicodeglyph\undefined \else \endinput \fi
-
-% NOT YET ADAPTED TO THE NEW FONT MACROS
-
-%D The first implementation (most of which is here) is based on
-%D the specific font layout. This is because not all glyphs are
-%D available in uniciode, which means that we cannot use
-%D unicode codepoints (yet); if it were possible we could use
-%D just one table per input encoding.
-
-\writestatus{loading}{ConTeXt Font Macros / Chinese}
-
-% much will to typo-chi.tex
-
-%D Still to be implemented:
-%D
-%D \startitemize
-%D \item columns left right touch
-%D \item distance = (hsize-n*bodyfontsize)/(n-1)
-%D \item char grids
-%D \item char tables
-%D \item all kind of rotated combinations
-%D \item hanging puctuation
-%D \item a few more encodings
-%D \item rotation list
-%D \stopitemize
-
-%M \setupbodyfont[chi]
-%M
-%M \def\WangLei{\purechinese{\uchar{205}{245}\uchar{192}{218}}}
-
-\useencoding[chi]
-
-%D When \WangLei\ sent me a mail asking if \CONTEXT\ was able
-%D to support Chinese, I wasn't sure if the answer could be
-%D yes. I knew that those languages, rich of glyphs, were
-%D typeset by \TEX, so in principle it should be possible. I
-%D asked or some more input and was told that there were
-%D \LATEX\ styles regarding those languages. When I unzipped
-%D the accompanying files, it became clear that I had to
-%D implement support for Chinese from scratch. There was a
-%D multitude of font, with rather unfamiliar encodings, a
-%D large collection of files with |<|at least for me|>|
-%D unknown purposes, and worse, the documentation was mainly
-%D in Chinese.
-%D
-%D So, \WangLei\ and I started exchanging some emails and it
-%D soon became clear that supporting Chinese was not that
-%D complicated at all. It mostly came to dealing with handling
-%D \UNICODE\ fonts. It also became clear that everything
-%D Chinese took place in the upper region of the eight bit
-%D character set. I wrote some macros that could process the
-%D small \type {Hello World} file \WangLei\ had send me, and
-%D after some bug fixes real Chinese came out. I started to
-%D like the look and fel of Chinese glyphs, so on we went.
-%D
-%D The first comments concerned spacing. The mix of English
-%D and Chinese demands some rather deliberate handling of
-%D spacing. Breaking lines was not so much a problem, and
-%D could be solved by adding some glue between Chinese glyphs.
-%D
-%D In the meantime had asked \WangLei\ for some language bound
-%D labels and texts, and implementing these was rather
-%D straightforward. But, there were still some issues to deal
-%D with: conversion of numbers, date handling and index
-%D sorting.
-%D
-%D I consider(ed) writing Chinese support to be a nice puzzle,
-%D since I have to act on chinese \CONTEXT\ code, where I only
-%D understand the \CONTEXT\ part. The drawings \WangLei\ made
-%D me (in drawing packages) were of great help. Since I write
-%D these modules from scratch, although I fall back on some
-%D basic encoding and font modules, I consider them to be
-%D rather clean. This cannot be said of all \CONTEXT\ font
-%D modules \type {-)}.
-
-\unprotect
-
-%D Because Chinese glyphs have more height than the average
-%D Latin glyph, and at the same time don't have much depth,
-%D we adapt the scale.
-%D
-%D Before and after the glyph we have to deal with Chinese
-%D spacing. Special attention is given to punctuation.
-%D
-%D \starttyping
-%D [some short nice chinese text with () and english]
-%D \stoptyping
-%D
-%D We insert a bit of stretch and introduce a signal to
-%D keep track of previous characters. We use a similar
-%D method in the units module, which may be a nice
-%D introduction to using signals.
-
-%D \macros
-%D   {chineseunicodescale, chineseinterglyphskip,
-%D    chineseunicodeheight, chineseunicodedepth, chinesespace}
-%D
-%D There are a few variables, that can be (re|)|set
-%D depending on the current font. They default to:
-
-% hm, why don't we use the normal unicodestrut mechanism?
-
-\def\chineseunicodescale  {1.00} % not smaller than .85
-\def\chineseunicodeheight {1.00}
-\def\chineseunicodedepth  {1.00}
-\def\chineseinterglyphskip{0pt   \!!plus .05em \!!minus .01em}
-\def\chinesesurroundskip  {.25em \!!plus .15em \!!minus .05em}
-
-%D We define a few signals. As said, another example of
-%D using signals can be found in the module \type {m-units}.
-
-\newsignal\chineseLsignal % left boundary character
-\newsignal\chineseRsignal % right boundary character
-\newsignal\chineseSsignal % any other character (symbol)
-
-\chardef\chineseBstatus=0 % 0=unknown 1=left 2=right 3=chinese 4=nospace
-\chardef\chineseAstatus=0 % 0=unknown 1=left 2=right 3=space
-\chardef\chineseSstatus=0 % 0=unknown 1=left 2=right
-
-\sfcode`(=2000  % a temporary hack
-
-\def\chinesenobreak
- {\relax
-  \iftracechinese
-    \nobreak
-    \kern-.5pt\color[red]{\vrule\!!width1pt}\kern-.5pt
-    \nobreak
-  \else
-    \nobreak
-  \fi}
-
-\newif\ifcorrectchineseboundarychars
-
-\def\chineseunskip
-  {\unskip\unskip\unskip\unskip}
-
-\def\insertchineseglyph
-  {\iftracechinese\tracedchineseglyph\else\insertunicodeglyph\fi}
-
-\newif\ifverticalchinese
-
-\def\handlechineseunicodeglyph
-  {\ifinpagebody
-     \horizontalchineseunicodeglyph
-   \else\ifverticalchinese
-     \verticalchineseunicodeglyph
-   \else
-     \horizontalchineseunicodeglyph
-   \fi\fi}
-
-% chinese classes: left=1|right=2|center=3
-
-\chardef\plusfour=4
-
-\def\analyzechineseunicodeglyph % beware, no zerocount !
-  {\chardef\chineseSstatus0\getvalue{uc\number\unicodeposition}\relax}
-
-\def\analyzechineseunicodeenviroment
-  {% left
-   \ifx (\nextutoken              \chardef\chineseAstatus\plusone   \else
-   \ifx [\nextutoken              \chardef\chineseAstatus\plusone   \else
-   % right
-   \ifx ,\nextutoken              \chardef\chineseAstatus\plustwo   \else
-   \ifx .\nextutoken              \chardef\chineseAstatus\plustwo   \else
-   \ifx ?\nextutoken              \chardef\chineseAstatus\plustwo   \else
-   \ifx ;\nextutoken              \chardef\chineseAstatus\plustwo   \else
-   \ifx :\nextutoken              \chardef\chineseAstatus\plustwo   \else
-   \ifx !\nextutoken              \chardef\chineseAstatus\plustwo   \else
-   \ifx )\nextutoken              \chardef\chineseAstatus\plustwo   \else
-   \ifx ]\nextutoken              \chardef\chineseAstatus\plustwo   \else
-   % space
-   \ifx\nextutoken\blankspace     \chardef\chineseAstatus\plusthree \else
-   \ifx\nextutoken\space          \chardef\chineseAstatus\plusthree \else
-                                  \chardef\chineseAstatus\zerocount
-   % unknown
-   \fi\fi\fi\fi\fi \fi\fi\fi\fi\fi \fi\fi
-   % maybe save the last skip?
-   \chardef\chineseBstatus\ifdim\lastskip=\zeropoint\plusfour\else\zerocount\fi
-   \ifdim\lastskip=\chineseLsignal \chardef\chineseBstatus\plusone   \else
-   \ifdim\lastskip=\chineseRsignal \chardef\chineseBstatus\plustwo   \else
-   \ifdim\lastskip=\chineseSsignal \chardef\chineseBstatus\plusthree \else
-     \scratchskip=\lastskip \unskip
-     \ifdim\lastskip=\chineseLsignal \chardef\chineseBstatus\plusone   \else
-     \ifdim\lastskip=\chineseRsignal \chardef\chineseBstatus\plustwo   \else
-     \ifdim\lastskip=\chineseSsignal \chardef\chineseBstatus\plusthree \else
-       \space\scratchskip=\lastskip \unskip
-       \setbox\scratchbox=\hbox\bgroup
-         (\space
-         \ifdim\lastskip=\scratchskip
-           \egroup \chardef\chineseBstatus\plusone
-         \else
-           \egroup
-           \ifdim\scratchskip=\zeropoint \chardef\chineseBstatus\plusfour \fi
-         \fi
-     \fi\fi\fi
-   \fi\fi\fi}
-
-\def\horizontalchineseunicodeglyph
-  {\relax
-   \ifhmode\else\dontleavehmode\fi % added
-   \setunicodescale\chineseunicodescale % redundant
-   \setunicodestrut\chineseunicodeheight\chineseunicodedepth % redundant
-   \ifprocessingverbatim
-     \iftracechinese
-       \ruledhbox{\insertunicodeglyph}%
-     \else
-       \insertunicodeglyph
-     \fi
-   \else\ifx\nextutoken\relax
-       \insertunicodeglyph
-   \else
-     \analyzechineseunicodeglyph
-     \analyzechineseunicodeenviroment
-     \ifcase\chineseSstatus\relax
-       \ifcase\chineseBstatus\relax
-         \chineseunskip
-         \hskip\chinesesurroundskip      % unknown
-       \or
-         \chineseunskip
-         \chinesenobreak                 % left
-       \or
-         \ifcorrectchineseboundarychars\else\chineseunskip\fi
-         \hskip\chineseinterglyphskip    % right
-       \or
-         \chineseunskip
-         \hskip\chineseinterglyphskip    % chinese
-       \or
-                                         % whatever
-       \fi
-       \insertchineseglyph
-       \ifcase\chineseAstatus\relax
-         \hskip\chineseinterglyphskip    % unknown
-         \hskip\chinesesurroundskip
-         \ifcase\chineseSstatus
-           \hskip\chineseSsignal
-         \or
-           \hskip\chineseLsignal
-         \else
-           \hskip\chineseRsignal
-         \fi
-       \or
-         \hskip\chineseinterglyphskip    % left
-         \chinesenobreak
-         \hskip\chineseLsignal
-       \or
-         \chinesenobreak                 % right
-         \hskip\chineseinterglyphskip
-         \chinesenobreak
-         \hskip\chineseRsignal
-       \or
-         \hskip\chineseinterglyphskip    % space
-         \hskip\chinesesurroundskip
-         \hskip\chineseSsignal
-       \fi
-     \or % left
-       \ifcorrectchineseboundarychars
-         \let\unicodecharcommand\chineseleftcharcommand
-       \fi
-       \chineseunskip
-       \insertchineseglyph
-       \chinesenobreak
-       \hskip\chineseLsignal
-     \or % right
-       \ifcorrectchineseboundarychars
-         \let\unicodecharcommand\chineserightcharcommand
-       \fi
-       \chineseunskip
-       \chinesenobreak
-       \insertchineseglyph
-       \hskip\chineseRsignal
-     \else % center
-       \chineseunskip
-       \chinesenobreak
-       \insertchineseglyph
-       \hskip\chineseinterglyphskip
-       \hskip\chineseRsignal
-     \fi\fi
-     \aftergroup\ignorespaces            % watch this
-   \fi}
-
-\def\verticalchineseunicodeglyph
-  {\relax
-   \ifprocessingverbatim % to do
-     \horizontalchineseunicodeglyph
-   \else
-     \setunicodescale\chineseunicodescale % redundant
-     \setunicodestrut\chineseunicodeheight\chineseunicodedepth % redundant
-     \ifx\nextutoken\relax
-       \insertchineseglyph
-       \ifvmode % catches \hbox{...}, actually \hbox should be \vbox -)
-         \nointerlineskip
-       \fi
-       \allowbreak
-     \else
-       \analyzechineseunicodeglyph
-       \setbox\scratchbox\hbox to \hsize
-         {\hss
-          \ifcase\chineseSstatus\relax
-            \insertchineseglyph
-          \else % left / right
-            \setbox\scratchbox\hbox{\insertchineseglyph}%
-            \rotate[\c!rotation=270]{\box\scratchbox}%
-          \fi
-          \hss}%
-       \ht\scratchbox\unicodeheight\strutht
-       \dp\scratchbox\unicodedepth \strutdp
-       \ifvmode % catches \hbox{...}, actually \hbox should be \vbox -)
-         \nointerlineskip
-       \fi
-       \ifcase\prevchineseSstatus\relax
-         \ifnum\chineseSstatus=\plustwo \par\nobreak\else\allowbreak\fi
-       \or % left
-         \par\nobreak
-       \or % right
-         \ifnum\chineseSstatus=\plustwo \par\nobreak\else\allowbreak\fi
-       \fi
-       \global\chardef\prevchineseSstatus\chineseSstatus % pagebody ...
-       \box\scratchbox\par
-     \fi
-     \aftergroup\ignorespaces                           % watch this
-   \fi}
-
-%D \macros
-%D   {setupchinese,startvertical,nochinese}
-%D
-%D The previous macros implement horizontal as well as
-%D vertical typesetting. Vertical typesetting is implemented
-%D on top of the multi||column routines.
-
-\def\setupchinese
-  {\dodoubleargument\getparameters[\??vt]}
-
-\def\startvertical
-  {\dosingleempty\dostartvertical}
-
-\def\dostartvertical[#1]%
-  {\bgroup
-   \def\maxnofcolumns{25}%
-   \verticalchinesetrue
-   \global\chardef\prevchineseSstatus\zerocount
-   \let\nochinese\nochineseinvertical
-   \doif\@@vtn\v!fit
-     {\dimen0=\textwidth    \advance\dimen0 \@@vtdistance
-      \dimen2=\bodyfontsize \advance\dimen2 \@@vtdistance
-      \divide\dimen0 \number\dimen2
-      \edef\@@vtn{\number\dimen0}}%
-   \startcolumns
-     [\c!direction=\@@vtdirection,
-      \c!balance=\@@vtbalance,
-      \c!distance=\@@vtdistance,
-      \c!n=\@@vtn,
-      #1]}
-
-\def\stopvertical
-  {\stopcolumns
-   \egroup}
-
-\setupchinese
-  [\c!direction=\v!left,
-   \c!balance=\v!no,
-   \c!n=\v!fit,
-   \c!distance=1.5\bodyfontsize]
-
-%D We can set up vertical typesetting with \type
-%D {\setupchinese}.
-
-%D \macros
-%D   {nochineseinvertical}
-%D
-%D English (non chinese) text is typeset rotated:
-
-\def\nochineseinvertical#1%
-  {\par
-   \setbox\scratchbox\hbox{\strut#1}
-   \getnoflines{\wd\scratchbox}
-   \setbox\scratchbox\hbox to \noflines\openlineheight
-     {\hss\box\scratchbox\hss}
-   \hbox to \hsize
-     {\hss
-      \rotate
-        [\c!rotation=270]
-        {\vbox to \ht\scratchbox{\vss\box\scratchbox\vss}}%
-      \hss}
-   \par}
-
-%D \macros
-%D   {correctchineseboundarychars}
-%D
-%D Careful reading of the previous macro learns that we
-%D treat left and right glyphs differently. When we say
-%D
-%D \starttyping
-%D \correctchineseboundarycharstrue
-%D \stoptyping
-%D
-%D For the moment correction in on by default.
-
-\correctchineseboundarycharstrue
-
-\def\chineserightcharcommand#1%
-  {\iftracechinese\ruledhbox\else\hbox\fi \!!to .5em{#1\hss}%
-   \hskip.25em\!!plus .25em\relax}%
-
-\def\chineseleftcharcommand#1%
-  {\ifnum\chineseBstatus<4 \hskip.25em \!!plus .25em\relax\fi
-   \iftracechinese\ruledhbox\else\hbox\fi \!!to .5em{\hss#1}}%
-
-% \def\chineserightcharcommand#1%
-%   {\setbox\scratchbox=\hbox{#1}%
-%    \scratchdimen=.5em
-%    \ifdim\wd\scratchbox>\scratchdimen
-%      \iftracechinese\ruledhbox\else\hbox\fi \!!to \scratchdimen
-%        {\box\scratchbox\hss}%
-%      \hskip.5\scratchdimen\!!plus.5\scratchdimen\relax
-%    \else
-%      \box\scratchbox
-%    \fi}
-
-% \def\chineseleftcharcommand#1%
-%   {\setbox\scratchbox=\hbox{#1}%
-%    \scratchdimen=.5em
-%    \ifdim\wd\scratchbox>\scratchdimen
-%      \ifnum\chineseBstatus<4
-%        \hskip.5\scratchdimen\!!plus.5\scratchdimen\relax
-%      \fi
-%      \iftracechinese\ruledhbox\else\hbox\fi \!!to \scratchdimen
-%        {\hss\box\scratchbox}%
-%    \else
-%      \box\scratchbox
-%    \fi}
-
-%D The long list of numbers in the previous macro identify the
-%D characters where special care is needed for breaking lines.
-%D A linebreak is not permitted before:
-%D
-%D \def\DoIt #1 #2 %
-%D   {\hbox{\hbox to 2em{\uchar{#1}{#2}\hss}#1 #2}\par}
-%D
-%D \startcolumns[n=5]
-%D \DoIt 161 162 \DoIt 161 163 \DoIt 161 164 \DoIt 161 167 \DoIt 161 173
-%D \DoIt 161 175 \DoIt 161 177 \DoIt 161 179 \DoIt 161 181 \DoIt 161 183
-%D \DoIt 161 185 \DoIt 161 187 \DoIt 161 189 \DoIt 161 191 \DoIt 161 227
-%D \DoIt 161 228 \DoIt 161 229 \DoIt 163 161 \DoIt 163 162 \DoIt 163 167
-%D \DoIt 163 169 \DoIt 163 172 \DoIt 163 174 \DoIt 163 186 \DoIt 163 187
-%D \DoIt 163 190 \DoIt 163 191 \DoIt 163 221 \DoIt 163 253
-%D \stopcolumns
-%D
-%D A linebreak is not permitted after the following glyphs:
-%D
-%D \startcolumns[n=5]
-%D \DoIt 161 174 \DoIt 161 176 \DoIt 161 178 \DoIt 161 180 \DoIt 161 182
-%D \DoIt 161 184 \DoIt 161 186 \DoIt 161 188 \DoIt 161 190 \DoIt 163 168
-%D \DoIt 163 219 \DoIt 163 224 \DoIt 163 251
-%D \stopcolumns
-
-%D \macros
-%D   {tracechinesetrue, showchinesetracelegend}
-%D
-%D When we say \type {\tracechinesetrue}, we get some
-%D insight in the way \CONTEXT\ handles the Chinese glyphs.
-%D The symbols and color used represent:
-%D
-%D \showchinesetracelegend
-
-\newif\iftracechinese
-
-\def\showchinesetracelegend
-  {\definetabulate[\s!dummy][|c|l|l|l|]%
-   \startdummy
-     \HL
-     \NC \bf key \NC \bf meaning        \NC \bf glyph              \NC \bf keys  \NC\NR
-     \HL
-     \NC u \NC unknown character type   \NC \color[green]{current} \NC u l r     \NC\NR
-     \NC l \NC left boundary character  \NC \color[red]{previous}  \NC u l r c n \NC\NR
-     \NC r \NC right boundary character \NC \color[blue]{next}     \NC u l r s   \NC\NR
-     \NC c \NC chinese character        \NC                        \NC           \NC\NR
-     \NC s \NC following space          \NC                        \NC           \NC\NR
-     \NC n \NC no preceding space       \NC                        \NC           \NC\NR
-     \HL
-   \stopdummy}
-
-\def\tracedchineseglyph
-  {\dontleavehmode
-   \ruledhbox
-     {\setbox\scratchbox\hbox{\insertunicodeglyph}%
-      \hbox to \wd\scratchbox
-        {\localcolortrue
-         \copy\scratchbox
-         \infofont
-         \hskip-\wd\scratchbox
-         \hbox to \wd\scratchbox
-           {\hss
-            \color[green]{\ifcase\chineseSstatus\relax u\or l\or r\fi}%
-            \hss}%
-         \hskip-\wd\scratchbox
-         \lower\dp\scratchbox\hbox to \wd\scratchbox
-           {\hss
-            \color[red]{\ifcase\chineseBstatus\relax u\or l\or r\or c\or n\fi}%
-            \hss
-            \color[blue]{\ifcase\chineseAstatus\relax u\or l\or r\or s\fi}%
-            \hss}}}}
-
-%D The following example shows how tracing works.
-%D
-%D \start \tracechinesetrue
-%D һθǽܶĵ֧֡ĵ
-%D ѯ \nochinese{\CONTEXT} ǷܴʱѾԹ
-%D еĺ꼯ûеõζŶĵֻ֧û
-%D ʵ֡
-%D
-%D һ(θ) () ܶĵ֧֡ĵ,
-%D ѯ\nochinese{\CONTEXT}ǷܴʱѾ
-%D Թеĺ꼯ûеõζŶĵ֧
-%D ûʵ֡.
-%D \stop
-
-%D Because fonts are defined each time a \UNICODE\ is
-%D encountered |<|which is less inefficient than one would
-%D imagine, because \TEX\ is optimized quite well in this
-%D repect|>| we can define macros like this to take care of
-%D font switches. When available, one can add definitions
-%D for italic, slanted, bold fonts and combinations of these.
-
-%D \macros
-%D   {chinesenumber}
-%D
-%D The chinese numbering systems rather straightforward. First
-%D there are the digits:
-%D
-%D \starttabulate[|c|c|c|c|c|c|c|c|c|c|]
-%D \NC 0 \NC 1 \NC 2 \NC 3 \NC 4 \NC 5 \NC 6 \NC 7 \NC 8 \NC 9 \NC\NR
-%D \NC \chinesenumber{0} \NC \chinesenumber{1} \NC \chinesenumber{2}
-%D \NC \chinesenumber{3} \NC \chinesenumber{4} \NC \chinesenumber{5}
-%D \NC \chinesenumber{6} \NC \chinesenumber{7} \NC \chinesenumber{8}
-%D \NC \chinesenumber{9} \NC\NR
-%D \stoptabulate
-%D
-%D Apart from these numbers, we have dedicated representations
-%D of some powers of~$10$.
-%D
-%D \starttabulate[|c|c|c|c|c|]
-%D \NC 10 \NC 100 \NC 1000 \NC 10000 \NC 100000000 \NC\NR
-%D \NC \chinesenumber{10} \NC \chinesenumber{100}
-%D \NC \chinesenumber{1000} \NC \chinesenumber{10000}
-%D \NC \chinesenumber{100000000} \NC\NR
-%D \stoptabulate
-%D
-%D The number~12 is a combination of $1\times10+2$, or:
-%D \chinesenumber {12}, while~22 becomes \chinesenumber {22}.
-%D The numbers below 20 are treated a bit different, just like
-%D numbers with series of $0$'s. So $2\times10$ comes out as
-%D two glyphs, but $1\times10$ as one, because in the latter
-%D case the~$1$ is redundant. The same is true for the powers
-%D of~10.
-%D
-%D \starttabulate[|r|r|r|r|r|r|]
-%D \NC     1 \NC \chinesenumber     {1} \NC
-%D         9 \NC \chinesenumber     {9} \NC
-%D         4 \NC \chinesenumber     {4} \NC\NR
-%D \NC    11 \NC \chinesenumber    {11} \NC
-%D        99 \NC \chinesenumber    {99} \NC
-%D        16 \NC \chinesenumber    {16} \NC\NR
-%D \NC   111 \NC \chinesenumber   {111} \NC
-%D       999 \NC \chinesenumber   {999} \NC
-%D       256 \NC \chinesenumber   {256} \NC\NR
-%D \NC  1111 \NC \chinesenumber  {1111} \NC
-%D      9999 \NC \chinesenumber  {9999} \NC
-%D     65536 \NC \chinesenumber {65536} \NC\NR
-%D \stoptabulate
-%D
-%D The implementation is rather simple. For internal purposes,
-%D we let zero expand to~0. The digits $0-9$ and numbers $10$,
-%D $100$, $1000$, $10000$ and $100000000$ are hard coded.
-
-% This was the first implementation, before \WangLei\ asked
-% me to look into Big Five encoding, so, like everthing in
-% \TEX, things become a bit more complicated, but also more
-% versatile.
-%
-% \starttypen
-% \def\chinesedigit#1%
-%   {\ifnum      #1=100000000 \uchar{210}{218}% 100000000
-%    \else\ifnum #1=10000     \uchar{205}{242}% 10000
-%    \else\ifnum #1=1000      \uchar{199}{167}% 1000
-%    \else\ifnum #1=100       \uchar{176}{217}% 100
-%    \else\ifnum #1=10        \uchar{202}{174}% 10
-%    \else\ifcase#1           \uchar{193}{227}% 0
-%    \or                      \uchar{210}{187}% 1
-%    \or                      \uchar{182}{254}% 2
-%    \or                      \uchar{200}{253}% 3
-%    \or                      \uchar{203}{196}% 4
-%    \or                      \uchar{206}{229}% 5
-%    \or                      \uchar{193}{249}% 6
-%    \or                      \uchar{198}{223}% 7
-%    \or                      \uchar{176}{203}% 8
-%    \or                      \uchar{190}{197}% 9
-%    \fi\fi\fi\fi\fi\fi}
-% \stoptypen
-
-%D We will implement four methods, the one described earlier,
-%D a derived one with capitalized characters, an extended
-%D version of the first method, and a rather Arabic method.
-%D
-%D \starttabulate[|l|l|]
-%D \HL
-%D \NC \bf command                      \NC \bf number 39                 \NC\NR
-%D \HL
-%D \NC \type{\normalchinesenumber}      \NC \normalchinesenumber     {39} \NC\NR
-%D \NC \type{\capitalizedchinesenumber} \NC \capitalizedchinesenumber{39} \NC\NR
-%D \NC \type{\arabicchinesenumber}      \NC \arabicchinesenumber     {39} \NC\NR
-%D \NC \type{\extendedchinesenumber}    \NC \extendedchinesenumber   {39} \NC\NR
-%D \HL
-%D \stoptabulate
-%D
-%D We use a dirty trick to enable Chinese Capital Digits. In
-%D the encoding vectors, we define these by appending a suffix
-%D \type {*} to the digit, which in the following macro is
-%D appended or not (by passing \type {\empty}).
-
-\def\chinesedigit#1#2% #2: suffix, here * or \empty
-  {\udigit{\chineseencoding}{\number#1#2}}
-
-% Normal Chinese Number
-
-\def\normalchinesenumber#1%
-  {\expandafter\dochinesenumber\number#1\relax\empty}
-
-\def\dochinesenumber#1#2\relax#3%
-  {\ifnum#1#2<10 % 1-10
-     \chinesedigit{#1}#3%
-   \else\ifnum#1#2<20 % 11-99
-     \chinesedigit{10}#3%
-     \dodochinesenumberA#2\relax#3%
-   \else
-     \dodochinesenumber#1#2\relax#3%
-   \fi\fi}
-
-\def\dodochinesenumber#1#2\relax#3%
-  {\ifnum#1=0
-     \chinesedigit{0}#3%
-     \dododochinesenumber0#2\relax#3%
-   \else\ifnum#1#2<10 % 1-10
-     \chinesedigit{#1#2}#3%
-     \dodochinesenumberA#2\relax#3%
-   \else\ifnum#1#2<100 % 11-99
-     \dodochinesenumber#1\relax#3%
-     \chinesedigit{10}#3%
-     \dodochinesenumberA#2\relax#3%
-   \else\ifnum#1#2<1000 % 100-999
-     \dodochinesenumber#1\relax#3%
-     \chinesedigit{100}#3%
-     \dodochinesenumberA#2\relax#3%
-   \else\ifnum#1#2<10000 % 1000-9999
-     \dodochinesenumber#1\relax#3%
-     \chinesedigit{1000}#3%
-     \dodochinesenumberA#2\relax#3%
-   \else\ifnum#1#2<100000 % 10000-99999
-     \dodochinesenumber#1\relax#3%
-     \chinesedigit{10000}#3%
-     \dodochinesenumberA#2\relax#3%
-   \else\ifnum#1#2<1000000 % 100000-999999
-     \dodochinesenumberB#1#2\relax#3%
-   \else\ifnum#1#2<10000000 % 1000000-9999999
-     \dodochinesenumberC#1#2\relax#3%
-   \else\ifnum#1#2<100000000 % 10000000-99999999
-     \dodochinesenumberD#1#2\relax#3%
-   \else\ifnum#1#2<1000000000 % 10000000-99999999
-     \dochinesenumber#1\relax#3%
-     \chinesedigit{100000000}#3%
-     \dododochinesenumber#2\relax#3%
-   \else
-     \dodochinesenumberE#1#2\relax#3%
-   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
-
-\def\dododochinesenumber#1#2\relax#3%
-  {\ifnum#1=0
-     \ifnum0#2>0 \dododochinesenumber#2\relax#3\fi
-   \else
-     \dodochinesenumber#1#2\relax#3%
-   \fi}
-
-\def\dodochinesenumberA#1\relax#2%
-  {\ifcase0#1 \else\dodochinesenumber#1\relax#2\fi}
-
-\def\dodochinesenumberB#1#2#3\relax#4%
-  {\dochinesenumber#1#2\relax#4%
-   \chinesedigit{10000}#4%
-   \dododochinesenumber#3\relax#4}
-
-\def\dodochinesenumberC#1#2#3#4\relax#5%
-  {\dochinesenumber#1#2#3\relax#5%
-   \chinesedigit{10000}#5%
-   \dododochinesenumber#4\relax#5}
-
-\def\dodochinesenumberD#1#2#3#4#5\relax#6%
-  {\dochinesenumber#1#2#3#4\relax#6%
-   \chinesedigit{10000}#6%
-   \dododochinesenumber#5\relax#6}
-
-\def\dodochinesenumberE#1#2#3\relax#4%
-  {\dochinesenumber#1#2\relax#4%
-   \chinesedigit{100000000}#4%
-   \dododochinesenumber#3\relax#4}
-
-% Capitalized Chinese Number
-
-\def\capitalizedchinesenumber#1%
-  {\expandafter\dochinesenumber\number#1\relax*}
-
-% Extended Chinese Number
-
-\def\extendedchinesenumber#1%
-  {\expandafter\doextendedchinesenumber\number#1\relax}
-
-\def\doextendedchinesenumber#1#2\relax%
-  {\ifnum     #1#2<20 %  0-19
-     \dochinesenumber#1#2\relax\empty
-   \else\ifnum#1#2<30 % 20-29
-     \chinesedigit{20}\empty
-     \ifcase#2\else\chinesedigit{2#2}\fi
-   \else\ifnum#1#2<40 % 30-39
-     \chinesedigit{30}\empty
-     \ifcase#2\else\chinesedigit{3#2}\fi
-   \else
-     \dochinesenumber#1#2\relax\empty
-   \fi\fi\fi}
-
-% Arabic Chinese Number
-
-\def\arabicchinesenumber#1%
-  {\expandafter\doarabicchinesenumber\number#1@\relax}
-
-\def\doarabicchinesenumber#1#2\relax
-  {\if#1@\else
-     \chinesedigit{#1}\empty
-     \doarabicchinesenumber#2\relax
-   \fi}
-
-% The short call:
-
-\def\chinesenumber{\normalchinesenumber}
-
-% \dorecurse{40}
-%   {\hbox
-%      {\processingverbatimtrue
-%       \hbox to 1cm{\hss\recurselevel}\quad
-%       \hbox to 3cm{\hss\strut\normalchinesenumber     {\recurselevel}}\quad
-%       \hbox to 3cm{\hss\strut\capitalizedchinesenumber{\recurselevel}}\quad
-%       \hbox to 3cm{\hss\strut\arabicchinesenumber     {\recurselevel}}\quad
-%       \hbox to 3cm{\hss\strut\extendedchinesenumber   {\recurselevel}}\crlf}}
-
-%D The next table demonstates the correctness of the
-%D conversion macro.
-%D
-%D \startbuffer
-%D \starttable[|l|l|l|l|l|l|]
-%D \HL
-%D \NC number     \NC converter                  \NC hard coded \NC
-%D     number     \NC converter                  \NC hard coded\NC \SR
-%D \HL
-%D \NC 1          \NC \chinesenumber{1}          \NC һ \NC
-%D     0          \NC \chinesenumber{0}          \NC  \NC\FR
-%D \NC 11         \NC \chinesenumber{11}         \NC ʮһ \NC
-%D     10         \NC \chinesenumber{10}         \NC ʮ  \NC\MR
-%D \NC 111        \NC \chinesenumber{111}        \NC һһʮһ \NC
-%D     100        \NC \chinesenumber{100}        \NC һ \NC\MR
-%D \NC 101        \NC \chinesenumber{101}        \NC һһ \NC
-%D     120        \NC \chinesenumber{120}        \NC һٶʮ \NC\MR
-%D \NC 1111       \NC \chinesenumber{1111}       \NC һǧһһʮһ \NC
-%D     1000       \NC \chinesenumber{1000}       \NC һǧ \NC\MR
-%D \NC 1001       \NC \chinesenumber{1001}       \NC һǧһ \NC
-%D     1020       \NC \chinesenumber{1020}       \NC һǧʮ \NC\MR
-%D \NC 11111      \NC \chinesenumber{11111}      \NC һһǧһһʮһ \NC
-%D     10000      \NC \chinesenumber{10000}      \NC һ \NC\MR
-%D \NC 10001      \NC \chinesenumber{10001}      \NC һһ \NC
-%D     10200      \NC \chinesenumber{10200}      \NC һ \NC\LR
-%D \HL
-%D \NC 111111     \NC \chinesenumber{111111}     \NC ʮһһǧһһʮһ \NC
-%D     100000     \NC \chinesenumber{100000}     \NC ʮ \NC\FR
-%D \NC 1111111    \NC \chinesenumber{1111111}    \NC һһʮһһǧһһʮһ \NC
-%D     1000000    \NC \chinesenumber{1000000}    \NC һ \NC\MR
-%D \NC 11111111   \NC \chinesenumber{11111111}   \NC һǧһһʮһһǧһһʮһ \NC
-%D     10000000   \NC \chinesenumber{10000000}   \NC һǧ \NC\MR
-%D \NC 111111111  \NC \chinesenumber{111111111}  \NC һһǧһһʮһһǧһһʮһ \NC
-%D     100000000  \NC \chinesenumber{100000000}  \NC һ \NC\MR
-%D \NC 1111111111 \NC \chinesenumber{1111111111} \NC ʮһһǧһһʮһһǧһһʮһ \NC
-%D     1000000000 \NC \chinesenumber{1000000000} \NC ʮ \NC\LR
-%D \HL
-%D \stoptable
-%D \stopbuffer
-%D
-%D \placetable{Some Chinese number examples.}{\getbuffer}
-
-%D Although the conversion can be hooked into most commands
-%D that deal with numbers |<|those familiar with \TEX\ macro
-%D programming will notice that the macro if fully
-%D expandable|>| in many cases Chinese documents use western
-%D digits. So, in practice, the change that the next example
-%D shows up, is minimal.
-%D
-%D \starttabulate[|r|r|c|]
-%D \NC  2546 \NC \chinesenumber  {2546} \NC     \NC\NR
-%D \NC  9258 \NC \chinesenumber  {9258} \NC $+$ \NC\NR
-%D \HL
-%D \NC 11804 \NC \chinesenumber {11804} \NC     \NC\NR
-%D \stoptabulate
-%D
-%D While in arabic arithmics addition leads to more digits, in
-%D Chinese the number of glyphs can (temporary) decrease.
-%D Given that the number of people dealing with Chinese is
-%D considerably larger than the number of latin speaking
-%D people, a successor of \TEX\ definitely must provide a
-%D \type {\chinesenumeral} primitive.
-
-\defineconversion [c]                  [\normalchinesenumber]
-\defineconversion [chinese]            [\normalchinesenumber]
-\defineconversion [nc]                 [\normalchinesenumber]
-\defineconversion [normalchinese]      [\normalchinesenumber]
-\defineconversion [cc]                 [\capitalizedchinesenumber]
-\defineconversion [capitalizedchinese] [\capitalizedchinesenumber]
-\defineconversion [ec]                 [\extendedchinesenumber]
-\defineconversion [extendedchinese]    [\extendedchinesenumber]
-\defineconversion [ac]                 [\arabicchinesenumber]
-\defineconversion [arabicchinese]      [\arabicchinesenumber]
-
-%D Date conversion:
-
-\defineconversion [cn] [\v!day]   [\chinesenumber]
-\defineconversion [cn] [\v!month] [\chinesenumber]
-\defineconversion [cn] [\v!year]  [\chinesenumber]
-
-%D \macros
-%D   {SimChi, TraChi}
-%D
-%D These components enable us to construct dedicated Chinese
-%D font switches, like:
-
-\setupunicodefont
-  [chinese]
-  [       \c!scale=\chineseunicodescale,
-         \c!height=\chineseunicodeheight,
-          \c!depth=\chineseunicodedepth,
-          \c!strut=\v!yes,
- \c!interlinespace=\v!yes,
-     \c!conversion=\chinesenumber,
-       \c!commands=\setchineseencoding, % needed for digits
-        \c!command=\handlechineseunicodeglyph]
-
-%D For the moment, this encoding is implemented rather ugly. The
-%D trick is to move the encoding value from the current font
-%D definition to the \type {\chineseencoding} macro.
-
-\let\chineseencoding\empty
-
-\def\setchineseencoding % normally SomeChineseRegular
-  {\getfontfileparameters\unicodestyle
-   \ifx\currentfontfileencoding\undefined \else
-     \let\chineseencoding\currentfontfileencoding
-   \fi}
-
-%D We could have said:
-%D
-%D \starttyping
-%D \defineunicodefont
-%D   [SimChi]
-%D   [SimplifiedChinese]
-%D   [\c!scale=\chineseunicodescale,
-%D    \c!height=\chineseunicodeheight,
-%D    \c!depth=\chineseunicodedepth,
-%D    \c!conversion=\chinesenumber,
-%D    \c!commands=\setchineseencoding, % needed for digits
-%D    \c!command=\handlechineseunicodeglyph]
-%D \stoptyping
-%D
-%D However, the former definitions is more general. Next we
-%D map a few fonts:
-
-\definefontsynonym [SimplifiedChineseRegular]      [gbsong]   [encoding=gbk]
-\definefontsynonym [SimplifiedChineseSlanted]      [gbsongsl] [encoding=gbk]
-\definefontsynonym [SimplifiedChineseItalic]       [gbsongsl] [encoding=gbk]
-\definefontsynonym [SimplifiedChineseBold]         [gbhei]    [encoding=gbk]
-\definefontsynonym [SimplifiedChineseBoldSlanted]  [gbheisl]  [encoding=gbk]
-\definefontsynonym [SimplifiedChineseBoldItalic]   [gbheisl]  [encoding=gbk]
-
-\definefontsynonym [TraditionalChineseRegular]     [b5song]   [encoding=big5]
-\definefontsynonym [TraditionalChineseSlanted]     [b5songsl] [encoding=big5]
-\definefontsynonym [TraditionalChineseItalic]      [b5songsl] [encoding=big5]
-\definefontsynonym [TraditionalChineseBold]        [b5hei]    [encoding=big5]
-\definefontsynonym [TraditionalChineseBoldSlanted] [b5heisl]  [encoding=big5]
-\definefontsynonym [TraditionalChineseBoldItalic]  [b5heisl]  [encoding=big5]
-
-% we need to move this to typescripts
-
-\doifelse \currentregime {utf} {
-
-    \definefontsynonym [SimplifiedChineseRegular]     [ChineseRegular]
-    \definefontsynonym [SimplifiedChineseSlanted]     [ChineseSlanted]
-    \definefontsynonym [SimplifiedChineseItalic]      [ChineseItalic]
-    \definefontsynonym [SimplifiedChineseBold]        [ChineseBold]
-    \definefontsynonym [SimplifiedChineseBoldSlanted] [ChineseBoldSlanted]
-    \definefontsynonym [SimplifiedChineseBoldItalic]  [ChineseBoldItalic]
-
-    \definefontsynonym [TraditionalChineseRegular]    [ChineseRegular]
-    \definefontsynonym [TraditionalChineseSlanted]    [ChineseSlanted]
-    \definefontsynonym [TraditionalChineseItalic]     [ChineseItalic]
-    \definefontsynonym [TraditionalChineseBold]       [ChineseBold]
-    \definefontsynonym [TraditionalChineseBoldSlanted][ChineseBoldSlanted]
-    \definefontsynonym [TraditionalChineseBoldItalic] [ChineseBoldItalic]
-
-    \definefontsynonym [ChineseRegular]    [uni-htsong-][encoding=cjk-uni]
-    \definefontsynonym [ChineseSlanted]    [uni-htsong-][encoding=cjk-uni]
-    \definefontsynonym [ChineseItalic]     [uni-htsong-][encoding=cjk-uni]
-    \definefontsynonym [ChineseBold]       [uni-hthei-] [encoding=cjk-uni]
-    \definefontsynonym [ChineseBoldSlanted][uni-hthei-] [encoding=cjk-uni]
-    \definefontsynonym [ChineseBoldItalic] [uni-hthei-] [encoding=cjk-uni]
-
-    \loadmapfile[uni-htsong.map]
-    \loadmapfile[uni-htfs.map]
-    \loadmapfile[uni-hthei.map]
-    \loadmapfile[uni-htkai.map]
-
-} {
-
-    \loadmapfile[gbk]
-
-}
-
-\defineunicodefont [SimChi] [SimplifiedChinese]  [chinese]
-\defineunicodefont [TraChi] [TraditionalChinese] [chinese]
-
-%D We default to these so called Simplified Chinese fonts.
-
-\SimChi
-
-%D In addition to these fonts, we (pre|)|define some commonly
-%D used fonts:
-
-\definefontsynonym [SimplifiedChineseSongTiRegular]        [gbsong]   [encoding=gbk]
-\definefontsynonym [SimplifiedChineseSongTiSlanted]        [gbsongsl] [encoding=gbk]
-\definefontsynonym [SimplifiedChineseSongTiBold]           [gbsong]   [encoding=gbk]
-\definefontsynonym [SimplifiedChineseSongTiBoldSlanted]    [gbsongsl] [encoding=gbk]
-
-\definefontsynonym [TraditionalChineseSongTiRegular]       [b5song]   [encoding=big5]
-\definefontsynonym [TraditionalChineseSongTiSlanted]       [b5songsl] [encoding=big5]
-\definefontsynonym [TraditionalChineseSongTiBold]          [b5song]   [encoding=big5]
-\definefontsynonym [TraditionalChineseSongTiBoldSlanted]   [b5songsl] [encoding=big5]
-
-\definefontsynonym [SimplifiedChineseHeiTiRegular]         [gbhei]    [encoding=gbk]
-\definefontsynonym [SimplifiedChineseHeiTiSlanted]         [gbheisl]  [encoding=gbk]
-\definefontsynonym [SimplifiedChineseHeiTiBold]            [gbhei]    [encoding=gbk]
-\definefontsynonym [SimplifiedChineseHeiTiBoldSlanted]     [gbheisl]  [encoding=gbk]
-
-\definefontsynonym [TraditionalChineseHeiTiRegular]        [b5hei]    [encoding=big5]
-\definefontsynonym [TraditionalChineseHeiTiSlanted]        [b5heisl]  [encoding=big5]
-\definefontsynonym [TraditionalChineseHeiTiBold]           [b5hei]    [encoding=big5]
-\definefontsynonym [TraditionalChineseHeiTiBoldSlanted]    [b5heisl]  [encoding=big5]
-
-\definefontsynonym [SimplifiedChineseKaiTiRegular]         [gbkai]    [encoding=gbk]
-\definefontsynonym [SimplifiedChineseKaiTiSlanted]         [gbkaisl]  [encoding=gbk]
-\definefontsynonym [SimplifiedChineseKaiTiBold]            [gbkai]    [encoding=gbk]
-\definefontsynonym [SimplifiedChineseKaiTiBoldSlanted]     [gbkaisl]  [encoding=gbk]
-
-\definefontsynonym [TraditionalChineseKaiTiRegular]        [b5kai]    [encoding=big5]
-\definefontsynonym [TraditionalChineseKaiTiSlanted]        [b5kaisl]  [encoding=big5]
-\definefontsynonym [TraditionalChineseKaiTiBold]           [b5kai]    [encoding=big5]
-\definefontsynonym [TraditionalChineseKaiTiBoldSlanted]    [b5kaisl]  [encoding=big5]
-
-\definefontsynonym [SimplifiedChineseFangSongRegular]      [gbfs]     [encoding=gbk]
-\definefontsynonym [SimplifiedChineseFangSongSlanted]      [gbfssl]   [encoding=gbk]
-\definefontsynonym [SimplifiedChineseFangSongBold]         [gbfs]     [encoding=gbk]
-\definefontsynonym [SimplifiedChineseFangSongBoldSlanted]  [gbfssl]   [encoding=gbk]
-
-\definefontsynonym [TraditionalChineseFangSongRegular]     [b5fs]     [encoding=big5]
-\definefontsynonym [TraditionalChineseFangSongSlanted]     [b5fssl]   [encoding=big5]
-\definefontsynonym [TraditionalChineseFangSongBold]        [b5fs]     [encoding=big5]
-\definefontsynonym [TraditionalChineseFangSongBoldSlanted] [b5fssl]   [encoding=big5]
-
-\definefontsynonym [SimplifiedChineseLiShuRegular]         [gbli]     [encoding=gbk]
-\definefontsynonym [SimplifiedChineseLiShuSlanted]         [gblisl]   [encoding=gbk]
-\definefontsynonym [SimplifiedChineseLiShuBold]            [gbli]     [encoding=gbk]
-\definefontsynonym [SimplifiedChineseLiShuBoldSlanted]     [gblisl]   [encoding=gbk]
-
-\definefontsynonym [TraditionalChineseLiShuRegular]        [b5li]     [encoding=big5]
-\definefontsynonym [TraditionalChineseLiShuSlanted]        [b5lisl]   [encoding=big5]
-\definefontsynonym [TraditionalChineseLiShuBold]           [b5li]     [encoding=big5]
-\definefontsynonym [TraditionalChineseLiShuBoldSlanted]    [b5lisl]   [encoding=big5]
-
-%D The following definitions provide us the commands to switch
-%D to these fonts.
-
-\defineunicodefont [SimSongTi]   [SimplifiedChineseSongTi]    [chinese]
-\defineunicodefont [TraSongTi]   [TraditionalChineseSongTi]   [chinese]
-
-\defineunicodefont [SimHeiTi]    [SimplifiedChineseHeiTi]     [chinese]
-\defineunicodefont [TraHeiTi]    [TraditionalChineseHeiTi]    [chinese]
-
-\defineunicodefont [SimKaiTi]    [SimplifiedChineseKaiTi]     [chinese]
-\defineunicodefont [TraKaiTi]    [TraditionalChineseKaiTi]    [chinese]
-
-\defineunicodefont [SimFangSong] [SimplifiedChineseFangSong]  [chinese]
-\defineunicodefont [TraFangSong] [TraditionalChineseFangSong] [chinese]
-
-\defineunicodefont [SimLiShu]    [SimplifiedChineseLiShu]     [chinese]
-\defineunicodefont [TraLiShu]    [TraditionalChineseLiShu]    [chinese]
-
-% \definealternativestyle [ChineseTitleFont] [\bfd\SimKaiTi] []
-
-%D \macros
-%D   {purechinese}
-%D
-%D Use this macro to suppress spacing around Chinese text.
-
-\def\purechinese#1% evt geen rek
-  {\hskip\chineseSsignal\relax
-   #1\unskip\unskip\unskip
-   \hskip\chineseSsignal\relax}
-
-%D \macros
-%D   {stillchinese}
-%D
-%D Use the next macro when you want the next item to be put
-%D tight to the previous chinese character.
-
-\def\stillchinese
-  {\hskip\chineseSsignal\relax}
-
-%D \macros
-%D   {nochinese}
-%D
-%D When we want to be sure of non||Chinese inline text,
-%D we can package the for instance english text in \type
-%D {\nochinese}.
-
-\def\nochinese#1%
-  {\unskip\unskip\unskip
-   \hskip\chinesesurroundskip
-   \hskip\chineseinterglyphskip\relax
-   #1%
-   \hskip\chineseinterglyphskip\relax
-   \hskip\chinesesurroundskip
-   \ignorespaces}
-
-%D \macros
-%D   {chisize}
-%D
-%D Chinese font sizes are specified in a different way,
-%D using positive and negative numbers:
-
-\def\chisize#1%
-  {\ifnum#11<0 % a trick to catch -0
-     \ifcase#1\space36\or24\or18\or15\or12\or9\or\else6.5\fi
-   \else
-     \ifcase#1\space42\or26\or22\or16\or14\or10.5\or7.5\or5.5\else5\fi
-   \fi pt}
-
-%D So:
-%D
-%D \startbuffer
-%D [\chisize{-1}] [\chisize{7}] [\chisize{+4}]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D gives:
-%D
-%D \getbuffer
-%D
-%D The full range of sizes is:
-%D
-%D \starttabulate[|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|]
-%D \NC          8 \NC         7 \NC         -6 \NC         6 \NC
-%D             -5 \NC         5 \NC         -4 \NC         4 \NC
-%D             -3 \NC         3 \NC         -2 \NC         2 \NC
-%D             -1 \NC         1 \NC         -0 \NC         0 \NC\NR
-%D \NC\chisize {8}\NC\chisize{7}\NC\chisize{-6}\NC\chisize{6}\NC
-%D    \chisize{-5}\NC\chisize{5}\NC\chisize{-4}\NC\chisize{4}\NC
-%D    \chisize{-3}\NC\chisize{3}\NC\chisize{-2}\NC\chisize{2}\NC
-%D    \chisize{-1}\NC\chisize{1}\NC\chisize{-0}\NC\chisize{0}\NC\NR
-%D \stoptabulate
-
-%D Now it's time for some real Chinese. This example
-%D also shows that font switching is supported.
-%D
-%D \startnarrower
-%D \midaligned{\tfd ˮͷ}
-%D \blank
-%D \midaligned{\tfb ﵩƪ滳ɡ}
-%D \blank
-%D \midaligned{\tfb }
-%D \blank
-%D ¼ʱУѾ졣֪ϹڣϦǺꣿ˷ȥ
-%D ֿ¥ߴʤŪӰ˼䣿
-%D \blank
-%D תͻߡӦкޣƫʱԲбϣ
-%D Բȱ¹ȫԸ˳ãǧﹲ濾ꡣ
-%D \stopnarrower
-%D
-%D The english translation is:
-%D
-%D \startnarrower
-%D \midaligned{\tfd Tune: Prelude to the Melody of Water}
-%D \blank
-%D \midaligned{\tfb On the night of the Mid||Autumn Festival of
-%D 1076, I drank happily till dawn and wrote this in my cups
-%D while thinking of Zi||you.}
-%D \blank
-%D \midaligned{\tfb Su Shi}
-%D \blank
-%D How long will the bright moon appear? Wine||cup in hand, I
-%D ask the sky. I do not know waht time of year it would be
-%D tonight in the palace on high. Riding the wind, there I
-%D would fly, yet I fear the crystal palace would be far too
-%D high and cold for me. I rise and dance, with my shadow I
-%D play. On high as on earth, would it be as gay?
-%D \blank
-%D The moon goes round the mansion red though gauze||draped
-%D windows soft to shed her light upon the sleepless bed.
-%D Against man she should have no spite. Why then when people
-%D part is she oft full and bright? Men have sorrow and joy,
-%D they part or meet again; The moon may be bright or dim, she
-%D may wax or wane. There has been nothing perfect since the
-%D olden days. So let us wish that man will live long as he
-%D can! Though miles apart, we'll share the beauty she
-%D displays.
-%D \stopnarrower
-
-%D This package is written in the city of Hasselt, a pretty
-%D small town in the |<|compared to China real small|>|
-%D Netherlands. Like most dutch cities, even this small one
-%D has a chinese restaurant, run by chinese, speaking chinese,
-%D and |<|indeed|>| writing chinese. Eating there will never
-%D be the same, since now I can at least pretend to know the
-%D glyphs all around the place. The numbers should pose me no
-%D problems, but I fear I will never manage to recognize those
-%D scribles they draw on their pads when thay take your order.
-
-%D To make our lives more easy, we put it here (too):
-
-\setuptyping[\c!tab=\v!no]
-
-\protect \endinput
diff --git a/tex/context/base/font-chk.lua b/tex/context/base/font-chk.lua
index 61f3f8ab5..382f671d8 100644
--- a/tex/context/base/font-chk.lua
+++ b/tex/context/base/font-chk.lua
@@ -18,6 +18,7 @@ local chardata     = characters.data
 
 local glyph        = node.id('glyph')
 local traverse_id  = node.traverse_id
+local remove_node  = nodes.remove
 
 -- maybe in fonts namespace
 -- deletion can be option
@@ -44,7 +45,7 @@ function fonts.register_message(font,char,message)
     end
 end
 
-function checkers.missing(head,tail)
+function checkers.missing(head)
     if checkers.enabled then
         local lastfont, characters, found = nil, nil, nil
         for n in traverse_id(glyph,head) do
@@ -67,14 +68,9 @@ function checkers.missing(head,tail)
         end
         if found and checkers.delete then
             for i=1,#found do
-                local n = found[i]
-                if n == tail then
-                    head, tail = nodes.remove(head,n,true)
-                else
-                    head, _ = nodes.remove(head,n,true)
-                end
+                head = remove_node(head,found[i],true)
             end
         end
     end
-    return head, tail, false
+    return head, false
 end
diff --git a/tex/context/base/font-cid.lua b/tex/context/base/font-cid.lua
index b8dfc4294..13e9cce89 100644
--- a/tex/context/base/font-cid.lua
+++ b/tex/context/base/font-cid.lua
@@ -93,6 +93,7 @@ local function locate(registry,ordering,supplement)
                     logs.report("load otf","using cidmap file %s",filename)
                 end
                 fonts.cid.map[filename] = cidmap
+                cidmap.usedname = file.basename(filename)
                 return cidmap
             end
         end
diff --git a/tex/context/base/font-col.lua b/tex/context/base/font-col.lua
index 5d089fef2..f2ee3f1ae 100644
--- a/tex/context/base/font-col.lua
+++ b/tex/context/base/font-col.lua
@@ -187,7 +187,7 @@ function collections.message(message)
     end
 end
 
-function collections.process(head,tail)
+function collections.process(head)
     if active then
         local done = false
         for n in traverse_id(glyph,head) do
@@ -211,5 +211,5 @@ function collections.process(head,tail)
             end
         end
     end
-    return head, tail, done
+    return head, done
 end
diff --git a/tex/context/base/font-heb.mkii b/tex/context/base/font-heb.mkii
new file mode 100644
index 000000000..3ec0395f3
--- /dev/null
+++ b/tex/context/base/font-heb.mkii
@@ -0,0 +1,5 @@
+\unprotected \writestatus\m!systems{load ARABTEX as a module instead}
+
+\usemodule[arabtex]
+
+\endinput
diff --git a/tex/context/base/font-heb.tex b/tex/context/base/font-heb.tex
deleted file mode 100644
index 3ec0395f3..000000000
--- a/tex/context/base/font-heb.tex
+++ /dev/null
@@ -1,5 +0,0 @@
-\unprotected \writestatus\m!systems{load ARABTEX as a module instead}
-
-\usemodule[arabtex]
-
-\endinput
diff --git a/tex/context/base/font-ini.mkii b/tex/context/base/font-ini.mkii
index 658d06f70..f614a07cd 100644
--- a/tex/context/base/font-ini.mkii
+++ b/tex/context/base/font-ini.mkii
@@ -2457,7 +2457,7 @@
       \fi
       \makeshortfilename[\truefilename{\f!fontprefix#2}]%
       \startreadingfile
-        \readsysfile\shortfilename
+        \readsysfile{\shortfilename.mkii}
           {\showmessage\m!fonts2{#2}}
           {\showmessage\m!fonts3{#2}}%
       \stopreadingfile}}
@@ -3778,7 +3778,7 @@
 %D The implementation is rather straightforward in using
 %D \type{\halign}.
 
-\fetchruntimecommand \showbodyfont  {\f!fontprefix\s!run}
+\fetchruntimecommand \showbodyfont  {\f!fontprefix\s!run.mkii}
 
 %D \macros
 %D   {showfontstrip, testminimalbaseline, showminimalbaseline}
@@ -3789,9 +3789,9 @@
 %D
 %D \showfontstrip \blank \showminimalbaseline
 
-\fetchruntimecommand \showfontstrip       {\f!fontprefix\s!run}
-\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run}
-\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run}
+\fetchruntimecommand \showfontstrip       {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run.mkii}
 
 %D \macros
 %D   {showkerning}
@@ -3800,7 +3800,7 @@
 %D
 %D \showkerning{Can you guess what kerning is?}
 
-\fetchruntimecommand \showkerning         {\f!fontprefix\s!run}
+\fetchruntimecommand \showkerning         {\f!fontprefix\s!run.mkii}
 
 %D \macros
 %D   {showbodyfontenvironment}
@@ -3813,7 +3813,7 @@
 %D
 %D \showsetup{showbodyfontenvironment}
 
-\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run}
+\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run.mkii}
 
 %D \macros
 %D   {showfont,showfontstyle,showligatures}
@@ -3834,11 +3834,11 @@
 
 % to be internationalized
 
-\fetchruntimecommand \showfont      {\f!fontprefix\s!run}
-\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run}
-\fetchruntimecommand \showligature  {\f!fontprefix\s!run}
-\fetchruntimecommand \showligatures {\f!fontprefix\s!run}
-\fetchruntimecommand \showcharratio {\f!fontprefix\s!run}
+\fetchruntimecommand \showfont      {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showligature  {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showligatures {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showcharratio {\f!fontprefix\s!run.mkii}
 
 %D \macros
 %D   {getglyph, symbolicfont}
diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv
index 5ce6248ea..339e521a9 100644
--- a/tex/context/base/font-ini.mkiv
+++ b/tex/context/base/font-ini.mkiv
@@ -405,7 +405,7 @@
 %D defining it here, we have at least an safeguard for utility
 %D file reading.
 
-\ifx\uchar\undefined \unexpanded\def\uchar#1#2{[#1,#2]} \fi
+\ifdefined\uchar\else \unexpanded\def\uchar#1#2{[#1,#2]} \fi
 
 %D We define some (very private) constants to improve speed,
 %D memory usage and consistency.
@@ -459,7 +459,10 @@
 %D tests but it does not help us when no math is defined.
 
 \chardef\mrfam\zerocount % math regular
-\chardef\mbfam\zerocount % math bold
+\chardef\mbfam\plusone   % math bold
+
+\unexpanded\def\mr{\ifmmode\fam\zerocount\else\setcurrentfontalternative\c!mr\fi} % \fam\csname\c!mr fam\endcsname
+\unexpanded\def\mb{\ifmmode\fam\plusone  \else\setcurrentfontalternative\c!mb\fi} % \fam\csname\c!mb fam\endcsname
 
 \def\mathtextsuffix        {-text}
 \def\mathscriptsuffix      {-script}
@@ -508,7 +511,17 @@
 
 \appendtoks
     \dosetmathfamily\mrfam\c!mr
-   %\dosetmathfamily\mbfam\c!mb % some day, only when defined, else equivalent to 0
+\to \mathstrategies
+
+% not official !
+
+\chardef\boldmathmode\zerocount % might change ... maybe \mathfontsupport 1 (normal) 2 (bold too)
+
+\def\enableboldmath {\chardef\boldmathmode\plusone  } % todo: \setupbodyfont[boldmath,...]
+\def\disableboldmath{\chardef\boldmathmode\zerocount}
+
+\appendtoks
+    \ifcase\boldmathmode\or\dosetmathfamily\mbfam\c!mb\fi
 \to \mathstrategies
 
 %D All used styles, like rm, ss and tt, are saved in a comma
@@ -825,7 +838,6 @@
 
 \def \defaultfontfile{\truefontname{Normal}} % was cmtt10, but that one is gone
 \edef\nullfontname   {\fontname\nullfont}
-\edef\dummyfontname  {font\strippedcsname\\}
 
 %D \macros
 %D  {everyfont,everyfontswitch}
@@ -1082,12 +1094,6 @@
 \let\oldrawfontidentifier\rawfontidentifier
 \let\oldnewfontidentifier\newfontidentifier
 
-% best we can add the style as well because otherwise we get math encoding mixups
-%
-% \setupbodyfont   [8pt] [\currentencoding/\ccaron\scaron\zcaron]
-% \blank
-% \switchtobodyfont[7pt] [\currentencoding/\ccaron\scaron\zcaron]
-
 \def\newfontidentifier{*\fontclass\lastfontidentifier\fontstyle\fontsize*}
 
 \def\dododefinefont#1#2%
@@ -1176,7 +1182,7 @@
 \let\fontalternativelist\empty
 \let\fontstylelist      \empty
 
-\def\checkfontnamecombinations
+\def\checkfontnamecombinations % we need to split math and text here ... todo (math only has mr and mb)
   {\def\docommand##1%
      {\def\dodocommand####1%
         {\def\dododocommand########1{\checkbodyfont{########1}{####1}{##1}}%
@@ -1508,7 +1514,7 @@
      \doifnumberelse{#1}
        {\doifassignmentelse{#3}
           {% [12pt] [style] [settings]
-           \doifundefined{#2}{\normalexpanded{\noexpand\definefontstyle[#2][#2]}}% new
+           \ifcsname#2\endcsname\else\normalexpanded{\noexpand\definefontstyle[#2][#2]}\fi % new
            \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}}
           {% [12pt] [style] [identifier]
            \dodefinedefaultbodyfont[#1][#2][#3]}} % body style identifier
@@ -1517,10 +1523,14 @@
    \else\ifsecondargument
      \definebodyfont[#1][\c!rm][#2]%
    \else
-     \doifundefined{\@size@#1} % Maybe there are default dependancies
-       {\defineunknownfont{#1}}% defined which we can use ([unknown])
-     \doifundefined{\@size@#1} % and if not, then we have at least to
-       {\definebodyfont[#1][\c!rm][]}% make sure some basics are set up.
+     % Maybe there are default dependencies defined which we can use ([unknown]) and
+     % if not, then we have at least to make sure some basics are set up.
+     \ifcsname\@size@#1\endcsname \else
+       \defineunknownfont{#1}%
+     \fi
+     \ifcsname\@size@#1\endcsname \else
+       \definebodyfont[#1][\c!rm][]%
+     \fi
    \fi\fi}
 
 \def\xdodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier
@@ -1588,18 +1598,19 @@
    \normalprotected\@EA\fcxdef\csname\fontclass#2#1#3#4#53\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#53}{\normalunexpanded{#6}}}}
 
 \def\checkbodyfont#1% tests for ttsl mmbf
-  {\def\c!!mm{#1}%
+  {\edef\c!!mm{#1}%
    \ifx\c!!mm\c!mm % prevents \max and alike (re)defs
      \expandafter\checkmathbodyfont
    \else
      \expandafter\checktextbodyfont
    \fi{#1}} % no \c!!mm, not expanded later on
 
+% some day we can do an auto-fam if needed
+
 \def\checkmathbodyfont#1#2#3% style alt size / gdef % #3 can be empty
   {%\message{!m #1 #2 #3!}%
    % #1 #2 #3 = signal
-   %unexpanded\setgvalue {#1#2#3}{\setcurrentfontstylealternativesize{#1}{#2}{#3}}% \mmsla
-   \unexpanded\setgvalue     {#2}{\setcurrentfontalternative         {#2}}%         \sl
+   %unexpanded\setgvalue     {#2}{\setcurrentfontalternative         {#2}}%         \mr \mb
    \unexpanded\setgvalue     {#1}{\setcurrentfontstyle               {#1}}}%        \mm
 
 \def\checktextbodyfont#1#2#3% style alt size / gdef % #3 can be empty
@@ -1619,9 +1630,10 @@
   {\def\dododefinedefaultbodyfont##1%
      {\def\dodododefinedefaultbodyfont####1%
         {\def\dododododefinedefaultbodyfont########1%
-           {\doifdefined{\s!default########1####1}
-              {% [12pt] [style] [identifier]
-               \getvalue{\s!default########1####1}{##1}{####1}}}%
+           {\ifcsname\s!default########1####1\endcsname
+              % [12pt] [style] [identifier]
+              \csname\s!default########1####1\endcsname{##1}{####1}%
+            \fi}%
          \processcommalist[#3]\dododododefinedefaultbodyfont}%
       \processcommalist[#2]\dodododefinedefaultbodyfont}%
    \processcommalist[#1]\dododefinedefaultbodyfont}
@@ -1643,14 +1655,14 @@
 \def\dodefineunknownbodyfont#1#2% see ***
   {\ifcsname\s!default\s!default#2\endcsname % somehow related to */*
      \donetrue
-     \getvalue{\s!default\s!default#2}{#1}{#2}%
+     \csname\s!default\s!default#2\endcsname{#1}{#2}%
    \fi}
 
 \def\dodefineunknownsubfont#1#2%
-  {\ifcsname\@size@\getvalue{\??ft#1#2}\endcsname
+  {\ifcsname\@size@\csname\??ft#1#2\endcsname\endcsname
    \else
      \donetrue
-     \defineunknownfont{\getvalue{\??ft#1#2}}%
+     \defineunknownfont{\csname\??ft#1#2\endcsname}%
    \fi}
 
 \def\defineunknownfont#1%
@@ -1832,27 +1844,32 @@
 % can be made faster (only used internally now)
 
 \def\doswitchpoints[#1]%
-  {\normalexpanded{\noexpand\dodoswitchpoints{#1}}}
+  {\normalexpanded{\dodoswitchpoints{#1}}}
 
-\def\dodoswitchpoints#1%
-  {\doifundefined{\@size@#1}
-     {\defineunknownfont{#1}}%
+\unexpanded \def\dodoswitchpoints#1%
+  {\ifcsname\@size@#1\endcsname \else
+     \defineunknownfont{#1}%
+   \fi%
   %\defineunknownfontstyles{#1}%
-   \doifdefinedelse{\@size@#1}
-     {\getvalue{\@size@#1}%
-      \localbodyfontsize#1\relax
-      \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
-% \edef\fontbody{\fontbody}% to be tested but we can clean up mkiv further
-      \checkbodyfontenvironment[\normalizedbodyfontsize]}
-     {\showmessage\m!fonts4{#1}}}
-
-\unprotected \def\doswitchstyle[#1]%
-  {\doifdefinedelse{\@style@#1}
-     {\getvalue{\@style@#1}%
-      \edef\fontstyle{#1}%
-      \ifmmode\mr\fi % in order to be compatible with \rm in math mode
-      }% \the\everybodyfont}  % cleaner, in setting size as well as style
-     {\showmessage\m!fonts5{#1}}}
+   \ifcsname\@size@#1\endcsname
+     \csname\@size@#1\endcsname
+     \localbodyfontsize#1\relax
+     \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
+   % \edef\fontbody{\fontbody}% to be tested but we can clean up mkiv further
+     \checkbodyfontenvironment[\normalizedbodyfontsize]%
+   \else
+     \showmessage\m!fonts4{#1}%
+   \fi}
+
+\unexpanded \def\doswitchstyle[#1]%
+  {\ifcsname\@style@#1\endcsname
+     \csname\@style@#1\endcsname
+     \edef\fontstyle{#1}%
+     \ifmmode\mr\fi % in order to be compatible with \rm in math mode
+     % \the\everybodyfont % cleaner, in setting size as well as style
+   \else
+     \showmessage\m!fonts5{#1}%
+   \fi}
 
 %D \TEX\ loads font metric files like \type{cmr10.tfm} and
 %D \type{tir.tfm} only once. In \PLAIN\ \TEX\ some font files
@@ -2450,9 +2467,11 @@
 
 \unexpanded\def\switchtobodyfont[#1]%
   {\doifsomething{#1}
-     {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#1}}
-        {\setbodyfontstep{#1}} % so we have a fast [small] switch
-        {\dosetfont0{#1}}%
+     {\ifcsname\??ft\normalizedbodyfontsize\interfaced{#1}\endcsname
+        \setbodyfontstep{#1}% so we have a fast [small] switch
+      \else
+        \dosetfont0{#1}%
+      \fi
       \the\everybodyfont}} % indeed needed in case nothing is executed
 
 %D The following alternative is meant for math||to||text
@@ -2513,6 +2532,10 @@
   [%mode=node,%
    liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes
 
+\definefontfeature % can be used for type1 fonts
+  [complete]
+  [liga=yes,kern=yes,compose=yes,tlig=yes,trep=yes]
+
 \definefontfeature
   [arabic]
   [mode=node,language=dflt,script=arab,ccmp=yes,
@@ -2633,10 +2656,10 @@
 \definecomplexorsimple\switchstyleonly
 
 \def\simpleswitchstyleonly#1% stupid version
-  {\complexswitchstyleonly[\strippedcsname#1]}
+  {\complexswitchstyleonly[\checkedstrippedcsname#1]}
 
 \def\complexswitchstyleonly[#1]% todo : check
-  {\setcurrentfontstyle{\getvalue{\@shortstyle@#1}}%
+  {\setcurrentfontstyle{\csname\@shortstyle@#1\endcsname}%
    \the\everybodyfont} % needed ?
 
 %D \macros
@@ -2814,7 +2837,7 @@
 
 \def\dodefinealternativestyle[#1][#2][#3]%
   {\def\docommand##1%
-     {\doifundefined{##1}{\setvalue{##1}{\groupedcommand{#2}{}}}%
+     {\ifcsname##1\endcsname\else\setvalue{##1}{\groupedcommand{#2}{}}\fi
       \setvalue{\@letter@  ##1}{#2}%
       \setvalue{\@noletter@##1}{#3}}%
    \processcommalist[#1]\docommand}
@@ -2947,37 +2970,37 @@
 
 %D or even better:
 
-\def\doemphasistypeface#1#2% slow
-  {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!slanted
-     {#1}%
-     {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!italic
-        {#2}%
-        {\doifelsevaluenothing{\??ft\fontclass\normalizedbodyfontsize\c!em}
-           {\doifelsevalue{\??ft\normalizedbodyfontsize\c!em}\v!slanted
-              {#1}%
-              {\doifelsevalue{\??ft\normalizedbodyfontsize\c!em}\v!italic
-                 {#2}%
-                 {\getvalue{\??ft\normalizedbodyfontsize\c!em}}}}
-           {\getvalue{\??ft\fontclass\normalizedbodyfontsize\c!em}}}}}
-
-% \def\doemphasistypeface#1#2%
-%   {\edef\emphasizedtypeface{\csname\??ft\fontclass\normalizedbodyfontsize\c!em\endcsname}%
-%    \ifx\emphasizedtypeface\v!slanted
-%      #1%
-%    \else\ifx\emphasizedtypeface\v!italic
-%      #2%
-%    \else\ifx\emphasizedtypeface\v!empty
-%      \edef\emphasizedtypeface{\csname\??ft\normalizedbodyfontsize\c!em\endcsname}%
-%      \ifx\emphasizedtypeface\v!slanted
-%        #1%
-%      \else\ifx\emphasizedtypeface\v!italic
-%        #2%
-%      \else
-%        \getvalue\emphasizedtypeface
-%      \fi\fi
-%    \else
-%      \getvalue\emphasizedtypeface
-%    \fi\fi\fi}
+% \def\doemphasistypeface#1#2% slow
+%   {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!slanted
+%      {#1}%
+%      {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!italic
+%         {#2}%
+%         {\doifelsevaluenothing{\??ft\fontclass\normalizedbodyfontsize\c!em}
+%            {\doifelsevalue{\??ft\normalizedbodyfontsize\c!em}\v!slanted
+%               {#1}%
+%               {\doifelsevalue{\??ft\normalizedbodyfontsize\c!em}\v!italic
+%                  {#2}%
+%                  {\getvalue{\??ft\normalizedbodyfontsize\c!em}}}}
+%            {\getvalue{\??ft\fontclass\normalizedbodyfontsize\c!em}}}}}
+
+\def\doemphasistypeface#1#2%
+  {\edef\emphasizedtypeface{\csname\??ft\fontclass\normalizedbodyfontsize\c!em\endcsname}%
+   \ifx\emphasizedtypeface\v!slanted
+     #1%
+   \else\ifx\emphasizedtypeface\v!italic
+     #2%
+   \else\ifx\emphasizedtypeface\v!empty
+     \edef\emphasizedtypeface{\csname\??ft\normalizedbodyfontsize\c!em\endcsname}%
+     \ifx\emphasizedtypeface\v!slanted
+       #1%
+     \else\ifx\emphasizedtypeface\v!italic
+       #2%
+     \else
+       \getvalue\emphasizedtypeface
+     \fi\fi
+   \else
+     \getvalue\emphasizedtypeface
+   \fi\fi\fi}
 
 \def\emphasistypeface{\doemphasistypeface\sl\it}
 \def\emphasisboldface{\doemphasistypeface\bs\bi}
@@ -3182,7 +3205,7 @@
 %D The implementation is rather straightforward in using
 %D \type{\halign}.
 
-\fetchruntimecommand \showbodyfont  {\f!fontprefix\s!run}
+\fetchruntimecommand \showbodyfont  {\f!fontprefix\s!run.mkii}
 
 %D \macros
 %D   {showfontstrip, testminimalbaseline, showminimalbaseline}
@@ -3193,9 +3216,9 @@
 %D
 %D \showfontstrip \blank \showminimalbaseline
 
-\fetchruntimecommand \showfontstrip       {\f!fontprefix\s!run}
-\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run}
-\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run}
+\fetchruntimecommand \showfontstrip       {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run.mkii}
 
 %D \macros
 %D   {showkerning}
@@ -3204,7 +3227,7 @@
 %D
 %D \showkerning{Can you guess what kerning is?}
 
-\fetchruntimecommand \showkerning         {\f!fontprefix\s!run}
+\fetchruntimecommand \showkerning         {\f!fontprefix\s!run.mkii}
 
 %D \macros
 %D   {showbodyfontenvironment}
@@ -3217,7 +3240,7 @@
 %D
 %D \showsetup{showbodyfontenvironment}
 
-\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run}
+\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run.mkii}
 
 %D \macros
 %D   {showfont,showfontstyle,showligatures}
@@ -3233,11 +3256,11 @@
 
 % to be internationalized
 
-\fetchruntimecommand \showfont      {\f!fontprefix\s!run}
-\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run}
-\fetchruntimecommand \showligature  {\f!fontprefix\s!run}
-\fetchruntimecommand \showligatures {\f!fontprefix\s!run}
-\fetchruntimecommand \showcharratio {\f!fontprefix\s!run}
+\fetchruntimecommand \showfont      {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showligature  {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showligatures {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showcharratio {\f!fontprefix\s!run.mkii}
 
 %D \macros
 %D   {getglyph, symbolicfont}
@@ -3746,7 +3769,7 @@
 
 \def\dodefinestyleinstance[#1][#2][#3][#4]% [name] [rm|ss|tt|..] [sl|bf|...] [whatever]
   {\iffirstargument
-     \doifundefined{#1}{\definestylecollection[#1]}%
+     \ifcsname#1\endcsname\else\definestylecollection[#1]\fi
    \fi
    \iffourthargument
      \setvalue{\??sx#1:#2:#3}{#4}%
@@ -3756,7 +3779,7 @@
      \letvalue{\??sx#1::#2}\empty
    \fi\fi\fi}
 
-\unexpanded\def\styleinstance[#1]% will be faster
+\unexpanded\def\styleinstance[#1]% will be made faster
   {%\begingroup\normalexpanded{\noexpand\infofont[#1:\fontstyle:\fontalternative]}\endgroup
    \executeifdefined{\??sx#1:\fontstyle:\fontalternative}%
   {\executeifdefined{\??sx#1:\fontstyle:\s!default}%
diff --git a/tex/context/base/font-jap.mkii b/tex/context/base/font-jap.mkii
new file mode 100644
index 000000000..42480df43
--- /dev/null
+++ b/tex/context/base/font-jap.mkii
@@ -0,0 +1,83 @@
+%D \module
+%D   [       file=font-jap,
+%D        version=2006.01.13,
+%D          title=\CONTEXT\ Font Macros,
+%D       subtitle=Japanese,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D    suggestions=Wang Lei,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifx\handlejapaneseunicodeglyph\undefined \else \endinput              \fi
+\ifx\handlechineseunicodeglyph \undefined          \input font-chi.tex \fi
+
+\writestatus{loading}{ConTeXt Font Macros / Japanese}
+
+\unprotect
+
+\newif\iftracejapanese
+
+\let\japaneseencoding\empty
+
+\def\setjapaneseencoding
+  {\getfontfileparameters\unicodestyle
+   \ifx\currentfontfileencoding\undefined \else
+     \let\japaneseencoding\currentfontfileencoding
+   \fi}
+
+\def\japaneseunicodescale  {\chineseunicodescale  }
+\def\japaneseunicodeheight {\chineseunicodeheight }
+\def\japaneseunicodedepth  {\chineseunicodedepth  }
+\def\japaneseinterglyphskip{\chineseinterglyphskip}
+\def\japanesesurroundskip  {\chinesesurroundskip  }
+
+\setupunicodefont
+  [japanese]
+  [       \c!scale=\japaneseunicodescale,
+         \c!height=\japaneseunicodeheight,
+          \c!depth=\japaneseunicodedepth,
+          \c!strut=\v!yes,
+ \c!interlinespace=\v!yes,
+     \c!conversion=\japanesenumber,
+       \c!commands=\setjapaneseencoding, % needed for digits
+        \c!command=\handlejapaneseunicodeglyph]
+
+\def\japanesenumber{\numbers}
+
+\def\handlejapaneseunicodeglyph
+  {\begingroup
+%    \let\chineseunicodescale  \japaneseunicodescale
+%    \let\chineseunicodeheight \japaneseunicodeheight
+%    \let\chineseunicodedepth  \japaneseunicodedepth
+%    \let\chineseinterglyphskip\japaneseinterglyphskip
+%    \let\chinesesurroundskip  \japanesesurroundskip
+   \iftracejapanese\tracechinesetrue\else\tracechinesefalse\fi
+   \handlechineseunicodeglyph
+   \endgroup}
+
+\doifelse \currentregime {utf} {
+
+    % todo: typescripts
+
+    \definefontsynonym [JapaneseRegular]    [uni-cybercjk-][encoding=cjk-uni]
+    \definefontsynonym [JapaneseSlanted]    [uni-cybercjk-][encoding=cjk-uni]
+    \definefontsynonym [JapaneseItalic]     [uni-cybercjk-][encoding=cjk-uni]
+    \definefontsynonym [JapaneseBold]       [uni-cybercjk-][encoding=cjk-uni]
+    \definefontsynonym [JapaneseBoldSlanted][uni-cybercjk-][encoding=cjk-uni]
+    \definefontsynonym [JapaneseBoldItalic] [uni-cybercjk-][encoding=cjk-uni]
+
+    \loadmapfile[uni-cybercjk.map]
+
+    \defineunicodefont [Japanese] [Japanese]  [japanese]
+
+} {
+    \writestatus{Japanese}{No fonts defined}
+}
+
+\Japanese
+
+\protect \endinput
diff --git a/tex/context/base/font-jap.tex b/tex/context/base/font-jap.tex
deleted file mode 100644
index 42480df43..000000000
--- a/tex/context/base/font-jap.tex
+++ /dev/null
@@ -1,83 +0,0 @@
-%D \module
-%D   [       file=font-jap,
-%D        version=2006.01.13,
-%D          title=\CONTEXT\ Font Macros,
-%D       subtitle=Japanese,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D    suggestions=Wang Lei,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\ifx\handlejapaneseunicodeglyph\undefined \else \endinput              \fi
-\ifx\handlechineseunicodeglyph \undefined          \input font-chi.tex \fi
-
-\writestatus{loading}{ConTeXt Font Macros / Japanese}
-
-\unprotect
-
-\newif\iftracejapanese
-
-\let\japaneseencoding\empty
-
-\def\setjapaneseencoding
-  {\getfontfileparameters\unicodestyle
-   \ifx\currentfontfileencoding\undefined \else
-     \let\japaneseencoding\currentfontfileencoding
-   \fi}
-
-\def\japaneseunicodescale  {\chineseunicodescale  }
-\def\japaneseunicodeheight {\chineseunicodeheight }
-\def\japaneseunicodedepth  {\chineseunicodedepth  }
-\def\japaneseinterglyphskip{\chineseinterglyphskip}
-\def\japanesesurroundskip  {\chinesesurroundskip  }
-
-\setupunicodefont
-  [japanese]
-  [       \c!scale=\japaneseunicodescale,
-         \c!height=\japaneseunicodeheight,
-          \c!depth=\japaneseunicodedepth,
-          \c!strut=\v!yes,
- \c!interlinespace=\v!yes,
-     \c!conversion=\japanesenumber,
-       \c!commands=\setjapaneseencoding, % needed for digits
-        \c!command=\handlejapaneseunicodeglyph]
-
-\def\japanesenumber{\numbers}
-
-\def\handlejapaneseunicodeglyph
-  {\begingroup
-%    \let\chineseunicodescale  \japaneseunicodescale
-%    \let\chineseunicodeheight \japaneseunicodeheight
-%    \let\chineseunicodedepth  \japaneseunicodedepth
-%    \let\chineseinterglyphskip\japaneseinterglyphskip
-%    \let\chinesesurroundskip  \japanesesurroundskip
-   \iftracejapanese\tracechinesetrue\else\tracechinesefalse\fi
-   \handlechineseunicodeglyph
-   \endgroup}
-
-\doifelse \currentregime {utf} {
-
-    % todo: typescripts
-
-    \definefontsynonym [JapaneseRegular]    [uni-cybercjk-][encoding=cjk-uni]
-    \definefontsynonym [JapaneseSlanted]    [uni-cybercjk-][encoding=cjk-uni]
-    \definefontsynonym [JapaneseItalic]     [uni-cybercjk-][encoding=cjk-uni]
-    \definefontsynonym [JapaneseBold]       [uni-cybercjk-][encoding=cjk-uni]
-    \definefontsynonym [JapaneseBoldSlanted][uni-cybercjk-][encoding=cjk-uni]
-    \definefontsynonym [JapaneseBoldItalic] [uni-cybercjk-][encoding=cjk-uni]
-
-    \loadmapfile[uni-cybercjk.map]
-
-    \defineunicodefont [Japanese] [Japanese]  [japanese]
-
-} {
-    \writestatus{Japanese}{No fonts defined}
-}
-
-\Japanese
-
-\protect \endinput
diff --git a/tex/context/base/font-map.lua b/tex/context/base/font-map.lua
index 35cfaf32f..c597d4855 100644
--- a/tex/context/base/font-map.lua
+++ b/tex/context/base/font-map.lua
@@ -6,13 +6,16 @@ if not modules then modules = { } end modules ['font-map'] = {
     license   = "see context related readme files"
 }
 
-local match, format, find = string.match, string.format, string.find
+local match, format, find, concat = string.match, string.format, string.find, table.concat
+
+local trace_loading = false  trackers.register("otf.loading", function(v) trace_loading = v end)
 
 local ctxcatcodes = tex.ctxcatcodes
 
 --[[ldx--
 Eventually this code will disappear because map files are kind
 of obsolete. Some code may move to runtime or auxiliary modules.
+The name to unciode related code will stay of course.
 --ldx]]--
 
 fonts               = fonts               or { }
@@ -123,3 +126,93 @@ function fonts.map.load_file(filename, entries, encodings)
     end
     return entries, encodings
 end
+
+function fonts.map.load_lum_table(filename)
+    local lumname = file.replacesuffix(file.basename(filename),"lum")
+    local lumfile = resolvers.find_file(lumname,"map") or ""
+    if lumfile ~= "" and lfs.isfile(lumfile) then
+        if trace_loading or trace_unimapping then
+            logs.report("load otf","enhance: loading %s ",lumfile)
+        end
+        lumunic = dofile(lumfile)
+        return lumunic, lumfile
+    end
+end
+
+local hex     = lpeg.R("AF","09")
+local hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end
+local dec     = (lpeg.R("09")^1) / tonumber
+local period  = lpeg.P(".")
+
+local unicode = lpeg.P("uni")   * (hexfour * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexfour^1) * lpeg.Cc(true))
+local index   = lpeg.P("index") * dec * lpeg.Cc(false)
+
+local parser  = unicode + index
+
+local parsers = { }
+
+function fonts.map.make_name_parser(str)
+    if not str or str == "" then
+        return parser
+    else
+        local p = parsers[str]
+        if not p then
+            p = lpeg.P(str) * period * dec * lpeg.Cc(false)
+            parsers[str] = p
+        end
+        return p
+    end
+end
+
+--~ local parser = fonts.map.make_name_parser("Japan1")
+--~ local function test(str)
+--~     local b, a = parser:match(str)
+--~     print((a and table.serialize(b)) or b)
+--~ end
+--~ test("uni1234")
+--~ test("uni1234.xx")
+--~ test("uni12349876")
+--~ test("index1234")
+--~ test("Japan1.123")
+
+function fonts.map.tounicode16(unicode)
+    if unicode < 0x10000 then
+        return format("%04X",unicode)
+    else
+        return format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00)
+    end
+end
+
+function fonts.map.tounicode16sequence(unicodes)
+    local t = { }
+    for l=1,#unicodes do
+        local unicode = unicodes[l]
+        if unicode < 0x10000 then
+            t[l] = format("%04X",unicode)
+        else
+            t[l] = format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00)
+        end
+    end
+    return concat(t)
+end
+
+--~ This is quite a bit faster but at the cost of some memory but if we
+--~ do this we will also use it elsewhere so let's not follow this route
+--~ now. I might use this method in the plain variant (no caching there)
+--~ but then I need a flag that distinguishes between code branches.
+--~
+--~ local cache = { }
+--~
+--~ function fonts.map.tounicode16(unicode)
+--~     local s = cache[unicode]
+--~     if not s then
+--~         if unicode < 0x10000 then
+--~             s = format("%04X",unicode)
+--~         else
+--~             s = format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00)
+--~         end
+--~         cache[unicode] = s
+--~     end
+--~     return s
+--~ end
+
diff --git a/tex/context/base/font-mis.lua b/tex/context/base/font-mis.lua
index 520f9e7a6..cc20b9711 100644
--- a/tex/context/base/font-mis.lua
+++ b/tex/context/base/font-mis.lua
@@ -11,7 +11,7 @@ local lower, strip = string.lower, string.strip
 
 fonts.otf = fonts.otf or { }
 
-fonts.otf.version = fonts.otf.version or 2.626
+fonts.otf.version = fonts.otf.version or 2.628
 fonts.otf.pack    = true
 fonts.otf.cache   = containers.define("fonts", "otf", fonts.otf.version, true)
 
diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua
index 00ac596cc..f3b3f5481 100644
--- a/tex/context/base/font-otf.lua
+++ b/tex/context/base/font-otf.lua
@@ -12,12 +12,13 @@ local concat, getn, utfbyte = table.concat, table.getn, utf.byte
 local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip
 local type, next, tonumber, tostring = type, next, tonumber, tostring
 
-local trace_private   = false  trackers.register("otf.private",      function(v) trace_private      = v end)
-local trace_loading   = false  trackers.register("otf.loading",      function(v) trace_loading      = v end)
-local trace_features  = false  trackers.register("otf.features",     function(v) trace_features     = v end)
-local trace_dynamics  = false  trackers.register("otf.dynamics",     function(v) trace_dynamics     = v end)
-local trace_sequences = false  trackers.register("otf.sequences",    function(v) trace_sequences    = v end)
-local trace_math      = false  trackers.register("otf.math",         function(v) trace_math         = v end)
+local trace_private    = false  trackers.register("otf.private",      function(v) trace_private      = v end)
+local trace_loading    = false  trackers.register("otf.loading",      function(v) trace_loading      = v end)
+local trace_features   = false  trackers.register("otf.features",     function(v) trace_features     = v end)
+local trace_dynamics   = false  trackers.register("otf.dynamics",     function(v) trace_dynamics     = v end)
+local trace_sequences  = false  trackers.register("otf.sequences",    function(v) trace_sequences    = v end)
+local trace_math       = false  trackers.register("otf.math",         function(v) trace_math         = v end)
+local trace_unimapping = false  trackers.register("otf.unimapping",   function(v) trace_unimapping   = v end)
 
 --~ trackers.enable("otf.loading")
 
@@ -81,7 +82,7 @@ otf.features.default = otf.features.default or { }
 otf.enhancers        = otf.enhancers        or { }
 otf.glists           = { "gsub", "gpos" }
 
-otf.version          = 2.626 -- beware: also sync font-mis.lua
+otf.version          = 2.628 -- beware: also sync font-mis.lua
 otf.pack             = true  -- beware: also sync font-mis.lua
 otf.syncspace        = true
 otf.notdef           = false
@@ -464,15 +465,18 @@ otf.enhancers["analyse marks"] = function(data,filename)
     end
 end
 
-local other = lpeg.C((1 - lpeg.S("_."))^0)
-local ligsplitter = lpeg.Ct(other * (lpeg.P("_") * other)^0)
+local separator   = lpeg.S("_.")
+local other       = lpeg.C((1 - separator)^1)
+local ligsplitter = lpeg.Ct(other * (separator * other)^0)
 
---~ print(splitter:match("this"))
---~ print(splitter:match("this.that"))
---~ print(splitter:match("such_so_more"))
---~ print(splitter:match("such_so_more.that"))
+--~ print(table.serialize(ligsplitter:match("this")))
+--~ print(table.serialize(ligsplitter:match("this.that")))
+--~ print(table.serialize(ligsplitter:match("japan1.123")))
+--~ print(table.serialize(ligsplitter:match("such_so_more")))
+--~ print(table.serialize(ligsplitter:match("such_so_more.that")))
 
 otf.enhancers["analyse unicodes"] = function(data,filename)
+    local tounicode16, tounicode16sequence = fonts.map.tounicode16, fonts.map.tounicode16sequence
     local unicodes = data.luatex.unicodes
     -- we need to move this code
     unicodes['space']  = unicodes['space']  or 32   -- handly later on
@@ -482,53 +486,113 @@ otf.enhancers["analyse unicodes"] = function(data,filename)
     -- the tounicode mapping is sparse and only needed for alternatives
     local tounicode, originals, ns, nl, private, unknown = { }, { }, 0, 0, fonts.private, format("%04X",utfbyte("?"))
     data.luatex.tounicode, data.luatex.originals = tounicode, originals
+    local lumunic, uparser, oparser
+    if false then -- will become an option
+        lumunic = fonts.map.load_lum_table(filename)
+        lumunic = lumunic and lumunic.tounicode
+    end
+    local cidinfo, cidnames, cidcodes = data.cidinfo
+    local usedmap = cidinfo and cidinfo.usedname
+    usedmap = usedmap and fonts.cid.map[usedmap]
+    if usedmap then
+        oparser = usedmap and fonts.map.make_name_parser(cidinfo.ordering)
+        cidnames = usedmap.names
+        cidcodes = usedmap.unicodes
+    end
+    uparser = fonts.map.make_name_parser()
     for index, glyph in next, data.glyphs do
         local name, unic = glyph.name, glyph.unicode or -1 -- play safe
         if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then
-            -- a.whatever or a_b_c.whatever or a_b_c
-            local split = ligsplitter:match(name)
-            if #split == 0 then
-                -- skip
-            elseif #split == 1 then
-                local u = unicodes[split[1]]
-                if u then
-                    if type(u) == "table" then
-                        u = u[1]
-                    end
-                    if u < 0x10000 then
-                        originals[index], tounicode[index] = u, format("%04X",u)
-                    else
-                        originals[index], tounicode[index] = u, format("%04X%04X",u/1024+0xD800,u%1024+0xDC00)
+            local unicode = lumunic and lumunic[name]
+            if unicode then
+                originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
+            end
+            -- cidmap heuristics, beware, there is no guarantee for a match unless
+            -- the chain resolves
+            if not unicode and usedmap then
+                local foundindex = oparser:match(name)
+                if foundindex then
+                    unicode = cidcodes[foundindex] -- name to number
+                    if not unicode then
+                        local reference = cidnames[foundindex] -- number to name
+                        if reference then
+                            local foundindex = oparser:match(reference)
+                            if foundindex then
+                                unicode = cidcodes[foundindex]
+                                if unicode then
+                                    originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
+                                end
+                            end
+                            if not unicode then
+                                local foundcodes, multiple = uparser:match(reference)
+                                if foundcodes then
+                                    if multiple then
+                                        originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true
+                                    else
+                                        originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes
+                                    end
+                                end
+                            end
+                        end
                     end
-                    ns = ns + 1
-                else
-                    originals[index], tounicode[index] = 0xFFFD, "FFFD"
                 end
-            else
-                local as = { }
-                for l=1,#split do
-                    local u = unicodes[split[l]]
-                    if not u then
-                        as[l], split[l] = 0xFFFD, "FFFD"
-                    else
-                        if type(u) == "table" then
-                            u = u[1]
+            end
+            -- a.whatever or a_b_c.whatever or a_b_c (no numbers)
+            if not unicode then
+                local split = ligsplitter:match(name)
+                local nplit = (split and #split) or 0
+                if nplit == 0 then
+                    -- skip
+                elseif nplit == 1 then
+                    unicode = unicodes[split[1]]
+                    if unicode then
+                        if type(unicode) == "table" then
+                            unicode = unicode[1]
                         end
-                        if u < 0x10000 then
-                            as[l], split[l] = u, format("%04X",u)
+                        originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
+                    end
+                else
+                    local done = true
+                    for l=1,nplit do
+                        local u = unicodes[split[l]]
+                        if not u then
+                            done = false
+                            break
+                        elseif type(u) == "table" then
+                            split[l] = u[1]
                         else
-                            as[l], split[l] = u, format("%04X%04X",u/1024+0xD800,u%1024+0xDC00)
+                            split[l] = u
                         end
                     end
+                    if done then
+                        originals[index], tounicode[index], nl, unicode = split, tounicode16sequence(split), nl + 1, true
+                    end
                 end
-                split = concat(split)
-                if split ~= "" then
-                    originals[index], tounicode[index] = as, split
-                    nl = nl + 1
-                else
-                    originals[index], tounicode[index] = 0xFFFD, "FFFD"
+            end
+            -- last resort
+            if not unicode then
+                local foundcodes, multiple = uparser:match(name)
+                if foundcodes then
+                    if multiple then
+                        originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true
+                    else
+                        originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes
+                    end
                 end
             end
+            if not unicode then
+                originals[index], tounicode[index] = 0xFFFD, "FFFD"
+            end
+        end
+    end
+    if trace_unimapping then
+        for index, glyph in table.sortedpairs(data.glyphs) do
+            local toun, name, unic = tounicode[index], glyph.name, glyph.unicode or -1 -- play safe
+            if toun then
+                logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun)
+            else
+                logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X",index,name,unic)
+            end
         end
     end
     if trace_loading and (ns > 0 or nl > 0) then
@@ -546,16 +610,14 @@ otf.enhancers["analyse subtables"] = function(data,filename)
     for _, g in next, { data.gsub, data.gpos } do
         for k=1,#g do
             local gk = g[k]
-
-local typ = gk.type
-if typ == "gsub_contextchain" or typ == "gpos_contextchain" then
-    gk.chain = 1
-elseif typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain" then
-    gk.chain = -1
-else
-    gk.chain = 0
-end
-
+            local typ = gk.type
+            if typ == "gsub_contextchain" or typ == "gpos_contextchain" then
+                gk.chain = 1
+            elseif typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain" then
+                gk.chain = -1
+            else
+                gk.chain = 0
+            end
             local features = gk.features
             if features then
                 sequences[#sequences+1] = gk
@@ -610,8 +672,9 @@ otf.enhancers["merge cid fonts"] = function(data,filename)
         local cidinfo = data.cidinfo
         local verbose = fonts.verbose
         if cidinfo.registry then
-            local cidmap = fonts.cid.getmap and fonts.cid.getmap(cidinfo.registry,cidinfo.ordering,cidinfo.supplement)
+            local cidmap, cidname = fonts.cid.getmap(cidinfo.registry,cidinfo.ordering,cidinfo.supplement)
             if cidmap then
+                cidinfo.usedname = cidmap.usedname
                 local glyphs, uni_to_int, int_to_uni, nofnames, nofunicodes = { }, { }, { }, 0, 0
                 local unicodes, names = cidmap.unicodes, cidmap.names
                 for n, subfont in next, data.subfonts do
@@ -1343,7 +1406,7 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th
         }
         -- indices maps from unicodes to indices
         for u, i in next, indices do
-            characters[u] = { } -- we need this because for instance we add protruding info
+            characters[u] = { } -- we need this because for instance we add protruding info and loop over characters
             descriptions[u] = glyphs[i]
         end
         -- math
diff --git a/tex/context/base/font-otn.lua b/tex/context/base/font-otn.lua
index 719c0ca80..3c11b84f1 100644
--- a/tex/context/base/font-otn.lua
+++ b/tex/context/base/font-otn.lua
@@ -150,7 +150,7 @@ trackers.register("*otf.sample","otf.steps,otf.actions,otf.analyzing")
 local insert_node_after = node.insert_after
 local delete_node       = nodes.delete
 local copy_node         = node.copy
-local slide_node_list   = node.slide
+local find_node_tail    = node.tail or node.slide
 local set_attribute     = node.set_attribute
 local has_attribute     = node.has_attribute
 
@@ -1905,7 +1905,7 @@ function fonts.methods.node.otf.features(head,font,attr)
                 local handler = handlers[typ]
                 local thecache = featuredata[typ] or { }
                 -- we need to get rid of this slide !
-                start = slide_node_list(head) -- slow (we can store tail because there's always a skip at the end): todo
+                start = find_node_tail(head) -- slow (we can store tail because there's always a skip at the end): todo
                 while start do
                     local id = start.id
                     if id == glyph then
diff --git a/tex/context/base/font-run.mkii b/tex/context/base/font-run.mkii
new file mode 100644
index 000000000..0a0ddd057
--- /dev/null
+++ b/tex/context/base/font-run.mkii
@@ -0,0 +1,326 @@
+%D \module
+%D   [       file=font-run,
+%D        version=1998.09.11, % (second)
+%D        version=2001.02.20, % (third)
+%D          title=\CONTEXT\ Font Macros,
+%D       subtitle=Runtime Macros,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 is hooked into the core macros and saves some
+%D format space.]
+
+\unprotect
+
+\gdef\@@onlyenglish#1%
+  {\blank{\tttf \type {#1} is only available in the english interface}\blank}
+
+\gdef\dosetshowfonttitle#1%
+  {\tabskip\zeropoint
+   \parindent\zeropoint
+   \setlocalhsize
+   \doifelsenothing{#1}
+     {\def\title{[\the\bodyfontsize]}}
+     {\switchtobodyfont[#1]\def\title{[#1]}}
+   \doifsomething\fontclass
+     {\doifnot{[\fontclass]}\title
+        {\edef\title{[\fontclass]\space\title}}}}
+
+\gdef\showbodyfont
+  {\dosingleempty\doshowbodyfont}
+
+\gdef\doshowbodyfont[#1]%
+  {\ifinsidefloat\else\startbaselinecorrection\fi
+   \vbox
+     {\dosetshowfonttitle{#1}%
+      \def\bigstrut##1##2%
+        {\hbox{\vrule
+           \!!height##1\strutht
+           \!!depth ##2\strutdp
+           \!!width \zeropoint}}
+      \def\next##1##2##3%
+        {\tf##3\sc##3%
+         \sl##3\it##3\bf##3\bs##3\bi##3%
+         \tfx##3\tfxx##3%
+         \tfa##3\tfb##3\tfc##3\tfd##3&\cr}%
+      \halign to \localhsize
+        {\bigstrut{1.5}{2}##&\vrule##
+         \tabskip=\!!zeropoint \!!plus 1fill
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil#\vrule
+         \tabskip=\!!zeropoint\cr
+         \noalign{\hrule}
+         &\multispan{29}{\vrule\hfil\tttf\strut\title\hfil
+          \llap{\string\mr\hbox to 1em{\hss:\hss}$\mr \languageparameter\c!text$\quad}\vrule}\cr
+         \noalign{\hrule}\next{}{\tt\string}{}
+         \noalign{\hrule}\next{\tt\string\rm}\rm{\languageparameter\c!text}
+         \noalign{\hrule}\next{\tt\string\ss}\ss{\languageparameter\c!text}
+         \noalign{\hrule}\next{\tt\string\tt}\tt{\languageparameter\c!text}
+         \noalign{\hrule}}}
+   \ifinsidefloat\else\stopbaselinecorrection\fi}
+
+\gdef\showbodyfontenvironment
+  {\dosingleempty\doshowbodyfontenvironment}
+
+\gdef\doshowbodyfontenvironment[#1]%
+  {\ifinsidefloat\else\startbaselinecorrection\fi
+   \vbox
+     {\dosetshowfonttitle{#1}%
+      \def\next##1%
+        {&&\getvalue{\bodyfontvariable{##1\s!text}}%
+         &&\getvalue{\bodyfontvariable{##1\s!script}}%
+         &&\getvalue{\bodyfontvariable{##1\s!scriptscript}}%
+         &&\getvalue{\bodyfontvariable{##1\c!x}}%
+         &&\getvalue{\bodyfontvariable{##1\c!xx}}%
+         &&\getvalue{\bodyfontvariable{##1\interfaced\v!small}}%
+         &&\getvalue{\bodyfontvariable{##1\interfaced\v!big}}%
+         &&\edef\next{\getvalue{\bodyfontvariable{##1\c!interlinespace}}}\ifx\next\empty not set\else\next\fi&\cr
+         \noalign{\hrule}}
+      \halign to \localhsize
+        {##&\vrule##\strut
+         \tabskip=\!!zeropoint \!!plus 1fill
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil#\vrule
+         \tabskip\zeropoint\cr
+         \noalign{\hrule}
+         &\multispan{17}{\vrule\hfil\tttf\strut\title\hfil}\vrule\cr
+         \noalign{\hrule}
+         &&\tttf\tx\s!text&&\tttf\tx\s!script&&\tttf\tx\s!scriptscript
+         &&\tttf\tx\c!x&&\tttf\tx\c!xx&&\tttf\tx\v!small&&\tttf\tx\v!big
+         &&\tttf\tx\c!interlinespace&\cr
+         \noalign{\hrule}
+         \@EA\globalprocesscommalist\@EA[\bodyfontenvironmentlist]\next}}
+   \ifinsidefloat\else\stopbaselinecorrection\fi}
+
+\gdef\showfont
+  {\dodoubleempty\doshowfont}
+
+\gdef\doshowfont[#1][#2]%
+  {\bgroup
+   \boxrulewidth=.1pt
+   \setupcolors[\c!state=\v!local]%
+   \iffirstargument
+     \definefont[\s!dummy][#1]\dummy
+   \else\ifdim2.5em>.05\hsize \tx
+        \ifdim2.5em>.05\hsize \txx
+   \fi\fi\fi
+   \ifinsidefloat\else\startbaselinecorrection\fi
+   \vbox\bgroup
+   \forgetall
+   \startoverlay
+     {\vbox
+        {\tf \setstrut \dummy
+         \localcolortrue \offinterlineskip
+         \dostepwiserecurse{0}{15}{1}
+           {\let\row\recurselevel
+            \hbox
+              {\red
+               \dostepwiserecurse{0}{15}{1}
+                 {\let\col\recurselevel
+                  \@EA\scratchcounter\normaldblquote\hexnumber\row\hexnumber\col\relax
+                  \edef\rowcol{\the\scratchcounter}%
+                  \iffontchar\font\scratchcounter
+                    \setbox\scratchbox\ruledhbox{\black\char\scratchcounter}%
+                    \ifdim\wd\scratchbox>\zeropoint
+                      \donetrue \else \donefalse
+                    \fi
+                  \else
+                    \setbox\scratchbox\hbox{\gray\vrule\!!width1ex\!!height.5ex\!!depth.5ex}%
+                  \fi
+                  \startoverlay
+                    {\tf\vbox to 2.5em
+                       {\vss
+                        \hbox to 2.5em
+                          {\dummy\ifdim\interwordspace=\zeropoint
+                             \setbox\scratchbox\hbox
+                               {\raise.5\dp\scratchbox\hbox
+                                  {\lower.5\ht\scratchbox\copy\scratchbox}}%
+                             \ht\scratchbox\zeropoint
+                             \dp\scratchbox\zeropoint
+                           \else
+                             \ht\scratchbox\strutht
+                             \dp\scratchbox\strutdp
+                             \strut
+                           \fi
+                           \hss\copy\scratchbox\hss}
+                        \vss}}
+                    {\tf\vbox to 2.3em
+                       {\ifdone
+                          \hsize2.4em
+                          \blue
+                          \edef\theshowfontspecs
+                            {\ifnum\hyphenchar\font=\rowcol hyph\else
+                             \ifnum\skewchar  \font=\rowcol skew\fi\fi}%
+                          \tinyfont % after \edef, else wrong font analyzed
+                          \doifnot\v!unknown{#2}{{\red\theshowfontspecs}}\hfill\number\rowcol
+                          \vfill
+                          \octnumber\rowcol\hfill\lchexnumbers\rowcol
+                          \par
+                        \fi}}
+                  \stopoverlay}}}
+          \par}}
+     {\tf\basegrid[\c!nx=16,\c!ny=16,\c!dx=2.5,\c!dy=2.5,\c!unit=em]}
+   \stopoverlay
+   \nointerlineskip
+   \vskip2pt
+   % the \noexpand before \blank is needed for non etex
+   \edef\ascii{name: {\noexpand\black\fontname\font}}
+   \def\do##1##2{\ifx##1\undefined\else\ifx##1\empty\else##2\fi\fi}%
+   \doifelse\v!unknown{#2}
+     {\edef\theshowfontspecs
+        {name: {\noexpand\black\fontname\font}}}
+     {\edef\theshowfontspecs
+        {name: {\noexpand\black\fontname\font}\noexpand\quad
+         \do\currentencoding{encoding: {\noexpand\black\currentencoding\noexpand\quad}}%
+         \do\currentmapping {mapping:  {\noexpand\black\currentmapping \noexpand\quad}}%
+         \do\fonthandling   {handling: {\noexpand\black\fonthandling                 }}}}%
+   \tf % also sets em
+   \hbox to 40em{\blue\hfill\tinyfont\setstrut\strut\theshowfontspecs}
+   \egroup
+   \ifinsidefloat\else\stopbaselinecorrection\fi
+   \egroup}
+
+\gdef\showfontstyle
+  {\dotripleempty\doshowfontstyle}
+
+\gdef\doshowfontstyle[#1][#2][#3]%
+  {\ifthirdargument
+     \bgroup
+     \raggedright
+     \switchtobodyfont[#1]
+     \def\dodocommand##1##2%
+       {\starttextrule{\tttf #1 ##1 ##2}
+        \nobreak \getvalue{##2}%
+        \dorecurse{255}
+          {\iffontchar\font\recurselevel\relax
+             \char\recurselevel\relax\space
+           \fi}
+        \par \nobreak
+        \stoptextrule}
+     \def\docommand##1%
+       {\getvalue{##1}\processcommacommand[#3]{\dodocommand{##1}}}
+     \processcommalist[#2]\docommand
+     \egroup
+   \else\ifsecondargument
+     \showfontstyle[#1][#2][\fontalternativelist]% math is gone
+   \else
+     \showfontstyle[#1][\c!rm]\showfontstyle[#1][\c!ss]
+     \showfontstyle[#1][\c!tt]\showfontstyle[#1][\c!mm]
+   \fi\fi}
+
+\gdef\showligature#1%
+  {\hbox{\type{#1}\enspace\red\ruledhbox{\black#1}}}
+
+\gdef\showligatures[#1]%
+  {\ifx\starttabulate\undefined
+     \@@onlyenglish\showligatures
+   \else
+     \bgroup
+     \setupcolors[\c!state=\v!local]%
+     \def\show##1{\hbox{\red\ruledhbox{\black##1}}}%
+     \definefont[\s!dummy][#1]\dummy
+     \starttabulate[|*{9}{c|}]
+     \NC\type{ff}\NC\type{fi}\NC\type{fl}\NC\type{ffi}\NC\type{ffl}\NC
+        \type{``}\NC\type{''}\NC\type{--}\NC\type{---}\NC\NR
+     \NC\show{ff}\NC\show{fi}\NC\show{fl}\NC\show{ffi}\NC\show{ffl}\NC
+        \show{``}\NC\show{''}\NC\show{--}\NC\show{---}\NC\NR
+     \stoptabulate
+     \egroup
+   \fi}
+
+\gdef\showfontstrip
+  {\dosingleempty\doshowfontstrip}
+
+\gdef\doshowfontstrip[#1]%
+  {\ifx\starttabulate\undefined
+     \@@onlyenglish\showfontstrip
+   \else
+     \bgroup
+     \def\dofontstripa##1##2%
+       {\tttf\string##1}
+     \def\dofontstripb##1##2%
+       {\ruledhbox{\switchtobodyfont[#1]##1{##2}}}
+     \def\dofontstripc##1##2%
+       {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
+        \tt\tfx\the\ht\scratchbox}%
+     \def\dofontstripd##1##2%
+       {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
+        \tt\tfx\the\wd\scratchbox}%
+     \def\fontstrip##1##2##3%
+       {\NC##2\rm{##3}\NC
+           ##2\ss{##3}\NC
+           ##2\tt{##3}\NC
+           ##2\mathematics{##3}\NC
+           \tttf##1\NR}
+     \starttabulate[|c|c|c|c|c|]
+       \fontstrip\relax\dofontstripa\empty
+       \TB
+       \fontstrip\relax\dofontstripb{xxxx}
+       \fontstrip\relax\dofontstripb{12345}
+       \fontstrip\relax\dofontstripb{(Agw)}
+       \TB
+       \fontstrip{(x height)}\dofontstripc{x}
+       \fontstrip{(m  width)}\dofontstripd{m}
+     \stoptabulate
+     \egroup
+   \fi}
+
+\ifx\databox\undefined \newbox\databox \fi
+
+\gdef\testminimalbaseline#1%
+  {\setbox\databox\ruledhbox{#1}%
+   \scratchdimen\ht\databox
+   \advance\scratchdimen\dp\databox
+   \scratchtoks{#1}%
+   \expanded
+     {\NC \ruledhbox{\the\scratchtoks}
+      \noexpand \NC ->
+      \noexpand \NC \the\scratchdimen
+      \noexpand \NC =
+      \noexpand \NC \the\ht\databox
+      \noexpand \NC +
+      \noexpand \NC \the\dp\databox
+      \noexpand \NC \ifdim\scratchdimen<\baselineskip <
+                    \else\ifdim\scratchdimen=\baselineskip =
+                    \else > \fi\fi
+      \noexpand \NC \the\baselineskip
+      \noexpand \NC (\ifdim\scratchdimen>\baselineskip not \fi ok)
+      \noexpand \NC \noexpand \NR }}
+
+\gdef\showminimalbaseline
+  {\ifx\starttabulate\undefined
+     \@@onlyenglish\showminimalbaseline
+   \else
+     \starttabulate[||T|T|T|T|T|T|T|T|T|]
+     \testminimalbaseline{\hbox to 1em{\hss\showstruts\strut\hss}}%
+     \testminimalbaseline{(/)}%
+     \testminimalbaseline{$\frac{1}{2}x^2_3$}
+     \stoptabulate
+   \fi}
+
+\gdef\showkerning#1%
+  {\bgroup
+   \let\MPfshowcommand\ruledhbox
+   \setMPtext\s!dummy{#1}%
+   \startMPcode draw textext(\MPstring\s!dummy);\stopMPcode
+   \egroup}
+
+\gdef\showcharratio
+  {\dowithnextboxcontent
+     {\switchtobodyfont[10pt]}%
+     {(\expanded{\withoutpt\the\nextboxht},%
+       \expanded{\withoutpt\the\nextboxdp})}%
+     \hbox}
+
+\protect \endinput
diff --git a/tex/context/base/font-run.mkiv b/tex/context/base/font-run.mkiv
new file mode 100644
index 000000000..5dd8d6086
--- /dev/null
+++ b/tex/context/base/font-run.mkiv
@@ -0,0 +1,326 @@
+%D \module
+%D   [       file=font-run,
+%D        version=1998.09.11, % (second)
+%D        version=2001.02.20, % (third)
+%D          title=\CONTEXT\ Font Macros,
+%D       subtitle=Runtime Macros,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 is hooked into the core macros and saves some
+%D format space.]
+
+\unprotect
+
+\gdef\@@onlyenglish#1%
+  {\blank{\tttf \type {#1} is only available in the english interface}\blank}
+
+\gdef\dosetshowfonttitle#1%
+  {\tabskip\zeropoint
+   \parindent\zeropoint
+   \setlocalhsize
+   \doifelsenothing{#1}
+     {\def\title{[\the\bodyfontsize]}}
+     {\switchtobodyfont[#1]\def\title{[#1]}}
+   \doifsomething\fontclass
+     {\doifnot{[\fontclass]}\title
+        {\edef\title{[\fontclass]\space\title}}}}
+
+\gdef\showbodyfont
+  {\dosingleempty\doshowbodyfont}
+
+\gdef\doshowbodyfont[#1]%
+  {\ifinsidefloat\else\startbaselinecorrection\fi
+   \vbox
+     {\dosetshowfonttitle{#1}%
+      \def\bigstrut##1##2%
+        {\hbox{\vrule
+           \!!height##1\strutht
+           \!!depth ##2\strutdp
+           \!!width \zeropoint}}
+      \def\next##1##2##3%
+        {\tf##3\sc##3%
+         \sl##3\it##3\bf##3\bs##3\bi##3%
+         \tfx##3\tfxx##3%
+         \tfa##3\tfb##3\tfc##3\tfd##3&\cr}%
+      \halign to \localhsize
+        {\bigstrut{1.5}{2}##&\vrule##
+         \tabskip=\!!zeropoint \!!plus 1fill
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil#\vrule
+         \tabskip=\!!zeropoint\cr
+         \noalign{\hrule}
+         &\multispan{29}{\vrule\hfil\tttf\strut\title\hfil
+          \llap{\string\mr\hbox to 1em{\hss:\hss}$\mr \languageparameter\c!text$\quad}\vrule}\cr
+         \noalign{\hrule}\next{}{\tt\string}{}
+         \noalign{\hrule}\next{\tt\string\rm}\rm{\languageparameter\c!text}
+         \noalign{\hrule}\next{\tt\string\ss}\ss{\languageparameter\c!text}
+         \noalign{\hrule}\next{\tt\string\tt}\tt{\languageparameter\c!text}
+         \noalign{\hrule}}}
+   \ifinsidefloat\else\stopbaselinecorrection\fi}
+
+\gdef\showbodyfontenvironment
+  {\dosingleempty\doshowbodyfontenvironment}
+
+\gdef\doshowbodyfontenvironment[#1]%
+  {\ifinsidefloat\else\startbaselinecorrection\fi
+   \vbox
+     {\dosetshowfonttitle{#1}%
+      \def\next##1%
+        {&&\getvalue{\bodyfontvariable{##1\s!text}}%
+         &&\getvalue{\bodyfontvariable{##1\s!script}}%
+         &&\getvalue{\bodyfontvariable{##1\s!scriptscript}}%
+         &&\getvalue{\bodyfontvariable{##1\c!x}}%
+         &&\getvalue{\bodyfontvariable{##1\c!xx}}%
+         &&\getvalue{\bodyfontvariable{##1\interfaced\v!small}}%
+         &&\getvalue{\bodyfontvariable{##1\interfaced\v!big}}%
+         &&\edef\next{\getvalue{\bodyfontvariable{##1\c!interlinespace}}}\ifx\next\empty not set\else\next\fi&\cr
+         \noalign{\hrule}}
+      \halign to \localhsize
+        {##&\vrule##\strut
+         \tabskip=\!!zeropoint \!!plus 1fill
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+         &\hfil##\hfil&\vrule##&\hfil##\hfil#\vrule
+         \tabskip\zeropoint\cr
+         \noalign{\hrule}
+         &\multispan{17}{\vrule\hfil\tttf\strut\title\hfil}\vrule\cr
+         \noalign{\hrule}
+         &&\tttf\tx\s!text&&\tttf\tx\s!script&&\tttf\tx\s!scriptscript
+         &&\tttf\tx\c!x&&\tttf\tx\c!xx&&\tttf\tx\v!small&&\tttf\tx\v!big
+         &&\tttf\tx\c!interlinespace&\cr
+         \noalign{\hrule}
+         \@EA\globalprocesscommalist\@EA[\bodyfontenvironmentlist]\next}}
+   \ifinsidefloat\else\stopbaselinecorrection\fi}
+
+\gdef\showfont
+  {\dodoubleempty\doshowfont}
+
+\gdef\doshowfont[#1][#2]%
+  {\bgroup
+   \boxrulewidth=.1pt
+   \setupcolors[\c!state=\v!local]%
+   \iffirstargument
+     \definefont[\s!dummy][#1]\dummy
+   \else\ifdim2.5em>.05\hsize \tx
+        \ifdim2.5em>.05\hsize \txx
+   \fi\fi\fi
+   \ifinsidefloat\else\startbaselinecorrection\fi
+   \vbox\bgroup
+   \forgetall
+   \startoverlay
+     {\vbox
+        {\tf \setstrut \dummy
+         \offinterlineskip
+         \dostepwiserecurse{0}{15}{1}
+           {\let\row\recurselevel
+            \hbox
+              {\red
+               \dostepwiserecurse{0}{15}{1}
+                 {\let\col\recurselevel
+                  \@EA\scratchcounter\normaldblquote\hexnumber\row\hexnumber\col\relax
+                  \edef\rowcol{\the\scratchcounter}%
+                  \iffontchar\font\scratchcounter
+                    \setbox\scratchbox\ruledhbox{\black\char\scratchcounter}%
+                    \ifdim\wd\scratchbox>\zeropoint
+                      \donetrue \else \donefalse
+                    \fi
+                  \else
+                    \setbox\scratchbox\hbox{\gray\vrule\!!width1ex\!!height.5ex\!!depth.5ex}%
+                  \fi
+                  \startoverlay
+                    {\tf\vbox to 2.5em
+                       {\vss
+                        \hbox to 2.5em
+                          {\dummy\ifdim\interwordspace=\zeropoint
+                             \setbox\scratchbox\hbox
+                               {\raise.5\dp\scratchbox\hbox
+                                  {\lower.5\ht\scratchbox\copy\scratchbox}}%
+                             \ht\scratchbox\zeropoint
+                             \dp\scratchbox\zeropoint
+                           \else
+                             \ht\scratchbox\strutht
+                             \dp\scratchbox\strutdp
+                             \strut
+                           \fi
+                           \hss\copy\scratchbox\hss}
+                        \vss}}
+                    {\tf\vbox to 2.3em
+                       {\ifdone
+                          \hsize2.4em
+                          \blue
+                          \edef\theshowfontspecs
+                            {\ifnum\hyphenchar\font=\rowcol hyph\else
+                             \ifnum\skewchar  \font=\rowcol skew\fi\fi}%
+                          \tinyfont % after \edef, else wrong font analyzed
+                          \doifnot\v!unknown{#2}{{\red\theshowfontspecs}}\hfill\number\rowcol
+                          \vfill
+                          \octnumber\rowcol\hfill\lchexnumbers\rowcol
+                          \par
+                        \fi}}
+                  \stopoverlay}}}
+          \par}}
+     {\tf\basegrid[\c!nx=16,\c!ny=16,\c!dx=2.5,\c!dy=2.5,\c!unit=em]}
+   \stopoverlay
+   \nointerlineskip
+   \vskip2pt
+   % the \noexpand before \blank is needed for non etex
+   \edef\ascii{name: {\noexpand\black\fontname\font}}
+   \def\do##1##2{\ifx##1\undefined\else\ifx##1\empty\else##2\fi\fi}%
+   \doifelse\v!unknown{#2}
+     {\edef\theshowfontspecs
+        {name: {\noexpand\black\fontname\font}}}
+     {\edef\theshowfontspecs
+        {name: {\noexpand\black\fontname\font}\noexpand\quad
+         \do\currentencoding{encoding: {\noexpand\black\currentencoding\noexpand\quad}}%
+         \do\currentmapping {mapping:  {\noexpand\black\currentmapping \noexpand\quad}}%
+         \do\fonthandling   {handling: {\noexpand\black\fonthandling                 }}}}%
+   \tf % also sets em
+   \hbox to 40em{\blue\hfill\tinyfont\setstrut\strut\theshowfontspecs}
+   \egroup
+   \ifinsidefloat\else\stopbaselinecorrection\fi
+   \egroup}
+
+\gdef\showfontstyle
+  {\dotripleempty\doshowfontstyle}
+
+\gdef\doshowfontstyle[#1][#2][#3]%
+  {\ifthirdargument
+     \bgroup
+     \raggedright
+     \switchtobodyfont[#1]
+     \def\dodocommand##1##2%
+       {\starttextrule{\tttf #1 ##1 ##2}
+        \nobreak \getvalue{##2}%
+        \dorecurse{255}
+          {\iffontchar\font\recurselevel\relax
+             \char\recurselevel\relax\space
+           \fi}
+        \par \nobreak
+        \stoptextrule}
+     \def\docommand##1%
+       {\getvalue{##1}\processcommacommand[#3]{\dodocommand{##1}}}
+     \processcommalist[#2]\docommand
+     \egroup
+   \else\ifsecondargument
+     \showfontstyle[#1][#2][\fontalternativelist]% math is gone
+   \else
+     \showfontstyle[#1][\c!rm]\showfontstyle[#1][\c!ss]
+     \showfontstyle[#1][\c!tt]\showfontstyle[#1][\c!mm]
+   \fi\fi}
+
+\gdef\showligature#1%
+  {\hbox{\type{#1}\enspace\red\ruledhbox{\black#1}}}
+
+\gdef\showligatures[#1]%
+  {\ifx\starttabulate\undefined
+     \@@onlyenglish\showligatures
+   \else
+     \bgroup
+     \setupcolors[\c!state=\v!local]%
+     \def\show##1{\hbox{\red\ruledhbox{\black##1}}}%
+     \definefont[\s!dummy][#1]\dummy
+     \starttabulate[|*{9}{c|}]
+     \NC\type{ff}\NC\type{fi}\NC\type{fl}\NC\type{ffi}\NC\type{ffl}\NC
+        \type{``}\NC\type{''}\NC\type{--}\NC\type{---}\NC\NR
+     \NC\show{ff}\NC\show{fi}\NC\show{fl}\NC\show{ffi}\NC\show{ffl}\NC
+        \show{``}\NC\show{''}\NC\show{--}\NC\show{---}\NC\NR
+     \stoptabulate
+     \egroup
+   \fi}
+
+\gdef\showfontstrip
+  {\dosingleempty\doshowfontstrip}
+
+\gdef\doshowfontstrip[#1]%
+  {\ifx\starttabulate\undefined
+     \@@onlyenglish\showfontstrip
+   \else
+     \bgroup
+     \def\dofontstripa##1##2%
+       {\tttf\string##1}
+     \def\dofontstripb##1##2%
+       {\ruledhbox{\switchtobodyfont[#1]##1{##2}}}
+     \def\dofontstripc##1##2%
+       {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
+        \tt\tfx\the\ht\scratchbox}%
+     \def\dofontstripd##1##2%
+       {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
+        \tt\tfx\the\wd\scratchbox}%
+     \def\fontstrip##1##2##3%
+       {\NC##2\rm{##3}\NC
+           ##2\ss{##3}\NC
+           ##2\tt{##3}\NC
+           ##2\mathematics{##3}\NC
+           \tttf##1\NR}
+     \starttabulate[|c|c|c|c|c|]
+       \fontstrip\relax\dofontstripa\empty
+       \TB
+       \fontstrip\relax\dofontstripb{xxxx}
+       \fontstrip\relax\dofontstripb{12345}
+       \fontstrip\relax\dofontstripb{(Agw)}
+       \TB
+       \fontstrip{(x height)}\dofontstripc{x}
+       \fontstrip{(m  width)}\dofontstripd{m}
+     \stoptabulate
+     \egroup
+   \fi}
+
+\ifx\databox\undefined \newbox\databox \fi
+
+\gdef\testminimalbaseline#1%
+  {\setbox\databox\ruledhbox{#1}%
+   \scratchdimen\ht\databox
+   \advance\scratchdimen\dp\databox
+   \scratchtoks{#1}%
+   \expanded
+     {\NC \ruledhbox{\the\scratchtoks}
+      \noexpand \NC ->
+      \noexpand \NC \the\scratchdimen
+      \noexpand \NC =
+      \noexpand \NC \the\ht\databox
+      \noexpand \NC +
+      \noexpand \NC \the\dp\databox
+      \noexpand \NC \ifdim\scratchdimen<\baselineskip <
+                    \else\ifdim\scratchdimen=\baselineskip =
+                    \else > \fi\fi
+      \noexpand \NC \the\baselineskip
+      \noexpand \NC (\ifdim\scratchdimen>\baselineskip not \fi ok)
+      \noexpand \NC \noexpand \NR }}
+
+\gdef\showminimalbaseline
+  {\ifx\starttabulate\undefined
+     \@@onlyenglish\showminimalbaseline
+   \else
+     \starttabulate[||T|T|T|T|T|T|T|T|T|]
+     \testminimalbaseline{\hbox to 1em{\hss\showstruts\strut\hss}}%
+     \testminimalbaseline{(/)}%
+     \testminimalbaseline{$\frac{1}{2}x^2_3$}
+     \stoptabulate
+   \fi}
+
+\gdef\showkerning#1%
+  {\bgroup
+   \let\MPfshowcommand\ruledhbox
+   \setMPtext\s!dummy{#1}%
+   \startMPcode draw textext(\MPstring\s!dummy);\stopMPcode
+   \egroup}
+
+\gdef\showcharratio
+  {\dowithnextboxcontent
+     {\switchtobodyfont[10pt]}%
+     {(\expanded{\withoutpt\the\nextboxht},%
+       \expanded{\withoutpt\the\nextboxdp})}%
+     \hbox}
+
+\protect \endinput
diff --git a/tex/context/base/font-run.tex b/tex/context/base/font-run.tex
deleted file mode 100644
index 0a0ddd057..000000000
--- a/tex/context/base/font-run.tex
+++ /dev/null
@@ -1,326 +0,0 @@
-%D \module
-%D   [       file=font-run,
-%D        version=1998.09.11, % (second)
-%D        version=2001.02.20, % (third)
-%D          title=\CONTEXT\ Font Macros,
-%D       subtitle=Runtime Macros,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 is hooked into the core macros and saves some
-%D format space.]
-
-\unprotect
-
-\gdef\@@onlyenglish#1%
-  {\blank{\tttf \type {#1} is only available in the english interface}\blank}
-
-\gdef\dosetshowfonttitle#1%
-  {\tabskip\zeropoint
-   \parindent\zeropoint
-   \setlocalhsize
-   \doifelsenothing{#1}
-     {\def\title{[\the\bodyfontsize]}}
-     {\switchtobodyfont[#1]\def\title{[#1]}}
-   \doifsomething\fontclass
-     {\doifnot{[\fontclass]}\title
-        {\edef\title{[\fontclass]\space\title}}}}
-
-\gdef\showbodyfont
-  {\dosingleempty\doshowbodyfont}
-
-\gdef\doshowbodyfont[#1]%
-  {\ifinsidefloat\else\startbaselinecorrection\fi
-   \vbox
-     {\dosetshowfonttitle{#1}%
-      \def\bigstrut##1##2%
-        {\hbox{\vrule
-           \!!height##1\strutht
-           \!!depth ##2\strutdp
-           \!!width \zeropoint}}
-      \def\next##1##2##3%
-        {\tf##3\sc##3%
-         \sl##3\it##3\bf##3\bs##3\bi##3%
-         \tfx##3\tfxx##3%
-         \tfa##3\tfb##3\tfc##3\tfd##3&\cr}%
-      \halign to \localhsize
-        {\bigstrut{1.5}{2}##&\vrule##
-         \tabskip=\!!zeropoint \!!plus 1fill
-         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
-         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
-         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
-         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
-         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
-         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
-         &\hfil##\hfil&\vrule##&\hfil##\hfil#\vrule
-         \tabskip=\!!zeropoint\cr
-         \noalign{\hrule}
-         &\multispan{29}{\vrule\hfil\tttf\strut\title\hfil
-          \llap{\string\mr\hbox to 1em{\hss:\hss}$\mr \languageparameter\c!text$\quad}\vrule}\cr
-         \noalign{\hrule}\next{}{\tt\string}{}
-         \noalign{\hrule}\next{\tt\string\rm}\rm{\languageparameter\c!text}
-         \noalign{\hrule}\next{\tt\string\ss}\ss{\languageparameter\c!text}
-         \noalign{\hrule}\next{\tt\string\tt}\tt{\languageparameter\c!text}
-         \noalign{\hrule}}}
-   \ifinsidefloat\else\stopbaselinecorrection\fi}
-
-\gdef\showbodyfontenvironment
-  {\dosingleempty\doshowbodyfontenvironment}
-
-\gdef\doshowbodyfontenvironment[#1]%
-  {\ifinsidefloat\else\startbaselinecorrection\fi
-   \vbox
-     {\dosetshowfonttitle{#1}%
-      \def\next##1%
-        {&&\getvalue{\bodyfontvariable{##1\s!text}}%
-         &&\getvalue{\bodyfontvariable{##1\s!script}}%
-         &&\getvalue{\bodyfontvariable{##1\s!scriptscript}}%
-         &&\getvalue{\bodyfontvariable{##1\c!x}}%
-         &&\getvalue{\bodyfontvariable{##1\c!xx}}%
-         &&\getvalue{\bodyfontvariable{##1\interfaced\v!small}}%
-         &&\getvalue{\bodyfontvariable{##1\interfaced\v!big}}%
-         &&\edef\next{\getvalue{\bodyfontvariable{##1\c!interlinespace}}}\ifx\next\empty not set\else\next\fi&\cr
-         \noalign{\hrule}}
-      \halign to \localhsize
-        {##&\vrule##\strut
-         \tabskip=\!!zeropoint \!!plus 1fill
-         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
-         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
-         &\hfil##\hfil&\vrule##&\hfil##\hfil#\vrule
-         \tabskip\zeropoint\cr
-         \noalign{\hrule}
-         &\multispan{17}{\vrule\hfil\tttf\strut\title\hfil}\vrule\cr
-         \noalign{\hrule}
-         &&\tttf\tx\s!text&&\tttf\tx\s!script&&\tttf\tx\s!scriptscript
-         &&\tttf\tx\c!x&&\tttf\tx\c!xx&&\tttf\tx\v!small&&\tttf\tx\v!big
-         &&\tttf\tx\c!interlinespace&\cr
-         \noalign{\hrule}
-         \@EA\globalprocesscommalist\@EA[\bodyfontenvironmentlist]\next}}
-   \ifinsidefloat\else\stopbaselinecorrection\fi}
-
-\gdef\showfont
-  {\dodoubleempty\doshowfont}
-
-\gdef\doshowfont[#1][#2]%
-  {\bgroup
-   \boxrulewidth=.1pt
-   \setupcolors[\c!state=\v!local]%
-   \iffirstargument
-     \definefont[\s!dummy][#1]\dummy
-   \else\ifdim2.5em>.05\hsize \tx
-        \ifdim2.5em>.05\hsize \txx
-   \fi\fi\fi
-   \ifinsidefloat\else\startbaselinecorrection\fi
-   \vbox\bgroup
-   \forgetall
-   \startoverlay
-     {\vbox
-        {\tf \setstrut \dummy
-         \localcolortrue \offinterlineskip
-         \dostepwiserecurse{0}{15}{1}
-           {\let\row\recurselevel
-            \hbox
-              {\red
-               \dostepwiserecurse{0}{15}{1}
-                 {\let\col\recurselevel
-                  \@EA\scratchcounter\normaldblquote\hexnumber\row\hexnumber\col\relax
-                  \edef\rowcol{\the\scratchcounter}%
-                  \iffontchar\font\scratchcounter
-                    \setbox\scratchbox\ruledhbox{\black\char\scratchcounter}%
-                    \ifdim\wd\scratchbox>\zeropoint
-                      \donetrue \else \donefalse
-                    \fi
-                  \else
-                    \setbox\scratchbox\hbox{\gray\vrule\!!width1ex\!!height.5ex\!!depth.5ex}%
-                  \fi
-                  \startoverlay
-                    {\tf\vbox to 2.5em
-                       {\vss
-                        \hbox to 2.5em
-                          {\dummy\ifdim\interwordspace=\zeropoint
-                             \setbox\scratchbox\hbox
-                               {\raise.5\dp\scratchbox\hbox
-                                  {\lower.5\ht\scratchbox\copy\scratchbox}}%
-                             \ht\scratchbox\zeropoint
-                             \dp\scratchbox\zeropoint
-                           \else
-                             \ht\scratchbox\strutht
-                             \dp\scratchbox\strutdp
-                             \strut
-                           \fi
-                           \hss\copy\scratchbox\hss}
-                        \vss}}
-                    {\tf\vbox to 2.3em
-                       {\ifdone
-                          \hsize2.4em
-                          \blue
-                          \edef\theshowfontspecs
-                            {\ifnum\hyphenchar\font=\rowcol hyph\else
-                             \ifnum\skewchar  \font=\rowcol skew\fi\fi}%
-                          \tinyfont % after \edef, else wrong font analyzed
-                          \doifnot\v!unknown{#2}{{\red\theshowfontspecs}}\hfill\number\rowcol
-                          \vfill
-                          \octnumber\rowcol\hfill\lchexnumbers\rowcol
-                          \par
-                        \fi}}
-                  \stopoverlay}}}
-          \par}}
-     {\tf\basegrid[\c!nx=16,\c!ny=16,\c!dx=2.5,\c!dy=2.5,\c!unit=em]}
-   \stopoverlay
-   \nointerlineskip
-   \vskip2pt
-   % the \noexpand before \blank is needed for non etex
-   \edef\ascii{name: {\noexpand\black\fontname\font}}
-   \def\do##1##2{\ifx##1\undefined\else\ifx##1\empty\else##2\fi\fi}%
-   \doifelse\v!unknown{#2}
-     {\edef\theshowfontspecs
-        {name: {\noexpand\black\fontname\font}}}
-     {\edef\theshowfontspecs
-        {name: {\noexpand\black\fontname\font}\noexpand\quad
-         \do\currentencoding{encoding: {\noexpand\black\currentencoding\noexpand\quad}}%
-         \do\currentmapping {mapping:  {\noexpand\black\currentmapping \noexpand\quad}}%
-         \do\fonthandling   {handling: {\noexpand\black\fonthandling                 }}}}%
-   \tf % also sets em
-   \hbox to 40em{\blue\hfill\tinyfont\setstrut\strut\theshowfontspecs}
-   \egroup
-   \ifinsidefloat\else\stopbaselinecorrection\fi
-   \egroup}
-
-\gdef\showfontstyle
-  {\dotripleempty\doshowfontstyle}
-
-\gdef\doshowfontstyle[#1][#2][#3]%
-  {\ifthirdargument
-     \bgroup
-     \raggedright
-     \switchtobodyfont[#1]
-     \def\dodocommand##1##2%
-       {\starttextrule{\tttf #1 ##1 ##2}
-        \nobreak \getvalue{##2}%
-        \dorecurse{255}
-          {\iffontchar\font\recurselevel\relax
-             \char\recurselevel\relax\space
-           \fi}
-        \par \nobreak
-        \stoptextrule}
-     \def\docommand##1%
-       {\getvalue{##1}\processcommacommand[#3]{\dodocommand{##1}}}
-     \processcommalist[#2]\docommand
-     \egroup
-   \else\ifsecondargument
-     \showfontstyle[#1][#2][\fontalternativelist]% math is gone
-   \else
-     \showfontstyle[#1][\c!rm]\showfontstyle[#1][\c!ss]
-     \showfontstyle[#1][\c!tt]\showfontstyle[#1][\c!mm]
-   \fi\fi}
-
-\gdef\showligature#1%
-  {\hbox{\type{#1}\enspace\red\ruledhbox{\black#1}}}
-
-\gdef\showligatures[#1]%
-  {\ifx\starttabulate\undefined
-     \@@onlyenglish\showligatures
-   \else
-     \bgroup
-     \setupcolors[\c!state=\v!local]%
-     \def\show##1{\hbox{\red\ruledhbox{\black##1}}}%
-     \definefont[\s!dummy][#1]\dummy
-     \starttabulate[|*{9}{c|}]
-     \NC\type{ff}\NC\type{fi}\NC\type{fl}\NC\type{ffi}\NC\type{ffl}\NC
-        \type{``}\NC\type{''}\NC\type{--}\NC\type{---}\NC\NR
-     \NC\show{ff}\NC\show{fi}\NC\show{fl}\NC\show{ffi}\NC\show{ffl}\NC
-        \show{``}\NC\show{''}\NC\show{--}\NC\show{---}\NC\NR
-     \stoptabulate
-     \egroup
-   \fi}
-
-\gdef\showfontstrip
-  {\dosingleempty\doshowfontstrip}
-
-\gdef\doshowfontstrip[#1]%
-  {\ifx\starttabulate\undefined
-     \@@onlyenglish\showfontstrip
-   \else
-     \bgroup
-     \def\dofontstripa##1##2%
-       {\tttf\string##1}
-     \def\dofontstripb##1##2%
-       {\ruledhbox{\switchtobodyfont[#1]##1{##2}}}
-     \def\dofontstripc##1##2%
-       {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
-        \tt\tfx\the\ht\scratchbox}%
-     \def\dofontstripd##1##2%
-       {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
-        \tt\tfx\the\wd\scratchbox}%
-     \def\fontstrip##1##2##3%
-       {\NC##2\rm{##3}\NC
-           ##2\ss{##3}\NC
-           ##2\tt{##3}\NC
-           ##2\mathematics{##3}\NC
-           \tttf##1\NR}
-     \starttabulate[|c|c|c|c|c|]
-       \fontstrip\relax\dofontstripa\empty
-       \TB
-       \fontstrip\relax\dofontstripb{xxxx}
-       \fontstrip\relax\dofontstripb{12345}
-       \fontstrip\relax\dofontstripb{(Agw)}
-       \TB
-       \fontstrip{(x height)}\dofontstripc{x}
-       \fontstrip{(m  width)}\dofontstripd{m}
-     \stoptabulate
-     \egroup
-   \fi}
-
-\ifx\databox\undefined \newbox\databox \fi
-
-\gdef\testminimalbaseline#1%
-  {\setbox\databox\ruledhbox{#1}%
-   \scratchdimen\ht\databox
-   \advance\scratchdimen\dp\databox
-   \scratchtoks{#1}%
-   \expanded
-     {\NC \ruledhbox{\the\scratchtoks}
-      \noexpand \NC ->
-      \noexpand \NC \the\scratchdimen
-      \noexpand \NC =
-      \noexpand \NC \the\ht\databox
-      \noexpand \NC +
-      \noexpand \NC \the\dp\databox
-      \noexpand \NC \ifdim\scratchdimen<\baselineskip <
-                    \else\ifdim\scratchdimen=\baselineskip =
-                    \else > \fi\fi
-      \noexpand \NC \the\baselineskip
-      \noexpand \NC (\ifdim\scratchdimen>\baselineskip not \fi ok)
-      \noexpand \NC \noexpand \NR }}
-
-\gdef\showminimalbaseline
-  {\ifx\starttabulate\undefined
-     \@@onlyenglish\showminimalbaseline
-   \else
-     \starttabulate[||T|T|T|T|T|T|T|T|T|]
-     \testminimalbaseline{\hbox to 1em{\hss\showstruts\strut\hss}}%
-     \testminimalbaseline{(/)}%
-     \testminimalbaseline{$\frac{1}{2}x^2_3$}
-     \stoptabulate
-   \fi}
-
-\gdef\showkerning#1%
-  {\bgroup
-   \let\MPfshowcommand\ruledhbox
-   \setMPtext\s!dummy{#1}%
-   \startMPcode draw textext(\MPstring\s!dummy);\stopMPcode
-   \egroup}
-
-\gdef\showcharratio
-  {\dowithnextboxcontent
-     {\switchtobodyfont[10pt]}%
-     {(\expanded{\withoutpt\the\nextboxht},%
-       \expanded{\withoutpt\the\nextboxdp})}%
-     \hbox}
-
-\protect \endinput
diff --git a/tex/context/base/font-tfm.lua b/tex/context/base/font-tfm.lua
index 472f69c8c..8b799df5a 100644
--- a/tex/context/base/font-tfm.lua
+++ b/tex/context/base/font-tfm.lua
@@ -245,7 +245,7 @@ function tfm.do_scale(tfmtable, scaledpoints)
     end
     -- status
     local isvirtual = tfmtable.type == "virtual" or tfmtable.virtualized
-    local hasmath = tfmtable.math_parameters ~= nil or tfmtable.MathConstants ~= nil
+    local hasmath = (tfmtable.math_parameters ~= nil and next(tfmtable.math_parameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil)
     local nodemode = tfmtable.mode == "node"
     local hasquality = tfmtable.auto_expand or tfmtable.auto_protrude
     local hasitalic = tfmtable.has_italic
@@ -293,6 +293,7 @@ function tfm.do_scale(tfmtable, scaledpoints)
     local scaledheight = defaultheight * delta
     local scaleddepth  = defaultdepth  * delta
     local stackmath = tfmtable.ignore_stack_math ~= true
+local private = fonts.private
     for k,v in next, characters do
         local chr, description, index
         if ischanged then
@@ -355,7 +356,7 @@ function tfm.do_scale(tfmtable, scaledpoints)
     --      logs.report("define font","t=%s, u=%s, i=%s, n=%s c=%s",k,chr.tounicode or k,description.index,description.name or '-',description.class or '-')
     --  end
         if tounicode then
-            local tu = tounicode[index]
+            local tu = tounicode[index] -- nb: index!
             if tu then
                 chr.tounicode = tu
             end
@@ -528,6 +529,7 @@ function tfm.do_scale(tfmtable, scaledpoints)
     end
     -- needed for \high cum suis
     local tpx = tp.x_height
+if hasmath then
     if not tp[13] then tp[13] = .86*tpx end  -- mathsupdisplay
     if not tp[14] then tp[14] = .86*tpx end  -- mathsupnormal
     if not tp[15] then tp[15] = .86*tpx end  -- mathsupcramped
@@ -535,11 +537,22 @@ function tfm.do_scale(tfmtable, scaledpoints)
     if not tp[17] then tp[17] = .48*tpx end  -- mathsubcombined
     if not tp[22] then tp[22] =   0     end  -- mathaxisheight
     if t.MathConstants then t.MathConstants.AccentBaseHeight = nil end -- safeguard
+end
     t.tounicode = 1
     t.cidinfo = tfmtable.cidinfo
     -- we have t.name=metricfile and t.fullname=RealName and t.filename=diskfilename
     -- when collapsing fonts, luatex looks as both t.name and t.fullname as ttc files
     -- can have multiple subfonts
+    if hasmath then
+        if trace_defining then
+            logs.report("define font","math enabled for: %s %s %s",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")
+        end
+    else
+        if trace_defining then
+            logs.report("define font","math disabled for: %s %s %s",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")
+        end
+        t.nomath, t.MathConstants = true, nil
+    end
     return t, delta
 end
 
@@ -714,7 +727,7 @@ function tfm.set_features(tfmdata)
                         local value = features[f]
                         if value and fi.tfm[f] then -- brr
                             if tfm.trace_features then
-                                logs.report("define tfm","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown')
+                                logs.report("define font","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown')
                             end
                             fi.tfm[f](tfmdata,value)
                             mode = tfmdata.mode or fonts.mode
diff --git a/tex/context/base/font-uni.mkii b/tex/context/base/font-uni.mkii
index 1b8ce8e43..02ab6ce2c 100644
--- a/tex/context/base/font-uni.mkii
+++ b/tex/context/base/font-uni.mkii
@@ -19,7 +19,7 @@
 \ifnum\texengine=\xetexengine
     \unexpanded\def\uchar#1#2{\char\numexpr#2+#1*\pluscclvi\relax}
     \let\uc\uchar
-    \endinput
+    \expandafter \endinput
 \fi
 
 %D Now comes the more traditional 8 bit \TEX\ hackery.
diff --git a/tex/context/base/font-xtx.mkii b/tex/context/base/font-xtx.mkii
new file mode 100644
index 000000000..5f4b85879
--- /dev/null
+++ b/tex/context/base/font-xtx.mkii
@@ -0,0 +1,357 @@
+%D \module
+%D   [       file=font-xtx,
+%D        version=2004.09.11,
+%D          title=\CONTEXT\ Font Macros,
+%D       subtitle=\XETEX\ Hacks,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifnum\texengine=\xetexengine
+    \writestatus{loading}{ConTeXt Font Macros / XeTeX Hacks}
+\else
+    \endinput
+\fi
+
+\unprotect
+
+%D Loading:
+
+%D for some reason xetex does not support [filename] for tfm files and
+%D quotes also behave kind of strange " vs ' vs [ vs ...
+%D
+%D \starttyping
+%D \font\myfont =  msam7         % ok
+%D \font\myfont = "msam7"        % also ok
+%D \font\myfont = "msam7" at 8pt % error
+%D \stoptyping
+
+\newconditional\tracexetexfonts
+
+%D Because \XETEX\ is not that fast on locating fonts we cache lookups so
+%D that we minimize the test. It saves a little bit of runtime, depending
+%D on the number of fonts loaded (which is normally not that much).
+
+\def\doiffoundXTXfontelse#1#2%
+  {\ifcsname xtx@fnt@#2\somefontspec\endcsname
+     \ifconditional\tracexetexfonts
+       \writestatus\m!fonts{already checked #1: #2\somefontspec\space (state: \number\csname xtx@fnt@#2\somefontspec\endcsname)}%
+     \fi
+   \else
+     \suppressfontnotfounderror\plusone
+     \font\xetextempfont=#2\somefontspec\relax
+     \suppressfontnotfounderror\zerocount
+     \edef\xetextempfont{\fontname\xetextempfont}%
+     \global\expandafter\chardef\csname xtx@fnt@#2\somefontspec\endcsname
+     \ifx\xetextempfont\nullfontname
+       \zerocount \ifconditional\tracexetexfonts
+         \writestatus\m!fonts{not found #1: #2\somefontspec}%
+       \fi
+     \else
+       \plusone \ifconditional\tracexetexfonts
+         \writestatus\m!fonts{found #1: #2\somefontspec}%
+       \fi
+     \fi
+   \fi
+   \ifcase\csname xtx@fnt@#2\somefontspec\endcsname
+     \expandafter\secondoftwoarguments
+   \else
+     \expandafter\firstoftwoarguments
+   \fi}
+
+\def\docheckfontfilenameprefix#1:#2:#3#4\relax
+  {\edef\!!stringa{#1}%
+   \edef\!!stringb{#2}%
+   \ifx\!!stringb\empty
+     % no prefix
+     \let\checkedfontfile\!!stringa
+     \doiffoundXTXfontelse{1a}{\checkedfontfile\checkedfontfeatures}
+       {\edef\checkedfontfile{\checkedfontfile\checkedfontfeatures}}
+       {\doiffoundXTXfontelse{1b}{"\checkedfontfile\checkedfontfeatures"}
+          {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}}
+          {\doiffoundXTXfontelse{1c}{"[\checkedfontfile]\checkedfontfeatures"}
+             {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
+             {}}}%
+   \else\ifx\!!stringa\v!file
+     % force file, only file check when no spaces
+     \let\checkedfontfile\!!stringb
+     \doiffoundXTXfontelse{2a}{"[\checkedfontfile]\checkedfontfeatures"}
+       {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
+       {\doiffoundXTXfontelse{2b}{"\checkedfontfile\checkedfontfeatures"}
+          {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}}
+          {}}%
+   \else\ifx\!!stringa\v!name
+     % force name, always lookup by xetex itself, "" forces otf/ttf/type1
+     \edef\checkedfontfile{"\!!stringb\checkedfontfeatures"}%
+     \ifconditional\tracexetexfonts
+       \writestatus\m!fonts{no checking 3a: \checkedfontfile}%
+     \fi
+   \else
+     % whatever, maybe even xetex spec, forget about features
+     \edef\checkedfontfile{"\!!stringa\!!stringb"}%
+     \ifconditional\tracexetexfonts
+       \writestatus\m!fonts{no checking 3b: \checkedfontfile}%
+     \fi
+   \fi\fi\fi}
+
+\def\checkfontfilename% -- todo: integrate so that we call do.. directly
+  {\expandafter\docheckfontfilename\fontfile*\empty*\relax}
+
+\def\docheckfontfilename#1*#2#3*#4\relax % class overrules file
+  {\edef\checkedfontfeatures
+     {\expandafter\ifx\csname\fontclass\s!features\endcsname\empty
+        \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi
+      \else\expandafter\ifx\csname\fontclass\s!features\endcsname\relax % redundant, will go away
+        \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi
+      \else
+        \csname\fontclass\s!features\endcsname
+      \fi\fi}%
+   \ifx\checkedfontfeatures\empty
+     % done
+   \else
+     \edef\checkedfontfeatures{\executeifdefined{\??fa\checkedfontfeatures}\empty}%
+     \ifx\checkedfontfeatures\empty
+       % done
+     \else
+       \let\convertedfontfeatures\empty
+       \processcommacommand[\checkedfontfeatures]\doconvertfontfeatures % raw
+       \ifx\convertedfontfeatures\empty
+         \let\checkedfontfeatures\empty
+       \else
+         \edef\checkedfontfeatures{:\convertedfontfeatures}%
+       \fi
+     \fi
+   \fi
+   \docheckfontfilenameprefix#1:\empty:\empty\relax
+   \doshowcheckedfontfeatures}
+
+\def\dodoconvertfontfeatures#1=#2#3=#4\relax
+  {\ifx#2\empty
+     % invalid feature
+   \else\ifcsname @xtx@#1@#2#3\endcsname
+       \expandafter\ifx\csname @xtx@#1@#2#3\endcsname\empty\else
+         \edef\convertedfontfeatures{\convertedfontfeatures\csname @xtx@#1@#2#3\endcsname;}%
+       \fi
+   \else
+     \edef\!!stringa{#1}%
+     \edef\!!stringb{#2#3}%
+     \edef\convertedfontfeatures
+       {\convertedfontfeatures
+        \ifx\!!stringb\v!yes
+          +\!!stringa
+        \else\ifx\!!stringb\v!no
+          -\!!stringa
+        \else
+          \!!stringa=\!!stringb
+        \fi\fi;}%
+   \fi\fi}
+
+\def\doconvertfontfeatures#1%
+  {\dodoconvertfontfeatures#1=\empty=\relax}
+
+\def\remapfontfeature #1 #2 #3 {\setevalue{@xtx@#1@#2}{#3}}
+
+% this may move to another file, maybe font-xtx
+
+\remapfontfeature tlig          yes  mapping=tlig
+%remapfontfeature tlig          no   mapping=
+\remapfontfeature trep          yes  {}
+\remapfontfeature trep          no   {}
+\remapfontfeature texligatures  yes  mapping=tlig
+%remapfontfeature texligatures  no   mapping=
+%remapfontfeature texquotes     yes  mapping=tex-text
+%remapfontfeature texquotes     no   mapping=
+
+%D Variants:
+
+\unexpanded\def\variant[#1]%
+  {\dosetscaledfont
+   \font\variantfont\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}} at \scaledfont
+   \variantfont}
+
+%D Possible optimizations:
+
+% \def\updatefontparameters
+%   {\edef\@@fontfeatures{\truefontdata\fontfile\s!features}%
+%    \edef\@@fontskewchar{\truefontdata\fontfile\s!skewchar}}
+
+% \def\setfontcharacteristics
+%   {\updatefontparameters % redundant, will go away, faster too
+%    \the\everyfont}
+
+% \let\synchronizepatternswithfont\relax
+
+%D Names:
+
+% We need to move the feature into the filename else it may be
+% overloaded by another reference. For instance the definition of
+% a regular and caps variant can use the same font.
+
+% We could use an indirect method ... store in 'array' and refer to
+% slot.
+
+\def\definefontsynonym[#1]#2[#3]%
+  {\edef\@@fontname{#1}%
+   \edef\@@fontfile{#3}%
+   \doifnextoptionalelse\dodefinefontsynonym\nodefinefontsynonym}
+
+\def\nodefinefontsynonym
+  {\@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile}
+
+\def\dodefinefontsynonym[#1]%
+  {\edef\@@fontdata{#1}%
+   \ifx\@@fontdata\empty
+     \nodefinefontsynonym
+   \else
+     \ifx\fontclass\empty
+       \getfontparameters
+     \else
+       \getglobalfontparameters
+     \fi
+     \ifcsname\??ff\@@fontfile\s!features\endcsname
+       \@EA\edef\csname\??ff\fontclass\@@fontname\endcsname{\@@fontfile*\csname\??ff\@@fontfile\s!features\endcsname}%
+       \@EA\let\csname\??ff\@@fontfile\s!features\endcsname\undefined
+     \else
+       \nodefinefontsynonym
+     \fi
+   \fi}
+
+\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
+
+% simple version
+%
+% \def\truefontname#1%
+%   {\@EA\dotruefontname#1*\relax}
+%
+% \def\dotruefontname#1*#2\relax
+%   {\ifcsname\??ff\fontclass#1\endcsname
+%      \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+%    \else\ifcsname\??ff#1\endcsname
+%      \@EA\truefontname\csname\??ff#1\endcsname
+%    \else
+%      #1%
+%    \fi\fi}
+%
+% last counts
+%
+% \def\truefontname#1%
+%   {\@EA\dotruefontname#1*\empty*\relax}
+%
+% \def\dotruefontname#1*#2#3*#4\relax
+%   {\ifcsname\??ff\fontclass#1\endcsname
+%      \ifx#2\empty
+%        \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+%      \else
+%        \@EA\truefontname\csname\??ff\fontclass#1\endcsname*#2#3%
+%      \fi
+%    \else\ifcsname\??ff#1\endcsname
+%      \ifx#2\empty
+%        \@EA\truefontname\csname\??ff#1\endcsname
+%      \else
+%        \@EA\truefontname\csname\??ff#1\endcsname*#2#3%
+%      \fi
+%    \else
+%      \ifx#2\empty
+%        #1%
+%      \else
+%        #1*#2#3%
+%      \fi
+%    \fi\fi}
+%
+% first counts
+
+\def\truefontname#1%
+  {\@EA\dotruefontname#1*\empty*\relax}
+
+\def\dotruefontname#1*#2#3*#4\relax
+  {\ifcsname\??ff\fontclass#1\endcsname
+     \ifx#2\empty
+       \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+     \else
+       \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname*#2#3%
+     \fi
+   \else\ifcsname\??ff#1\endcsname
+     \ifx#2\empty
+       \@EA\truefontname\csname\??ff#1\endcsname
+     \else
+       \@EA\redotruefontname\csname\??ff#1\endcsname*#2#3%
+     \fi
+   \else
+     #1\ifx#2\empty\else*#2#3\fi
+   \fi\fi}
+
+\def\redotruefontname#1%
+  {\@EA\dodotruefontname#1*\relax}
+
+\def\dodotruefontname#1*#2\relax
+  {\ifcsname\??ff\fontclass#1\endcsname
+     \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname
+   \else\ifcsname\??ff#1\endcsname
+     \@EA\redotruefontname\csname\??ff#1\endcsname
+   \else
+     #1%
+   \fi\fi}
+
+%D Default:
+
+\def\defaultfontfile{file:lmmono10-regular}
+
+%D Maybe:
+
+% \def\updatefontparameters
+%   {\edef\@@fontfeatures{\truefontdata\fontfile    \s!features}%
+%    \edef\@@fontskewchar{\truefontdata\fontfile    \s!skewchar}}
+
+% \def\setfontcharacteristics
+%   {%\updatefontparameters % redundant, will go away, faster too
+%    \the\everyfont
+%    \synchronizepatternswithfont}
+
+\protect \endinput
+
+% \starttypescript[serif] [myzhfont]
+%     \definefontsynonym [Serif]           [file:SimSun]
+%     \definefontsynonym [SerifBold]       [file:SimSun]
+%     \definefontsynonym [SerifItalic]     [file:SimSun]
+%     \definefontsynonym [SerifBoldItalic] [file:SimSun]
+% \stoptypescript
+% \starttypescript[sans] [myzhfont]
+%     \definefontsynonym [Sans]           [file:SimSun]
+%     \definefontsynonym [SansBold]       [file:SimSun]
+%     \definefontsynonym [SansItalic]     [file:SimSun]
+%     \definefontsynonym [SansBoldItalic] [file:SimSun]
+% \stoptypescript
+% \starttypescript[mono] [myzhfont]
+%     \definefontsynonym [Mono]           [file:SimSun]
+%     \definefontsynonym [MonoBold]       [file:SimSun]
+%     \definefontsynonym [MonoItalic]     [file:SimSun]
+%     \definefontsynonym [MonoBoldItalic] [file:SimSun]
+% \stoptypescript
+% \definetypeface [myzhfont] [rm] [serif][myzhfont]   [default]
+% \definetypeface [myzhfont] [ss] [sans] [myzhfont]   [default]
+% \definetypeface [myzhfont] [tt] [mono] [myzhfont]   [default]
+
+% \starttext
+%     % on windows: make sure fonts.conf has no cache mentioned
+%     %
+%     % 64 sec xetex, 11 sec luatex (56 sec xetex when \nobigmath)
+%     %
+%       \setupbodyfont[myzhfont] \dorecurse{10000}{{hello {\switchtobodyfont[myzhfont] 你好}}\par}
+%     %
+%     % 67 sec xetex, 11.5 sec luatex
+%     %
+%     % \dorecurse{10000}{{hello {\switchtobodyfont[myzhfont] 你好}}\par}
+%     %
+%     % 5 sec xetex, 7 sec luatex
+%     %
+%     % \setupbodyfont[myzhfont]  \dorecurse{10000}{{hello {你好}}\par}
+%     %
+%     % 5 sec xetex, 7 sec luatex
+%     %
+%     % \setupbodyfont[myzhfont]  \dorecurse{10000}{{\bf hello {你好}}\par}
+% \stoptext
+
diff --git a/tex/context/base/font-xtx.tex b/tex/context/base/font-xtx.tex
deleted file mode 100644
index 5f4b85879..000000000
--- a/tex/context/base/font-xtx.tex
+++ /dev/null
@@ -1,357 +0,0 @@
-%D \module
-%D   [       file=font-xtx,
-%D        version=2004.09.11,
-%D          title=\CONTEXT\ Font Macros,
-%D       subtitle=\XETEX\ Hacks,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright=\PRAGMA]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\ifnum\texengine=\xetexengine
-    \writestatus{loading}{ConTeXt Font Macros / XeTeX Hacks}
-\else
-    \endinput
-\fi
-
-\unprotect
-
-%D Loading:
-
-%D for some reason xetex does not support [filename] for tfm files and
-%D quotes also behave kind of strange " vs ' vs [ vs ...
-%D
-%D \starttyping
-%D \font\myfont =  msam7         % ok
-%D \font\myfont = "msam7"        % also ok
-%D \font\myfont = "msam7" at 8pt % error
-%D \stoptyping
-
-\newconditional\tracexetexfonts
-
-%D Because \XETEX\ is not that fast on locating fonts we cache lookups so
-%D that we minimize the test. It saves a little bit of runtime, depending
-%D on the number of fonts loaded (which is normally not that much).
-
-\def\doiffoundXTXfontelse#1#2%
-  {\ifcsname xtx@fnt@#2\somefontspec\endcsname
-     \ifconditional\tracexetexfonts
-       \writestatus\m!fonts{already checked #1: #2\somefontspec\space (state: \number\csname xtx@fnt@#2\somefontspec\endcsname)}%
-     \fi
-   \else
-     \suppressfontnotfounderror\plusone
-     \font\xetextempfont=#2\somefontspec\relax
-     \suppressfontnotfounderror\zerocount
-     \edef\xetextempfont{\fontname\xetextempfont}%
-     \global\expandafter\chardef\csname xtx@fnt@#2\somefontspec\endcsname
-     \ifx\xetextempfont\nullfontname
-       \zerocount \ifconditional\tracexetexfonts
-         \writestatus\m!fonts{not found #1: #2\somefontspec}%
-       \fi
-     \else
-       \plusone \ifconditional\tracexetexfonts
-         \writestatus\m!fonts{found #1: #2\somefontspec}%
-       \fi
-     \fi
-   \fi
-   \ifcase\csname xtx@fnt@#2\somefontspec\endcsname
-     \expandafter\secondoftwoarguments
-   \else
-     \expandafter\firstoftwoarguments
-   \fi}
-
-\def\docheckfontfilenameprefix#1:#2:#3#4\relax
-  {\edef\!!stringa{#1}%
-   \edef\!!stringb{#2}%
-   \ifx\!!stringb\empty
-     % no prefix
-     \let\checkedfontfile\!!stringa
-     \doiffoundXTXfontelse{1a}{\checkedfontfile\checkedfontfeatures}
-       {\edef\checkedfontfile{\checkedfontfile\checkedfontfeatures}}
-       {\doiffoundXTXfontelse{1b}{"\checkedfontfile\checkedfontfeatures"}
-          {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}}
-          {\doiffoundXTXfontelse{1c}{"[\checkedfontfile]\checkedfontfeatures"}
-             {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
-             {}}}%
-   \else\ifx\!!stringa\v!file
-     % force file, only file check when no spaces
-     \let\checkedfontfile\!!stringb
-     \doiffoundXTXfontelse{2a}{"[\checkedfontfile]\checkedfontfeatures"}
-       {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
-       {\doiffoundXTXfontelse{2b}{"\checkedfontfile\checkedfontfeatures"}
-          {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}}
-          {}}%
-   \else\ifx\!!stringa\v!name
-     % force name, always lookup by xetex itself, "" forces otf/ttf/type1
-     \edef\checkedfontfile{"\!!stringb\checkedfontfeatures"}%
-     \ifconditional\tracexetexfonts
-       \writestatus\m!fonts{no checking 3a: \checkedfontfile}%
-     \fi
-   \else
-     % whatever, maybe even xetex spec, forget about features
-     \edef\checkedfontfile{"\!!stringa\!!stringb"}%
-     \ifconditional\tracexetexfonts
-       \writestatus\m!fonts{no checking 3b: \checkedfontfile}%
-     \fi
-   \fi\fi\fi}
-
-\def\checkfontfilename% -- todo: integrate so that we call do.. directly
-  {\expandafter\docheckfontfilename\fontfile*\empty*\relax}
-
-\def\docheckfontfilename#1*#2#3*#4\relax % class overrules file
-  {\edef\checkedfontfeatures
-     {\expandafter\ifx\csname\fontclass\s!features\endcsname\empty
-        \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi
-      \else\expandafter\ifx\csname\fontclass\s!features\endcsname\relax % redundant, will go away
-        \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi
-      \else
-        \csname\fontclass\s!features\endcsname
-      \fi\fi}%
-   \ifx\checkedfontfeatures\empty
-     % done
-   \else
-     \edef\checkedfontfeatures{\executeifdefined{\??fa\checkedfontfeatures}\empty}%
-     \ifx\checkedfontfeatures\empty
-       % done
-     \else
-       \let\convertedfontfeatures\empty
-       \processcommacommand[\checkedfontfeatures]\doconvertfontfeatures % raw
-       \ifx\convertedfontfeatures\empty
-         \let\checkedfontfeatures\empty
-       \else
-         \edef\checkedfontfeatures{:\convertedfontfeatures}%
-       \fi
-     \fi
-   \fi
-   \docheckfontfilenameprefix#1:\empty:\empty\relax
-   \doshowcheckedfontfeatures}
-
-\def\dodoconvertfontfeatures#1=#2#3=#4\relax
-  {\ifx#2\empty
-     % invalid feature
-   \else\ifcsname @xtx@#1@#2#3\endcsname
-       \expandafter\ifx\csname @xtx@#1@#2#3\endcsname\empty\else
-         \edef\convertedfontfeatures{\convertedfontfeatures\csname @xtx@#1@#2#3\endcsname;}%
-       \fi
-   \else
-     \edef\!!stringa{#1}%
-     \edef\!!stringb{#2#3}%
-     \edef\convertedfontfeatures
-       {\convertedfontfeatures
-        \ifx\!!stringb\v!yes
-          +\!!stringa
-        \else\ifx\!!stringb\v!no
-          -\!!stringa
-        \else
-          \!!stringa=\!!stringb
-        \fi\fi;}%
-   \fi\fi}
-
-\def\doconvertfontfeatures#1%
-  {\dodoconvertfontfeatures#1=\empty=\relax}
-
-\def\remapfontfeature #1 #2 #3 {\setevalue{@xtx@#1@#2}{#3}}
-
-% this may move to another file, maybe font-xtx
-
-\remapfontfeature tlig          yes  mapping=tlig
-%remapfontfeature tlig          no   mapping=
-\remapfontfeature trep          yes  {}
-\remapfontfeature trep          no   {}
-\remapfontfeature texligatures  yes  mapping=tlig
-%remapfontfeature texligatures  no   mapping=
-%remapfontfeature texquotes     yes  mapping=tex-text
-%remapfontfeature texquotes     no   mapping=
-
-%D Variants:
-
-\unexpanded\def\variant[#1]%
-  {\dosetscaledfont
-   \font\variantfont\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}} at \scaledfont
-   \variantfont}
-
-%D Possible optimizations:
-
-% \def\updatefontparameters
-%   {\edef\@@fontfeatures{\truefontdata\fontfile\s!features}%
-%    \edef\@@fontskewchar{\truefontdata\fontfile\s!skewchar}}
-
-% \def\setfontcharacteristics
-%   {\updatefontparameters % redundant, will go away, faster too
-%    \the\everyfont}
-
-% \let\synchronizepatternswithfont\relax
-
-%D Names:
-
-% We need to move the feature into the filename else it may be
-% overloaded by another reference. For instance the definition of
-% a regular and caps variant can use the same font.
-
-% We could use an indirect method ... store in 'array' and refer to
-% slot.
-
-\def\definefontsynonym[#1]#2[#3]%
-  {\edef\@@fontname{#1}%
-   \edef\@@fontfile{#3}%
-   \doifnextoptionalelse\dodefinefontsynonym\nodefinefontsynonym}
-
-\def\nodefinefontsynonym
-  {\@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile}
-
-\def\dodefinefontsynonym[#1]%
-  {\edef\@@fontdata{#1}%
-   \ifx\@@fontdata\empty
-     \nodefinefontsynonym
-   \else
-     \ifx\fontclass\empty
-       \getfontparameters
-     \else
-       \getglobalfontparameters
-     \fi
-     \ifcsname\??ff\@@fontfile\s!features\endcsname
-       \@EA\edef\csname\??ff\fontclass\@@fontname\endcsname{\@@fontfile*\csname\??ff\@@fontfile\s!features\endcsname}%
-       \@EA\let\csname\??ff\@@fontfile\s!features\endcsname\undefined
-     \else
-       \nodefinefontsynonym
-     \fi
-   \fi}
-
-\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
-
-% simple version
-%
-% \def\truefontname#1%
-%   {\@EA\dotruefontname#1*\relax}
-%
-% \def\dotruefontname#1*#2\relax
-%   {\ifcsname\??ff\fontclass#1\endcsname
-%      \@EA\truefontname\csname\??ff\fontclass#1\endcsname
-%    \else\ifcsname\??ff#1\endcsname
-%      \@EA\truefontname\csname\??ff#1\endcsname
-%    \else
-%      #1%
-%    \fi\fi}
-%
-% last counts
-%
-% \def\truefontname#1%
-%   {\@EA\dotruefontname#1*\empty*\relax}
-%
-% \def\dotruefontname#1*#2#3*#4\relax
-%   {\ifcsname\??ff\fontclass#1\endcsname
-%      \ifx#2\empty
-%        \@EA\truefontname\csname\??ff\fontclass#1\endcsname
-%      \else
-%        \@EA\truefontname\csname\??ff\fontclass#1\endcsname*#2#3%
-%      \fi
-%    \else\ifcsname\??ff#1\endcsname
-%      \ifx#2\empty
-%        \@EA\truefontname\csname\??ff#1\endcsname
-%      \else
-%        \@EA\truefontname\csname\??ff#1\endcsname*#2#3%
-%      \fi
-%    \else
-%      \ifx#2\empty
-%        #1%
-%      \else
-%        #1*#2#3%
-%      \fi
-%    \fi\fi}
-%
-% first counts
-
-\def\truefontname#1%
-  {\@EA\dotruefontname#1*\empty*\relax}
-
-\def\dotruefontname#1*#2#3*#4\relax
-  {\ifcsname\??ff\fontclass#1\endcsname
-     \ifx#2\empty
-       \@EA\truefontname\csname\??ff\fontclass#1\endcsname
-     \else
-       \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname*#2#3%
-     \fi
-   \else\ifcsname\??ff#1\endcsname
-     \ifx#2\empty
-       \@EA\truefontname\csname\??ff#1\endcsname
-     \else
-       \@EA\redotruefontname\csname\??ff#1\endcsname*#2#3%
-     \fi
-   \else
-     #1\ifx#2\empty\else*#2#3\fi
-   \fi\fi}
-
-\def\redotruefontname#1%
-  {\@EA\dodotruefontname#1*\relax}
-
-\def\dodotruefontname#1*#2\relax
-  {\ifcsname\??ff\fontclass#1\endcsname
-     \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname
-   \else\ifcsname\??ff#1\endcsname
-     \@EA\redotruefontname\csname\??ff#1\endcsname
-   \else
-     #1%
-   \fi\fi}
-
-%D Default:
-
-\def\defaultfontfile{file:lmmono10-regular}
-
-%D Maybe:
-
-% \def\updatefontparameters
-%   {\edef\@@fontfeatures{\truefontdata\fontfile    \s!features}%
-%    \edef\@@fontskewchar{\truefontdata\fontfile    \s!skewchar}}
-
-% \def\setfontcharacteristics
-%   {%\updatefontparameters % redundant, will go away, faster too
-%    \the\everyfont
-%    \synchronizepatternswithfont}
-
-\protect \endinput
-
-% \starttypescript[serif] [myzhfont]
-%     \definefontsynonym [Serif]           [file:SimSun]
-%     \definefontsynonym [SerifBold]       [file:SimSun]
-%     \definefontsynonym [SerifItalic]     [file:SimSun]
-%     \definefontsynonym [SerifBoldItalic] [file:SimSun]
-% \stoptypescript
-% \starttypescript[sans] [myzhfont]
-%     \definefontsynonym [Sans]           [file:SimSun]
-%     \definefontsynonym [SansBold]       [file:SimSun]
-%     \definefontsynonym [SansItalic]     [file:SimSun]
-%     \definefontsynonym [SansBoldItalic] [file:SimSun]
-% \stoptypescript
-% \starttypescript[mono] [myzhfont]
-%     \definefontsynonym [Mono]           [file:SimSun]
-%     \definefontsynonym [MonoBold]       [file:SimSun]
-%     \definefontsynonym [MonoItalic]     [file:SimSun]
-%     \definefontsynonym [MonoBoldItalic] [file:SimSun]
-% \stoptypescript
-% \definetypeface [myzhfont] [rm] [serif][myzhfont]   [default]
-% \definetypeface [myzhfont] [ss] [sans] [myzhfont]   [default]
-% \definetypeface [myzhfont] [tt] [mono] [myzhfont]   [default]
-
-% \starttext
-%     % on windows: make sure fonts.conf has no cache mentioned
-%     %
-%     % 64 sec xetex, 11 sec luatex (56 sec xetex when \nobigmath)
-%     %
-%       \setupbodyfont[myzhfont] \dorecurse{10000}{{hello {\switchtobodyfont[myzhfont] 你好}}\par}
-%     %
-%     % 67 sec xetex, 11.5 sec luatex
-%     %
-%     % \dorecurse{10000}{{hello {\switchtobodyfont[myzhfont] 你好}}\par}
-%     %
-%     % 5 sec xetex, 7 sec luatex
-%     %
-%     % \setupbodyfont[myzhfont]  \dorecurse{10000}{{hello {你好}}\par}
-%     %
-%     % 5 sec xetex, 7 sec luatex
-%     %
-%     % \setupbodyfont[myzhfont]  \dorecurse{10000}{{\bf hello {你好}}\par}
-% \stoptext
-
diff --git a/tex/context/base/grph-fig.mkiv b/tex/context/base/grph-fig.mkiv
index 61f78f09e..415a2aa76 100644
--- a/tex/context/base/grph-fig.mkiv
+++ b/tex/context/base/grph-fig.mkiv
@@ -43,8 +43,7 @@
   {\bgroup
    \pushmacro\textunderscore
    \edef\textunderscore{\string_}% brrr, temp hack, still needed?
-   \calculateexternalfigure      [][#1][#2][#3][#4][#5]% [] is dummy dwcomp
-   \calculateexternalscreenfigure[][#1][#2][#3][#4][#5]% [] is dummy dwcomp
+   \calculateexternalfigure[][#1][#2][#3][#4][#5]% [] is dummy dwcomp
    \popmacro\textunderscore
    \box\foundexternalfigure
    \egroup}
@@ -56,14 +55,16 @@
      [\??ef]
      [\c!width=\figurewidth,
       \c!height=\figureheight,
-      \c!background=\v!screen,
-      \c!backgroundscreen=.8,
+      \c!background=\v!color,
+      \c!backgroundcolor=missingfigurecolor,
       \c!frame=\@@efframe]}%
      {\tt\tfxx \nohyphens
         name:  \expanded{\verbatimstring{#1}}\\%
         file:  \expanded{\verbatimstring{#2}}\\%
         state: \expanded{\verbatimstring{#3}}}}
 
+\definecolor[missingfigurecolor][s=.8]
+
 \def\externalfigureplaceholder#1#2#3%
   {\localframed
      [\??ef]
@@ -186,89 +187,91 @@
 
 %D Still undocumented! No one uses it I think, better be done with layers.
 
-\newcount\efreference
-\newdimen\efxsteps
-\newdimen\efysteps
-
-\def\calculateefsteps
-  {\ifnum0\@@exxmax=\zerocount
-     \ifnum0\@@exymax=\zerocount
-       \def\@@exymax{24}%
-     \fi
-     \efysteps\figureheight \divide\efysteps \@@exymax
-     \efxsteps\efysteps
-     \dimen0=\figurewidth
-     \advance\dimen0 \efysteps
-     \divide \dimen0 \efysteps
-     \edef\@@exxmax{\number\dimen0}%
-   \else
-     \efxsteps\figurewidth  \divide\efxsteps \@@exxmax
-     \efysteps\figureheight \divide\efysteps \@@exymax
-   \fi}
-
-\def\efcomment#1(#2,#3)#4(#5,#6)%    {kader}(x,y)(h,b)[...]{tekst}
-  {\def\complexefdocomment[##1]##2%
-     {\position(#2,#3)%
-        {\setnostrut
-         \framed
-           [\c!width=#5\efxsteps,
-            \c!height=#6\exysteps,
-            \c!offset=\v!none,
-            \c!frame=#1,
-            ##1]%
-           {##2}}}%
-   \complexorsimpleempty\efdocomment}
-
-\def\efnocomment(#1,#2)#3(#4,#5)%    (x,y)(h,b)[...]{tekst}
-  {\def\complexefdonocomment[##1]##2{}%
-   \complexorsimpleempty\efdonocomment}
-
-\def\efdomarker(#1,#2)#3#4%    (h,b){kader}{tekst}
-  {\framed
-     [\c!width=#1\efxsteps,
-      \c!height=#2\efysteps,
-      \c!offset=\v!none,
-      \c!frame=#3]%
-     {#4}}
-
-\def\effigure#1%
-  {\position(0,0){\getvalue{#1}}}
-
-\def\efdoarea(#1,#2)#3#4%    (h,b){kader}{tekst}
-  {\bgroup
-   \setnostrut
-   \framed
-     [\c!width=#1\efxsteps,
-      \c!height=#2\efysteps,
-      \c!offset=\!!zeropoint,
-      \c!frame=#3]
-     {#4}%
-   \egroup}
-
-\def\efgoto(#1,#2)#3[#4]%    (h,b)kader[ref]
-  {\setbox0=\vbox{\efdoarea(#1,#2)#3{}}%
-   \gotobox{\copy0}[#4]}
-
-\def\efmark(#1,#2)#3(#4,#5)#6[#7]%
-  {\advance\efreference \plusone
-   \position(#1,#2)
-     {\hbox{\the\efreference}}%
-   \position(#1,#2)
-     {\gotosomeinternal\s!vwb{#7}\realfolio
-        {\efdomarker(#4,#5)\v!on{\thisissomeinternal\s!vwa{#7}}}}}
-
-\def\eftext#1(#2,#3)#4(#5,#6)#7[#8]%
-  {\advance\efreference \plusone
-   \hbox
-     {\quad
-      \thisissomeinternal\s!vwb{#8}%
-      \gotosomeinternal  \s!vwa{#8}\realfolio
-        {\hbox to 1.5em{\the\efreference\presetgoto\hfill}}%
-      \quad#1 (#2,#3) (#5,#6) [#8]\hfill}%
-   \endgraf}
-
-\def\efthisis(#1,#2)#3[#4]%
-  {\efdoarea(#1,#2){#3}{\pagereference[#4]}}
+% when there is need for this i'll reimplement it
+%
+% \newcount\efreference
+% \newdimen\efxsteps
+% \newdimen\efysteps
+%
+% \def\calculateefsteps
+%   {\ifnum0\@@exxmax=\zerocount
+%      \ifnum0\@@exymax=\zerocount
+%        \def\@@exymax{24}%
+%      \fi
+%      \efysteps\figureheight \divide\efysteps \@@exymax
+%      \efxsteps\efysteps
+%      \dimen0=\figurewidth
+%      \advance\dimen0 \efysteps
+%      \divide \dimen0 \efysteps
+%      \edef\@@exxmax{\number\dimen0}%
+%    \else
+%      \efxsteps\figurewidth  \divide\efxsteps \@@exxmax
+%      \efysteps\figureheight \divide\efysteps \@@exymax
+%    \fi}
+%
+% \def\efcomment#1(#2,#3)#4(#5,#6)%    {kader}(x,y)(h,b)[...]{tekst}
+%   {\def\complexefdocomment[##1]##2%
+%      {\position(#2,#3)%
+%         {\setnostrut
+%          \framed
+%            [\c!width=#5\efxsteps,
+%             \c!height=#6\exysteps,
+%             \c!offset=\v!none,
+%             \c!frame=#1,
+%             ##1]%
+%            {##2}}}%
+%    \complexorsimpleempty\efdocomment}
+%
+% \def\efnocomment(#1,#2)#3(#4,#5)%    (x,y)(h,b)[...]{tekst}
+%   {\def\complexefdonocomment[##1]##2{}%
+%    \complexorsimpleempty\efdonocomment}
+%
+% \def\efdomarker(#1,#2)#3#4%    (h,b){kader}{tekst}
+%   {\framed
+%      [\c!width=#1\efxsteps,
+%       \c!height=#2\efysteps,
+%       \c!offset=\v!none,
+%       \c!frame=#3]%
+%      {#4}}
+%
+% \def\effigure#1%
+%   {\position(0,0){\getvalue{#1}}}
+%
+% \def\efdoarea(#1,#2)#3#4%    (h,b){kader}{tekst}
+%   {\bgroup
+%    \setnostrut
+%    \framed
+%      [\c!width=#1\efxsteps,
+%       \c!height=#2\efysteps,
+%       \c!offset=\!!zeropoint,
+%       \c!frame=#3]
+%      {#4}%
+%    \egroup}
+%
+% \def\efgoto(#1,#2)#3[#4]%    (h,b)kader[ref]
+%   {\setbox0=\vbox{\efdoarea(#1,#2)#3{}}%
+%    \gotobox{\copy0}[#4]}
+%
+% \def\efmark(#1,#2)#3(#4,#5)#6[#7]%
+%   {\advance\efreference \plusone
+%    \position(#1,#2)
+%      {\hbox{\the\efreference}}%
+%    \position(#1,#2)
+%      {\gotosomeinternal\s!vwb{#7}\realfolio
+%         {\efdomarker(#4,#5)\v!on{\thisissomeinternal\s!vwa{#7}}}}}
+%
+% \def\eftext#1(#2,#3)#4(#5,#6)#7[#8]%
+%   {\advance\efreference \plusone
+%    \hbox
+%      {\quad
+%       \thisissomeinternal\s!vwb{#8}%
+%       \gotosomeinternal  \s!vwa{#8}\realfolio
+%         {\hbox to 1.5em{\the\efreference\presetgoto\hfill}}%
+%       \quad#1 (#2,#3) (#5,#6) [#8]\hfill}%
+%    \endgraf}
+%
+% \def\efthisis(#1,#2)#3[#4]%
+%   {\efdoarea(#1,#2){#3}{\pagereference[#4]}}
 
 \newbox\colorbarbox
 
@@ -402,41 +405,6 @@
 \def\startfigure
   {\grabuntil{\e!stop\v!figure}\dostartfigure}
 
-%D defining sound tracks:
-%D
-%D \starttyping
-%D \useexternalsoundtrack[label][file]
-%D \stoptyping
-%D
-%D associated actions: StartSound StopSound PauseSound ResumeSound
-%D
-%D Todo: like external figures, also search on path,
-%D although, they need to be present ar viewing time, so ...
-
-\def\useexternalsoundtrack
-  {\dodoubleargument\douseexternalsoundtrack}
-
-\def\douseexternalsoundtrack[#1][#2]%
-  {\setgvalue{\??sd:#1}{#2}}
-
-\def\checksoundtrack#1%
-  {\iflocation
-     \doifdefined{\??sd:#1}{\doifvaluesomething{\??sd:#1}
-       {\doinsertsoundtrack{\getvalue{\??sd:#1}}{#1}\@@sdoption
-        % brr, \..empty not really needed and maybe even wrong;
-        % also, not here but in driver
-        % well, no: sounds need to be reinitialize each time (i.e., be on page), so no
-        }}% \letgvalueempty{\??sd:#1}}}%
-   \fi}
-
-\setexecutecommandcheck {startsound} \checksoundtrack
-
-\def\setupexternalsoundtracks
-  {\dodoubleargument\getparameters[\??sd]}
-
-\setupexternalsoundtracks
-  [\c!option=]
-
 %D NEW: used in styledesign manual
 
 % \setbuffer[typeset-b]\endbuffer
diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua
index 5b3bff36c..3dfcee739 100644
--- a/tex/context/base/grph-inc.lua
+++ b/tex/context/base/grph-inc.lua
@@ -36,6 +36,7 @@ run TeX code from within Lua. Some more functionality will move to Lua.
 local texsprint, format, lower, find, match = tex.sprint, string.format, string.lower, string.find, string.match
 
 local ctxcatcodes = tex.ctxcatcodes
+local variables = interfaces.variables
 
 local trace_figures = false  trackers.register("figures.locating",function(v) trace_figures = v end)
 
@@ -107,16 +108,16 @@ figures.order =  {
 }
 
 figures.formats = {
-    ["pdf"]    = { },
-    ["mps"]    = { patterns = { "%d+" } },
+    ["pdf"]    = { list = { "pdf" } },
+    ["mps"]    = { patterns = { "mps", "%d+" } },
     ["jpg"]    = { list = { "jpg", "jpeg" } },
-    ["png"]    = { } ,
+    ["png"]    = { list = { "png" } },
     ["jbig"]   = { list = { "jbig", "jbig2", "jb2" } },
     ["svg"]    = { list = { "svg", "svgz" } },
     ["eps"]    = { list = { "eps", "ai" } },
     ["mov"]    = { list = { "mov", "avi" } },
     ["buffer"] = { list = { "tmp", "buffer", "buf" } },
-    ["tex"]    = { },
+    ["tex"]    = { list = { "tex" } },
 }
 
 function figures.setlookups()
@@ -142,16 +143,19 @@ end
 figures.setlookups()
 
 local function register(tag,target,what)
-    local data = figures.formats[target]
-    if data then
-        local d = data[tag]
-        if d and not table.contains(d,what) then
-            d[#d+1] = what
-        else
-            data[tag] = { what }
-        end
+    local data = figures.formats[target] -- resolver etc
+    if not data then
+        data = { }
+        figures.formats[target] = data
+    end
+    local d = data[tag] -- list or pattern
+    if d and not table.contains(d,what) then
+        d[#d+1] = what -- suffix or patternspec
     else
-        figures.formats[target] = { }
+        data[tag] = { what }
+    end
+    if not table.contains(figures.order,target) then
+        figures.order[#figures.order+1] = target
     end
     figures.setlookups()
 end
@@ -208,7 +212,7 @@ end
 --~ end
 
 function figures.hash(data)
-    return tostring(data.status.private) -- the 
+    return data.status.hash or tostring(data.status.private) -- the 
 --  return data.status.fullname .. "+".. (data.status.page or data.request.page or 1) -- img is still not perfect
 end
 
@@ -267,9 +271,9 @@ do
 --~             local w, h = tonumber(request.width), tonumber(request.height)
             request.page      = math.max(tonumber(request.page) or 1,1)
             request.size      = img.check_size(request.size)
-            request.object    = iv[request.object] == "yes"
-            request["repeat"] = iv[request["repeat"]] == "yes"
-            request.preview   = iv[request.preview] == "yes"
+            request.object    = iv[request.object] == variables.yes
+            request["repeat"] = iv[request["repeat"]] == variables.yes
+            request.preview   = iv[request.preview] == variables.yes
             request.cache     = request.cache  ~= "" and request.cache
             request.prefix    = request.prefix ~= "" and request.prefix
             request.format    = request.format ~= "" and request.format
@@ -603,12 +607,15 @@ function figures.existers.generic(askedname)
 end
 function figures.checkers.generic(data)
     local dr, du, ds = data.request, data.used, data.status
-    local name, page, size = du.fullname or "unknown generic", du.page or dr.page, dr.size or "crop"
-    local hash = name .. "->" .. page .. "->" .. size
+    local name, page, size, color = du.fullname or "unknown generic", du.page or dr.page, dr.size or "crop", dr.color or "natural"
+    local hash = name .. "->" .. page .. "->" .. size .. "->" .. color
     local figure = figures.loaded[hash]
     if figure == nil then
         figure = img.new { filename = name, page = page, pagebox = dr.size }
+        backends.codeinjections.setfigurecolorspace(data,figure)
         figure = (figure and img.scan(figure)) or false
+        local f, d = backends.codeinjections.setfigurealternative(data,figure)
+        figure, data = f or figure, d or data
         figures.loaded[hash] = figure
     end
     if figure then
@@ -616,6 +623,7 @@ function figures.checkers.generic(data)
         du.height = figure.height
         du.pages = figure.pages
         ds.private = figure
+        ds.hash = hash
     end
     return data
 end
@@ -629,7 +637,6 @@ function figures.includers.generic(data)
     if figure == nil then
         figure = ds.private
         if figure then
---~ figure.page = dr.page or '1'
             figure = img.copy(figure)
             figure = (figure and img.clone(figure,data.request)) or false
         end
diff --git a/tex/context/base/grph-inc.mkii b/tex/context/base/grph-inc.mkii
index 231ce902e..acb5ae7e9 100644
--- a/tex/context/base/grph-inc.mkii
+++ b/tex/context/base/grph-inc.mkii
@@ -1212,4 +1212,28 @@
      \setanalyzedfiguredimensions\plustwo
    \fi}
 
+%D This is \MKII\ only and comes from cont-new (maybe used in a project).
+
+% maybe to be integrated (option=...)
+
+\def\directexternalfigure
+  {\dodoubleempty\dodirectexternalfigure}
+
+\def\dodirectexternalfigure[#1][#2]%
+  {\bgroup
+   \getparameters[\??ef][\c!type=\splitofftype,\c!page=1,#2]%
+   \sanitizefilename#1\to\expandedfigurename
+   \splitfilename\expandedfigurename
+   \let\@@DriverImageWidth  \!!zeropoint
+   \let\@@DriverImageHeight \!!zeropoint
+   \let\@@DriverImageFile   \splitofffull
+   \let\@@DriverImageType   \@@eftype
+   \let\@@DriverImageMethod \@@eftype
+   \let\@@DriverImageLabel  \empty
+   \let\@@DriverImagePage   \@@efpage
+   \doinsertfile
+   \egroup}
+
+% \directexternalfigure[cow.pdf]
+
 \protect \endinput
diff --git a/tex/context/base/grph-inc.mkiv b/tex/context/base/grph-inc.mkiv
index 96ea2d74a..d5151c521 100644
--- a/tex/context/base/grph-inc.mkiv
+++ b/tex/context/base/grph-inc.mkiv
@@ -21,6 +21,7 @@
 %D - a few more obscure things
 
 \registerctxluafile{grph-inc}{1.001}
+\registerctxluafile{grph-u3d}{1.001} % this will change
 
 \unprotect
 
@@ -198,12 +199,7 @@
    % a transparent color is used
    \doifsomething\@@efforegroundcolor
      {\def\@@efbackground{\v!foreground,\v!color}%
-      \def\@@efbackgroundcolor{\@@efforegroundcolor}}%
-   \doifsomething\@@efcolor
-     {\doifcolorelse\@@efcolor
-        {\checkpredefinedcolor[\@@efcolor]%
-         \doregisterfigurecolor\@@efcolor}}%
-        \donothing}
+      \def\@@efbackgroundcolor{\@@efforegroundcolor}}}
 
 \appendtoks
     \checkfigureusersettings
@@ -237,6 +233,9 @@
    \resetfigurevariables
    \dosetefparameters{#4}{#5}{#6}%
    \checkfigurevariables
+%    \begingroup
+%    \color[\@@efcolor]{\xdef\globcolorattr{\internalspotcolorname}}
+%    \endgroup
    \ctxlua{figures.push {
         name="#3",
         label="#2", % todo: \@eflabel
@@ -250,6 +249,7 @@
         controls="\@@efcontrols",
         preview="\@@efpreview",
         display="\@@efdisplay",
+        color="\internalspotcolorparent\@@efcolor", % hack is needed
         ["repeat"]="\@@efrepeat",
         width="\@@efwidth", % can be crap
         height="\@@efheight", % can be crap
@@ -361,25 +361,6 @@
 \let\feedbackexternalfigure\relax % \gobblefourarguments
 \let\dowithfigure          \relax
 
-% \let\lastfigureobjectname\empty
-
-\def\calculateexternalscreenfigure[#1][#2][#3][#4][#5][#6]%
-  {\ifx\@@efdisplay\empty\else
-%      \doifnot\@@efobject\v!no
-%        {\doifobjectssupportedelse
-%           {\doifspecialavailableelse\doregisterfigure
-%              {\doshowfigurestate{screen alternative : start}%
-%               \bgroup
-%               \dosetefparameters{#4}{#5}{#6}%
-%               \doregisterfigure{FIG}{\lastfigureobjectname}%
-%               \let\@@ef@@scherm\@@efdisplay
-%               \calculateexternalfigure[#1][\@@ef@@scherm][\@@ef@@scherm][#4,\c!display=][#5][#6]%
-%               \doshowfigurestate{screen alternative : stop}%
-%               \egroup}
-%              {}}
-%           {}}%
-   \fi}
-
 \def\getfiguredimensions
   {\dodoubleempty\dogetfiguredimensions}
 
@@ -416,3 +397,49 @@
   {\ctxlua{figures.bases.use("#1")}}
 
 \protect \endinput
+
+% \startbuffer
+% \definecolor [blue]   [c=1,m=.38,y=0,k=.64]
+% \definecolor [yellow] [c=0,m=.28,y=1,k=.06]
+%
+% \definespotcolor [blue-100]   [blue]   [p=1]
+% \definespotcolor [yellow-100] [yellow] [p=1]
+%
+% \definemultitonecolor [combicolor]   [blue=.12,yellow=.28] [c=.1,m=.1,y=.3,k=.1]
+%
+% \definemultitonecolor [combicolor-b] [blue=1]   [c=1,m=.38,y=0,k=.64] % force multitone
+% \definemultitonecolor [combicolor-y] [yellow=1] [c=0,m=.28,y=1,k=.06] % force multitone
+%
+% \useexternalfigure[demo-a][mill.png]     [object=no,width=.2\textwidth]
+% \useexternalfigure[demo-b][hacker-bw.jpg][object=no,width=.2\textwidth]
+%
+% \startbaselinecorrection \startcombination[4*1]
+%   {\externalfigure[demo-a]}                     {no color}
+%   {\externalfigure[demo-a][color=combicolor]}   {indexed duotone}
+%   {\externalfigure[demo-a][color=combicolor-b]} {spot color}
+%   {\externalfigure[demo-a][color=combicolor-y]} {spot color}
+% \stopcombination \stopbaselinecorrection
+%
+% \startbaselinecorrection \startcombination[4*1]
+%   {\externalfigure[demo-b]}                     {no color}
+%   {\externalfigure[demo-b][color=combicolor]}   {indexed duotone}
+%   {\externalfigure[demo-b][color=combicolor-b]} {spot color}
+%   {\externalfigure[demo-b][color=combicolor-y]} {spot color}
+% \stopcombination \stopbaselinecorrection
+%
+% \startbaselinecorrection \startcombination[4*1]
+%   {\externalfigure[demo-a]}                     {no color}
+%   {\externalfigure[demo-a][color=combicolor]}   {indexed duotone}
+%   {\externalfigure[demo-a][color=blue-100]}     {spot color}
+%   {\externalfigure[demo-a][color=yellow-100]}   {spot color}
+% \stopcombination \stopbaselinecorrection
+%
+% \startbaselinecorrection \startcombination[4*1]
+%   {\externalfigure[demo-b]}                     {no color}
+%   {\externalfigure[demo-b][color=combicolor]}   {indexed duotone}
+%   {\externalfigure[demo-b][color=blue-100]}     {spot color}
+%   {\externalfigure[demo-b][color=yellow-100]}   {spot color}
+% \stopcombination \stopbaselinecorrection
+% \stopbuffer
+%
+% \getbuffer \typebuffer
diff --git a/tex/context/base/grph-u3d.lua b/tex/context/base/grph-u3d.lua
new file mode 100644
index 000000000..e5944691c
--- /dev/null
+++ b/tex/context/base/grph-u3d.lua
@@ -0,0 +1,45 @@
+if not modules then modules = { } end modules ['grph-u3d'] = {
+    version   = 1.001,
+    comment   = "companion to grph-inc.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+-- see lpdf-u3d.lua for comment
+
+local format = string.format
+
+local texsprint   = tex.sprint
+local ctxcatcodes = tex.ctxcatcodes
+
+function figures.checkers.u3d(data)
+    local dr, du, ds = data.request, data.used, data.status
+    local width = (dr.width or figures.defaultwidth):todimen()
+    local height = (dr.height or figures.defaultheight):todimen()
+    local foundname = du.fullname
+    dr.width, dr.height = width, height
+    du.width, du.height, du.foundname = width, height, foundname
+    texsprint(ctxcatcodes,format("\\startfoundexternalfigure{%ssp}{%ssp}",width,height))
+    local annot, preview, ref = backends.pdf.helpers.insert3d {
+        foundname = foundname,
+        width     = width,
+        height    = height,
+        factor    = number.dimenfactors.bp,
+        display   = dr.display,
+        controls  = dr.controls,
+        label     = dr.label,
+    }
+ -- node.write(nodes.pdfannot(width,-height,0,annot()))
+    texsprint(ctxcatcodes,format("\\pdfannot width %ssp height %ssp {%s}",width,height,annot())) -- brrrr
+--~     if ref then -- wrong ! a direct ref should work
+--~         texsprint(ctxcatcodes,format("\\smash{\\pdfrefximage%s\\relax}",ref)) -- brrrr
+--~     end
+    texsprint(ctxcatcodes,"\\stopfoundexternalfigure")
+    return data
+end
+
+figures.includers.u3d = figures.includers.nongeneric
+
+figures.registersuffix("u3d","u3d")
+figures.registersuffix("prc","u3d")
diff --git a/tex/context/base/hand-def.mkii b/tex/context/base/hand-def.mkii
new file mode 100644
index 000000000..0a19ce270
--- /dev/null
+++ b/tex/context/base/hand-def.mkii
@@ -0,0 +1,577 @@
+%D \module
+%D   [     file=hand-def, % was enco-pro
+%D      version=2000.29.09,
+%D        title=\CONTEXT\ Handling Macros,
+%D     subtitle=Default Protruding Factors,
+%D       author=Hans Hagen,
+%D         date=\currentdate,
+%D    copyright=Hans Hagen]
+%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 is an experimental definition file. The protruding
+%D values we use here are those found from \THANH's thesis.
+
+\startfonthandling [pure]
+
+  \defineprotrudefactor , 0 1
+  \defineprotrudefactor . 0 1
+  \defineprotrudefactor : 0 1
+  \defineprotrudefactor ; 0 1
+  \defineprotrudefactor - 0 1
+
+  \defineprotrudefactor hyphen 0 1
+  \defineprotrudefactor endash 0 .5
+  \defineprotrudefactor emdash 0 .33 % .5
+
+\stopfonthandling
+
+\startfonthandling [punctuation]
+
+  \defineprotrudefactor !  0  .2
+  \defineprotrudefactor '  0  .7
+  \defineprotrudefactor ` .7   0
+  \defineprotrudefactor ( .05  0
+  \defineprotrudefactor )  0  .05
+  \defineprotrudefactor [ .05  0
+  \defineprotrudefactor ]  0  .05
+  \defineprotrudefactor ,  0  .7
+  \defineprotrudefactor -  0  .7
+  \defineprotrudefactor .  0  .7
+  \defineprotrudefactor :  0  .5
+  \defineprotrudefactor ;  0  .5
+
+  \defineprotrudefactor rightupperninequote  0 .5
+  \defineprotrudefactor leftupperninequote  .5  0
+  \defineprotrudefactor endash               0 .3
+  \defineprotrudefactor emdash               0 .2
+
+  \defineprotrudefactor hyphen               0 .7
+
+\stopfonthandling
+
+\startfonthandling [alpha]
+
+  \defineprotrudefactor A .05 .05
+  \defineprotrudefactor F  0  .05
+  \defineprotrudefactor J .05   0
+  \defineprotrudefactor K  0  .05
+  \defineprotrudefactor L  0  .05
+  \defineprotrudefactor T .05 .05
+  \defineprotrudefactor V .05 .05
+  \defineprotrudefactor W .05 .05
+  \defineprotrudefactor X .05 .05
+  \defineprotrudefactor Y .05 .05
+
+  \defineprotrudefactor k  0  .05
+  \defineprotrudefactor r  0  .05
+  \defineprotrudefactor t  0  .05
+  \defineprotrudefactor v .05 .05
+  \defineprotrudefactor w .05 .05
+  \defineprotrudefactor x .05 .05
+  \defineprotrudefactor y .05 .05
+
+\stopfonthandling
+
+% ogoneks may need another treatment
+
+\startfonthandling [extended]
+
+  \inherithandling Acircumflex A
+  \inherithandling acircumflex a
+  \inherithandling Ccircumflex C
+  \inherithandling ccircumflex c
+  \inherithandling Ecircumflex E
+  \inherithandling ecircumflex e
+  \inherithandling Gcircumflex G
+  \inherithandling gcircumflex g
+  \inherithandling Hcircumflex H
+  \inherithandling hcircumflex h
+  \inherithandling Icircumflex I
+  \inherithandling icircumflex i
+  \inherithandling Jcircumflex J
+  \inherithandling jcircumflex j
+  \inherithandling Ocircumflex O
+  \inherithandling ocircumflex o
+  \inherithandling Scircumflex S
+  \inherithandling scircumflex s
+  \inherithandling Ucircumflex U
+  \inherithandling ucircumflex u
+  \inherithandling Wcircumflex W
+  \inherithandling wcircumflex w
+  \inherithandling Ycircumflex Y
+  \inherithandling ycircumflex y
+
+  \inherithandling Agrave A
+  \inherithandling agrave a
+  \inherithandling Egrave E
+  \inherithandling egrave e
+  \inherithandling Igrave I
+  \inherithandling igrave i
+  \inherithandling Ograve O
+  \inherithandling ograve o
+  \inherithandling Ugrave U
+  \inherithandling ugrave u
+  \inherithandling Ygrave Y
+  \inherithandling ygrave y
+
+  \inherithandling Atilde A
+  \inherithandling atilde a
+  \inherithandling Itilde I
+  \inherithandling itilde i
+  \inherithandling Ntilde N
+  \inherithandling ntilde n
+  \inherithandling Otilde O
+  \inherithandling otilde o
+  \inherithandling Utilde U
+  \inherithandling utilde u
+
+  \inherithandling Adiaeresis A
+  \inherithandling adiaeresis a
+  \inherithandling Ediaeresis E
+  \inherithandling ediaeresis e
+  \inherithandling Idiaeresis I
+  \inherithandling idiaeresis i
+  \inherithandling Odiaeresis O
+  \inherithandling odiaeresis o
+  \inherithandling Udiaeresis U
+  \inherithandling udiaeresis u
+  \inherithandling Ydiaeresis Y
+  \inherithandling ydiaeresis y
+
+  \inherithandling Aacute A
+  \inherithandling aacute a
+  \inherithandling Cacute C
+  \inherithandling cacute c
+  \inherithandling Eacute E
+  \inherithandling eacute e
+  \inherithandling Iacute I
+  \inherithandling iacute i
+  \inherithandling Lacute L
+  \inherithandling lacute l
+  \inherithandling Nacute N
+  \inherithandling nacute n
+  \inherithandling Oacute O
+  \inherithandling oacute o
+  \inherithandling Racute R
+  \inherithandling racute r
+  \inherithandling Sacute s
+  \inherithandling sacute s
+  \inherithandling Uacute U
+  \inherithandling uacute u
+  \inherithandling Yacute Y
+  \inherithandling yacute y
+  \inherithandling Zacute Z
+  \inherithandling zacute z
+
+  \inherithandling Dstroke D
+  \inherithandling dstroke d
+  \inherithandling Hstroke H
+  \inherithandling hstroke h
+  \inherithandling Tstroke T
+  \inherithandling tstroke t
+
+  \inherithandling Cdotaccent C
+  \inherithandling cdotaccent c
+  \inherithandling Edotaccent E
+  \inherithandling edotaccent e
+  \inherithandling Gdotaccent G
+  \inherithandling gdotaccent g
+  \inherithandling Idotaccent I
+  \inherithandling idotaccent i
+  \inherithandling Zdotaccent Z
+  \inherithandling zdotaccent z
+
+  \inherithandling Amacron A
+  \inherithandling amacron a
+  \inherithandling Emacron E
+  \inherithandling emacron e
+  \inherithandling Imacron I
+  \inherithandling imacron i
+  \inherithandling Omacron O
+  \inherithandling omacron o
+  \inherithandling Umacron U
+  \inherithandling umacron u
+
+  \inherithandling Ccedilla C
+  \inherithandling ccedilla c
+  \inherithandling Kcedilla K
+  \inherithandling kcedilla k
+  \inherithandling Lcedilla L
+  \inherithandling lcedilla l
+  \inherithandling Ncedilla N
+  \inherithandling ncedilla n
+  \inherithandling Rcedilla R
+  \inherithandling rcedilla r
+  \inherithandling Scedilla S
+  \inherithandling scedilla s
+  \inherithandling Tcedilla T
+  \inherithandling tcedilla t
+
+  \inherithandling Ohungarumlaut O
+  \inherithandling ohungarumlaut o
+  \inherithandling Uhungarumlaut U
+  \inherithandling uhungarumlaut u
+
+  \inherithandling Aogonek A
+  \inherithandling aogonek a
+  \inherithandling Eogonek E
+  \inherithandling eogonek e
+  \inherithandling Iogonek I
+  \inherithandling iogonek i
+  \inherithandling Uogonek U
+  \inherithandling uogonek u
+
+  \inherithandling Aring A
+  \inherithandling aring a
+  \inherithandling Uring U
+  \inherithandling uring u
+
+  \inherithandling Abreve A
+  \inherithandling abreve a
+  \inherithandling Ebreve E
+  \inherithandling ebreve e
+  \inherithandling Gbreve G
+  \inherithandling gbreve g
+  \inherithandling Ibreve I
+  \inherithandling ibreve i
+  \inherithandling Obreve O
+  \inherithandling obreve o
+  \inherithandling Ubreve U
+  \inherithandling ubreve u
+
+  \inherithandling Ccaron C
+  \inherithandling ccaron c
+  \inherithandling Dcaron D
+  \inherithandling dcaron d
+  \inherithandling Ecaron E
+  \inherithandling ecaron e
+  \inherithandling Lcaron L
+  \inherithandling lcaron l
+  \inherithandling Ncaron N
+  \inherithandling ncaron n
+  \inherithandling Rcaron R
+  \inherithandling rcaron r
+  \inherithandling Scaron S
+  \inherithandling scaron s
+  \inherithandling Tcaron T
+  \inherithandling tcaron t
+  \inherithandling Ycaron Y
+  \inherithandling ycaron y
+  \inherithandling Zcaron Z
+  \inherithandling zcaron z
+
+  \inherithandling AEligature E
+  \inherithandling aeligature e
+  \inherithandling Lstroke    I
+  \inherithandling lstroke    o
+  \inherithandling Ostroke    O
+  \inherithandling ostroke    o
+  \inherithandling OEligature O
+  \inherithandling oeligature o
+
+  \inherithandling Ssharp     S
+  \inherithandling ssharp     s
+  \inherithandling IJligature J
+  \inherithandling ijligature j
+
+  \inherithandling aumlaut a
+  \inherithandling eumlaut e
+  \inherithandling iumlaut i
+  \inherithandling oumlaut o
+  \inherithandling uumlaut u
+
+  \inherithandling Aumlaut A
+  \inherithandling Eumlaut E
+  \inherithandling Iumlaut I
+  \inherithandling Oumlaut O
+  \inherithandling Uumlaut U
+
+  \inherithandling Lslash L
+  \inherithandling lslash l
+  \inherithandling Dslash D
+  \inherithandling dslash d
+  \inherithandling Oslash O
+  \inherithandling oslash o
+
+  \inherithandling Eszett S
+  \inherithandling eszett s
+
+  \inherithandling Thorn P
+  \inherithandling thorn p
+
+  % vietnamese
+
+  \inherithandling Ahook A
+  \inherithandling ahook a
+  \inherithandling Ehook E
+  \inherithandling ehook e
+  \inherithandling Ihook I
+  \inherithandling ihook i
+  \inherithandling Ohook O
+  \inherithandling ohook o
+  \inherithandling Uhook U
+  \inherithandling uhook u
+  \inherithandling Yhook Y
+  \inherithandling yhook y
+
+  \inherithandling Acircumflexgrave A
+  \inherithandling Acircumflexacute A
+  \inherithandling Acircumflextilde A
+  \inherithandling Acircumflexhook  A
+  \inherithandling acircumflexgrave a
+  \inherithandling acircumflexacute a
+  \inherithandling acircumflextilde a
+  \inherithandling acircumflexhook  a
+  \inherithandling Ecircumflexgrave E
+  \inherithandling Ecircumflexacute E
+  \inherithandling Ecircumflextilde E
+  \inherithandling Ecircumflexhook  E
+  \inherithandling ecircumflexgrave e
+  \inherithandling ecircumflexacute e
+  \inherithandling ecircumflextilde e
+  \inherithandling ecircumflexhook  e
+  \inherithandling Ocircumflexgrave O
+  \inherithandling Ocircumflexacute O
+  \inherithandling Ocircumflextilde O
+  \inherithandling Ocircumflexhook  O
+  \inherithandling ocircumflexgrave o
+  \inherithandling ocircumflexacute o
+  \inherithandling ocircumflextilde o
+  \inherithandling ocircumflexhook  o
+
+  \inherithandling Abrevegrave A
+  \inherithandling Abreveacute A
+  \inherithandling Abrevetilde A
+  \inherithandling Abrevehook  A
+  \inherithandling abrevegrave a
+  \inherithandling abreveacute a
+  \inherithandling abrevetilde a
+  \inherithandling abrevehook  a
+
+  \inherithandling Adotbelow A
+  \inherithandling adotbelow a
+  \inherithandling Edotbelow E
+  \inherithandling edotbelow e
+  \inherithandling Idotbelow I
+  \inherithandling idotbelow i
+  \inherithandling Odotbelow O
+  \inherithandling odotbelow o
+  \inherithandling Udotbelow U
+  \inherithandling udotbelow u
+  \inherithandling Ydotbelow Y
+  \inherithandling ydotbelow y
+
+  \inherithandling Ohorndotbelow O
+  \inherithandling ohorndotbelow o
+  \inherithandling Uhorndotbelow U
+  \inherithandling uhorndotbelow u
+
+  \inherithandling Acircumflexdotbelow A
+  \inherithandling acircumflexdotbelow a
+  \inherithandling Ecircumflexdotbelow E
+  \inherithandling ecircumflexdotbelow e
+  \inherithandling Ocircumflexdotbelow O
+  \inherithandling ocircumflexdotbelow o
+
+  \inherithandling Abrevedotbelow A
+  \inherithandling abrevedotbelow a
+
+  \inherithandling Ohorn      O
+  \inherithandling Ohorngrave O
+  \inherithandling Ohornacute O
+  \inherithandling Ohorntilde O
+  \inherithandling Ohornhook  O
+  \inherithandling ohorn      o
+  \inherithandling ohorngrave o
+  \inherithandling ohornacute o
+  \inherithandling ohorntilde o
+  \inherithandling ohornhook  o
+  \inherithandling Uhorn      U
+  \inherithandling Uhorngrave U
+  \inherithandling Uhornacute U
+  \inherithandling Uhorntilde U
+  \inherithandling Uhornhook  U
+  \inherithandling uhorn      u
+  \inherithandling uhorngrave u
+  \inherithandling uhornacute u
+  \inherithandling uhorntilde u
+  \inherithandling uhornhook  u
+
+  \inherithandling Ytilde Y
+  \inherithandling ytilde y
+  \inherithandling Etilde E
+  \inherithandling etilde e
+
+\stopfonthandling
+
+\startfonthandling [hz]
+
+    \defineadjustfactor A .5
+    \defineadjustfactor B .7
+    \defineadjustfactor C .7
+    \defineadjustfactor D .5
+    \defineadjustfactor E .7
+    \defineadjustfactor F .7
+    \defineadjustfactor G .5
+    \defineadjustfactor H .7
+    \defineadjustfactor K .7
+    \defineadjustfactor M .7
+    \defineadjustfactor N .7
+    \defineadjustfactor O .5
+    \defineadjustfactor P .7
+    \defineadjustfactor Q .5
+    \defineadjustfactor R .7
+    \defineadjustfactor S .7
+    \defineadjustfactor U .7
+    \defineadjustfactor W .7
+    \defineadjustfactor Z .7
+
+    \defineadjustfactor a .7
+    \defineadjustfactor b .7
+    \defineadjustfactor c .7
+    \defineadjustfactor d .7
+    \defineadjustfactor e .7
+    \defineadjustfactor g .7
+    \defineadjustfactor h .7
+    \defineadjustfactor k .7
+    \defineadjustfactor m .7
+    \defineadjustfactor n .7
+    \defineadjustfactor o .7
+    \defineadjustfactor p .7
+    \defineadjustfactor q .7
+    \defineadjustfactor s .7
+    \defineadjustfactor u .7
+    \defineadjustfactor w .7
+    \defineadjustfactor z .7
+
+    \defineadjustfactor 2 .7
+    \defineadjustfactor 3 .7
+    \defineadjustfactor 6 .7
+    \defineadjustfactor 8 .7
+    \defineadjustfactor 9 .7
+
+%     \defineadjustfactor hyphen ?
+%     \defineadjustfactor endash ?
+%     \defineadjustfactor emdash ?
+
+\stopfonthandling
+
+% no ligs other than fi fl etc, no --- and ''
+
+\startfonthandling[noligs]
+
+    \settagcode - {\notagcode}
+    \settagcode ' {\notagcode}
+    \settagcode ` {\notagcode}
+    \settagcode ? {\notagcode}
+    \settagcode ! {\notagcode}
+
+\stopfonthandling
+
+% \startfonthandling[noligs]
+%   \dostepwiserecurse{0}{255}{1}{\expanded{\settagcode \recurselevel\space\notagcode\space}}
+% \stopfonthandling
+
+% \definefonthandling [noligs] [noligs] [type=tag]
+    % \setupfontsynonym[Serif][handling=noligs]
+% \definefont[test][Serif at 12.34pt]
+%
+% {``fi--ffl---ffi'' \test ``fi--ffl---ffi''}
+
+\unprotect
+
+% beware: extended extends the preceding vector (both protruding and
+% adjusting) but as long as the normal ascii characters are not set
+% beforehand, they default to normal
+
+% protruding variants -- slanted/italic is yet incomplete
+
+\definefonthandling [pure]              [pure]                       [\c!type=\v!hanging]
+\definefonthandling [purebold]          [pure]                       [\c!type=\v!hanging]
+\definefonthandling [pureslanted]       [pure]                       [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [pureitalic]        [pure]                       [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [pureboldslanted]   [pure]                       [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [purebolditalic]    [pure]                       [\c!type=\v!hanging,\c!right=1.5]
+
+\definefonthandling [normal]            [punctuation,alpha,extended] [\c!type=\v!hanging]
+\definefonthandling [normalbold]        [punctuation,alpha,extended] [\c!type=\v!hanging]
+\definefonthandling [normalslanted]     [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [normalitalic]      [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [normalboldslanted] [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [normalbolditalic]  [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+
+% for old times sake
+
+\definefonthandling [bold]              [punctuation,alpha,extended] [\c!type=\v!hanging]
+\definefonthandling [slanted]           [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [italic]            [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [boldslanted]       [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [bolditalic]        [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+
+% hz variants
+
+\definefonthandling [hz]              [hz,extended]                [\c!type=\v!hz] % min=20 max=20 step=5
+
+% combined variants
+
+\definefonthandling [quality]         [hz,pure]
+\definefonthandling [highquality]     [hz,normal]
+
+% noligs (xml) : \definefonthandling [default] [noligs]
+
+\definefonthandling [noligs]          [noligs]                     [\c!type=tag]
+
+% experimental values !
+%
+% \definefontsynonym[myfont][Serif][handling=prespacing]
+% \definefont[whatever][myfont sa 1]
+% \setupalign[spacing]
+%
+% \whatever look at this: we now have a proper spacing feature and, hurray,
+% get rid of active punctuation!
+
+\startfonthandling [flexspacing]
+
+  \definespacefactor  : 0 1.25 .25 .25
+
+  \definespacefactor  , 0 1 .25 .25
+  \inheritspacefactor ; ,
+
+  \definespacefactor  . 0 1.5 .25 .25
+  \inheritspacefactor ! .
+  \inheritspacefactor ? .
+
+\stopfonthandling
+
+\definefonthandling[flexspacing][flexspacing][\c!type=\v!spacing]
+
+\startfonthandling [prespacing] % better name needed
+
+  \definespacefactor  : .25 .25 0 0
+  \inheritspacefactor ; :
+  \inheritspacefactor ! :
+  \inheritspacefactor ? :
+
+\stopfonthandling
+
+\definefonthandling[prespacing][prespacing][\c!type=\v!spacing] % factor=.5
+
+% A special case of guillemots, beware: when used ungrouped,
+% it overloads all successive (current) encoding vector
+% instances! Will be obsolete soon.
+
+\startfonthandling [glm]
+
+  \overloadcharacter guilsingleleft  {\defaultcharacter\guilsingleleft }
+  \overloadcharacter guilsingleright {\defaultcharacter\guilsingleright}
+  \overloadcharacter leftguillemot   {\defaultcharacter\leftguillemot  }
+  \overloadcharacter rightguillemot  {\defaultcharacter\rightguillemot }
+
+\stopfonthandling
+
+\definefonthandling [glm] [glm]
+
+\protect \endinput
diff --git a/tex/context/base/hand-def.tex b/tex/context/base/hand-def.tex
deleted file mode 100644
index 0a19ce270..000000000
--- a/tex/context/base/hand-def.tex
+++ /dev/null
@@ -1,577 +0,0 @@
-%D \module
-%D   [     file=hand-def, % was enco-pro
-%D      version=2000.29.09,
-%D        title=\CONTEXT\ Handling Macros,
-%D     subtitle=Default Protruding Factors,
-%D       author=Hans Hagen,
-%D         date=\currentdate,
-%D    copyright=Hans Hagen]
-%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 is an experimental definition file. The protruding
-%D values we use here are those found from \THANH's thesis.
-
-\startfonthandling [pure]
-
-  \defineprotrudefactor , 0 1
-  \defineprotrudefactor . 0 1
-  \defineprotrudefactor : 0 1
-  \defineprotrudefactor ; 0 1
-  \defineprotrudefactor - 0 1
-
-  \defineprotrudefactor hyphen 0 1
-  \defineprotrudefactor endash 0 .5
-  \defineprotrudefactor emdash 0 .33 % .5
-
-\stopfonthandling
-
-\startfonthandling [punctuation]
-
-  \defineprotrudefactor !  0  .2
-  \defineprotrudefactor '  0  .7
-  \defineprotrudefactor ` .7   0
-  \defineprotrudefactor ( .05  0
-  \defineprotrudefactor )  0  .05
-  \defineprotrudefactor [ .05  0
-  \defineprotrudefactor ]  0  .05
-  \defineprotrudefactor ,  0  .7
-  \defineprotrudefactor -  0  .7
-  \defineprotrudefactor .  0  .7
-  \defineprotrudefactor :  0  .5
-  \defineprotrudefactor ;  0  .5
-
-  \defineprotrudefactor rightupperninequote  0 .5
-  \defineprotrudefactor leftupperninequote  .5  0
-  \defineprotrudefactor endash               0 .3
-  \defineprotrudefactor emdash               0 .2
-
-  \defineprotrudefactor hyphen               0 .7
-
-\stopfonthandling
-
-\startfonthandling [alpha]
-
-  \defineprotrudefactor A .05 .05
-  \defineprotrudefactor F  0  .05
-  \defineprotrudefactor J .05   0
-  \defineprotrudefactor K  0  .05
-  \defineprotrudefactor L  0  .05
-  \defineprotrudefactor T .05 .05
-  \defineprotrudefactor V .05 .05
-  \defineprotrudefactor W .05 .05
-  \defineprotrudefactor X .05 .05
-  \defineprotrudefactor Y .05 .05
-
-  \defineprotrudefactor k  0  .05
-  \defineprotrudefactor r  0  .05
-  \defineprotrudefactor t  0  .05
-  \defineprotrudefactor v .05 .05
-  \defineprotrudefactor w .05 .05
-  \defineprotrudefactor x .05 .05
-  \defineprotrudefactor y .05 .05
-
-\stopfonthandling
-
-% ogoneks may need another treatment
-
-\startfonthandling [extended]
-
-  \inherithandling Acircumflex A
-  \inherithandling acircumflex a
-  \inherithandling Ccircumflex C
-  \inherithandling ccircumflex c
-  \inherithandling Ecircumflex E
-  \inherithandling ecircumflex e
-  \inherithandling Gcircumflex G
-  \inherithandling gcircumflex g
-  \inherithandling Hcircumflex H
-  \inherithandling hcircumflex h
-  \inherithandling Icircumflex I
-  \inherithandling icircumflex i
-  \inherithandling Jcircumflex J
-  \inherithandling jcircumflex j
-  \inherithandling Ocircumflex O
-  \inherithandling ocircumflex o
-  \inherithandling Scircumflex S
-  \inherithandling scircumflex s
-  \inherithandling Ucircumflex U
-  \inherithandling ucircumflex u
-  \inherithandling Wcircumflex W
-  \inherithandling wcircumflex w
-  \inherithandling Ycircumflex Y
-  \inherithandling ycircumflex y
-
-  \inherithandling Agrave A
-  \inherithandling agrave a
-  \inherithandling Egrave E
-  \inherithandling egrave e
-  \inherithandling Igrave I
-  \inherithandling igrave i
-  \inherithandling Ograve O
-  \inherithandling ograve o
-  \inherithandling Ugrave U
-  \inherithandling ugrave u
-  \inherithandling Ygrave Y
-  \inherithandling ygrave y
-
-  \inherithandling Atilde A
-  \inherithandling atilde a
-  \inherithandling Itilde I
-  \inherithandling itilde i
-  \inherithandling Ntilde N
-  \inherithandling ntilde n
-  \inherithandling Otilde O
-  \inherithandling otilde o
-  \inherithandling Utilde U
-  \inherithandling utilde u
-
-  \inherithandling Adiaeresis A
-  \inherithandling adiaeresis a
-  \inherithandling Ediaeresis E
-  \inherithandling ediaeresis e
-  \inherithandling Idiaeresis I
-  \inherithandling idiaeresis i
-  \inherithandling Odiaeresis O
-  \inherithandling odiaeresis o
-  \inherithandling Udiaeresis U
-  \inherithandling udiaeresis u
-  \inherithandling Ydiaeresis Y
-  \inherithandling ydiaeresis y
-
-  \inherithandling Aacute A
-  \inherithandling aacute a
-  \inherithandling Cacute C
-  \inherithandling cacute c
-  \inherithandling Eacute E
-  \inherithandling eacute e
-  \inherithandling Iacute I
-  \inherithandling iacute i
-  \inherithandling Lacute L
-  \inherithandling lacute l
-  \inherithandling Nacute N
-  \inherithandling nacute n
-  \inherithandling Oacute O
-  \inherithandling oacute o
-  \inherithandling Racute R
-  \inherithandling racute r
-  \inherithandling Sacute s
-  \inherithandling sacute s
-  \inherithandling Uacute U
-  \inherithandling uacute u
-  \inherithandling Yacute Y
-  \inherithandling yacute y
-  \inherithandling Zacute Z
-  \inherithandling zacute z
-
-  \inherithandling Dstroke D
-  \inherithandling dstroke d
-  \inherithandling Hstroke H
-  \inherithandling hstroke h
-  \inherithandling Tstroke T
-  \inherithandling tstroke t
-
-  \inherithandling Cdotaccent C
-  \inherithandling cdotaccent c
-  \inherithandling Edotaccent E
-  \inherithandling edotaccent e
-  \inherithandling Gdotaccent G
-  \inherithandling gdotaccent g
-  \inherithandling Idotaccent I
-  \inherithandling idotaccent i
-  \inherithandling Zdotaccent Z
-  \inherithandling zdotaccent z
-
-  \inherithandling Amacron A
-  \inherithandling amacron a
-  \inherithandling Emacron E
-  \inherithandling emacron e
-  \inherithandling Imacron I
-  \inherithandling imacron i
-  \inherithandling Omacron O
-  \inherithandling omacron o
-  \inherithandling Umacron U
-  \inherithandling umacron u
-
-  \inherithandling Ccedilla C
-  \inherithandling ccedilla c
-  \inherithandling Kcedilla K
-  \inherithandling kcedilla k
-  \inherithandling Lcedilla L
-  \inherithandling lcedilla l
-  \inherithandling Ncedilla N
-  \inherithandling ncedilla n
-  \inherithandling Rcedilla R
-  \inherithandling rcedilla r
-  \inherithandling Scedilla S
-  \inherithandling scedilla s
-  \inherithandling Tcedilla T
-  \inherithandling tcedilla t
-
-  \inherithandling Ohungarumlaut O
-  \inherithandling ohungarumlaut o
-  \inherithandling Uhungarumlaut U
-  \inherithandling uhungarumlaut u
-
-  \inherithandling Aogonek A
-  \inherithandling aogonek a
-  \inherithandling Eogonek E
-  \inherithandling eogonek e
-  \inherithandling Iogonek I
-  \inherithandling iogonek i
-  \inherithandling Uogonek U
-  \inherithandling uogonek u
-
-  \inherithandling Aring A
-  \inherithandling aring a
-  \inherithandling Uring U
-  \inherithandling uring u
-
-  \inherithandling Abreve A
-  \inherithandling abreve a
-  \inherithandling Ebreve E
-  \inherithandling ebreve e
-  \inherithandling Gbreve G
-  \inherithandling gbreve g
-  \inherithandling Ibreve I
-  \inherithandling ibreve i
-  \inherithandling Obreve O
-  \inherithandling obreve o
-  \inherithandling Ubreve U
-  \inherithandling ubreve u
-
-  \inherithandling Ccaron C
-  \inherithandling ccaron c
-  \inherithandling Dcaron D
-  \inherithandling dcaron d
-  \inherithandling Ecaron E
-  \inherithandling ecaron e
-  \inherithandling Lcaron L
-  \inherithandling lcaron l
-  \inherithandling Ncaron N
-  \inherithandling ncaron n
-  \inherithandling Rcaron R
-  \inherithandling rcaron r
-  \inherithandling Scaron S
-  \inherithandling scaron s
-  \inherithandling Tcaron T
-  \inherithandling tcaron t
-  \inherithandling Ycaron Y
-  \inherithandling ycaron y
-  \inherithandling Zcaron Z
-  \inherithandling zcaron z
-
-  \inherithandling AEligature E
-  \inherithandling aeligature e
-  \inherithandling Lstroke    I
-  \inherithandling lstroke    o
-  \inherithandling Ostroke    O
-  \inherithandling ostroke    o
-  \inherithandling OEligature O
-  \inherithandling oeligature o
-
-  \inherithandling Ssharp     S
-  \inherithandling ssharp     s
-  \inherithandling IJligature J
-  \inherithandling ijligature j
-
-  \inherithandling aumlaut a
-  \inherithandling eumlaut e
-  \inherithandling iumlaut i
-  \inherithandling oumlaut o
-  \inherithandling uumlaut u
-
-  \inherithandling Aumlaut A
-  \inherithandling Eumlaut E
-  \inherithandling Iumlaut I
-  \inherithandling Oumlaut O
-  \inherithandling Uumlaut U
-
-  \inherithandling Lslash L
-  \inherithandling lslash l
-  \inherithandling Dslash D
-  \inherithandling dslash d
-  \inherithandling Oslash O
-  \inherithandling oslash o
-
-  \inherithandling Eszett S
-  \inherithandling eszett s
-
-  \inherithandling Thorn P
-  \inherithandling thorn p
-
-  % vietnamese
-
-  \inherithandling Ahook A
-  \inherithandling ahook a
-  \inherithandling Ehook E
-  \inherithandling ehook e
-  \inherithandling Ihook I
-  \inherithandling ihook i
-  \inherithandling Ohook O
-  \inherithandling ohook o
-  \inherithandling Uhook U
-  \inherithandling uhook u
-  \inherithandling Yhook Y
-  \inherithandling yhook y
-
-  \inherithandling Acircumflexgrave A
-  \inherithandling Acircumflexacute A
-  \inherithandling Acircumflextilde A
-  \inherithandling Acircumflexhook  A
-  \inherithandling acircumflexgrave a
-  \inherithandling acircumflexacute a
-  \inherithandling acircumflextilde a
-  \inherithandling acircumflexhook  a
-  \inherithandling Ecircumflexgrave E
-  \inherithandling Ecircumflexacute E
-  \inherithandling Ecircumflextilde E
-  \inherithandling Ecircumflexhook  E
-  \inherithandling ecircumflexgrave e
-  \inherithandling ecircumflexacute e
-  \inherithandling ecircumflextilde e
-  \inherithandling ecircumflexhook  e
-  \inherithandling Ocircumflexgrave O
-  \inherithandling Ocircumflexacute O
-  \inherithandling Ocircumflextilde O
-  \inherithandling Ocircumflexhook  O
-  \inherithandling ocircumflexgrave o
-  \inherithandling ocircumflexacute o
-  \inherithandling ocircumflextilde o
-  \inherithandling ocircumflexhook  o
-
-  \inherithandling Abrevegrave A
-  \inherithandling Abreveacute A
-  \inherithandling Abrevetilde A
-  \inherithandling Abrevehook  A
-  \inherithandling abrevegrave a
-  \inherithandling abreveacute a
-  \inherithandling abrevetilde a
-  \inherithandling abrevehook  a
-
-  \inherithandling Adotbelow A
-  \inherithandling adotbelow a
-  \inherithandling Edotbelow E
-  \inherithandling edotbelow e
-  \inherithandling Idotbelow I
-  \inherithandling idotbelow i
-  \inherithandling Odotbelow O
-  \inherithandling odotbelow o
-  \inherithandling Udotbelow U
-  \inherithandling udotbelow u
-  \inherithandling Ydotbelow Y
-  \inherithandling ydotbelow y
-
-  \inherithandling Ohorndotbelow O
-  \inherithandling ohorndotbelow o
-  \inherithandling Uhorndotbelow U
-  \inherithandling uhorndotbelow u
-
-  \inherithandling Acircumflexdotbelow A
-  \inherithandling acircumflexdotbelow a
-  \inherithandling Ecircumflexdotbelow E
-  \inherithandling ecircumflexdotbelow e
-  \inherithandling Ocircumflexdotbelow O
-  \inherithandling ocircumflexdotbelow o
-
-  \inherithandling Abrevedotbelow A
-  \inherithandling abrevedotbelow a
-
-  \inherithandling Ohorn      O
-  \inherithandling Ohorngrave O
-  \inherithandling Ohornacute O
-  \inherithandling Ohorntilde O
-  \inherithandling Ohornhook  O
-  \inherithandling ohorn      o
-  \inherithandling ohorngrave o
-  \inherithandling ohornacute o
-  \inherithandling ohorntilde o
-  \inherithandling ohornhook  o
-  \inherithandling Uhorn      U
-  \inherithandling Uhorngrave U
-  \inherithandling Uhornacute U
-  \inherithandling Uhorntilde U
-  \inherithandling Uhornhook  U
-  \inherithandling uhorn      u
-  \inherithandling uhorngrave u
-  \inherithandling uhornacute u
-  \inherithandling uhorntilde u
-  \inherithandling uhornhook  u
-
-  \inherithandling Ytilde Y
-  \inherithandling ytilde y
-  \inherithandling Etilde E
-  \inherithandling etilde e
-
-\stopfonthandling
-
-\startfonthandling [hz]
-
-    \defineadjustfactor A .5
-    \defineadjustfactor B .7
-    \defineadjustfactor C .7
-    \defineadjustfactor D .5
-    \defineadjustfactor E .7
-    \defineadjustfactor F .7
-    \defineadjustfactor G .5
-    \defineadjustfactor H .7
-    \defineadjustfactor K .7
-    \defineadjustfactor M .7
-    \defineadjustfactor N .7
-    \defineadjustfactor O .5
-    \defineadjustfactor P .7
-    \defineadjustfactor Q .5
-    \defineadjustfactor R .7
-    \defineadjustfactor S .7
-    \defineadjustfactor U .7
-    \defineadjustfactor W .7
-    \defineadjustfactor Z .7
-
-    \defineadjustfactor a .7
-    \defineadjustfactor b .7
-    \defineadjustfactor c .7
-    \defineadjustfactor d .7
-    \defineadjustfactor e .7
-    \defineadjustfactor g .7
-    \defineadjustfactor h .7
-    \defineadjustfactor k .7
-    \defineadjustfactor m .7
-    \defineadjustfactor n .7
-    \defineadjustfactor o .7
-    \defineadjustfactor p .7
-    \defineadjustfactor q .7
-    \defineadjustfactor s .7
-    \defineadjustfactor u .7
-    \defineadjustfactor w .7
-    \defineadjustfactor z .7
-
-    \defineadjustfactor 2 .7
-    \defineadjustfactor 3 .7
-    \defineadjustfactor 6 .7
-    \defineadjustfactor 8 .7
-    \defineadjustfactor 9 .7
-
-%     \defineadjustfactor hyphen ?
-%     \defineadjustfactor endash ?
-%     \defineadjustfactor emdash ?
-
-\stopfonthandling
-
-% no ligs other than fi fl etc, no --- and ''
-
-\startfonthandling[noligs]
-
-    \settagcode - {\notagcode}
-    \settagcode ' {\notagcode}
-    \settagcode ` {\notagcode}
-    \settagcode ? {\notagcode}
-    \settagcode ! {\notagcode}
-
-\stopfonthandling
-
-% \startfonthandling[noligs]
-%   \dostepwiserecurse{0}{255}{1}{\expanded{\settagcode \recurselevel\space\notagcode\space}}
-% \stopfonthandling
-
-% \definefonthandling [noligs] [noligs] [type=tag]
-    % \setupfontsynonym[Serif][handling=noligs]
-% \definefont[test][Serif at 12.34pt]
-%
-% {``fi--ffl---ffi'' \test ``fi--ffl---ffi''}
-
-\unprotect
-
-% beware: extended extends the preceding vector (both protruding and
-% adjusting) but as long as the normal ascii characters are not set
-% beforehand, they default to normal
-
-% protruding variants -- slanted/italic is yet incomplete
-
-\definefonthandling [pure]              [pure]                       [\c!type=\v!hanging]
-\definefonthandling [purebold]          [pure]                       [\c!type=\v!hanging]
-\definefonthandling [pureslanted]       [pure]                       [\c!type=\v!hanging,\c!right=1.5]
-\definefonthandling [pureitalic]        [pure]                       [\c!type=\v!hanging,\c!right=1.5]
-\definefonthandling [pureboldslanted]   [pure]                       [\c!type=\v!hanging,\c!right=1.5]
-\definefonthandling [purebolditalic]    [pure]                       [\c!type=\v!hanging,\c!right=1.5]
-
-\definefonthandling [normal]            [punctuation,alpha,extended] [\c!type=\v!hanging]
-\definefonthandling [normalbold]        [punctuation,alpha,extended] [\c!type=\v!hanging]
-\definefonthandling [normalslanted]     [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
-\definefonthandling [normalitalic]      [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
-\definefonthandling [normalboldslanted] [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
-\definefonthandling [normalbolditalic]  [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
-
-% for old times sake
-
-\definefonthandling [bold]              [punctuation,alpha,extended] [\c!type=\v!hanging]
-\definefonthandling [slanted]           [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
-\definefonthandling [italic]            [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
-\definefonthandling [boldslanted]       [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
-\definefonthandling [bolditalic]        [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
-
-% hz variants
-
-\definefonthandling [hz]              [hz,extended]                [\c!type=\v!hz] % min=20 max=20 step=5
-
-% combined variants
-
-\definefonthandling [quality]         [hz,pure]
-\definefonthandling [highquality]     [hz,normal]
-
-% noligs (xml) : \definefonthandling [default] [noligs]
-
-\definefonthandling [noligs]          [noligs]                     [\c!type=tag]
-
-% experimental values !
-%
-% \definefontsynonym[myfont][Serif][handling=prespacing]
-% \definefont[whatever][myfont sa 1]
-% \setupalign[spacing]
-%
-% \whatever look at this: we now have a proper spacing feature and, hurray,
-% get rid of active punctuation!
-
-\startfonthandling [flexspacing]
-
-  \definespacefactor  : 0 1.25 .25 .25
-
-  \definespacefactor  , 0 1 .25 .25
-  \inheritspacefactor ; ,
-
-  \definespacefactor  . 0 1.5 .25 .25
-  \inheritspacefactor ! .
-  \inheritspacefactor ? .
-
-\stopfonthandling
-
-\definefonthandling[flexspacing][flexspacing][\c!type=\v!spacing]
-
-\startfonthandling [prespacing] % better name needed
-
-  \definespacefactor  : .25 .25 0 0
-  \inheritspacefactor ; :
-  \inheritspacefactor ! :
-  \inheritspacefactor ? :
-
-\stopfonthandling
-
-\definefonthandling[prespacing][prespacing][\c!type=\v!spacing] % factor=.5
-
-% A special case of guillemots, beware: when used ungrouped,
-% it overloads all successive (current) encoding vector
-% instances! Will be obsolete soon.
-
-\startfonthandling [glm]
-
-  \overloadcharacter guilsingleleft  {\defaultcharacter\guilsingleleft }
-  \overloadcharacter guilsingleright {\defaultcharacter\guilsingleright}
-  \overloadcharacter leftguillemot   {\defaultcharacter\leftguillemot  }
-  \overloadcharacter rightguillemot  {\defaultcharacter\rightguillemot }
-
-\stopfonthandling
-
-\definefonthandling [glm] [glm]
-
-\protect \endinput
diff --git a/tex/context/base/hand-ini.mkii b/tex/context/base/hand-ini.mkii
index 42d248df6..ac8a94696 100644
--- a/tex/context/base/hand-ini.mkii
+++ b/tex/context/base/hand-ini.mkii
@@ -16,22 +16,6 @@
 
 \unprotect
 
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
 \newif\iftracefonthandling % \tracefonthandlingtrue
 
 \newif\ifskiphandlingdef  \skiphandlingdeffalse
@@ -452,7 +436,7 @@
      {\letvalueempty{\c!file\f!handlingprefix#1}%
       \makeshortfilename[\truefilename{\f!handlingprefix#1}]%
       \startreadingfile
-        \readsysfile\shortfilename
+        \readsysfile{\shortfilename.mkii}
           {\showmessage\m!handlings2{#1}}
           {\showmessage\m!handlings3{#1}}%
       \stopreadingfile}}
diff --git a/tex/context/base/java-fld.tex b/tex/context/base/java-fld.tex
index e6e5ee03a..4fdf41ce4 100644
--- a/tex/context/base/java-fld.tex
+++ b/tex/context/base/java-fld.tex
@@ -19,15 +19,7 @@
 
   function Sanitized_TeX_String (value)
     { var v = value ;
-    % v = v.replace(/\\\\\\/L/g,"\\225") ; % problematic
-    % v = v.replace(  /\\\\OE/g,"\\226") ; % problematic
-    % v = v.replace(  /\\\\vS/g,"\\227") ; % problematic
-    % v = v.replace(  /\\\\"Y/g,"\\230") ; % problematic
-    % v = v.replace(  /\\\\vZ/g,"\\231") ; % problematic
-    % v = v.replace(/\\\\\\/l/g,"\\233") ; % problematic
       v = v.replace(  /\\\\oe/g,"\\234") ;
-    % v = v.replace(  /\\\\vs/g,"\\235") ; % problematic
-    % v = v.replace(  /\\\\vz/g,"\\236") ; % problematic
       v = v.replace(  /\\\\<>/g,"\\273") ;
       v = v.replace(  /\\\\`A/g,"\\300") ;
@@ -52,7 +44,6 @@
       v = v.replace(  /\\\\^O/g,"\\324") ;
       v = v.replace(  /\\\\~O/g,"\\325") ;
       v = v.replace(  /\\\\"O/g,"\\326") ;
-    % v = v.replace(/\\\\\\/O/g,"\\330") ; % problematic
       v = v.replace(  /\\\\`U/g,"\\331") ;
       v = v.replace(  /\\\\'U/g,"\\332") ;
       v = v.replace(  /\\\\^U/g,"\\333") ;
@@ -81,7 +72,6 @@
       v = v.replace(  /\\\\^o/g,"\\364") ;
       v = v.replace(  /\\\\~o/g,"\\365") ;
       v = v.replace(  /\\\\"o/g,"\\366") ;
-    % v = v.replace(/\\\\\\/o/g,"\\370") ; % problematic
       v = v.replace(  /\\\\`u/g,"\\371") ;
       v = v.replace(  /\\\\'u/g,"\\372") ;
       v = v.replace(  /\\\\^u/g,"\\373") ;
@@ -129,7 +119,7 @@
 
 \startJSpreamble fields_1 used now
 
-var visible_field  = new Array() ; % no garbage collection !
+var visible_field  = new Array() ;
 var visible_fields = 0 ;
 
 function PresetFields ( )
@@ -140,13 +130,11 @@ function Preset_Fields ( )
 
 function Hide_When_Down ( )
   { event.target.hidden = true }
-% { event.target.display = display.hidden }
 
 function Hide_Field ( Name )
   { var v = this.getField(Name) ;
     if (v)
       { v.hidden = true ;
-    % { v.display = display.hidden ;
         v.readonly = true ;
         this.dirty = false } }
 
@@ -173,11 +161,11 @@ function Hide_Fields ()
       { Hide_Field(visible_field[visible_fields]) ;
         --visible_fields } }
 
-function Vide_Fields ( Name ) % show only one field
+function Vide_Fields ( Name )
   { Hide_Fields () ;
     Vide_Field ( Name) }
 
-function Vide_Hide_Fields ( Name ) % show only one field
+function Vide_Hide_Fields ( Name )
   { Hide_Fields () ;
     Vide_Hide_Field ( Name) }
 
@@ -185,10 +173,6 @@ function Toggle_Hide ( Name )
   { var v = this.getField(Name) ;
     if (v)
       { v.hidden = !v.hidden ;
-      % if v.display == display.hidden
-      %   { v.display = display.visible }
-      % else
-      %   { v.display = display.hidden }
         this.dirty = false } }
 
 function Field_On ( Name )
@@ -218,10 +202,6 @@ function Flip_Fields ( Name )
       { v = this.getField(Names[i]) ;
         if (v)
           { v.hidden = !v.hidden ;
-          % if v.display == display.hidden
-          %   { v.display = display.visible }
-          % else
-          %   { v.display = display.hidden }
             v.value = "On" } } }
 
 function Forget_Changes ()
@@ -229,7 +209,6 @@ function Forget_Changes ()
 
 function ForgetChanges ()
   { this.dirty = false }
-
 \stopJSpreamble
 
 %\startJScode{Hide_When_Down}  Hide_When_Down()     \stopJScode
diff --git a/tex/context/base/java-ini.lua b/tex/context/base/java-ini.lua
new file mode 100644
index 000000000..0fe7d3d29
--- /dev/null
+++ b/tex/context/base/java-ini.lua
@@ -0,0 +1,112 @@
+if not modules then modules = { } end modules ['java-ini'] = {
+    version   = 1.001,
+    comment   = "companion to java-ini.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+javascripts           = javascripts           or { }
+javascripts.codes     = javascripts.codes     or { }
+javascripts.preambles = javascripts.preambles or { }
+javascripts.functions = javascripts.functions or { }
+
+local codes, preambles, functions = javascripts.codes, javascripts.preambles, javascripts.functions
+
+local preambled = { }
+
+local function storefunction(s)
+    functions[s] = true
+end
+
+local uses     = lpeg.P("uses")
+local used     = lpeg.P("used")
+local left     = lpeg.P("{")
+local right    = lpeg.P("}")
+local space    = lpeg.S(" \r\n")
+local spaces   = space^0
+local braced   = left * lpeg.C((1-right-space)^1) * right
+local unbraced = lpeg.C((1-space)^1)
+local name     = spaces * (braced + unbraced) * spaces
+local any      = lpeg.P(1)
+local script   = lpeg.C(any^1)
+local funct    = lpeg.P("function")
+local leftp    = lpeg.P("(")
+local rightp   = lpeg.P(")")
+local fname    = spaces * funct * spaces * (((1-space-left)^1)/storefunction) * spaces * leftp
+
+local parsecode      = name * ((uses * name) + lpeg.Cc("")) * spaces * script
+local parsepreamble  = name * ((used * name) + lpeg.Cc("")) * spaces * script
+local parsefunctions = (fname + any)^0
+
+function javascripts.storecode(str)
+    local name, uses, script = parsecode:match(str)
+    if name and name ~= "" then
+        javascripts.codes[name] = { uses, script }
+    end
+end
+
+function javascripts.storepreamble(str) -- now later
+    local name, used, script = parsepreamble:match(str)
+    if name and name ~= "" then
+        preambles[#preambles+1] = { name, used, script }
+        preambled[name] = #preambles
+        parsefunctions:match(script)
+    end
+end
+
+function javascripts.setpreamble(name,script) -- now later
+    if name and name ~= "" then
+        preambles[#preambles+1] = { name, "now", script }
+        preambled[name] = #preambles
+        parsefunctions:match(script)
+    end
+end
+
+function javascripts.addtopreamble(name,script) -- now later
+    if name and name ~= "" then
+        local p = preambled[name]
+        if p then
+            preambles[p] = { "now", preambles[p] .. " ;\n" .. script }
+        else
+            preambles[#preambles+1] = { name, "now", script }
+            preambled[name] = #preambles
+            parsefunctions:match(script)
+        end
+    end
+end
+
+function javascripts.usepreamblenow(name) -- now later
+    if name and name ~= "" and preambled[name] then
+        preambles[preambled[name]][2] = "now"
+    end
+end
+
+function javascripts.code(name,arguments)
+    local c = codes[name]
+    if c then
+        local u, code = c[1], c[2]
+        if u ~= "" then
+            local p = preambled[u]
+            if p then
+                preambles[p][1] = "now"
+            end
+        end
+        return code
+    end
+    local f = functions[name]
+    if f then
+        return string.format("%s(%s)",name,arguments or "")
+    end
+end
+
+function javascripts.flushpreambles()
+    local t = { }
+    for i=1,#preambles do
+        local preamble = preambles[i]
+        if preamble[2] == "now" then
+            t[#t+1] = { preamble[1], preamble[3] }
+        end
+    end
+    return t
+end
diff --git a/tex/context/base/java-ini.mkiv b/tex/context/base/java-ini.mkiv
index 53c36d65f..6536ced48 100644
--- a/tex/context/base/java-ini.mkiv
+++ b/tex/context/base/java-ini.mkiv
@@ -13,47 +13,10 @@
 
 \writestatus{loading}{ConTeXt JavaScript Macros / Initialization}
 
-% BUG: preamble zonder used/used en split
-
-% todo: lua sanitizer
-
-% JavaScript support is under development. In the near future
-% a slightly different model will be used. The JScode stuff
-% will probably become just auto function inclusion and the
-% JS_* things will disappear. First I have to find a way to
-% deal with global variables so the 'uses' thing will remain.
-
-% ook p{ref}
-% documentation should be corrected to JS(
-
-% Also, obeylines will be supported.
+\registerctxluafile{java-ini}{1.001}
 
 \unprotect
 
-%D \JAVA\ support is not implemented as a generic support
-%D module. The main reason for this is that passing system
-%D variables to a \JAVASCRIPT\ is closely related to other core
-%D macros. First some messages:
-
-%D \TEX\ is not the right tool to check the \JAVA\ code; the
-%D most we can do is reporting some passed variables:
-
-\newif\iftraceJScode \traceJScodefalse
-
-\let\traceJScode\traceJScodetrue
-
-%D A bit out of place, but not dangerous:
-
-\bgroup
-\catcode127=\@@letter
-\gdef\delcharacter{^^7f}
-\egroup
-
-%D The number of passed variables is minimalized by setting the
-%D next switch.
-
-\newif\ifminimalizeJScode    \minimalizeJScodetrue
-
 %D \macros
 %D   {JS*}
 %D
@@ -74,50 +37,7 @@
 %D \starttyping
 %D \goto{calculate total}[Sum(1.5,2.3)]
 %D \stoptyping
-%D
-%D References are passed by using the \type{R{}} classifier.
-%D
-%D \starttyping
-%D \goto{calculate total}[Sum(1.5,2.3,R{overflow})]
-%D \stoptyping
-%D
-%D The last call calls the script \type{Sum} and passes the
-%D next set of variables:
-%D
-%D \starttyping
-%D JS_S_1="1.5";
-%D JS_S_2="2.3";
-%D JS_R_3="overflow";
-%D JS_P_3=3;
-%D \stoptyping
-%D
-%D The first two parameters are just strings, the third one
-%D however is treated as a reference and results in passing the
-%D reference (if needed this references is prefixed) and the
-%D (real) page number. The alternative:
-%D
-%D \starttyping
-%D \goto{calculate total}[JS(Sum{V{1.5},V{2.3},R{overflow}})]
-%D \stoptyping
-%D
-%D does a verbose passing:
-%D
-%D \starttyping
-%D JS_V_1=1.5;
-%D JS_V_2=2.3;
-%D JS_R_3="overflow";
-%D JS_P_3=3;
-%D \stoptyping
-% %D
-% %D Finally we have a counter that tells\JAVA\ how many
-% %D arguments were passed,
-% %D
-% %D \starttyping
-% %D JS_N
-% %D \stoptyping
 
-%D We will also support direct function calls. In that case
-%D no intermediate variables are used.
 
 %D \macros
 %D   {startJScode}
@@ -125,32 +45,12 @@
 %D A piece of \JAVASCRIPT\ code is defined by saying:
 %D
 %D \starttyping
-%D \startJScode{SomeScript}
-%D   var Item=this.getField("item");
-%D          N=Item.getArray();
-%D      Total=this.getField("total");
-%D   Total.value=0;
-%D   for (j=0; j0) && (JS_R_1!=""))
-%D     { gotoNamedDest(JS_R_1) };
-%D \stopJScode
-%D \stoptyping
-%D
-%D Such a piece of code is closely related to the interpreter
-%D used. Watch the last two lines, here the script adapts
-%D itself to the presence of a reference.
-%D
-%D While
-%D
-%D \starttyping
 %D \startJScode{name}
 %D   name = 4 ;
 %D \stopJScode
 %D \stoptyping
 %D
-%D assumes uses no preamble or presumes that the preamble is
+%D This assumes uses no preamble or presumes that the preamble is
 %D always loaded, the next definition also tells \CONTEXT\ to
 %D actually include the preamble needed.
 %D
@@ -159,109 +59,9 @@
 %D   uses = 6 ;
 %D \stopJScode
 %D \stoptyping
-
-\long\def\startJScode#1 #2
-  {\doifelse{#2}{uses}
-     {\dostartJScodeA{#1}}
-     {\dostartJScodeB{#1} #2 }}
-
-\long\def\dostartJScodeA#1#2 #3\stopJScode
-  {\long\setgvalue{\r!java#1}{\do{#2}{#3}}}
-
-\long\def\dostartJScodeB#1#2\stopJScode
-  {\long\setgvalue{\r!java#1}{\do{}{#2}}}
-
-\let\stopJScode\relax
-
-%D \macros
-%D   {presetJScode}
-%D
-%D The code can be retrieved by saying
-%D
-%D \starttyping
-%D \presetJScode{SomeScript}{template}
-%D \stoptyping
 %D
-%D Such a template is a comma separated list, where
-%D individual entries can optionally be transformed by
-%D \type{R{}} and \type{V{}}.
-%D
-%D After this call, the code is available in \type{\JScode}.
-
-\newif\ifdirectJScode
-
-\def\presetJScode#1#2% #1=operation #2=arguments
-  {\setverbosecscharacters
-   \def\par{\delcharacter}% was: { }
-   \scratchcounter\zerocount
-   \globallet\JScode\empty
-   \def\do##1##2%
-     {\doifelse{##2}{!}\directJScodetrue\directJScodefalse}%
-   \getvalue{\r!java#1}%
-   \edef\!!stringa{#2}%
-   \ifx\!!stringa\empty \else
-     \processcommacommand[\!!stringa]\dopresetJSvariables
-   \fi
-   \def\docommand##1%
-     {\doifundefinedelse{\r!java\r!java##1}
-        {\showmessage\m!javascript2{##1}}
-        {\useJSpreamblenow{##1}}}%
-%        {\doglobal\increment\currentJSpreamble
-%         \doglobal\addtocommalist{##1}\allJSpreambles}}%
-   \def\do##1##2%
-     {\xdef\JScode{\ifdirectJScode#1(\JScode)\else\JScode##2\fi}%
-     %\xdef\JScode{JS\string_N=\the\scratchcounter;\JScode}%
-      \processcommalist[##1]\docommand}%
-   \getvalue{\r!java#1}}
-
-\def\dopresetJSvariables#1%
-  {\advance\scratchcounter \plusone
-   \donefalse
-   \dodopresetJSvariables#1\end}%
-
-\def\dodopresetJSvariables
-  {\doifnextcharelse R\dodopresetJSrefvariables
-  {\doifnextcharelse V\dodopresetJSvervariables
-  {\doifnextcharelse S\dodopresetJSstrvariables
-                      \dodopresetJSrawvariables}}}
-
-\def\dodopresetJSrefvariables R#1\end
-  {\doifreferencefoundelse{#1}
-     {\donetrue \dododopresetJSvariables R{\referenceprefix#1}%
-      \donefalse\dododopresetJSvariables P{\currentrealreference}}
-     {\unknownreference{#1}}%
-   \ifminimalizeJScode \else
-     \donetrue\dododopresetJSvariables S{#1}%
-   \fi}
-
-\def\dodopresetJSvervariables V#1\end
-  {\donefalse\dododopresetJSvariables V{#1}%
-   \ifminimalizeJScode \else
-     \donetrue\dododopresetJSvariables S{#1}%
-   \fi}
-
-\def\dodopresetJSstrvariables S#1\end
-  {\donetrue\dododopresetJSvariables S{#1}}
-
-\def\dodopresetJSrawvariables #1\end
-  {\donetrue\dododopresetJSvariables S{#1}}
-
-\def\JSprefix#1%
-  {JS\string_#1\string_\the\scratchcounter}
-
-\def\dododopresetJSvariables#1#2%
-  {\iftraceJScode
-     \writestatus{JavaScript}{\JSprefix#1=#2}
-     \xdef\JScode{\JScode console.println("\JSprefix#1=#2"); }%
-   \fi
-   \ifdirectJScode
-     \xdef\JScode{\ifx\JScode\empty\else\JScode,\fi\ifdone"#2"\else#2\fi}%
-   \else
-     \xdef\JScode{\JScode\JSprefix#1=\ifdone"#2"\else#2\fi; }%
-   \fi}
-
 %D \macros
-%D   {startJSpreamble, flushJSpreamble}
+%D   {startJSpreamble}
 %D
 %D One can define insert \JAVASCRIPT\ code at the document level
 %D by using:
@@ -291,365 +91,40 @@
 %D
 %D This command may be used more that once, but always before
 %D the first page is shipped out.
-
-\newif\ifoneJSpreamble \oneJSpreamblefalse
-
-\let\allJSpreambles\empty
-\newcounter\nofJSpreambles
-\newcounter\currentJSpreamble
-
-\long\def\startJSpreamble#1 #2 %
-  {\bgroup           % we need to restore the catcodes
-   \restoreendofline % just in case it happens while reading lists
-   \doifelse{#2}{used}
-     {\dostartJSpreamble#1 }
-     {\dostartJSpreamble#1 now #2 }}
-
-\long\def\dostartJSpreamble#1 #2 %
-  {\processaction
-     [#2]
-     [     later=>\chardef\JSstatus\zerocount,%
-             now=>\chardef\JSstatus\plusone  ,%
-      \s!default=>\chardef\JSstatus\plustwo  ,%
-      \s!unknown=>\chardef\JSstatus\plustwo  ]%
-    \ifaddJSlinebreaks
-      \obeylines  \let\obeyedline \normalpar
-      \obeyspaces \let\obeyedspace\normalspace
-    \fi
-    \dodostartJSpreamble{#1}}
-
-\long\def\dodostartJSpreamble#1#2\stopJSpreamble
-  {\presetJSfunctions #2function ()\end
-   \long\setgvalue{\r!java\r!java#1}{#2}%
-   \ifcase\JSstatus \else
-     \useJSpreamblenow{#1}%
-   \fi
-   \egroup}
-
+%D
 %D \macros
 %D   {setJSpreamble, addtoJSpreamble}
 %D
 %D In addition to the previous preamble definitions, we can
 %D set a preamble \quote {in||line} and add tokens to a
 %D preamble.
-
-\def\setJSpreamble#1#2%
-  {\doifundefined{\r!java\r!java#1}
-     {\setgvalue{\r!java\r!java#1}{#2;}%
-      \doglobal\increment\currentJSpreamble
-      \doglobal\addtocommalist{#1}\allJSpreambles}}
-
-\def\addtoJSpreamble#1#2%
-  {\doifdefinedelse{\r!java\r!java#1}
-     {\edef\!!stringa{\r!java\r!java#1}%
-      \edef\!!stringb{\csname\!!stringa\endcsname}%
-      \@EA\setgvalue\@EA\!!stringa\@EA{\!!stringb #2;}}
-     {\setJSpreamble{#1}{#2}}}
-
+%D
 %D \macros
 %D   {useJSpreamblenow}
 %D
-%D The next macro can be used to force inclusion of postponed
+%D This macro can be used to force inclusion of postponed
 %D \JAVASCRIPT\ preambles.
 
-\def\useJSpreamblenow#1%
-  {\doglobal\increment\currentJSpreamble
-   \doglobal\addtocommalist{#1}\allJSpreambles}
-
-%D Because we want to check for valid calls, we preload the
-%D functions. This means that we can call them directly as
-%D well as indirectly when defined by \type {\startJScode} etc.
-
-% \long\def\presetJSfunctions#1function #2(#3)%
-%   {\doifelsenothing{#2}
-%      {\long\def\presetJSfunctions##1\end{}}
-%      {\stripspaces\from#2\to\ascii
-%       \doifundefined{\r!java\ascii}{\setgvalue{\r!java\ascii}{\do{}{!}}}}%
-%    \presetJSfunctions}
-
-\long\def\presetJSfunctions#1function#2(#3)%
-  {\doifelse{#2}\space
-     {\long\def\presetJSfunctions##1\end{}}
-     {\stripspaces\from#2\to\ascii
-      \doifundefined{\r!java\ascii}{\setgvalue{\r!java\ascii}{\do{}{!}}}}%
-   \presetJSfunctions}
-
-\def\getJSpreamble#1%
-  {\getvalue{\r!java\r!java#1}}
+\unexpanded\def\startJScode
+  {\begingroup\obeylualines\obeyluatokens\dostartJScode}
 
-\def\presetJSpreamble
-  {\ifx\allJSpreambles\empty\else
-     \bgroup
-     \setverbosecscharacters
-     \obeyspaces \let\obeyedspace\normalspace
-     \def\par{\delcharacter}% was: { }
-     \globallet\JSpreamble\empty
-     \def\@@collectedJSpreamble{\r!java\r!java collected}%
-     \letvalue{\@@collectedJSpreamble}=\empty
-     \def\docommand##1%
-       {\xdef\JScode{\getvalue{\r!java\r!java##1}}%
-        \ifoneJSpreamble % \global\letcdcsname
-          \@EA\setxvalue\@EA\@@collectedJSpreamble\@EA
-            {\csname\@@collectedJSpreamble\endcsname\JScode}%
-        \else
-          \setxvalue{\r!java\r!java##1}{\JScode}%
-        \fi}%
-     \processcommacommand[\allJSpreambles]\docommand
-     \ifoneJSpreamble
-       \gdef\allJSpreambles{collected}%
-     \fi
-     \globallet\presetJSpreamble\relax
-     \egroup
-   \fi}
+\long\def\dostartJScode#1\stopJScode
+  {\normalexpanded{\endgroup\ctxlua{javascripts.storecode(\!!bs#1\!!es)}}}
 
-\def\flushJSpreamble
-  {\iflocation\ifx\allJSpreambles\empty\else
-     \ifcase\nofJSpreambles\else\ifnum\nofJSpreambles=\currentJSpreamble
-       \bgroup
-       \presetJSpreamble
-       \expanded{\doflushJSpreamble{\allJSpreambles}}%
-       \globallet\flushJSpreamble\relax
-       \globallet\allJSpreambles\empty
-       \egroup
-     \fi\fi
-   \fi\fi}
-
-\def\finalflushJSpreamble
-  {\iflocation
-     \flushJSpreamble
-     \ifcase\currentJSpreamble\relax\else
-       \savecurrentvalue\nofJSpreambles\currentJSpreamble
-       \globallet\currentJSpreamble\nofJSpreambles
-     \fi
-   \fi}
-
-%D \macros
-%D   {doPSsanitizeJScode}
-%D
-%D Before the code can be passed to the (\POSTSCRIPT\ or \PDF)
-%D output file, some precautions must be made concerning the
-%D use of \type{(} and~\type{)}. Here we use a beautiful
-%D \type{\aftergroup} trick I discovered in the \TABLE\ format.
-
-\def\doPSsanitizeJScode#1\to#2%
-  {\begingroup
-   \scratchcounter\zerocount % \aftergroup counter
-   \aftergroup\xdef
-   \aftergroup#2%
-   \aftergroup{%
-   \expanded{\defconvertedargument\noexpand\JScode{#1}}%
-   \expandafter\handletokens\JScode\with\dodoPSsanitizeJScode
-   \aftergroup}%
-   \endgroup
-   \iftraceJScode
-     \writestatus{JS trace}{#2}%
-   \fi}
-
-%D I started with:
-%D
-%D \starttyping
-%D \def\dodoPSsanitizeJScode#1%
-%D   {\aftergroup\string
-%D    \if#1(%
-%D      \expandafter\aftergroup\csname#1\endcsname
-%D    \else\if#1)%
-%D      \expandafter\aftergroup\csname#1\endcsname
-%D    \else\if#1;%
-%D      \aftergroup;\aftergroup\string\expandafter\aftergroup\
-%D    \else
-%D      \expandafter\aftergroup#1%
-%D    \fi\fi\fi
-%D    \advance\scratchcounter by 1
-%D    \ifnum\scratchcounter=500
-%D      \expandafter\dododoPSsanitizeJScode
-%D    \fi}
-%D \stoptyping
-%D
-%D For pretty printing purposes, we need some way to signal
-%D \TEX\ macros. Therefore we introduce a special keyword
-%D \type{TEX}. When followed by a space, this keyword is
-%D ignored, that is, filtered from the stream. Now we have:
-
-\chardef\JSisTEX  \zerocount
-\chardef\JScomment\zerocount
-
-\newif\ifaddJSlinebreaks \addJSlinebreakstrue
-
-\def\flushJSisTEX
-  {\ifcase\JSisTEX
-   \or \aftergroup T%
-   \or \aftergroup T\aftergroup E%
-   \or \aftergroup T\aftergroup E\aftergroup X%
-   \fi
-   \chardef\JSisTEX\zerocount}
-
-% \def\doJSlinebreak
-%  {\ifaddJSlinebreaks
-%     \aftergroup\string\aftergroup\n%
-%   \fi}
-%
-% \def\dodoPSsanitizeJScode#1%  % input stack>500 & TEX check
-%   {\if#1/%
-%      \ifnum\JScomment=0
-%        \chardef\JScomment\plusone
-%      \else\ifnum\JScomment=1
-%        \chardef\JScomment\plustwo
-%      \fi\fi
-%    \else
-%      \ifnum\JScomment=1
-%        \aftergroup/%
-%        \chardef\JScomment\zerocount
-%      \fi
-%      \ifnum\JScomment=2
-%        \if#1\delcharacter
-%          \chardef\JScomment\zerocount
-%        \fi
-%      \else
-%        \if#1\delcharacter
-%          \flushJSisTEX\doJSlinebreak
-%        \else\if#1(%
-%          \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname
-%        \else\if#1)%
-%          \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname
-%        \else\if#1;%
-%          \flushJSisTEX\aftergroup;\doJSlinebreak
-%        \else\if#1T%
-%          \ifnum\JSisTEX=0 \chardef\JSisTEX\plusone   \else\flushJSisTEX\aftergroup T\fi
-%        \else\if#1E%
-%          \ifnum\JSisTEX=1 \chardef\JSisTEX\plustwo   \else\flushJSisTEX\aftergroup E\fi
-%        \else\if#1X%
-%          \ifnum\JSisTEX=2 \chardef\JSisTEX\plusthree \else\flushJSisTEX\aftergroup X\fi
-%        \else\if#1\normalspace
-%          \ifnum\JSisTEX=3 \chardef\JSisTEX\zerocount \else\flushJSisTEX\aftergroup#1\fi
-%        \else
-%          \flushJSisTEX\aftergroup\string\expandafter\aftergroup#1%
-%        \fi\fi\fi\fi\fi\fi\fi\fi
-%      \fi
-%    \fi
-%    \dododoPSsanitizeJScode}
-
-% todo: "http:\\" -> simple. maar wel \" afvangen
-%
-% use new pdftex escape mechanism or make fully expandable version, not used that often btw
-
-\chardef\JSstring\zerocount
-
-\def\doJSlinebreak
- {\chardef\JScomment\zerocount
-  \chardef\JSstring\zerocount
-  \ifaddJSlinebreaks
-    \aftergroup\string\aftergroup\n%
-  \fi}
-
-\def\dodoPSsanitizeJScode#1%  % input stack>500 & TEX check
-  {\if#1/%
-     \ifnum\JSstring=0
-       \ifnum\JScomment=0
-         \chardef\JScomment\plusone
-       \else\ifnum\JScomment=1
-         \chardef\JScomment\plustwo
-       \fi\fi
-     \else
-       \aftergroup/%
-     \fi
-   \else
-     \ifnum\JScomment=1
-       \aftergroup/%
-       \chardef\JScomment\zerocount
-     \fi
-     % is the delchar trick still needed?
-     \ifnum\JScomment=2
-       \ifnum`#1=13 % brrr
-         \doJSlinebreak
-       \else\if#1\par
-         \doJSlinebreak
-       \else\if#1\delcharacter
-         \doJSlinebreak
-       \fi\fi\fi
-     \else
-       \ifnum`#1=13 % brrr
-         \flushJSisTEX\doJSlinebreak
-       \else\if#1\par
-         \flushJSisTEX\doJSlinebreak
-       \else\if#1\delcharacter
-         \flushJSisTEX\doJSlinebreak
-       \else\if#1(%
-         \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname
-       \else\if#1)%
-         \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname
-       %\else\if#1;%
-       %  \flushJSisTEX\aftergroup;\doJSlinebreak
-       \else\if#1T%
-         \ifnum\JSisTEX=0 \chardef\JSisTEX\plusone   \else\flushJSisTEX\aftergroup T\fi
-       \else\if#1E%
-         \ifnum\JSisTEX=1 \chardef\JSisTEX\plustwo   \else\flushJSisTEX\aftergroup E\fi
-       \else\if#1X%
-         \ifnum\JSisTEX=2 \chardef\JSisTEX\plusthree \else\flushJSisTEX\aftergroup X\fi
-       \else\if#1\normalspace
-         \ifnum\JSisTEX=3 \chardef\JSisTEX\zerocount \else\flushJSisTEX\aftergroup#1\fi
-       \else
-          % todo: "test\"test"
-         \if#1"%
-           \ifcase\JSstring
-             \chardef\JSstring\plusone
-           \else
-             \chardef\JSstring\zerocount
-           \fi
-         \fi
-         \flushJSisTEX\aftergroup\string\expandafter\aftergroup#1%
-       \fi\fi\fi\fi\fi\fi\fi\fi\fi % \fi
-     \fi
-   \fi
-   \dododoPSsanitizeJScode}
-
-%D Close reading learns that one line comments (\type{// ...})
-%D are removed from the stream. This permits switching in
-%D pretty printing \JAVASCRIPT\ sources as well as saves
-%D some bytes.
-
-%D The magic 500 in the next hack prevents the input stack from
-%D overflowing when large scripts are sanitized.
-
-\def\dododoPSsanitizeJScode
-  {\ifcase\JSisTEX\ifcase\JScomment
-     \advance\scratchcounter \plusone
-   \fi\fi
-   \ifnum\scratchcounter=500
-     \expandafter\dodododoPSsanitizeJScode
-   \fi}
-
-\def\dodododoPSsanitizeJScode
-  {\let\next={%
-   \aftergroup}%
-   \endgroup
-   \begingroup
-   \aftergroup\xdef
-   \aftergroup\sanitizedJScode
-   \aftergroup{%
-   \aftergroup\sanitizedJScode
-   \let\next=}}
+\let\stopJScode\relax
 
-%D The macro \type{\doPSsanitizeJScode} converts its argument
-%D into the macro \type{\sanitizedJScode}, thereby prefixing
-%D each \type{(} and \type{)} by a slash.
+\unexpanded\def\startJSpreamble
+  {\begingroup\obeylualines\obeyluatokens\dostartJSpreamble}
 
-%D Hooking this mechanism into the general \CONTEXT\ reference
-%D mechanism does not take much effort:
+\long\def\dostartJSpreamble#1\stopJSpreamble
+  {\normalexpanded{\endgroup\ctxlua{javascripts.storepreamble(\!!bs#1\!!es)}}}
 
-\definespecialtest{JS}%
-  {\doifdefinedelse{\r!java\currentreferenceoperation}}
+\let\stopJSpreamble\relax
 
-\def\gotojavascriptspecial#1#2#3#4% special operation arguments data
-  {\begingroup
-   \iflocation
-     \bgroup
-       \presetJScode{#2}{#3}%
-     \egroup
-     \dohandlegoto{#4}{\dostartgotoJS\buttonwidth\buttonheight\JScode}{\dostopgotoJS}%
-   \else
-     #4%
-   \fi
-   \endgroup}
+\def\setJSpreamble   #1#2{\ctxlua{javascripts.storepreamble ("#1",\!!bs#2\!!es)}}
+\def\addtoJSpreamble #1#2{\ctxlua{javascripts.addtopreamble ("#1",\!!bs#2\!!es)}}
+\def\useJSpreamblenow  #1{\ctxlua{javascripts.usepreamblenow("#1")}}
+\def\finalflushJSpreamble{\iflocation\ctxlua{javascripts.flushpreambles()}\fi}
 
 %D \macros
 %D   {useJSscripts}
@@ -669,14 +144,15 @@
 \def\dodouseJSscripts#1%
   {\doifelse{#1}\v!reset
      {\let\allJSpreambles\empty}
-     {\doifundefined{\c!file\f!javascriptprefix#1}
-        {\startnointerference
-           \letgvalueempty{\c!file\f!javascriptprefix#1}%
-           \makeshortfilename[\f!javascriptprefix#1]%
-           \startreadingfile
-             \readsysfile\shortfilename{\showmessage\m!javascript1{#1}}\donothing
-           \stopreadingfile
-         \stopnointerference}}}
+     {\ifcsname\c!file\f!javascriptprefix#1\endcsname \else
+        \startnointerference
+          \letgvalueempty{\c!file\f!javascriptprefix#1}%
+          \makeshortfilename[\f!javascriptprefix#1]%
+          \startreadingfile
+            \readsysfile\shortfilename{\showmessage\m!javascript1{#1}}\donothing
+          \stopreadingfile
+        \stopnointerference
+      \fi}}
 
 \def\douseJSscripts[#1][#2]%
   {\processcommalist[#1]\dodouseJSscripts
diff --git a/tex/context/base/java-stp.tex b/tex/context/base/java-stp.tex
index fcb9d4f22..df4fbcc2f 100644
--- a/tex/context/base/java-stp.tex
+++ b/tex/context/base/java-stp.tex
@@ -11,13 +11,13 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-\startJSpreamble Steps used now
+% we define ocglist global, otherwise we quickly run into a memory hog (even
+% out of memory in a 512 Meg machine)
 
-    % we define ocglist global, otherwise we quickly run into a memory hog (even
-    % out of memory in a 512 Meg machine)
+% we cannot use doc_visited[this.pageNum] instead of doc_currentstep because
+% of some funny side effect (i.e. dup or so)
 
-    % we cannot use doc_visited[this.pageNum] instead of doc_currentstep because
-    % of some funny side effect (i.e. dup or so)
+\startJSpreamble Steps used now
 
     var doc_ocglist     = this.getOCGs() ;
     var doc_stepname    = "step" ;
@@ -26,9 +26,6 @@
     var doc_visited     = new Array() ;
     var doc_busy        = new Array() ;
 
-    % for some reason, this function is not seen in time (funny initialization
-    % order again?) ...
-
     function SetupStepper ( layername, laststep ) {
         doc_stepname = layername ;
         doc_maxstep  = laststep ;
@@ -38,8 +35,6 @@
         }
     }
 
-    % so, we do it the ugly way
-
     for (var i=0; i<=this.numPages; i++) {
         doc_visited[i] = 0 ;
         doc_busy[i] = 0 ;
@@ -96,7 +91,6 @@
 
     function InvokeStepper ( ) {
         try {
-%             console.println("INVOKE "+doc_currentstep+" "+doc_busy[this.pageNum]) ;
             if (doc_currentstep
 
 do
 
-    function copy(old,tables)
+    local function copy(old,tables)
         if old then
             tables = tables or { }
             local new = { }
diff --git a/tex/context/base/lang-ara.mkiv b/tex/context/base/lang-ara.mkiv
new file mode 100644
index 000000000..3c4d3c522
--- /dev/null
+++ b/tex/context/base/lang-ara.mkiv
@@ -0,0 +1,150 @@
+%D \module
+%D   [       file=lang-ara,
+%D        version=2008.06.20,
+%D          title=\CONTEXT\ Language Macros,
+%D       subtitle=Arabic Languages,
+%D         author=Khaled Hosny,
+%D           date=\currentdate,
+%D      copyright=PRAGMA-ADE]
+%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 Language Macros / Arabic Languages}
+
+\unprotect
+
+\definesystemconstant {arabic}
+\definesystemvariable {ar}
+
+\installlanguage
+  [\s!ar]
+  [\c!spacing=\v!broad,
+   \c!leftsentence=---,
+   \c!rightsentence=---,
+   \c!leftsubsentence=---,
+   \c!rightsubsentence=---,
+   \c!leftquote=\upperleftsinglesixquote,
+   \c!rightquote=\upperrightsingleninequote,
+   \c!leftquotation=\upperleftdoublesixquote,
+   \c!rightquotation=\upperrightdoubleninequote,
+   \c!date={\v!day,\ ,\v!month,{،\ },\v!year}]
+
+\installlanguage [\s!arabic] [\s!ar]
+
+% Just aliases to "ar" for now
+
+\installlanguage[\s!ar-ae][\c!default=\s!ar] % U.A.E.
+\installlanguage[\s!ar-bh][\c!default=\s!ar] % Bahrain
+\installlanguage[\s!ar-eg][\c!default=\s!ar] % Egypt
+\installlanguage[\s!ar-in][\c!default=\s!ar] % India?
+\installlanguage[\s!ar-kw][\c!default=\s!ar] % Kuwait
+\installlanguage[\s!ar-ly][\c!default=\s!ar] % Libya
+\installlanguage[\s!ar-om][\c!default=\s!ar] % Oman
+\installlanguage[\s!ar-qa][\c!default=\s!ar] % Qatar
+\installlanguage[\s!ar-sa][\c!default=\s!ar] % Saudi Arabia
+\installlanguage[\s!ar-sd][\c!default=\s!ar] % Sudan
+\installlanguage[\s!ar-tn][\c!default=\s!ar] % Tunisia
+\installlanguage[\s!ar-ye][\c!default=\s!ar] % Yemen
+
+% Syriac months
+
+\installlanguage[\s!ar-sy][\c!default=\s!ar]    % Syria
+\installlanguage[\s!ar-iq][\c!default=\s!ar-sy] % Iraq
+\installlanguage[\s!ar-jo][\c!default=\s!ar-sy] % Jordan
+\installlanguage[\s!ar-lb][\c!default=\s!ar-sy] % Lebanon
+
+% Maghribi months
+
+\installlanguage[\s!ar-dz][\c!default=\s!ar] % Algeria
+\installlanguage[\s!ar-ma][\c!default=\s!ar] % Morocco
+
+\setupheadtext  [\s!ar] [\v!content=المحتويات]
+\setupheadtext  [\s!ar] [\v!tables=الجداول]
+\setupheadtext  [\s!ar] [\v!figures=الأشكال]
+\setupheadtext  [\s!ar] [\v!graphics=الرسوم]
+\setupheadtext  [\s!ar] [\v!intermezzi=فسح]
+\setupheadtext  [\s!ar] [\v!index=الفهرس]
+\setupheadtext  [\s!ar] [\v!abbreviations=الاختصارات]
+\setupheadtext  [\s!ar] [\v!logos=الشعارات]
+\setupheadtext  [\s!ar] [\v!units=الوحدات]
+\setuplabeltext [\s!ar] [\v!table=جدول ]
+\setuplabeltext [\s!ar] [\v!figure=شكل ]
+\setuplabeltext [\s!ar] [\v!intermezzo=فسحة ]
+\setuplabeltext [\s!ar] [\v!graphic=رسم ]
+
+%D We don't set these here. One can do that in a style.
+
+\setuplabeltext [\s!ar] [\v!chapter=] % باب
+\setuplabeltext [\s!ar] [\v!section=] % فصل or قسم
+\setuplabeltext [\s!ar] [\v!subsection=] % فصل أدنى
+\setuplabeltext [\s!ar] [\v!subsubsection=] % فصل أ دنى أدنى
+\setuplabeltext [\s!ar] [\v!subsubsubsection=] % فصل أدنى أدنى أدنى
+\setuplabeltext [\s!ar] [\v!appendix=] % ملحق
+\setuplabeltext [\s!ar] [\v!part=جزء ]
+\setuplabeltext [\s!ar] [\v!line=سطر ]
+\setuplabeltext [\s!ar] [\v!lines=السطور ]
+
+\setuplabeltext [\s!ar] [\v!january=يناير]
+\setuplabeltext [\s!ar] [\v!february=فبراير]
+\setuplabeltext [\s!ar] [\v!march=مارس]
+\setuplabeltext [\s!ar] [\v!april=أبريل]
+\setuplabeltext [\s!ar] [\v!may=مايو]
+\setuplabeltext [\s!ar] [\v!june=يونيو]
+\setuplabeltext [\s!ar] [\v!july=يوليو]
+\setuplabeltext [\s!ar] [\v!august=أغسطس]
+\setuplabeltext [\s!ar] [\v!september=سبتمبر]
+\setuplabeltext [\s!ar] [\v!october=أكتوبر]
+\setuplabeltext [\s!ar] [\v!november=نوفمبر]
+\setuplabeltext [\s!ar] [\v!december=ديسمبر]
+
+\setuplabeltext [\s!ar-sy] [\v!january=كانون الثاني]
+\setuplabeltext [\s!ar-sy] [\v!february=شباط]
+\setuplabeltext [\s!ar-sy] [\v!march=آذار]
+\setuplabeltext [\s!ar-sy] [\v!april=نيسان]
+\setuplabeltext [\s!ar-sy] [\v!may=أيار]
+\setuplabeltext [\s!ar-sy] [\v!june=حزيران]
+\setuplabeltext [\s!ar-sy] [\v!july=تموز]
+\setuplabeltext [\s!ar-sy] [\v!august=آب]
+\setuplabeltext [\s!ar-sy] [\v!september=أيلول]
+\setuplabeltext [\s!ar-sy] [\v!october=تشرين الأول]
+\setuplabeltext [\s!ar-sy] [\v!november=تشرين الثاني]
+\setuplabeltext [\s!ar-sy] [\v!december=كانون الأول]
+
+\setuplabeltext [\s!ar-ma] [\v!may=ماي]
+\setuplabeltext [\s!ar-ma] [\v!july=يوليوز]
+\setuplabeltext [\s!ar-ma] [\v!august=غشت]
+\setuplabeltext [\s!ar-ma] [\v!september=شتنبر]
+\setuplabeltext [\s!ar-ma] [\v!november=نونبر]
+\setuplabeltext [\s!ar-ma] [\v!december=دجنبر]
+
+\setuplabeltext [\s!ar-dz] [\v!january=جانفي]
+\setuplabeltext [\s!ar-dz] [\v!february=فيفري]
+\setuplabeltext [\s!ar-dz] [\v!april=أفريل]
+\setuplabeltext [\s!ar-dz] [\v!may=ماي]
+\setuplabeltext [\s!ar-dz] [\v!june=جوان]
+\setuplabeltext [\s!ar-dz] [\v!july=جويلة]
+\setuplabeltext [\s!ar-dz] [\v!august=أوت]
+
+\setuplabeltext [\s!ar] [\v!sunday=الأحد]
+\setuplabeltext [\s!ar] [\v!monday=الاثنين]
+\setuplabeltext [\s!ar] [\v!tuesday=الثلاثاء]
+\setuplabeltext [\s!ar] [\v!wednesday=الأربعاء]
+\setuplabeltext [\s!ar] [\v!thursday=الخميس]
+\setuplabeltext [\s!ar] [\v!friday=الجمعة]
+\setuplabeltext [\s!ar] [\v!saturday=السبت]
+
+%D Rather new ...
+
+\setuplabeltext [\s!ar] [\v!page=صفحة ]
+\setuplabeltext [\s!ar] [\v!atpage=في صفحة ]
+\setuplabeltext [\s!ar] [\v!hencefore=كما وضحنا سابقا]
+\setuplabeltext [\s!ar] [\v!hereafter=كما نوضح لاحقا]
+\setuplabeltext [\s!ar] [\v!see=انظر ]
+
+%D ... and to be completed!
+
+%D \ShowAllLanguageValues [\s!ar] [arabic] {Arabic} {horn} % engelse humor
+
+\protect \endinput
diff --git a/tex/context/base/lang-ara.tex b/tex/context/base/lang-ara.tex
deleted file mode 100644
index 3c4d3c522..000000000
--- a/tex/context/base/lang-ara.tex
+++ /dev/null
@@ -1,150 +0,0 @@
-%D \module
-%D   [       file=lang-ara,
-%D        version=2008.06.20,
-%D          title=\CONTEXT\ Language Macros,
-%D       subtitle=Arabic Languages,
-%D         author=Khaled Hosny,
-%D           date=\currentdate,
-%D      copyright=PRAGMA-ADE]
-%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 Language Macros / Arabic Languages}
-
-\unprotect
-
-\definesystemconstant {arabic}
-\definesystemvariable {ar}
-
-\installlanguage
-  [\s!ar]
-  [\c!spacing=\v!broad,
-   \c!leftsentence=---,
-   \c!rightsentence=---,
-   \c!leftsubsentence=---,
-   \c!rightsubsentence=---,
-   \c!leftquote=\upperleftsinglesixquote,
-   \c!rightquote=\upperrightsingleninequote,
-   \c!leftquotation=\upperleftdoublesixquote,
-   \c!rightquotation=\upperrightdoubleninequote,
-   \c!date={\v!day,\ ,\v!month,{،\ },\v!year}]
-
-\installlanguage [\s!arabic] [\s!ar]
-
-% Just aliases to "ar" for now
-
-\installlanguage[\s!ar-ae][\c!default=\s!ar] % U.A.E.
-\installlanguage[\s!ar-bh][\c!default=\s!ar] % Bahrain
-\installlanguage[\s!ar-eg][\c!default=\s!ar] % Egypt
-\installlanguage[\s!ar-in][\c!default=\s!ar] % India?
-\installlanguage[\s!ar-kw][\c!default=\s!ar] % Kuwait
-\installlanguage[\s!ar-ly][\c!default=\s!ar] % Libya
-\installlanguage[\s!ar-om][\c!default=\s!ar] % Oman
-\installlanguage[\s!ar-qa][\c!default=\s!ar] % Qatar
-\installlanguage[\s!ar-sa][\c!default=\s!ar] % Saudi Arabia
-\installlanguage[\s!ar-sd][\c!default=\s!ar] % Sudan
-\installlanguage[\s!ar-tn][\c!default=\s!ar] % Tunisia
-\installlanguage[\s!ar-ye][\c!default=\s!ar] % Yemen
-
-% Syriac months
-
-\installlanguage[\s!ar-sy][\c!default=\s!ar]    % Syria
-\installlanguage[\s!ar-iq][\c!default=\s!ar-sy] % Iraq
-\installlanguage[\s!ar-jo][\c!default=\s!ar-sy] % Jordan
-\installlanguage[\s!ar-lb][\c!default=\s!ar-sy] % Lebanon
-
-% Maghribi months
-
-\installlanguage[\s!ar-dz][\c!default=\s!ar] % Algeria
-\installlanguage[\s!ar-ma][\c!default=\s!ar] % Morocco
-
-\setupheadtext  [\s!ar] [\v!content=المحتويات]
-\setupheadtext  [\s!ar] [\v!tables=الجداول]
-\setupheadtext  [\s!ar] [\v!figures=الأشكال]
-\setupheadtext  [\s!ar] [\v!graphics=الرسوم]
-\setupheadtext  [\s!ar] [\v!intermezzi=فسح]
-\setupheadtext  [\s!ar] [\v!index=الفهرس]
-\setupheadtext  [\s!ar] [\v!abbreviations=الاختصارات]
-\setupheadtext  [\s!ar] [\v!logos=الشعارات]
-\setupheadtext  [\s!ar] [\v!units=الوحدات]
-\setuplabeltext [\s!ar] [\v!table=جدول ]
-\setuplabeltext [\s!ar] [\v!figure=شكل ]
-\setuplabeltext [\s!ar] [\v!intermezzo=فسحة ]
-\setuplabeltext [\s!ar] [\v!graphic=رسم ]
-
-%D We don't set these here. One can do that in a style.
-
-\setuplabeltext [\s!ar] [\v!chapter=] % باب
-\setuplabeltext [\s!ar] [\v!section=] % فصل or قسم
-\setuplabeltext [\s!ar] [\v!subsection=] % فصل أدنى
-\setuplabeltext [\s!ar] [\v!subsubsection=] % فصل أ دنى أدنى
-\setuplabeltext [\s!ar] [\v!subsubsubsection=] % فصل أدنى أدنى أدنى
-\setuplabeltext [\s!ar] [\v!appendix=] % ملحق
-\setuplabeltext [\s!ar] [\v!part=جزء ]
-\setuplabeltext [\s!ar] [\v!line=سطر ]
-\setuplabeltext [\s!ar] [\v!lines=السطور ]
-
-\setuplabeltext [\s!ar] [\v!january=يناير]
-\setuplabeltext [\s!ar] [\v!february=فبراير]
-\setuplabeltext [\s!ar] [\v!march=مارس]
-\setuplabeltext [\s!ar] [\v!april=أبريل]
-\setuplabeltext [\s!ar] [\v!may=مايو]
-\setuplabeltext [\s!ar] [\v!june=يونيو]
-\setuplabeltext [\s!ar] [\v!july=يوليو]
-\setuplabeltext [\s!ar] [\v!august=أغسطس]
-\setuplabeltext [\s!ar] [\v!september=سبتمبر]
-\setuplabeltext [\s!ar] [\v!october=أكتوبر]
-\setuplabeltext [\s!ar] [\v!november=نوفمبر]
-\setuplabeltext [\s!ar] [\v!december=ديسمبر]
-
-\setuplabeltext [\s!ar-sy] [\v!january=كانون الثاني]
-\setuplabeltext [\s!ar-sy] [\v!february=شباط]
-\setuplabeltext [\s!ar-sy] [\v!march=آذار]
-\setuplabeltext [\s!ar-sy] [\v!april=نيسان]
-\setuplabeltext [\s!ar-sy] [\v!may=أيار]
-\setuplabeltext [\s!ar-sy] [\v!june=حزيران]
-\setuplabeltext [\s!ar-sy] [\v!july=تموز]
-\setuplabeltext [\s!ar-sy] [\v!august=آب]
-\setuplabeltext [\s!ar-sy] [\v!september=أيلول]
-\setuplabeltext [\s!ar-sy] [\v!october=تشرين الأول]
-\setuplabeltext [\s!ar-sy] [\v!november=تشرين الثاني]
-\setuplabeltext [\s!ar-sy] [\v!december=كانون الأول]
-
-\setuplabeltext [\s!ar-ma] [\v!may=ماي]
-\setuplabeltext [\s!ar-ma] [\v!july=يوليوز]
-\setuplabeltext [\s!ar-ma] [\v!august=غشت]
-\setuplabeltext [\s!ar-ma] [\v!september=شتنبر]
-\setuplabeltext [\s!ar-ma] [\v!november=نونبر]
-\setuplabeltext [\s!ar-ma] [\v!december=دجنبر]
-
-\setuplabeltext [\s!ar-dz] [\v!january=جانفي]
-\setuplabeltext [\s!ar-dz] [\v!february=فيفري]
-\setuplabeltext [\s!ar-dz] [\v!april=أفريل]
-\setuplabeltext [\s!ar-dz] [\v!may=ماي]
-\setuplabeltext [\s!ar-dz] [\v!june=جوان]
-\setuplabeltext [\s!ar-dz] [\v!july=جويلة]
-\setuplabeltext [\s!ar-dz] [\v!august=أوت]
-
-\setuplabeltext [\s!ar] [\v!sunday=الأحد]
-\setuplabeltext [\s!ar] [\v!monday=الاثنين]
-\setuplabeltext [\s!ar] [\v!tuesday=الثلاثاء]
-\setuplabeltext [\s!ar] [\v!wednesday=الأربعاء]
-\setuplabeltext [\s!ar] [\v!thursday=الخميس]
-\setuplabeltext [\s!ar] [\v!friday=الجمعة]
-\setuplabeltext [\s!ar] [\v!saturday=السبت]
-
-%D Rather new ...
-
-\setuplabeltext [\s!ar] [\v!page=صفحة ]
-\setuplabeltext [\s!ar] [\v!atpage=في صفحة ]
-\setuplabeltext [\s!ar] [\v!hencefore=كما وضحنا سابقا]
-\setuplabeltext [\s!ar] [\v!hereafter=كما نوضح لاحقا]
-\setuplabeltext [\s!ar] [\v!see=انظر ]
-
-%D ... and to be completed!
-
-%D \ShowAllLanguageValues [\s!ar] [arabic] {Arabic} {horn} % engelse humor
-
-\protect \endinput
diff --git a/tex/context/base/lang-chi.mkii b/tex/context/base/lang-chi.mkii
new file mode 100644
index 000000000..278e10745
--- /dev/null
+++ b/tex/context/base/lang-chi.mkii
@@ -0,0 +1,305 @@
+%D \module
+%D   [       file=lang-chi,
+%D        version=2002.06.25, % 1998.10.10,
+%D          title=\CONTEXT\ Language Macros,
+%D       subtitle=Chinese,
+%D         author={Hans Hagen \& Wang Lei},
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Language Macros / Chinese}
+
+%D This module is coded using the \UNICODE\ support built in
+%D \CONTEXT. Therefore, \type {\uchar} is used instead of latin
+%D characters.
+
+\unprotect
+
+\definesystemconstant {chinese}   \definesystemconstant {cn}
+
+\installlanguage
+  [\s!cn]
+  [\c!leftsentence=\cnencoding\cnleftsentence,
+   \c!rightsentence=\cnencoding\cnrightsentence,
+   \c!leftsubsentence=\cnencoding\cnleftsubsentence,
+   \c!rightsubsentence=\cnencoding\cnrightsubsentence,
+   \c!leftquote=\cnencoding\cnupperleftsinglequote,
+   \c!rightquote=\cnencoding\cnupperrightsinglequote,
+   \c!leftquotation=\cnencoding\cnupperleftdoublequote,
+   \c!rightquotation=\cnencoding\cnupperrightdoublequote,
+   \c!date={\v!year,\cnyear,\ ,\v!month,\v!day,\cnday}]
+
+\setupheadtext [\s!cn]       [\v!content={\cnencoding\cnencodedcontents}]
+\setupheadtext [\s!cn]        [\v!tables={\cnencoding\cnencodedtables}]
+\setupheadtext [\s!cn]       [\v!figures={\cnencoding\cnencodedfigures}]
+\setupheadtext [\s!cn]      [\v!graphics={\cnencoding\cnencodedgraphics}]% RG & XJF
+\setupheadtext [\s!cn]    [\v!intermezzi={\cnencoding\cnencodedintermezzo}]% RG & XJF
+\setupheadtext [\s!cn]         [\v!index={\cnencoding\cnencodedindex}]
+\setupheadtext [\s!cn] [\v!abbreviations={\cnencoding\cnencodedabbreviations}]
+\setupheadtext [\s!cn]         [\v!logos={\cnencoding\cnencodedlogos}]
+\setupheadtext [\s!cn]         [\v!units={\cnencoding\cnencodedunits}]
+
+\setuplabeltext [\s!cn]        [\v!table={\cnencoding\cnencodedtable}]
+\setuplabeltext [\s!cn]       [\v!figure={\cnencoding\cnencodedfigure}]
+\setuplabeltext [\s!cn]   [\v!intermezzo={\cnencoding\cnencodedintermezzo}]% RG & XJF
+\setuplabeltext [\s!cn]      [\v!graphic={\cnencoding\cnencodedillustration}]% RG & XJF
+\setuplabeltext [\s!cn]     [\v!appendix={\cnencoding\cnencodedappendix}]% RG
+\setuplabeltext [\s!cn]         [\v!part={\cnencoding\cnencodedintro,\cnencoding\cnencodedpart}]
+\setuplabeltext [\s!cn]      [\v!chapter={\cnencoding\cnencodedintro,\cnencoding\cnencodedchapter}]
+\setuplabeltext [\s!cn]      [\v!section={\cnencoding\cnencodedintro,\cnencoding\cnencodedsection}]
+\setuplabeltext [\s!cn]         [\v!line={\cnencoding\cnencodedline}]% RG & XJF
+\setuplabeltext [\s!cn]        [\v!lines={\cnencoding\cnencodedline}]% RG & XJF
+
+\setuplabeltext [\s!cn]       [\v!subsection=]
+\setuplabeltext [\s!cn]    [\v!subsubsection=]
+\setuplabeltext [\s!cn] [\v!subsubsubsection=]
+
+%D From this definition one can deduce that language, input
+%D encoding, font encoding, and glyph meaning form a pretty
+%D complex four dimensional space.
+
+\startlanguagespecifics[\s!cn]
+
+\setuplabeltext [\s!cn]   [\v!january=\cnencoding\cnencodedjanuary  ]
+\setuplabeltext [\s!cn]  [\v!february=\cnencoding\cnencodedfebrary  ]
+\setuplabeltext [\s!cn]     [\v!march=\cnencoding\cnencodedmarch    ]
+\setuplabeltext [\s!cn]     [\v!april=\cnencoding\cnencodedapril    ]
+\setuplabeltext [\s!cn]       [\v!may=\cnencoding\cnencodedmay      ]
+\setuplabeltext [\s!cn]      [\v!june=\cnencoding\cnencodedjune     ]
+\setuplabeltext [\s!cn]      [\v!july=\cnencoding\cnencodedjuly     ]
+\setuplabeltext [\s!cn]    [\v!august=\cnencoding\cnencodedaugust   ]
+\setuplabeltext [\s!cn] [\v!september=\cnencoding\cnencodedseptember]
+\setuplabeltext [\s!cn]   [\v!october=\cnencoding\cnencodedoctober  ]
+\setuplabeltext [\s!cn]  [\v!november=\cnencoding\cnencodednovember ]
+\setuplabeltext [\s!cn]  [\v!december=\cnencoding\cnencodeddecember ]
+
+\setuplabeltext [\s!cn]    [\v!sunday=\cnencoding\cnencodedsunday   ]
+\setuplabeltext [\s!cn]    [\v!monday=\cnencoding\cnencodedmonday   ]
+\setuplabeltext [\s!cn]   [\v!tuesday=\cnencoding\cnencodedtuesday  ]
+\setuplabeltext [\s!cn] [\v!wednesday=\cnencoding\cnencodedwednesday]
+\setuplabeltext [\s!cn]  [\v!thursday=\cnencoding\cnencodedthursday ]
+\setuplabeltext [\s!cn]    [\v!friday=\cnencoding\cnencodedfriday   ]
+\setuplabeltext [\s!cn]  [\v!saturday=\cnencoding\cnencodedsaturday ]
+
+\stoplanguagespecifics
+
+%D One can specify a split labeltext, as demonstrated in
+%D the definition of the \type {part} label. Unfortunately
+%D the glyphs of both part depend on the encoding. Therefore,
+%D we have an encoding section here.
+
+\unexpanded\def\cnencoding{\enableencoding[\chineseencoding]} % ugly and temporary
+
+\startencoding[cjk-uni]
+  \definecommand cnleftsentence            {\uchar{32}{20}\uchar{32}{20}}
+  \definecommand cnrightsentence           {\uchar{32}{20}\uchar{32}{20}}
+  \definecommand cnleftsubsentence         {\uchar{32}{20}\uchar{32}{20}}
+  \definecommand cnrightsubsentence        {\uchar{32}{20}\uchar{32}{20}}
+  \definecommand cnupperleftsinglequote    {\uchar{32}{24}}
+  \definecommand cnupperrightsinglequote   {\uchar{32}{25}}
+  \definecommand cnupperleftdoublequote    {\uchar{32}{28}}
+  \definecommand cnupperrightdoublequote   {\uchar{32}{29}}
+  \definecommand cnupperleftsinglequote-v  {\uchar{48}{12}}
+  \definecommand cnupperrightsinglequote-v {\uchar{48}{13}}
+  \definecommand cnupperleftdoublequote-v  {\uchar{48}{14}}
+  \definecommand cnupperrightdoublequote-v {\uchar{48}{15}}
+  \definecommand cnencodedcontents         {\uchar{118}{238}\uchar{95}{85}}
+  \definecommand cnencodedtables           {\uchar{136}{104}\uchar{104}{60}}
+  \definecommand cnencodedfigures          {\uchar{86}{254}\uchar{95}{98}}
+  \definecommand cnencodedindex            {\uchar{125}{34}\uchar{95}{21}}
+  \definecommand cnencodedabbreviations    {\uchar{127}{41}\uchar{117}{101}\uchar{139}{237}}
+  \definecommand cnencodedlogos            {\uchar{95}{189}\uchar{141}{44}}
+  \definecommand cnencodedunits            {\uchar{139}{161}\uchar{145}{207}\uchar{83}{85}\uchar{79}{77}}
+  \definecommand cnencodedtable            {\uchar{136}{104}}
+  \definecommand cnencodedfigure           {\uchar{86}{254}}
+  \definecommand cnencodedintro            {\uchar{123}{44}}
+  \definecommand cnencodedpart             {\uchar{144}{232}\uchar{82}{6}}
+  \definecommand cnencodedchapter          {\uchar{122}{224}}
+  \definecommand cnencodedsection          {\uchar{130}{130}}
+  \definecommand cnencodedjanuary          {\uchar{78}{0}\uchar{103}{8}}
+  \definecommand cnencodedfebrary          {\uchar{78}{140}\uchar{103}{8}}
+  \definecommand cnencodedmarch            {\uchar{78}{9}\uchar{103}{8}}
+  \definecommand cnencodedapril            {\uchar{86}{219}\uchar{103}{8}}
+  \definecommand cnencodedmay              {\uchar{78}{148}\uchar{103}{8}}
+  \definecommand cnencodedjune             {\uchar{81}{109}\uchar{103}{8}}
+  \definecommand cnencodedjuly             {\uchar{78}{3}\uchar{103}{8}}
+  \definecommand cnencodedaugust           {\uchar{81}{107}\uchar{103}{8}}
+  \definecommand cnencodedseptember        {\uchar{78}{93}\uchar{103}{8}}
+  \definecommand cnencodedoctober          {\uchar{83}{65}\uchar{103}{8}}
+  \definecommand cnencodednovember         {\uchar{83}{65}\uchar{78}{0}\uchar{103}{8}}
+  \definecommand cnencodeddecember         {\uchar{83}{65}\uchar{78}{140}\uchar{103}{8}}
+  \definecommand cnencodedsunday           {\uchar{102}{31}\uchar{103}{31}\uchar{101}{229}}
+  \definecommand cnencodedmonday           {\uchar{102}{31}\uchar{103}{31}\uchar{78}{0}}
+  \definecommand cnencodedtuesday          {\uchar{102}{31}\uchar{103}{31}\uchar{78}{140}}
+  \definecommand cnencodedwednesday        {\uchar{102}{31}\uchar{103}{31}\uchar{78}{9}}
+  \definecommand cnencodedthursday         {\uchar{102}{31}\uchar{103}{31}\uchar{86}{219}}
+  \definecommand cnencodedfriday           {\uchar{102}{31}\uchar{103}{31}\uchar{78}{148}}
+  \definecommand cnencodedsaturday         {\uchar{102}{31}\uchar{103}{31}\uchar{81}{109}}
+  % RG & XJF
+  \definecommand cnencodedgraphics         {\uchar{86}{254}}
+  \definecommand cnencodedintermezzo       {\uchar{210}{99}\uchar{242}{102}}
+  \definecommand cnencodedillustration     {\uchar{99}{210}\uchar{86}{254}}
+  \definecommand cnencodedappendix         {\uchar{150}{68}\uchar{95}{85}}
+  \definecommand cnencodedline             {\uchar{136}{76}}
+  % Tobias Burnus & XJF
+  \definecommand cnyear                    {\uchar{94}{116}}
+  \definecommand cnmonth                   {\uchar{103}{8}}
+  \definecommand cnday                     {\uchar{101}{229}}
+\stopencoding
+
+\startencoding[gbk]
+  \definecommand cnleftsentence            {\uchar{161}{170}\uchar{161}{170}}
+  \definecommand cnrightsentence           {\uchar{161}{170}\uchar{161}{170}}
+  \definecommand cnleftsubsentence         {\uchar{161}{170}\uchar{161}{170}}
+  \definecommand cnrightsubsentence        {\uchar{161}{170}\uchar{161}{170}}
+  \definecommand cnupperleftsinglequote    {\uchar{161}{174}}
+  \definecommand cnupperrightsinglequote   {\uchar{161}{175}}
+  \definecommand cnupperleftdoublequote    {\uchar{161}{176}}
+  \definecommand cnupperrightdoublequote   {\uchar{161}{177}}
+  \definecommand cnupperleftsinglequote-v  {\uchar{161}{184}}
+  \definecommand cnupperrightsinglequote-v {\uchar{161}{185}}
+  \definecommand cnupperleftdoublequote-v  {\uchar{161}{186}}
+  \definecommand cnupperrightdoublequote-v {\uchar{161}{187}}
+  \definecommand cnencodedcontents         {\uchar{196}{191}\uchar{194}{188}}
+  \definecommand cnencodedtables           {\uchar{177}{237}\uchar{184}{241}}
+  \definecommand cnencodedfigures          {\uchar{205}{188}\uchar{208}{206}}
+  \definecommand cnencodedindex            {\uchar{203}{247}\uchar{210}{253}}
+  \definecommand cnencodedabbreviations    {\uchar{203}{245}\uchar{194}{212}\uchar{211}{239}}
+  \definecommand cnencodedlogos            {\uchar{187}{213}\uchar{177}{225}}
+  \definecommand cnencodedunits            {\uchar{188}{198}\uchar{193}{191}\uchar{181}{165}\uchar{206}{187}}
+  \definecommand cnencodedtable            {\uchar{177}{237}}
+  \definecommand cnencodedfigure           {\uchar{205}{188}}
+  \definecommand cnencodedintro            {\uchar{181}{218}}
+  \definecommand cnencodedpart             {\uchar{178}{191}\uchar{183}{214}}
+  \definecommand cnencodedchapter          {\uchar{213}{194}}
+  \definecommand cnencodedsection          {\uchar{189}{218}}
+  \definecommand cnencodedjanuary          {\uchar{210}{187}\uchar{212}{194}}
+  \definecommand cnencodedfebrary          {\uchar{182}{254}\uchar{212}{194}}
+  \definecommand cnencodedmarch            {\uchar{200}{253}\uchar{212}{194}}
+  \definecommand cnencodedapril            {\uchar{203}{196}\uchar{212}{194}}
+  \definecommand cnencodedmay              {\uchar{206}{229}\uchar{212}{194}}
+  \definecommand cnencodedjune             {\uchar{193}{249}\uchar{212}{194}}
+  \definecommand cnencodedjuly             {\uchar{198}{223}\uchar{212}{194}}
+  \definecommand cnencodedaugust           {\uchar{176}{203}\uchar{212}{194}}
+  \definecommand cnencodedseptember        {\uchar{190}{197}\uchar{212}{194}}
+  \definecommand cnencodedoctober          {\uchar{202}{174}\uchar{212}{194}}
+  \definecommand cnencodednovember         {\uchar{202}{174}\uchar{210}{187}\uchar{212}{194}}
+  \definecommand cnencodeddecember         {\uchar{202}{174}\uchar{182}{254}\uchar{212}{194}}
+  \definecommand cnencodedsunday           {\uchar{208}{199}\uchar{198}{218}\uchar{200}{213}}
+  \definecommand cnencodedmonday           {\uchar{208}{199}\uchar{198}{218}\uchar{210}{187}}
+  \definecommand cnencodedtuesday          {\uchar{208}{199}\uchar{198}{218}\uchar{182}{254}}
+  \definecommand cnencodedwednesday        {\uchar{208}{199}\uchar{198}{218}\uchar{200}{253}}
+  \definecommand cnencodedthursday         {\uchar{208}{199}\uchar{198}{218}\uchar{203}{196}}
+  \definecommand cnencodedfriday           {\uchar{208}{199}\uchar{198}{218}\uchar{206}{229}}
+  \definecommand cnencodedsaturday         {\uchar{208}{199}\uchar{198}{218}\uchar{193}{249}}
+  % RG & XJF
+  \definecommand cnencodedgraphics         {\uchar{205}{188}}
+  \definecommand cnencodedintermezzo       {\uchar{178}{229}\uchar{199}{250}}
+  \definecommand cnencodedillustration     {\uchar{178}{229}\uchar{205}{188}}
+  \definecommand cnencodedappendix         {\uchar{184}{189}\uchar{194}{188}}
+  \definecommand cnencodedline             {\uchar{208}{208}}
+  % Tobias Burnus & XJF
+  \definecommand cnyear                    {\uchar{196}{234}}
+  \definecommand cnmonth                   {\uchar{212}{194}}
+  \definecommand cnday                     {\uchar{200}{213}}
+\stopencoding
+
+\startencoding[big5]
+  \definecommand cnleftsentence            {\uchar{162}{119}\uchar{162}{119}}
+  \definecommand cnrightsentence           {\uchar{162}{119}\uchar{162}{119}}
+  \definecommand cnleftsubsentence         {\uchar{162}{119}\uchar{162}{119}}
+  \definecommand cnrightsubsentence        {\uchar{162}{119}\uchar{162}{119}}
+  \definecommand cnupperleftsinglequote    {\uchar{161}{165}}
+  \definecommand cnupperrightsinglequote   {\uchar{161}{166}}
+  \definecommand cnupperleftdoublequote    {\uchar{161}{167}}
+  \definecommand cnupperrightdoublequote   {\uchar{161}{168}}
+  \definecommand cnupperleftsinglequote-v  {\uchar{161}{117}}
+  \definecommand cnupperrightsinglequote-v {\uchar{161}{118}}
+  \definecommand cnupperleftdoublequote-v  {\uchar{161}{121}}
+  \definecommand cnupperrightdoublequote-v {\uchar{161}{122}}
+  \definecommand cnencodecontents          {\uchar{165}{216}\uchar{191}{253}}
+  \definecommand cnencodetables            {\uchar{170}{237}\uchar{174}{230}}
+  \definecommand cnencodefigures           {\uchar{185}{207}\uchar{167}{206}}
+  \definecommand cnencodeindex             {\uchar{175}{193}\uchar{174}{222}}
+  \definecommand cnencodeabbreviations     {\uchar{191}{89}\uchar{178}{164}\uchar{187}{121}}
+  \definecommand cnencodelogos             {\uchar{192}{178}\uchar{188}{208}}
+  \definecommand cnencodeunits             {\uchar{173}{112}\uchar{182}{113}\uchar{179}{230}\uchar{166}{236}}
+  \definecommand cnencodetable             {\uchar{170}{237}}
+  \definecommand cnencodefigure            {\uchar{185}{207}}
+  \definecommand cnencodedintro            {\uchar{178}{196}}
+  \definecommand cnencodedpart             {\uchar{179}{161}\uchar{164}{192}}
+  \definecommand cnencodedchapter          {\uchar{179}{185}}
+  \definecommand cnencodedsection          {\uchar{184} {96}}
+  \definecommand cnencodedjanuary          {\uchar{164} {64}\uchar{164}{235}}
+  \definecommand cnencodedfebrary          {\uchar{164} {71}\uchar{164}{235}}
+  \definecommand cnencodedmarch            {\uchar{164} {84}\uchar{164}{235}}
+  \definecommand cnencodedapril            {\uchar{165}{124}\uchar{164}{235}}
+  \definecommand cnencodedmay              {\uchar{164}{173}\uchar{164}{235}}
+  \definecommand cnencodedjune             {\uchar{164}{187}\uchar{164}{235}}
+  \definecommand cnencodedjuly             {\uchar{164} {67}\uchar{164}{235}}
+  \definecommand cnencodedaugust           {\uchar{164} {75}\uchar{164}{235}}
+  \definecommand cnencodedseptember        {\uchar{164} {69}\uchar{164}{235}}
+  \definecommand cnencodedoctober          {\uchar{164} {81}\uchar{164}{235}}
+  \definecommand cnencodednovember         {\uchar{164} {81}\uchar{164} {64}\uchar{164}{235}}
+  \definecommand cnencodeddecember         {\uchar{164} {81}\uchar{164} {71}\uchar{164}{235}}
+  \definecommand cnencodedsunday           {\uchar{172} {80}\uchar{180}{193}\uchar{164}{233}}
+  \definecommand cnencodedmonday           {\uchar{172} {80}\uchar{180}{193}\uchar{164} {64}}
+  \definecommand cnencodedtuesday          {\uchar{172} {80}\uchar{180}{193}\uchar{164} {71}}
+  \definecommand cnencodedwednesday        {\uchar{172} {80}\uchar{180}{193}\uchar{164} {84}}
+  \definecommand cnencodedthursday         {\uchar{172} {80}\uchar{180}{193}\uchar{165}{124}}
+  \definecommand cnencodedfriday           {\uchar{172} {80}\uchar{180}{193}\uchar{164}{173}}
+  \definecommand cnencodedsaturday         {\uchar{172} {80}\uchar{180}{193}\uchar{164}{187}}
+  % Tobias Burnus &\XJF
+  \definecommand cnyear                    {\uchar{166}{126}}
+  \definecommand cnmonth                   {\uchar{164}{235}}
+  \definecommand cnday                     {\uchar{164}{233}}
+
+% Traditional Chinese characters (only where they differ to the
+% simplified ones) for lang-chi.tex and font-chi.tex.
+
+% \startencoding[cjk-uni]
+%   \defineudigit     10000 132  44
+%   \defineudigit 100000000  81   4
+
+%   \definecommand cnencodedsection          {\uchar{123}{192}}
+%   \definecommand cnencodedfigure           {\uchar{87}{22}}
+%   \definecommand cnencodedunits            {\uchar{138}{8}\uchar{145}{207}\uchar{85}{174}\uchar{79}{77}}
+%   \definecommand cnencodedlogos            {\uchar{95}{189}\uchar{140}{182}}
+%   \definecommand cnencodedabbreviations    {\uchar{126}{46}\uchar{117}{101}\uchar{138}{158}}
+%   \definecommand cnencodedfigures          {\uchar{87}{22}\uchar{95}{98}}
+%   \definecommand cnencodedcontents         {\uchar{118}{238}\uchar{147}{4}}
+% \stopencoding
+
+% \startencoding[gbk]
+%   \defineudigit     10000 200 102
+%   \defineudigit 100000000 131 124
+
+%   \definecommand cnencodedsection          {\uchar{185}{157}}
+%   \definecommand cnencodedfigure           {\uchar{136}{68}}
+%   \definecommand cnencodedunits            {\uchar{211}{139}\uchar{193}{191}\uchar{134}{206}\uchar{206}{187}}
+%   \definecommand cnencodedlogos            {\uchar{187}{213}\uchar{217}{72}
+%   \definecommand cnencodedabbreviations    {\uchar{191}{115}\uchar{194}{212}\uchar{213}{90}}
+%   \definecommand cnencodedfigures          {\uchar{136}{68}\uchar{208}{206}}
+%   \definecommand cnencodedcontents         {\uchar{196}{191}\uchar{228}{155}}
+% \stopencoding
+
+% \startencoding[big5]
+%   \defineudigit     10000 184  85
+%   \defineudigit 100000000 187 245
+
+%   \definecommand cnencodedsection          {\uchar{184}{96}}
+%   \definecommand cnencodedfigure           {\uchar{185}{207}}
+%   \definecommand cnencodedunits            {\uchar{173}{112}\uchar{182}{113}\uchar{179}{230}\uchar{166}{236}}
+%   \definecommand cnencodedlogos            {\uchar{192}{178}\uchar{182}{83}}
+%   \definecommand cnencodedabbreviations    {\uchar{193}{89}\uchar{178}{164}\uchar{187}{121}}
+%   \definecommand cnencodedfigures          {\uchar{185}{207}\uchar{167}{206}}
+%   \definecommand cnencodedcontents         {\uchar{165}{216}\uchar{191}{253}}
+% \stopencoding
+
+\stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/lang-chi.tex b/tex/context/base/lang-chi.tex
deleted file mode 100644
index 278e10745..000000000
--- a/tex/context/base/lang-chi.tex
+++ /dev/null
@@ -1,305 +0,0 @@
-%D \module
-%D   [       file=lang-chi,
-%D        version=2002.06.25, % 1998.10.10,
-%D          title=\CONTEXT\ Language Macros,
-%D       subtitle=Chinese,
-%D         author={Hans Hagen \& Wang Lei},
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Language Macros / Chinese}
-
-%D This module is coded using the \UNICODE\ support built in
-%D \CONTEXT. Therefore, \type {\uchar} is used instead of latin
-%D characters.
-
-\unprotect
-
-\definesystemconstant {chinese}   \definesystemconstant {cn}
-
-\installlanguage
-  [\s!cn]
-  [\c!leftsentence=\cnencoding\cnleftsentence,
-   \c!rightsentence=\cnencoding\cnrightsentence,
-   \c!leftsubsentence=\cnencoding\cnleftsubsentence,
-   \c!rightsubsentence=\cnencoding\cnrightsubsentence,
-   \c!leftquote=\cnencoding\cnupperleftsinglequote,
-   \c!rightquote=\cnencoding\cnupperrightsinglequote,
-   \c!leftquotation=\cnencoding\cnupperleftdoublequote,
-   \c!rightquotation=\cnencoding\cnupperrightdoublequote,
-   \c!date={\v!year,\cnyear,\ ,\v!month,\v!day,\cnday}]
-
-\setupheadtext [\s!cn]       [\v!content={\cnencoding\cnencodedcontents}]
-\setupheadtext [\s!cn]        [\v!tables={\cnencoding\cnencodedtables}]
-\setupheadtext [\s!cn]       [\v!figures={\cnencoding\cnencodedfigures}]
-\setupheadtext [\s!cn]      [\v!graphics={\cnencoding\cnencodedgraphics}]% RG & XJF
-\setupheadtext [\s!cn]    [\v!intermezzi={\cnencoding\cnencodedintermezzo}]% RG & XJF
-\setupheadtext [\s!cn]         [\v!index={\cnencoding\cnencodedindex}]
-\setupheadtext [\s!cn] [\v!abbreviations={\cnencoding\cnencodedabbreviations}]
-\setupheadtext [\s!cn]         [\v!logos={\cnencoding\cnencodedlogos}]
-\setupheadtext [\s!cn]         [\v!units={\cnencoding\cnencodedunits}]
-
-\setuplabeltext [\s!cn]        [\v!table={\cnencoding\cnencodedtable}]
-\setuplabeltext [\s!cn]       [\v!figure={\cnencoding\cnencodedfigure}]
-\setuplabeltext [\s!cn]   [\v!intermezzo={\cnencoding\cnencodedintermezzo}]% RG & XJF
-\setuplabeltext [\s!cn]      [\v!graphic={\cnencoding\cnencodedillustration}]% RG & XJF
-\setuplabeltext [\s!cn]     [\v!appendix={\cnencoding\cnencodedappendix}]% RG
-\setuplabeltext [\s!cn]         [\v!part={\cnencoding\cnencodedintro,\cnencoding\cnencodedpart}]
-\setuplabeltext [\s!cn]      [\v!chapter={\cnencoding\cnencodedintro,\cnencoding\cnencodedchapter}]
-\setuplabeltext [\s!cn]      [\v!section={\cnencoding\cnencodedintro,\cnencoding\cnencodedsection}]
-\setuplabeltext [\s!cn]         [\v!line={\cnencoding\cnencodedline}]% RG & XJF
-\setuplabeltext [\s!cn]        [\v!lines={\cnencoding\cnencodedline}]% RG & XJF
-
-\setuplabeltext [\s!cn]       [\v!subsection=]
-\setuplabeltext [\s!cn]    [\v!subsubsection=]
-\setuplabeltext [\s!cn] [\v!subsubsubsection=]
-
-%D From this definition one can deduce that language, input
-%D encoding, font encoding, and glyph meaning form a pretty
-%D complex four dimensional space.
-
-\startlanguagespecifics[\s!cn]
-
-\setuplabeltext [\s!cn]   [\v!january=\cnencoding\cnencodedjanuary  ]
-\setuplabeltext [\s!cn]  [\v!february=\cnencoding\cnencodedfebrary  ]
-\setuplabeltext [\s!cn]     [\v!march=\cnencoding\cnencodedmarch    ]
-\setuplabeltext [\s!cn]     [\v!april=\cnencoding\cnencodedapril    ]
-\setuplabeltext [\s!cn]       [\v!may=\cnencoding\cnencodedmay      ]
-\setuplabeltext [\s!cn]      [\v!june=\cnencoding\cnencodedjune     ]
-\setuplabeltext [\s!cn]      [\v!july=\cnencoding\cnencodedjuly     ]
-\setuplabeltext [\s!cn]    [\v!august=\cnencoding\cnencodedaugust   ]
-\setuplabeltext [\s!cn] [\v!september=\cnencoding\cnencodedseptember]
-\setuplabeltext [\s!cn]   [\v!october=\cnencoding\cnencodedoctober  ]
-\setuplabeltext [\s!cn]  [\v!november=\cnencoding\cnencodednovember ]
-\setuplabeltext [\s!cn]  [\v!december=\cnencoding\cnencodeddecember ]
-
-\setuplabeltext [\s!cn]    [\v!sunday=\cnencoding\cnencodedsunday   ]
-\setuplabeltext [\s!cn]    [\v!monday=\cnencoding\cnencodedmonday   ]
-\setuplabeltext [\s!cn]   [\v!tuesday=\cnencoding\cnencodedtuesday  ]
-\setuplabeltext [\s!cn] [\v!wednesday=\cnencoding\cnencodedwednesday]
-\setuplabeltext [\s!cn]  [\v!thursday=\cnencoding\cnencodedthursday ]
-\setuplabeltext [\s!cn]    [\v!friday=\cnencoding\cnencodedfriday   ]
-\setuplabeltext [\s!cn]  [\v!saturday=\cnencoding\cnencodedsaturday ]
-
-\stoplanguagespecifics
-
-%D One can specify a split labeltext, as demonstrated in
-%D the definition of the \type {part} label. Unfortunately
-%D the glyphs of both part depend on the encoding. Therefore,
-%D we have an encoding section here.
-
-\unexpanded\def\cnencoding{\enableencoding[\chineseencoding]} % ugly and temporary
-
-\startencoding[cjk-uni]
-  \definecommand cnleftsentence            {\uchar{32}{20}\uchar{32}{20}}
-  \definecommand cnrightsentence           {\uchar{32}{20}\uchar{32}{20}}
-  \definecommand cnleftsubsentence         {\uchar{32}{20}\uchar{32}{20}}
-  \definecommand cnrightsubsentence        {\uchar{32}{20}\uchar{32}{20}}
-  \definecommand cnupperleftsinglequote    {\uchar{32}{24}}
-  \definecommand cnupperrightsinglequote   {\uchar{32}{25}}
-  \definecommand cnupperleftdoublequote    {\uchar{32}{28}}
-  \definecommand cnupperrightdoublequote   {\uchar{32}{29}}
-  \definecommand cnupperleftsinglequote-v  {\uchar{48}{12}}
-  \definecommand cnupperrightsinglequote-v {\uchar{48}{13}}
-  \definecommand cnupperleftdoublequote-v  {\uchar{48}{14}}
-  \definecommand cnupperrightdoublequote-v {\uchar{48}{15}}
-  \definecommand cnencodedcontents         {\uchar{118}{238}\uchar{95}{85}}
-  \definecommand cnencodedtables           {\uchar{136}{104}\uchar{104}{60}}
-  \definecommand cnencodedfigures          {\uchar{86}{254}\uchar{95}{98}}
-  \definecommand cnencodedindex            {\uchar{125}{34}\uchar{95}{21}}
-  \definecommand cnencodedabbreviations    {\uchar{127}{41}\uchar{117}{101}\uchar{139}{237}}
-  \definecommand cnencodedlogos            {\uchar{95}{189}\uchar{141}{44}}
-  \definecommand cnencodedunits            {\uchar{139}{161}\uchar{145}{207}\uchar{83}{85}\uchar{79}{77}}
-  \definecommand cnencodedtable            {\uchar{136}{104}}
-  \definecommand cnencodedfigure           {\uchar{86}{254}}
-  \definecommand cnencodedintro            {\uchar{123}{44}}
-  \definecommand cnencodedpart             {\uchar{144}{232}\uchar{82}{6}}
-  \definecommand cnencodedchapter          {\uchar{122}{224}}
-  \definecommand cnencodedsection          {\uchar{130}{130}}
-  \definecommand cnencodedjanuary          {\uchar{78}{0}\uchar{103}{8}}
-  \definecommand cnencodedfebrary          {\uchar{78}{140}\uchar{103}{8}}
-  \definecommand cnencodedmarch            {\uchar{78}{9}\uchar{103}{8}}
-  \definecommand cnencodedapril            {\uchar{86}{219}\uchar{103}{8}}
-  \definecommand cnencodedmay              {\uchar{78}{148}\uchar{103}{8}}
-  \definecommand cnencodedjune             {\uchar{81}{109}\uchar{103}{8}}
-  \definecommand cnencodedjuly             {\uchar{78}{3}\uchar{103}{8}}
-  \definecommand cnencodedaugust           {\uchar{81}{107}\uchar{103}{8}}
-  \definecommand cnencodedseptember        {\uchar{78}{93}\uchar{103}{8}}
-  \definecommand cnencodedoctober          {\uchar{83}{65}\uchar{103}{8}}
-  \definecommand cnencodednovember         {\uchar{83}{65}\uchar{78}{0}\uchar{103}{8}}
-  \definecommand cnencodeddecember         {\uchar{83}{65}\uchar{78}{140}\uchar{103}{8}}
-  \definecommand cnencodedsunday           {\uchar{102}{31}\uchar{103}{31}\uchar{101}{229}}
-  \definecommand cnencodedmonday           {\uchar{102}{31}\uchar{103}{31}\uchar{78}{0}}
-  \definecommand cnencodedtuesday          {\uchar{102}{31}\uchar{103}{31}\uchar{78}{140}}
-  \definecommand cnencodedwednesday        {\uchar{102}{31}\uchar{103}{31}\uchar{78}{9}}
-  \definecommand cnencodedthursday         {\uchar{102}{31}\uchar{103}{31}\uchar{86}{219}}
-  \definecommand cnencodedfriday           {\uchar{102}{31}\uchar{103}{31}\uchar{78}{148}}
-  \definecommand cnencodedsaturday         {\uchar{102}{31}\uchar{103}{31}\uchar{81}{109}}
-  % RG & XJF
-  \definecommand cnencodedgraphics         {\uchar{86}{254}}
-  \definecommand cnencodedintermezzo       {\uchar{210}{99}\uchar{242}{102}}
-  \definecommand cnencodedillustration     {\uchar{99}{210}\uchar{86}{254}}
-  \definecommand cnencodedappendix         {\uchar{150}{68}\uchar{95}{85}}
-  \definecommand cnencodedline             {\uchar{136}{76}}
-  % Tobias Burnus & XJF
-  \definecommand cnyear                    {\uchar{94}{116}}
-  \definecommand cnmonth                   {\uchar{103}{8}}
-  \definecommand cnday                     {\uchar{101}{229}}
-\stopencoding
-
-\startencoding[gbk]
-  \definecommand cnleftsentence            {\uchar{161}{170}\uchar{161}{170}}
-  \definecommand cnrightsentence           {\uchar{161}{170}\uchar{161}{170}}
-  \definecommand cnleftsubsentence         {\uchar{161}{170}\uchar{161}{170}}
-  \definecommand cnrightsubsentence        {\uchar{161}{170}\uchar{161}{170}}
-  \definecommand cnupperleftsinglequote    {\uchar{161}{174}}
-  \definecommand cnupperrightsinglequote   {\uchar{161}{175}}
-  \definecommand cnupperleftdoublequote    {\uchar{161}{176}}
-  \definecommand cnupperrightdoublequote   {\uchar{161}{177}}
-  \definecommand cnupperleftsinglequote-v  {\uchar{161}{184}}
-  \definecommand cnupperrightsinglequote-v {\uchar{161}{185}}
-  \definecommand cnupperleftdoublequote-v  {\uchar{161}{186}}
-  \definecommand cnupperrightdoublequote-v {\uchar{161}{187}}
-  \definecommand cnencodedcontents         {\uchar{196}{191}\uchar{194}{188}}
-  \definecommand cnencodedtables           {\uchar{177}{237}\uchar{184}{241}}
-  \definecommand cnencodedfigures          {\uchar{205}{188}\uchar{208}{206}}
-  \definecommand cnencodedindex            {\uchar{203}{247}\uchar{210}{253}}
-  \definecommand cnencodedabbreviations    {\uchar{203}{245}\uchar{194}{212}\uchar{211}{239}}
-  \definecommand cnencodedlogos            {\uchar{187}{213}\uchar{177}{225}}
-  \definecommand cnencodedunits            {\uchar{188}{198}\uchar{193}{191}\uchar{181}{165}\uchar{206}{187}}
-  \definecommand cnencodedtable            {\uchar{177}{237}}
-  \definecommand cnencodedfigure           {\uchar{205}{188}}
-  \definecommand cnencodedintro            {\uchar{181}{218}}
-  \definecommand cnencodedpart             {\uchar{178}{191}\uchar{183}{214}}
-  \definecommand cnencodedchapter          {\uchar{213}{194}}
-  \definecommand cnencodedsection          {\uchar{189}{218}}
-  \definecommand cnencodedjanuary          {\uchar{210}{187}\uchar{212}{194}}
-  \definecommand cnencodedfebrary          {\uchar{182}{254}\uchar{212}{194}}
-  \definecommand cnencodedmarch            {\uchar{200}{253}\uchar{212}{194}}
-  \definecommand cnencodedapril            {\uchar{203}{196}\uchar{212}{194}}
-  \definecommand cnencodedmay              {\uchar{206}{229}\uchar{212}{194}}
-  \definecommand cnencodedjune             {\uchar{193}{249}\uchar{212}{194}}
-  \definecommand cnencodedjuly             {\uchar{198}{223}\uchar{212}{194}}
-  \definecommand cnencodedaugust           {\uchar{176}{203}\uchar{212}{194}}
-  \definecommand cnencodedseptember        {\uchar{190}{197}\uchar{212}{194}}
-  \definecommand cnencodedoctober          {\uchar{202}{174}\uchar{212}{194}}
-  \definecommand cnencodednovember         {\uchar{202}{174}\uchar{210}{187}\uchar{212}{194}}
-  \definecommand cnencodeddecember         {\uchar{202}{174}\uchar{182}{254}\uchar{212}{194}}
-  \definecommand cnencodedsunday           {\uchar{208}{199}\uchar{198}{218}\uchar{200}{213}}
-  \definecommand cnencodedmonday           {\uchar{208}{199}\uchar{198}{218}\uchar{210}{187}}
-  \definecommand cnencodedtuesday          {\uchar{208}{199}\uchar{198}{218}\uchar{182}{254}}
-  \definecommand cnencodedwednesday        {\uchar{208}{199}\uchar{198}{218}\uchar{200}{253}}
-  \definecommand cnencodedthursday         {\uchar{208}{199}\uchar{198}{218}\uchar{203}{196}}
-  \definecommand cnencodedfriday           {\uchar{208}{199}\uchar{198}{218}\uchar{206}{229}}
-  \definecommand cnencodedsaturday         {\uchar{208}{199}\uchar{198}{218}\uchar{193}{249}}
-  % RG & XJF
-  \definecommand cnencodedgraphics         {\uchar{205}{188}}
-  \definecommand cnencodedintermezzo       {\uchar{178}{229}\uchar{199}{250}}
-  \definecommand cnencodedillustration     {\uchar{178}{229}\uchar{205}{188}}
-  \definecommand cnencodedappendix         {\uchar{184}{189}\uchar{194}{188}}
-  \definecommand cnencodedline             {\uchar{208}{208}}
-  % Tobias Burnus & XJF
-  \definecommand cnyear                    {\uchar{196}{234}}
-  \definecommand cnmonth                   {\uchar{212}{194}}
-  \definecommand cnday                     {\uchar{200}{213}}
-\stopencoding
-
-\startencoding[big5]
-  \definecommand cnleftsentence            {\uchar{162}{119}\uchar{162}{119}}
-  \definecommand cnrightsentence           {\uchar{162}{119}\uchar{162}{119}}
-  \definecommand cnleftsubsentence         {\uchar{162}{119}\uchar{162}{119}}
-  \definecommand cnrightsubsentence        {\uchar{162}{119}\uchar{162}{119}}
-  \definecommand cnupperleftsinglequote    {\uchar{161}{165}}
-  \definecommand cnupperrightsinglequote   {\uchar{161}{166}}
-  \definecommand cnupperleftdoublequote    {\uchar{161}{167}}
-  \definecommand cnupperrightdoublequote   {\uchar{161}{168}}
-  \definecommand cnupperleftsinglequote-v  {\uchar{161}{117}}
-  \definecommand cnupperrightsinglequote-v {\uchar{161}{118}}
-  \definecommand cnupperleftdoublequote-v  {\uchar{161}{121}}
-  \definecommand cnupperrightdoublequote-v {\uchar{161}{122}}
-  \definecommand cnencodecontents          {\uchar{165}{216}\uchar{191}{253}}
-  \definecommand cnencodetables            {\uchar{170}{237}\uchar{174}{230}}
-  \definecommand cnencodefigures           {\uchar{185}{207}\uchar{167}{206}}
-  \definecommand cnencodeindex             {\uchar{175}{193}\uchar{174}{222}}
-  \definecommand cnencodeabbreviations     {\uchar{191}{89}\uchar{178}{164}\uchar{187}{121}}
-  \definecommand cnencodelogos             {\uchar{192}{178}\uchar{188}{208}}
-  \definecommand cnencodeunits             {\uchar{173}{112}\uchar{182}{113}\uchar{179}{230}\uchar{166}{236}}
-  \definecommand cnencodetable             {\uchar{170}{237}}
-  \definecommand cnencodefigure            {\uchar{185}{207}}
-  \definecommand cnencodedintro            {\uchar{178}{196}}
-  \definecommand cnencodedpart             {\uchar{179}{161}\uchar{164}{192}}
-  \definecommand cnencodedchapter          {\uchar{179}{185}}
-  \definecommand cnencodedsection          {\uchar{184} {96}}
-  \definecommand cnencodedjanuary          {\uchar{164} {64}\uchar{164}{235}}
-  \definecommand cnencodedfebrary          {\uchar{164} {71}\uchar{164}{235}}
-  \definecommand cnencodedmarch            {\uchar{164} {84}\uchar{164}{235}}
-  \definecommand cnencodedapril            {\uchar{165}{124}\uchar{164}{235}}
-  \definecommand cnencodedmay              {\uchar{164}{173}\uchar{164}{235}}
-  \definecommand cnencodedjune             {\uchar{164}{187}\uchar{164}{235}}
-  \definecommand cnencodedjuly             {\uchar{164} {67}\uchar{164}{235}}
-  \definecommand cnencodedaugust           {\uchar{164} {75}\uchar{164}{235}}
-  \definecommand cnencodedseptember        {\uchar{164} {69}\uchar{164}{235}}
-  \definecommand cnencodedoctober          {\uchar{164} {81}\uchar{164}{235}}
-  \definecommand cnencodednovember         {\uchar{164} {81}\uchar{164} {64}\uchar{164}{235}}
-  \definecommand cnencodeddecember         {\uchar{164} {81}\uchar{164} {71}\uchar{164}{235}}
-  \definecommand cnencodedsunday           {\uchar{172} {80}\uchar{180}{193}\uchar{164}{233}}
-  \definecommand cnencodedmonday           {\uchar{172} {80}\uchar{180}{193}\uchar{164} {64}}
-  \definecommand cnencodedtuesday          {\uchar{172} {80}\uchar{180}{193}\uchar{164} {71}}
-  \definecommand cnencodedwednesday        {\uchar{172} {80}\uchar{180}{193}\uchar{164} {84}}
-  \definecommand cnencodedthursday         {\uchar{172} {80}\uchar{180}{193}\uchar{165}{124}}
-  \definecommand cnencodedfriday           {\uchar{172} {80}\uchar{180}{193}\uchar{164}{173}}
-  \definecommand cnencodedsaturday         {\uchar{172} {80}\uchar{180}{193}\uchar{164}{187}}
-  % Tobias Burnus &\XJF
-  \definecommand cnyear                    {\uchar{166}{126}}
-  \definecommand cnmonth                   {\uchar{164}{235}}
-  \definecommand cnday                     {\uchar{164}{233}}
-
-% Traditional Chinese characters (only where they differ to the
-% simplified ones) for lang-chi.tex and font-chi.tex.
-
-% \startencoding[cjk-uni]
-%   \defineudigit     10000 132  44
-%   \defineudigit 100000000  81   4
-
-%   \definecommand cnencodedsection          {\uchar{123}{192}}
-%   \definecommand cnencodedfigure           {\uchar{87}{22}}
-%   \definecommand cnencodedunits            {\uchar{138}{8}\uchar{145}{207}\uchar{85}{174}\uchar{79}{77}}
-%   \definecommand cnencodedlogos            {\uchar{95}{189}\uchar{140}{182}}
-%   \definecommand cnencodedabbreviations    {\uchar{126}{46}\uchar{117}{101}\uchar{138}{158}}
-%   \definecommand cnencodedfigures          {\uchar{87}{22}\uchar{95}{98}}
-%   \definecommand cnencodedcontents         {\uchar{118}{238}\uchar{147}{4}}
-% \stopencoding
-
-% \startencoding[gbk]
-%   \defineudigit     10000 200 102
-%   \defineudigit 100000000 131 124
-
-%   \definecommand cnencodedsection          {\uchar{185}{157}}
-%   \definecommand cnencodedfigure           {\uchar{136}{68}}
-%   \definecommand cnencodedunits            {\uchar{211}{139}\uchar{193}{191}\uchar{134}{206}\uchar{206}{187}}
-%   \definecommand cnencodedlogos            {\uchar{187}{213}\uchar{217}{72}
-%   \definecommand cnencodedabbreviations    {\uchar{191}{115}\uchar{194}{212}\uchar{213}{90}}
-%   \definecommand cnencodedfigures          {\uchar{136}{68}\uchar{208}{206}}
-%   \definecommand cnencodedcontents         {\uchar{196}{191}\uchar{228}{155}}
-% \stopencoding
-
-% \startencoding[big5]
-%   \defineudigit     10000 184  85
-%   \defineudigit 100000000 187 245
-
-%   \definecommand cnencodedsection          {\uchar{184}{96}}
-%   \definecommand cnencodedfigure           {\uchar{185}{207}}
-%   \definecommand cnencodedunits            {\uchar{173}{112}\uchar{182}{113}\uchar{179}{230}\uchar{166}{236}}
-%   \definecommand cnencodedlogos            {\uchar{192}{178}\uchar{182}{83}}
-%   \definecommand cnencodedabbreviations    {\uchar{193}{89}\uchar{178}{164}\uchar{187}{121}}
-%   \definecommand cnencodedfigures          {\uchar{185}{207}\uchar{167}{206}}
-%   \definecommand cnencodedcontents         {\uchar{165}{216}\uchar{191}{253}}
-% \stopencoding
-
-\stopencoding
-
-\protect \endinput
diff --git a/tex/context/base/lang-cjk.mkiv b/tex/context/base/lang-cjk.mkiv
new file mode 100644
index 000000000..138f6d263
--- /dev/null
+++ b/tex/context/base/lang-cjk.mkiv
@@ -0,0 +1,328 @@
+%D \module
+%D   [       file=lang-chi,
+%D        version=2009.03.02,
+%D          title=\CONTEXT\ Language Macros,
+%D       subtitle=Chinese,
+%D         author={Hans Hagen \& Wang Lei},
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Derived from \MKII\ files.
+
+\writestatus{loading}{ConTeXt Language Macros / CJK}
+
+\definesystemconstant {chinese}  \definesystemconstant {cn}
+\definesystemconstant {japanese} \definesystemconstant {ja}
+\definesystemconstant {korean}   \definesystemconstant {kr}
+
+\unprotect
+
+% Chinese
+
+\installlanguage
+  [\s!cn]
+  [\c!leftsentence=——,
+   \c!rightsentence=——,
+   \c!leftsubsentence=——,
+   \c!rightsubsentence=——,
+   \c!leftquote=‘,
+   \c!rightquote=’,
+   \c!leftquotation=“,
+   \c!rightquotation=”,
+   \c!date={\v!year,年,\ ,\v!month,\v!day,日}]
+
+\setupheadtext [\s!cn]       [\v!content=目录]
+\setupheadtext [\s!cn]        [\v!tables=表格]
+\setupheadtext [\s!cn]       [\v!figures=图形]
+\setupheadtext [\s!cn]      [\v!graphics=图]
+\setupheadtext [\s!cn]    [\v!intermezzi=퉣]
+\setupheadtext [\s!cn]         [\v!index=索引]
+\setupheadtext [\s!cn] [\v!abbreviations=缩略语]
+\setupheadtext [\s!cn]         [\v!logos=徽贬]
+\setupheadtext [\s!cn]         [\v!units=计量单位]
+
+\setuplabeltext [\s!cn]        [\v!table=表]
+\setuplabeltext [\s!cn]       [\v!figure=图]
+\setuplabeltext [\s!cn]   [\v!intermezzo=퉣]
+\setuplabeltext [\s!cn]      [\v!graphic=插图]
+\setuplabeltext [\s!cn]     [\v!appendix=附录]
+\setuplabeltext [\s!cn]         [\v!part={第,部分}]
+\setuplabeltext [\s!cn]      [\v!chapter={第,章}]
+\setuplabeltext [\s!cn]      [\v!section={第,节}]
+\setuplabeltext [\s!cn]         [\v!line=行]
+\setuplabeltext [\s!cn]        [\v!lines=行]
+
+\setuplabeltext [\s!cn]       [\v!subsection=]
+\setuplabeltext [\s!cn]    [\v!subsubsection=]
+\setuplabeltext [\s!cn] [\v!subsubsubsection=]
+
+\setuplabeltext [\s!cn]   [\v!january=一月]
+\setuplabeltext [\s!cn]  [\v!february=二月]
+\setuplabeltext [\s!cn]     [\v!march=三月]
+\setuplabeltext [\s!cn]     [\v!april=四月]
+\setuplabeltext [\s!cn]       [\v!may=五月]
+\setuplabeltext [\s!cn]      [\v!june=六月]
+\setuplabeltext [\s!cn]      [\v!july=七月]
+\setuplabeltext [\s!cn]    [\v!august=八月]
+\setuplabeltext [\s!cn] [\v!september=九月]
+\setuplabeltext [\s!cn]   [\v!october=十月]
+\setuplabeltext [\s!cn]  [\v!november=十一月]
+\setuplabeltext [\s!cn]  [\v!december=十二月]
+
+\setuplabeltext [\s!cn]    [\v!sunday=星期日]
+\setuplabeltext [\s!cn]    [\v!monday=星期一]
+\setuplabeltext [\s!cn]   [\v!tuesday=星期二]
+\setuplabeltext [\s!cn] [\v!wednesday=星期三]
+\setuplabeltext [\s!cn]  [\v!thursday=星期四]
+\setuplabeltext [\s!cn]    [\v!friday=星期五]
+\setuplabeltext [\s!cn]  [\v!saturday=星期六]
+
+%D Japanese
+
+\installlanguage
+  [\s!ja]
+  [\c!leftsentence=——,
+   \c!rightsentence=——,
+   \c!leftsubsentence=——,
+   \c!rightsubsentence=——,
+   \c!leftquote=‘,
+   \c!rightquote=’,
+   \c!leftquotation=「,
+   \c!rightquotation=」,
+   \c!date={西暦,\v!year,年,\v!month,月,\v!day,日}]
+
+\setupheadtext [\s!ja]       [\v!content=目次]
+\setupheadtext [\s!ja]        [\v!tables=机]
+\setupheadtext [\s!ja]       [\v!figures=図]
+\setupheadtext [\s!ja]      [\v!graphics=グラフ]
+\setupheadtext [\s!ja]    [\v!intermezzi=間奏曲]
+\setupheadtext [\s!ja]         [\v!index=目次]
+\setupheadtext [\s!ja] [\v!abbreviations=略語]
+\setupheadtext [\s!ja]         [\v!logos=理性]
+\setupheadtext [\s!ja]         [\v!units=ユニッツ]
+
+\setuplabeltext [\s!ja]        [\v!table=表]
+\setuplabeltext [\s!ja]       [\v!figure=図]
+\setuplabeltext [\s!ja]   [\v!intermezzo=間奏曲]
+\setuplabeltext [\s!ja]      [\v!graphic=イラスト]
+\setuplabeltext [\s!ja]     [\v!appendix=付録]
+\setuplabeltext [\s!ja]         [\v!part={第,パート}]
+\setuplabeltext [\s!ja]      [\v!chapter={第,章}]
+\setuplabeltext [\s!ja]      [\v!section={第,項}]
+\setuplabeltext [\s!ja]         [\v!line=線]
+\setuplabeltext [\s!ja]        [\v!lines=線]
+
+\setuplabeltext [\s!ja]       [\v!subsection=]
+\setuplabeltext [\s!ja]    [\v!subsubsection=]
+\setuplabeltext [\s!ja] [\v!subsubsubsection=]
+
+\setuplabeltext [\s!ja]   [\v!january=1]
+\setuplabeltext [\s!ja]  [\v!february=2]
+\setuplabeltext [\s!ja]     [\v!march=3]
+\setuplabeltext [\s!ja]     [\v!april=4]
+\setuplabeltext [\s!ja]       [\v!may=5]
+\setuplabeltext [\s!ja]      [\v!june=6]
+\setuplabeltext [\s!ja]      [\v!july=7]
+\setuplabeltext [\s!ja]    [\v!august=8]
+\setuplabeltext [\s!ja] [\v!september=9]
+\setuplabeltext [\s!ja]   [\v!october=10]
+\setuplabeltext [\s!ja]  [\v!november=11]
+\setuplabeltext [\s!ja]  [\v!december=12]
+
+\setuplabeltext [\s!ja]    [\v!sunday=月曜日]
+\setuplabeltext [\s!ja]    [\v!monday=火曜日]
+\setuplabeltext [\s!ja]   [\v!tuesday=水曜日]
+\setuplabeltext [\s!ja] [\v!wednesday=木曜日]
+\setuplabeltext [\s!ja]  [\v!thursday=金曜日]
+\setuplabeltext [\s!ja]    [\v!friday=土曜日]
+\setuplabeltext [\s!ja]  [\v!saturday=日曜日]
+
+%D Korean
+
+% todo
+
+\protect \endinput
+
+cn={
+ ["abbreviations"]="缩略语",
+ ["appendix"]="附录",
+ ["april"]="四月",
+ ["august"]="八月",
+ ["chapter"]="章",
+ ["contents"]="目录",
+ ["day"]="日",
+ ["december"]="十二月",
+ ["febrary"]="二月",
+ ["figure"]="图",
+ ["figures"]="图形",
+ ["friday"]="星期五",
+ ["graphics"]="图",
+ ["illustration"]="插图",
+ ["index"]="索引",
+ ["intermezzo"]="퉣",
+ ["intro"]="第",
+ ["january"]="一月",
+ ["july"]="七月",
+ ["june"]="六月",
+ ["leftsentence"]="——",
+ ["leftsubsentence"]="——",
+ ["line"]="行",
+ ["logos"]="徽贬",
+ ["march"]="三月",
+ ["may"]="五月",
+ ["monday"]="星期一",
+ ["month"]="月",
+ ["november"]="十一月",
+ ["october"]="十月",
+ ["part"]="部分",
+ ["rightsentence"]="——",
+ ["rightsubsentence"]="——",
+ ["saturday"]="星期六",
+ ["section"]="节",
+ ["september"]="九月",
+ ["sunday"]="星期日",
+ ["table"]="表",
+ ["tables"]="表格",
+ ["thursday"]="星期四",
+ ["tuesday"]="星期二",
+ ["units"]="计量单位",
+ ["upperleftdoublequote"]="“",
+ ["upperleftdoublequote-v"]="『",
+ ["upperleftsinglequote"]="‘",
+ ["upperleftsinglequote-v"]="「",
+ ["upperrightdoublequote"]="”",
+ ["upperrightdoublequote-v"]="』",
+ ["upperrightsinglequote"]="’",
+ ["upperrightsinglequote-v"]="」",
+ ["wednesday"]="星期三",
+ ["year"]="年",
+}
+
+ja={
+ ["abbreviations"]="略語",
+ ["abstract"]="概要",
+ ["and"]="、",
+ ["answer"]="答:",
+ ["appendix"]="付録",
+ ["april"]="四月",
+ ["article"]="項目",
+ ["august"]="八月",
+ ["bibliography"]="参考文献",
+ ["book"]="ブック",
+ ["bridgehead"]="項",
+ ["bullet"]="●",
+ ["by"]=":",
+ ["caution"]="注意",
+ ["chapter"]="章",
+ ["christiandate"]="西暦",
+ ["colophon"]="奥付",
+ ["copyright"]="製作著作",
+ ["day"]="日",
+ ["december"]="十二月",
+ ["dedication"]="謝辞",
+ ["edited"]="編者",
+ ["editedby"]="編者:",
+ ["edition"]="編集",
+ ["endquote"]="」",
+ ["equation"]="式",
+ ["example"]="例",
+ ["february"]="二月",
+ ["figure"]="図",
+ ["figures"]="図",
+ ["friday"]="土曜日",
+ ["glossary"]="用語集",
+ ["glosssee"]="参照",
+ ["glossseealso"]="参照",
+ ["graphics"]="グラフ",
+ ["illustration"]="イラスト",
+ ["important"]="重要項目",
+ ["index"]="目次",
+ ["indexsymbols"]="シンボル",
+ ["intermezzo"]="間奏曲",
+ ["intermezzos"]="間奏曲",
+ ["intro"]="第",
+ ["january"]="一月",
+ ["july"]="七月",
+ ["june"]="六月",
+ ["leftsentence"]="——",
+ ["leftsubsentence"]="——",
+ ["line"]="線",
+ ["lines"]="線",
+ ["listofequations"]="式目次",
+ ["listofexamples"]="例目次",
+ ["listoffigures"]="図目次",
+ ["listoftables"]="表目次",
+ ["listofunknown"]="不明目次",
+ ["logos"]="理性",
+ ["march"]="三月",
+ ["may"]="五月",
+ ["monday"]="火曜日",
+ ["month"]="月",
+ ["msgaud"]="対象者",
+ ["msglevel"]="レベル",
+ ["msgorig"]="発信元",
+ ["navhome"]="ホーム",
+ ["navnext"]="次のページ",
+ ["navnextsibling"]="早送り",
+ ["navprev"]="前のページ",
+ ["navprevsibling"]="巻戻し",
+ ["navup"]="上に戻る",
+ ["nestedendquote"]="』",
+ ["nestedstartquote"]="『",
+ ["nonexistantelement"]="要素が存在しません",
+ ["note"]="注意",
+ ["notes"]="注意",
+ ["november"]="十一月",
+ ["october"]="十月",
+ ["pages"]="偧献",
+ ["part"]="パート",
+ ["preface"]="序文",
+ ["procedure"]="手順",
+ ["procedureformal"]="手順",
+ ["productionset"]="プロダクション",
+ ["productionsetformal"]="プロダクション",
+ ["published"]="発行",
+ ["qandadiv"]="問:、答:",
+ ["qandaentry"]="問:",
+ ["question"]="問:",
+ ["reference"]="参照",
+ ["refname"]="名前",
+ ["refsection"]="項",
+ ["refsynopsisdiv"]="概要",
+ ["revhistory"]="改訂履歴",
+ ["revision"]="改訂",
+ ["rightsentence"]="——",
+ ["rightsubsentence"]="——",
+ ["saturday"]="日曜日",
+ ["section"]="項",
+ ["see"]="参照",
+ ["seealso"]="参照",
+ ["separator"]="、",
+ ["september"]="九月",
+ ["set"]="設定",
+ ["setindex"]="目次設定",
+ ["sidebar"]="サイドバー",
+ ["simplesect"]="項",
+ ["singleendquote"]="’",
+ ["singlestartquote"]="‘",
+ ["startquote"]="「",
+ ["step"]="ステップ",
+ ["sunday"]="月曜日",
+ ["table"]="表",
+ ["tablenotes"]="注意",
+ ["tableofcontents"]="目次",
+ ["tables"]="机",
+ ["thursday"]="金曜日",
+ ["tip"]="ティップ",
+ ["tuesday"]="水曜日",
+ ["unexpectedelementname"]="不明な要素名",
+ ["units"]="ユニッツ",
+ ["unsupported"]="サポートしません",
+ ["warning"]="警告",
+ ["wednesday"]="木曜日",
+ ["year"]="年",
+}
diff --git a/tex/context/base/lang-cjk.tex b/tex/context/base/lang-cjk.tex
deleted file mode 100644
index 138f6d263..000000000
--- a/tex/context/base/lang-cjk.tex
+++ /dev/null
@@ -1,328 +0,0 @@
-%D \module
-%D   [       file=lang-chi,
-%D        version=2009.03.02,
-%D          title=\CONTEXT\ Language Macros,
-%D       subtitle=Chinese,
-%D         author={Hans Hagen \& Wang Lei},
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Derived from \MKII\ files.
-
-\writestatus{loading}{ConTeXt Language Macros / CJK}
-
-\definesystemconstant {chinese}  \definesystemconstant {cn}
-\definesystemconstant {japanese} \definesystemconstant {ja}
-\definesystemconstant {korean}   \definesystemconstant {kr}
-
-\unprotect
-
-% Chinese
-
-\installlanguage
-  [\s!cn]
-  [\c!leftsentence=——,
-   \c!rightsentence=——,
-   \c!leftsubsentence=——,
-   \c!rightsubsentence=——,
-   \c!leftquote=‘,
-   \c!rightquote=’,
-   \c!leftquotation=“,
-   \c!rightquotation=”,
-   \c!date={\v!year,年,\ ,\v!month,\v!day,日}]
-
-\setupheadtext [\s!cn]       [\v!content=目录]
-\setupheadtext [\s!cn]        [\v!tables=表格]
-\setupheadtext [\s!cn]       [\v!figures=图形]
-\setupheadtext [\s!cn]      [\v!graphics=图]
-\setupheadtext [\s!cn]    [\v!intermezzi=퉣]
-\setupheadtext [\s!cn]         [\v!index=索引]
-\setupheadtext [\s!cn] [\v!abbreviations=缩略语]
-\setupheadtext [\s!cn]         [\v!logos=徽贬]
-\setupheadtext [\s!cn]         [\v!units=计量单位]
-
-\setuplabeltext [\s!cn]        [\v!table=表]
-\setuplabeltext [\s!cn]       [\v!figure=图]
-\setuplabeltext [\s!cn]   [\v!intermezzo=퉣]
-\setuplabeltext [\s!cn]      [\v!graphic=插图]
-\setuplabeltext [\s!cn]     [\v!appendix=附录]
-\setuplabeltext [\s!cn]         [\v!part={第,部分}]
-\setuplabeltext [\s!cn]      [\v!chapter={第,章}]
-\setuplabeltext [\s!cn]      [\v!section={第,节}]
-\setuplabeltext [\s!cn]         [\v!line=行]
-\setuplabeltext [\s!cn]        [\v!lines=行]
-
-\setuplabeltext [\s!cn]       [\v!subsection=]
-\setuplabeltext [\s!cn]    [\v!subsubsection=]
-\setuplabeltext [\s!cn] [\v!subsubsubsection=]
-
-\setuplabeltext [\s!cn]   [\v!january=一月]
-\setuplabeltext [\s!cn]  [\v!february=二月]
-\setuplabeltext [\s!cn]     [\v!march=三月]
-\setuplabeltext [\s!cn]     [\v!april=四月]
-\setuplabeltext [\s!cn]       [\v!may=五月]
-\setuplabeltext [\s!cn]      [\v!june=六月]
-\setuplabeltext [\s!cn]      [\v!july=七月]
-\setuplabeltext [\s!cn]    [\v!august=八月]
-\setuplabeltext [\s!cn] [\v!september=九月]
-\setuplabeltext [\s!cn]   [\v!october=十月]
-\setuplabeltext [\s!cn]  [\v!november=十一月]
-\setuplabeltext [\s!cn]  [\v!december=十二月]
-
-\setuplabeltext [\s!cn]    [\v!sunday=星期日]
-\setuplabeltext [\s!cn]    [\v!monday=星期一]
-\setuplabeltext [\s!cn]   [\v!tuesday=星期二]
-\setuplabeltext [\s!cn] [\v!wednesday=星期三]
-\setuplabeltext [\s!cn]  [\v!thursday=星期四]
-\setuplabeltext [\s!cn]    [\v!friday=星期五]
-\setuplabeltext [\s!cn]  [\v!saturday=星期六]
-
-%D Japanese
-
-\installlanguage
-  [\s!ja]
-  [\c!leftsentence=——,
-   \c!rightsentence=——,
-   \c!leftsubsentence=——,
-   \c!rightsubsentence=——,
-   \c!leftquote=‘,
-   \c!rightquote=’,
-   \c!leftquotation=「,
-   \c!rightquotation=」,
-   \c!date={西暦,\v!year,年,\v!month,月,\v!day,日}]
-
-\setupheadtext [\s!ja]       [\v!content=目次]
-\setupheadtext [\s!ja]        [\v!tables=机]
-\setupheadtext [\s!ja]       [\v!figures=図]
-\setupheadtext [\s!ja]      [\v!graphics=グラフ]
-\setupheadtext [\s!ja]    [\v!intermezzi=間奏曲]
-\setupheadtext [\s!ja]         [\v!index=目次]
-\setupheadtext [\s!ja] [\v!abbreviations=略語]
-\setupheadtext [\s!ja]         [\v!logos=理性]
-\setupheadtext [\s!ja]         [\v!units=ユニッツ]
-
-\setuplabeltext [\s!ja]        [\v!table=表]
-\setuplabeltext [\s!ja]       [\v!figure=図]
-\setuplabeltext [\s!ja]   [\v!intermezzo=間奏曲]
-\setuplabeltext [\s!ja]      [\v!graphic=イラスト]
-\setuplabeltext [\s!ja]     [\v!appendix=付録]
-\setuplabeltext [\s!ja]         [\v!part={第,パート}]
-\setuplabeltext [\s!ja]      [\v!chapter={第,章}]
-\setuplabeltext [\s!ja]      [\v!section={第,項}]
-\setuplabeltext [\s!ja]         [\v!line=線]
-\setuplabeltext [\s!ja]        [\v!lines=線]
-
-\setuplabeltext [\s!ja]       [\v!subsection=]
-\setuplabeltext [\s!ja]    [\v!subsubsection=]
-\setuplabeltext [\s!ja] [\v!subsubsubsection=]
-
-\setuplabeltext [\s!ja]   [\v!january=1]
-\setuplabeltext [\s!ja]  [\v!february=2]
-\setuplabeltext [\s!ja]     [\v!march=3]
-\setuplabeltext [\s!ja]     [\v!april=4]
-\setuplabeltext [\s!ja]       [\v!may=5]
-\setuplabeltext [\s!ja]      [\v!june=6]
-\setuplabeltext [\s!ja]      [\v!july=7]
-\setuplabeltext [\s!ja]    [\v!august=8]
-\setuplabeltext [\s!ja] [\v!september=9]
-\setuplabeltext [\s!ja]   [\v!october=10]
-\setuplabeltext [\s!ja]  [\v!november=11]
-\setuplabeltext [\s!ja]  [\v!december=12]
-
-\setuplabeltext [\s!ja]    [\v!sunday=月曜日]
-\setuplabeltext [\s!ja]    [\v!monday=火曜日]
-\setuplabeltext [\s!ja]   [\v!tuesday=水曜日]
-\setuplabeltext [\s!ja] [\v!wednesday=木曜日]
-\setuplabeltext [\s!ja]  [\v!thursday=金曜日]
-\setuplabeltext [\s!ja]    [\v!friday=土曜日]
-\setuplabeltext [\s!ja]  [\v!saturday=日曜日]
-
-%D Korean
-
-% todo
-
-\protect \endinput
-
-cn={
- ["abbreviations"]="缩略语",
- ["appendix"]="附录",
- ["april"]="四月",
- ["august"]="八月",
- ["chapter"]="章",
- ["contents"]="目录",
- ["day"]="日",
- ["december"]="十二月",
- ["febrary"]="二月",
- ["figure"]="图",
- ["figures"]="图形",
- ["friday"]="星期五",
- ["graphics"]="图",
- ["illustration"]="插图",
- ["index"]="索引",
- ["intermezzo"]="퉣",
- ["intro"]="第",
- ["january"]="一月",
- ["july"]="七月",
- ["june"]="六月",
- ["leftsentence"]="——",
- ["leftsubsentence"]="——",
- ["line"]="行",
- ["logos"]="徽贬",
- ["march"]="三月",
- ["may"]="五月",
- ["monday"]="星期一",
- ["month"]="月",
- ["november"]="十一月",
- ["october"]="十月",
- ["part"]="部分",
- ["rightsentence"]="——",
- ["rightsubsentence"]="——",
- ["saturday"]="星期六",
- ["section"]="节",
- ["september"]="九月",
- ["sunday"]="星期日",
- ["table"]="表",
- ["tables"]="表格",
- ["thursday"]="星期四",
- ["tuesday"]="星期二",
- ["units"]="计量单位",
- ["upperleftdoublequote"]="“",
- ["upperleftdoublequote-v"]="『",
- ["upperleftsinglequote"]="‘",
- ["upperleftsinglequote-v"]="「",
- ["upperrightdoublequote"]="”",
- ["upperrightdoublequote-v"]="』",
- ["upperrightsinglequote"]="’",
- ["upperrightsinglequote-v"]="」",
- ["wednesday"]="星期三",
- ["year"]="年",
-}
-
-ja={
- ["abbreviations"]="略語",
- ["abstract"]="概要",
- ["and"]="、",
- ["answer"]="答:",
- ["appendix"]="付録",
- ["april"]="四月",
- ["article"]="項目",
- ["august"]="八月",
- ["bibliography"]="参考文献",
- ["book"]="ブック",
- ["bridgehead"]="項",
- ["bullet"]="●",
- ["by"]=":",
- ["caution"]="注意",
- ["chapter"]="章",
- ["christiandate"]="西暦",
- ["colophon"]="奥付",
- ["copyright"]="製作著作",
- ["day"]="日",
- ["december"]="十二月",
- ["dedication"]="謝辞",
- ["edited"]="編者",
- ["editedby"]="編者:",
- ["edition"]="編集",
- ["endquote"]="」",
- ["equation"]="式",
- ["example"]="例",
- ["february"]="二月",
- ["figure"]="図",
- ["figures"]="図",
- ["friday"]="土曜日",
- ["glossary"]="用語集",
- ["glosssee"]="参照",
- ["glossseealso"]="参照",
- ["graphics"]="グラフ",
- ["illustration"]="イラスト",
- ["important"]="重要項目",
- ["index"]="目次",
- ["indexsymbols"]="シンボル",
- ["intermezzo"]="間奏曲",
- ["intermezzos"]="間奏曲",
- ["intro"]="第",
- ["january"]="一月",
- ["july"]="七月",
- ["june"]="六月",
- ["leftsentence"]="——",
- ["leftsubsentence"]="——",
- ["line"]="線",
- ["lines"]="線",
- ["listofequations"]="式目次",
- ["listofexamples"]="例目次",
- ["listoffigures"]="図目次",
- ["listoftables"]="表目次",
- ["listofunknown"]="不明目次",
- ["logos"]="理性",
- ["march"]="三月",
- ["may"]="五月",
- ["monday"]="火曜日",
- ["month"]="月",
- ["msgaud"]="対象者",
- ["msglevel"]="レベル",
- ["msgorig"]="発信元",
- ["navhome"]="ホーム",
- ["navnext"]="次のページ",
- ["navnextsibling"]="早送り",
- ["navprev"]="前のページ",
- ["navprevsibling"]="巻戻し",
- ["navup"]="上に戻る",
- ["nestedendquote"]="』",
- ["nestedstartquote"]="『",
- ["nonexistantelement"]="要素が存在しません",
- ["note"]="注意",
- ["notes"]="注意",
- ["november"]="十一月",
- ["october"]="十月",
- ["pages"]="偧献",
- ["part"]="パート",
- ["preface"]="序文",
- ["procedure"]="手順",
- ["procedureformal"]="手順",
- ["productionset"]="プロダクション",
- ["productionsetformal"]="プロダクション",
- ["published"]="発行",
- ["qandadiv"]="問:、答:",
- ["qandaentry"]="問:",
- ["question"]="問:",
- ["reference"]="参照",
- ["refname"]="名前",
- ["refsection"]="項",
- ["refsynopsisdiv"]="概要",
- ["revhistory"]="改訂履歴",
- ["revision"]="改訂",
- ["rightsentence"]="——",
- ["rightsubsentence"]="——",
- ["saturday"]="日曜日",
- ["section"]="項",
- ["see"]="参照",
- ["seealso"]="参照",
- ["separator"]="、",
- ["september"]="九月",
- ["set"]="設定",
- ["setindex"]="目次設定",
- ["sidebar"]="サイドバー",
- ["simplesect"]="項",
- ["singleendquote"]="’",
- ["singlestartquote"]="‘",
- ["startquote"]="「",
- ["step"]="ステップ",
- ["sunday"]="月曜日",
- ["table"]="表",
- ["tablenotes"]="注意",
- ["tableofcontents"]="目次",
- ["tables"]="机",
- ["thursday"]="金曜日",
- ["tip"]="ティップ",
- ["tuesday"]="水曜日",
- ["unexpectedelementname"]="不明な要素名",
- ["units"]="ユニッツ",
- ["unsupported"]="サポートしません",
- ["warning"]="警告",
- ["wednesday"]="木曜日",
- ["year"]="年",
-}
diff --git a/tex/context/base/lang-ctx.mkii b/tex/context/base/lang-ctx.mkii
new file mode 100644
index 000000000..09f28dda1
--- /dev/null
+++ b/tex/context/base/lang-ctx.mkii
@@ -0,0 +1,53 @@
+%D \module
+%D   [       file=lang-ctx,
+%D        version=2005.02.12,
+%D          title=\CONTEXT\ Language Macros,
+%D       subtitle=Generic Patterns,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Language Macros / Generic Patterns}
+
+\unprotect
+
+%D The \CONTEXT\ specific patterns are more generic and
+%D are more or less encoding independent. They are generated
+%D from the ones shipped with distributions using:
+%D
+%D \starttyping
+%D ctxtools --pattern --all
+%D \stoptyping
+
+%D In order to get 8 bit characters hyphenated, we need to load
+%D patterns under the right circumstances. In some countries, more
+%D than one font encoding is in use. I can add more defaults here
+%D if users let me know what encoding they use.
+
+% \installlanguage [\s!nl] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
+% \installlanguage [\s!fr] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
+% \installlanguage [\s!de] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
+% \installlanguage [\s!it] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
+% \installlanguage [\s!pt] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
+% \installlanguage [\s!hr] [\s!mapping=ec,\s!encoding=ec] % no il2, misses cacute characters
+% \installlanguage [\s!pl] [\s!mapping={pl0,ec,qx},\s!encoding={pl0,ec,qx}] % pl0 may go
+% \installlanguage [\s!cs] [\s!mapping={il2,ec},\s!encoding={il2,ec}]       % il2 may go
+% \installlanguage [\s!sk] [\s!mapping={il2,ec},\s!encoding={il2,ec}]       % il2 may go
+% \installlanguage [\s!sl] [\s!mapping=ec,\s!encoding=ec]                   % il2 has gone
+% \installlanguage [\s!vi] [\s!mapping=t5,\s!encoding=t5]
+% \installlanguage [\s!ru] [\s!mapping=t2a,\s!encoding=t2a]
+
+% beware, don't use \setuplanguage here
+
+% \installlanguage[\s!gb][\s!lefthyphenmin=3,\s!righthyphenmin=3] % patterns can only handle this
+% \installlanguage[\s!us][\s!lefthyphenmin=2,\s!righthyphenmin=3] % patterns can only handle this
+
+% greek
+
+% \installlanguage[\s!agr][\s!mapping=\s!agr,\s!encoding=\s!agr]
+
+\protect \endinput
diff --git a/tex/context/base/lang-ctx.tex b/tex/context/base/lang-ctx.tex
deleted file mode 100644
index 09f28dda1..000000000
--- a/tex/context/base/lang-ctx.tex
+++ /dev/null
@@ -1,53 +0,0 @@
-%D \module
-%D   [       file=lang-ctx,
-%D        version=2005.02.12,
-%D          title=\CONTEXT\ Language Macros,
-%D       subtitle=Generic Patterns,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Language Macros / Generic Patterns}
-
-\unprotect
-
-%D The \CONTEXT\ specific patterns are more generic and
-%D are more or less encoding independent. They are generated
-%D from the ones shipped with distributions using:
-%D
-%D \starttyping
-%D ctxtools --pattern --all
-%D \stoptyping
-
-%D In order to get 8 bit characters hyphenated, we need to load
-%D patterns under the right circumstances. In some countries, more
-%D than one font encoding is in use. I can add more defaults here
-%D if users let me know what encoding they use.
-
-% \installlanguage [\s!nl] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
-% \installlanguage [\s!fr] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
-% \installlanguage [\s!de] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
-% \installlanguage [\s!it] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
-% \installlanguage [\s!pt] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
-% \installlanguage [\s!hr] [\s!mapping=ec,\s!encoding=ec] % no il2, misses cacute characters
-% \installlanguage [\s!pl] [\s!mapping={pl0,ec,qx},\s!encoding={pl0,ec,qx}] % pl0 may go
-% \installlanguage [\s!cs] [\s!mapping={il2,ec},\s!encoding={il2,ec}]       % il2 may go
-% \installlanguage [\s!sk] [\s!mapping={il2,ec},\s!encoding={il2,ec}]       % il2 may go
-% \installlanguage [\s!sl] [\s!mapping=ec,\s!encoding=ec]                   % il2 has gone
-% \installlanguage [\s!vi] [\s!mapping=t5,\s!encoding=t5]
-% \installlanguage [\s!ru] [\s!mapping=t2a,\s!encoding=t2a]
-
-% beware, don't use \setuplanguage here
-
-% \installlanguage[\s!gb][\s!lefthyphenmin=3,\s!righthyphenmin=3] % patterns can only handle this
-% \installlanguage[\s!us][\s!lefthyphenmin=2,\s!righthyphenmin=3] % patterns can only handle this
-
-% greek
-
-% \installlanguage[\s!agr][\s!mapping=\s!agr,\s!encoding=\s!agr]
-
-\protect \endinput
diff --git a/tex/context/base/lang-dis.mkii b/tex/context/base/lang-dis.mkii
new file mode 100644
index 000000000..f081bf4a9
--- /dev/null
+++ b/tex/context/base/lang-dis.mkii
@@ -0,0 +1,59 @@
+%D \module
+%D   [       file=lang-dis,
+%D        version=2005.02.12,
+%D          title=\CONTEXT\ Language Macros,
+%D       subtitle=Distribution Patterns,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 used to be part of cont-usr.tex but now that we
+%D use more generic pattern files, we decided to isolate these
+%D mappings.
+
+\writestatus{loading}{ConTeXt Language Macros / Distribution Patterns}
+
+%D Hyphenation patterns are normally sought in filed named
+%D \type {lang-xx.pat}. When present on the system, those
+%D patterns take precedence. This list will be adapted to
+%D the actual situation, given that it's noticed.
+
+%D The us/uk hyph 1/2 files will go
+
+\unprotect
+
+% \definefilefallback [lang-ca.pat]  [cahyph.tex]
+% \definefilefallback [lang-da.pat]  [dkhyph.tex]
+% \definefilefallback [lang-de.pat]  [dehyphn.tex]
+% \definefilefallback [lang-es.pat]  [eshyph.tex]
+% \definefilefallback [lang-fi.pat]  [fihyph.tex]
+% \definefilefallback [lang-fr.pat]  [frhyph.tex]
+% \definefilefallback [lang-hr.pat]  [hrhyph.tex]
+% \definefilefallback [lang-hu.pat]  [huhyph.tex]
+% \definefilefallback [lang-it.pat]  [ithyph.tex]
+% \definefilefallback [lang-la.pat]  [lahyph7.tex]
+% \definefilefallback [lang-no.pat]  [nohyph.tex]
+% \definefilefallback [lang-pl.pat]  [plhyph.tex]
+% \definefilefallback [lang-pt.pat]  [pthyph.tex]
+% \definefilefallback [lang-ro.pat]  [rohyph.tex]
+% \definefilefallback [lang-ru.pat]  [ruenhyph.tex]
+% \definefilefallback [lang-sl.pat]  [sihyph.tex,slhyph.tex]
+% \definefilefallback [lang-sv.pat]  [svhyph.tex,sehyph.tex]
+% \definefilefallback [lang-tr.pat]  [tkhyph.tex,trhyph.tex]
+% \definefilefallback [lang-ua.pat]  [ukrenhyp.tex]
+% \definefilefallback [lang-uk.pat]  [ukhyphen.tex,ukhyph.tex]
+% \definefilefallback [lang-us.pat]  [ushyphmax.tex,ushyph.tex,ushyph1.tex,ushyph2.tex,hyphen.tex]
+% \definefilefallback [lang-nl.pat]  [nehyph96.tex,dutch96.pat,nehyph.tex]
+% \definefilefallback [lang-cz.pat]  [czhyphen.tex,czhyph.pat]
+% \definefilefallback [lang-sk.pat]  [skhyphen.tex,skhyph.pat]
+% \definefilefallback [lang-deo.pat] [dehypht.tex]
+
+% \definefilesynonym  [lang-af.pat]  [lang-nl.pat]
+% \definefilesynonym  [lang-en.pat]  [lang-us.pat]
+% \definefilesynonym  [lang-en.hyp]  [lang-us.hyp]
+
+\protect \endinput
diff --git a/tex/context/base/lang-dis.tex b/tex/context/base/lang-dis.tex
deleted file mode 100644
index f081bf4a9..000000000
--- a/tex/context/base/lang-dis.tex
+++ /dev/null
@@ -1,59 +0,0 @@
-%D \module
-%D   [       file=lang-dis,
-%D        version=2005.02.12,
-%D          title=\CONTEXT\ Language Macros,
-%D       subtitle=Distribution Patterns,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 used to be part of cont-usr.tex but now that we
-%D use more generic pattern files, we decided to isolate these
-%D mappings.
-
-\writestatus{loading}{ConTeXt Language Macros / Distribution Patterns}
-
-%D Hyphenation patterns are normally sought in filed named
-%D \type {lang-xx.pat}. When present on the system, those
-%D patterns take precedence. This list will be adapted to
-%D the actual situation, given that it's noticed.
-
-%D The us/uk hyph 1/2 files will go
-
-\unprotect
-
-% \definefilefallback [lang-ca.pat]  [cahyph.tex]
-% \definefilefallback [lang-da.pat]  [dkhyph.tex]
-% \definefilefallback [lang-de.pat]  [dehyphn.tex]
-% \definefilefallback [lang-es.pat]  [eshyph.tex]
-% \definefilefallback [lang-fi.pat]  [fihyph.tex]
-% \definefilefallback [lang-fr.pat]  [frhyph.tex]
-% \definefilefallback [lang-hr.pat]  [hrhyph.tex]
-% \definefilefallback [lang-hu.pat]  [huhyph.tex]
-% \definefilefallback [lang-it.pat]  [ithyph.tex]
-% \definefilefallback [lang-la.pat]  [lahyph7.tex]
-% \definefilefallback [lang-no.pat]  [nohyph.tex]
-% \definefilefallback [lang-pl.pat]  [plhyph.tex]
-% \definefilefallback [lang-pt.pat]  [pthyph.tex]
-% \definefilefallback [lang-ro.pat]  [rohyph.tex]
-% \definefilefallback [lang-ru.pat]  [ruenhyph.tex]
-% \definefilefallback [lang-sl.pat]  [sihyph.tex,slhyph.tex]
-% \definefilefallback [lang-sv.pat]  [svhyph.tex,sehyph.tex]
-% \definefilefallback [lang-tr.pat]  [tkhyph.tex,trhyph.tex]
-% \definefilefallback [lang-ua.pat]  [ukrenhyp.tex]
-% \definefilefallback [lang-uk.pat]  [ukhyphen.tex,ukhyph.tex]
-% \definefilefallback [lang-us.pat]  [ushyphmax.tex,ushyph.tex,ushyph1.tex,ushyph2.tex,hyphen.tex]
-% \definefilefallback [lang-nl.pat]  [nehyph96.tex,dutch96.pat,nehyph.tex]
-% \definefilefallback [lang-cz.pat]  [czhyphen.tex,czhyph.pat]
-% \definefilefallback [lang-sk.pat]  [skhyphen.tex,skhyph.pat]
-% \definefilefallback [lang-deo.pat] [dehypht.tex]
-
-% \definefilesynonym  [lang-af.pat]  [lang-nl.pat]
-% \definefilesynonym  [lang-en.pat]  [lang-us.pat]
-% \definefilesynonym  [lang-en.hyp]  [lang-us.hyp]
-
-\protect \endinput
diff --git a/tex/context/base/lang-ini.mkii b/tex/context/base/lang-ini.mkii
index e5759bc84..a55748a78 100644
--- a/tex/context/base/lang-ini.mkii
+++ b/tex/context/base/lang-ini.mkii
@@ -265,7 +265,7 @@
    \fi
    \egroup}
 
-\fetchruntimecommand \showpatterns {\f!languageprefix\s!run}
+\fetchruntimecommand \showpatterns {\f!languageprefix\s!run.mkii}
 
 %D Since we can only load patterns in ini\TeX, we nil the
 %D loading before dumping (which saves a bit of memory, but
diff --git a/tex/context/base/lang-ini.mkiv b/tex/context/base/lang-ini.mkiv
index 7cb945ef9..f88281a60 100644
--- a/tex/context/base/lang-ini.mkiv
+++ b/tex/context/base/lang-ini.mkiv
@@ -76,14 +76,18 @@
 \def\setupcurrentlanguage[#1]{\setcurrentlanguage\currentmainlanguage{#1}}
 
 \def\setcurrentlanguage#1#2% sets modes: **id (currentmain) *id (current)
-  {\doifsomething{#1}
-     {\ifx\currentmainlanguage\empty\else\resetsystemmode{\systemmodeprefix\currentmainlanguage}\fi
-      \edef\currentmainlanguage{#1}%
-      \setsystemmode{\systemmodeprefix\currentmainlanguage}}%
-   \doifsomething{#2}
-     {\ifx\currentlanguage\empty\else\resetsystemmode\currentlanguage\fi
-      \edef\currentlanguage{#2}%
-      \setsystemmode\currentlanguage}}
+  {\edef\xaskedlanguage{#1}% otherwise clash with \askedlanguage
+   \ifx\xaskedlanguage\empty \else
+     \ifx\currentmainlanguage\empty\else\resetsystemmode{\systemmodeprefix\currentmainlanguage}\fi
+     \let\currentmainlanguage\xaskedlanguage
+     \setsystemmode{\systemmodeprefix\currentmainlanguage}%
+   \fi
+   \edef\xaskedlanguage{#2}%
+   \ifx\xaskedlanguage\empty \else
+     \ifx\currentlanguage\empty\else\resetsystemmode\currentlanguage\fi
+     \let\currentlanguage\xaskedlanguage
+     \setsystemmode\currentlanguage
+   \fi}
 
 %D The internal macros will be defined later.
 
@@ -120,9 +124,9 @@
 %D preloaded format).
 
 \def\dodoinstalllanguage#1#2% #2 added
-  {\doifundefined{#1}{\setvalue{#1}{\complexlanguage[#2]}}%
-   \expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}%
-   \doifundefined\ascii{\setvalue\ascii{\complexlanguage[#2]}}}
+  {\expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}%
+   \ifcsname    #1\endcsname\else\setvalue  {#1}{\complexlanguage[#2]}\fi
+   \ifcsname\ascii\endcsname\else\setvalue\ascii{\complexlanguage[#2]}\fi}
 
 %D \macros
 %D   {preloadlanguages}
@@ -145,11 +149,6 @@
       "\truefilename{\f!languageprefix#2.\f!hyphensextension }")
    }}
 
-% \def\doloadlanguagefiles#1%
-%   {\doifelsevaluenothing{\??la#1\s!patterns}
-%      {\doloadpatterns{#1}{#1}}
-%      {\doloadpatterns{#1}{\getvalue{\??la#1\s!patterns}}}}
-
 \def\doloadlanguagefiles#1%
   {\edef\languagesuffix{\specificlanguageparameter{#1}\s!patterns}%
    \ifx\languagesuffix\empty
@@ -318,9 +317,6 @@
 
 \newtoks \everylanguage
 
-\def\disablelanguagespecifics
-  {\ignorecompoundcharacter}
-
 \def\sethyphenationvariables
   {\lefthyphenmin 0\languageparameter\s!lefthyphenmin \relax
    \righthyphenmin0\languageparameter\s!righthyphenmin\relax
@@ -331,21 +327,14 @@
   {\edef\currentdefaultlanguage{\defaultlanguage\currentlanguage}%
    \setnormallanguage\currentlanguage\currentdefaultlanguage
    \the\everylanguage
-   \enablelanguagespecifics[\currentlanguage]%
    \sethyphenationvariables
    \relax
    % will be definable and move to core-spa !
    \doifelse{\languageparameter\c!spacing}\v!broad\nonfrenchspacing\frenchspacing}
 
-\ifx\enablelanguagespecifics\undefined \def\enablelanguagespecifics[#1]{} \fi
-
 % The following may be a solution for the fact that one cannot
 % change catcodes of characters like : and ; inside an environment.
 
-\appendtoks
-  \enablelanguagespecifics[\currentlanguage]%
-\to \everystarttext
-
 \def\complexlanguage[#1]%
   {\edef\askedlanguage{#1}%
    \ifx\askedlanguage\empty \else
@@ -586,4 +575,6 @@
 
 \uchyph=1
 
+\exhyphenchar=45 % to permit breaking at explicit hyphens
+
 \protect \endinput
diff --git a/tex/context/base/lang-ita.tex b/tex/context/base/lang-ita.tex
index ae3b7a514..c714be775 100644
--- a/tex/context/base/lang-ita.tex
+++ b/tex/context/base/lang-ita.tex
@@ -478,12 +478,18 @@
 
 %D Rather new \unknown
 
-\setuplabeltext [\s!it]    [\v!page=pagina ]
-\setuplabeltext [\s!it]  [\v!atpage=a pagina ]
+\setuplabeltext [\s!it]      [\v!page=pagina ]
+\setuplabeltext [\s!it]    [\v!atpage=a pagina ]
 \setuplabeltext [\s!it] [\v!hencefore=come mostrato sopra]
 \setuplabeltext [\s!it] [\v!hereafter=come mostrato sotto]
 \setuplabeltext [\s!it]       [\v!see=cf. ]
 
+\setuplabeltext [\s!fr]      [\v!page=page ]
+\setuplabeltext [\s!fr]    [\v!atpage=à la page ]
+\setuplabeltext [\s!fr] [\v!hencefore=ci-dessus]
+\setuplabeltext [\s!fr] [\v!hereafter=ci-dessous]
+\setuplabeltext [\s!fr]       [\v!see=cf. ]
+
 %D Ordinal converters:
 
 \def\frordinaldaynumber#1% date is masculine
diff --git a/tex/context/base/lang-jap.mkii b/tex/context/base/lang-jap.mkii
new file mode 100644
index 000000000..05c9b1d41
--- /dev/null
+++ b/tex/context/base/lang-jap.mkii
@@ -0,0 +1,234 @@
+%D \module
+%D   [       file=lang-jap,
+%D        version=2006.01.13,
+%D          title=\CONTEXT\ Language Macros,
+%D       subtitle=Japanese,
+%D         author={Richard Gabriel},
+%D           date=\currentdate,
+%D      copyright={PRAGMA / RG}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% rgabriel@kerio.com
+
+\writestatus{loading}{ConTeXt Language Macros / Japanese}
+
+\unprotect
+
+\definesystemconstant {japanese} \definesystemconstant {ja}
+
+\installlanguage
+  [\s!ja]
+  [\c!leftsentence=\jaencoding\jaleftsentence,
+   \c!rightsentence=\jaencoding\jarightsentence,
+   \c!leftsubsentence=\jaencoding\jaleftsubsentence,
+   \c!rightsubsentence=\jaencoding\jarightsubsentence,
+   \c!leftquote=\jaencoding\jaencodedsinglestartquote,
+   \c!rightquote=\jaencoding\jaencodedsingleendquote,
+   \c!leftquotation=\jaencoding\jaencodedstartquote,
+   \c!rightquotation=\jaencoding\jaencodedendquote,
+   \c!date={\jaencodedchristiandate,\v!year,\jaencodedyear,\v!month,\jaencodedmonth,\v!day,\jaencodedday}]
+
+\setupheadtext [\s!ja]       [\v!content={\jaencoding\jaencodedtableofcontents}]
+\setupheadtext [\s!ja]        [\v!tables={\jaencoding\jaencodedtables}]
+\setupheadtext [\s!ja]       [\v!figures={\jaencoding\jaencodedfigures}]
+\setupheadtext [\s!ja]      [\v!graphics={\jaencoding\jaencodedgraphics}]
+\setupheadtext [\s!ja]    [\v!intermezzi={\jaencoding\jaencodedintermezzos}]
+\setupheadtext [\s!ja]         [\v!index={\jaencoding\jaencodedindex}]
+\setupheadtext [\s!ja] [\v!abbreviations={\jaencoding\jaencodedabbreviations}]
+\setupheadtext [\s!ja]         [\v!logos={\jaencoding\jaencodedlogos}]
+\setupheadtext [\s!ja]         [\v!units={\jaencoding\jaencodedunits}]
+
+\setuplabeltext [\s!ja]        [\v!table={\jaencoding\jaencodedtable}]
+\setuplabeltext [\s!ja]       [\v!figure={\jaencoding\jaencodedfigure}]
+\setuplabeltext [\s!ja]   [\v!intermezzo={\jaencoding\jaencodedintermezzo}]
+\setuplabeltext [\s!ja]      [\v!graphic={\jaencoding\jaencodedillustration}]
+\setuplabeltext [\s!ja]     [\v!appendix={\jaencoding\jaencodedappendix}]
+\setuplabeltext [\s!ja]         [\v!part={\jaencoding\jaencodedintro,\jaencoding\jaencodedpart}]
+\setuplabeltext [\s!ja]      [\v!chapter={\jaencoding\jaencodedintro,\jaencoding\jaencodedchapter}]
+\setuplabeltext [\s!ja]      [\v!section={\jaencoding\jaencodedintro,\jaencoding\jaencodedsection}]
+\setuplabeltext [\s!ja]         [\v!line={\jaencoding\jaencodedline}]
+\setuplabeltext [\s!ja]        [\v!lines={\jaencoding\jaencodedline}]
+
+\setuplabeltext [\s!ja]       [\v!subsection=]
+\setuplabeltext [\s!ja]    [\v!subsubsection=]
+\setuplabeltext [\s!ja] [\v!subsubsubsection=]
+
+%D Why are these languagespecifics ?
+
+\setuplabeltext [\s!ja]   [\v!january=1]
+\setuplabeltext [\s!ja]  [\v!february=2]
+\setuplabeltext [\s!ja]     [\v!march=3]
+\setuplabeltext [\s!ja]     [\v!april=4]
+\setuplabeltext [\s!ja]       [\v!may=5]
+\setuplabeltext [\s!ja]      [\v!june=6]
+\setuplabeltext [\s!ja]      [\v!july=7]
+\setuplabeltext [\s!ja]    [\v!august=8]
+\setuplabeltext [\s!ja] [\v!september=9]
+\setuplabeltext [\s!ja]   [\v!october=10]
+\setuplabeltext [\s!ja]  [\v!november=11]
+\setuplabeltext [\s!ja]  [\v!december=12]
+
+\setuplabeltext [\s!ja]    [\v!sunday=\jaencoding\jaencodedsunday   ]
+\setuplabeltext [\s!ja]    [\v!monday=\jaencoding\jaencodedmonday   ]
+\setuplabeltext [\s!ja]   [\v!tuesday=\jaencoding\jaencodedtuesday  ]
+\setuplabeltext [\s!ja] [\v!wednesday=\jaencoding\jaencodedwednesday]
+\setuplabeltext [\s!ja]  [\v!thursday=\jaencoding\jaencodedthursday ]
+\setuplabeltext [\s!ja]    [\v!friday=\jaencoding\jaencodedfriday   ]
+\setuplabeltext [\s!ja]  [\v!saturday=\jaencoding\jaencodedsaturday ]
+
+% Hardcoded - \japaneseencoding should be defined similarly to \chineseencoding
+
+\unexpanded\def\jaencoding{\enableencoding[cjk-uni]}
+
+%D This list is taken from DocBook XSL stylesheets (http://docbook.sourceforge.net/).
+
+\startencoding[cjk-uni]
+
+  \definecommand jaencodedabstract              {\uchar{105}{130}\uchar{137}{129}}
+  \definecommand jaencodedand                   {\uchar{48}{1}}
+  \definecommand jaencodedanswer                {\uchar{123}{84}\uchar{255}{26}}
+  \definecommand jaencodedappendix              {\uchar{78}{216}\uchar{147}{50}}
+  \definecommand jaencodedarticle               {\uchar{152}{5}\uchar{118}{238}}
+  \definecommand jaencodedbibliography          {\uchar{83}{194}\uchar{128}{3}\uchar{101}{135}\uchar{115}{46}}
+  \definecommand jaencodedbook                  {\uchar{48}{214}\uchar{48}{195}\uchar{48}{175}}
+  \definecommand jaencodedbridgehead            {\uchar{152}{5}}
+  \definecommand jaencodedbullet                {\uchar{37}{207}}
+  \definecommand jaencodedby                    {\uchar{255}{26}}
+  \definecommand jaencodedcaution               {\uchar{108}{232}\uchar{97}{15}}
+  \definecommand jaencodedcolophon              {\uchar{89}{101}\uchar{78}{216}}
+  \definecommand jaencodedcopyright             {\uchar{136}{253}\uchar{79}{92}\uchar{132}{87}\uchar{79}{92}}
+  \definecommand jaencodeddedication            {\uchar{139}{29}\uchar{143}{158}}
+  \definecommand jaencodededited                {\uchar{125}{232}\uchar{128}{5}}
+  \definecommand jaencodededitedby              {\uchar{125}{232}\uchar{128}{5}\uchar{255}{26}}
+  \definecommand jaencodededition               {\uchar{125}{232}\uchar{150}{198}}
+  \definecommand jaencodedendquote              {\uchar{48}{13}}
+  \definecommand jaencodedequation              {\uchar{95}{15}}
+  \definecommand jaencodedexample               {\uchar{79}{139}}
+  \definecommand jaencodedfigure                {\uchar{86}{243}}
+  \definecommand jaencodedglossary              {\uchar{117}{40}\uchar{138}{158}\uchar{150}{198}}
+  \definecommand jaencodedglosssee              {\uchar{83}{194}\uchar{113}{103}}
+  \definecommand jaencodedglossseealso          {\uchar{83}{194}\uchar{113}{103}}
+  \definecommand jaencodedchapter               {\uchar{122}{224}}
+  \definecommand jaencodedimportant             {\uchar{145}{205}\uchar{137}{129}\uchar{152}{5}\uchar{118}{238}}
+  \definecommand jaencodedindex                 {\uchar{118}{238}\uchar{107}{33}}
+  \definecommand jaencodedindexsymbols          {\uchar{48}{183}\uchar{48}{243}\uchar{48}{220}\uchar{48}{235}}
+  \definecommand jaencodedintro                 {\uchar{123}{44}}
+  \definecommand jaencodedlistofequations       {\uchar{95}{15}\uchar{118}{238}\uchar{107}{33}}
+  \definecommand jaencodedlistofexamples        {\uchar{79}{139}\uchar{118}{238}\uchar{107}{33}}
+  \definecommand jaencodedlistoffigures         {\uchar{86}{243}\uchar{118}{238}\uchar{107}{33}}
+  \definecommand jaencodedlistoftables          {\uchar{136}{104}\uchar{118}{238}\uchar{107}{33}}
+  \definecommand jaencodedlistofunknown         {\uchar{78}{13}\uchar{102}{14}\uchar{118}{238}\uchar{107}{33}}
+  \definecommand jaencodedmsgaud                {\uchar{91}{254}\uchar{140}{97}\uchar{128}{5}}
+  \definecommand jaencodedmsglevel              {\uchar{48}{236}\uchar{48}{217}\uchar{48}{235}}
+  \definecommand jaencodedmsgorig               {\uchar{118}{122}\uchar{79}{225}\uchar{81}{67}}
+  \definecommand jaencodednavhome               {\uchar{48}{219}\uchar{48}{252}\uchar{48}{224}}
+  \definecommand jaencodednavnext               {\uchar{107}{33}\uchar{48}{110}\uchar{48}{218}\uchar{48}{252}\uchar{48}{184}}
+  \definecommand jaencodednavnextsibling        {\uchar{101}{233}\uchar{144}{1}\uchar{48}{138}}
+  \definecommand jaencodednavprev               {\uchar{82}{77}\uchar{48}{110}\uchar{48}{218}\uchar{48}{252}\uchar{48}{184}}
+  \definecommand jaencodednavprevsibling        {\uchar{93}{251}\uchar{98}{59}\uchar{48}{87}}
+  \definecommand jaencodednavup                 {\uchar{78}{10}\uchar{48}{107}\uchar{98}{59}\uchar{48}{139}}
+  \definecommand jaencodednestedendquote        {\uchar{48}{15}}
+  \definecommand jaencodednestedstartquote      {\uchar{48}{14}}
+  \definecommand jaencodednonexistantelement    {\uchar{137}{129}\uchar{125}{32}\uchar{48}{76}\uchar{91}{88}\uchar{87}{40}\uchar{48}{87}\uchar{48}{126}\uchar{48}{91}\uchar{48}{147}}
+  \definecommand jaencodednote                  {\uchar{108}{232}\uchar{97}{15}}
+  \definecommand jaencodednotes                 {\uchar{108}{232}\uchar{97}{15}}
+  \definecommand jaencodedpages                 {\uchar{80}{103}\uchar{115}{46}}
+  \definecommand jaencodedpart                  {\uchar{48}{209}\uchar{48}{252}\uchar{48}{200}}
+  \definecommand jaencodedpreface               {\uchar{94}{143}\uchar{101}{135}}
+  \definecommand jaencodedprocedure             {\uchar{98}{75}\uchar{152}{6}}
+  \definecommand jaencodedprocedureformal       {\uchar{98}{75}\uchar{152}{6}}
+  \definecommand jaencodedproductionset         {\uchar{48}{215}\uchar{48}{237}\uchar{48}{192}\uchar{48}{175}\uchar{48}{183}\uchar{48}{231}\uchar{48}{243}}
+  \definecommand jaencodedproductionsetformal   {\uchar{48}{215}\uchar{48}{237}\uchar{48}{192}\uchar{48}{175}\uchar{48}{183}\uchar{48}{231}\uchar{48}{243}}
+  \definecommand jaencodedpublished             {\uchar{118}{122}\uchar{136}{76}}
+  \definecommand jaencodedqandadiv              {\uchar{85}{79}\uchar{255}{26}\uchar{48}{1}\uchar{123}{84}\uchar{255}{26}}
+  \definecommand jaencodedqandaentry            {\uchar{85}{79}\uchar{255}{26}}
+  \definecommand jaencodedquestion              {\uchar{85}{79}\uchar{255}{26}}
+  \definecommand jaencodedreference             {\uchar{83}{194}\uchar{113}{103}}
+  \definecommand jaencodedrefname               {\uchar{84}{13}\uchar{82}{77}}
+  \definecommand jaencodedrefsection            {\uchar{152}{5}}
+  \definecommand jaencodedrefsynopsisdiv        {\uchar{105}{130}\uchar{137}{129}}
+  \definecommand jaencodedrevhistory            {\uchar{101}{57}\uchar{138}{2}\uchar{92}{101}\uchar{107}{116}}
+  \definecommand jaencodedrevision              {\uchar{101}{57}\uchar{138}{2}}
+  \definecommand jaencodedsection               {\uchar{152}{5}}
+  \definecommand jaencodedsee                   {\uchar{83}{194}\uchar{113}{103}}
+  \definecommand jaencodedseealso               {\uchar{83}{194}\uchar{113}{103}}
+  \definecommand jaencodedseparator             {\uchar{48}{1}}
+  \definecommand jaencodedset                   {\uchar{138}{45}\uchar{91}{154}}
+  \definecommand jaencodedsetindex              {\uchar{118}{238}\uchar{107}{33}\uchar{138}{45}\uchar{91}{154}}
+  \definecommand jaencodedsidebar               {\uchar{48}{181}\uchar{48}{164}\uchar{48}{201}\uchar{48}{208}\uchar{48}{252}}
+  \definecommand jaencodedsimplesect            {\uchar{152}{5}}
+  \definecommand jaencodedsingleendquote        {\uchar{32}{25}}
+  \definecommand jaencodedsinglestartquote      {\uchar{32}{24}}
+  \definecommand jaencodedstartquote            {\uchar{48}{12}}
+  \definecommand jaencodedstep                  {\uchar{48}{185}\uchar{48}{198}\uchar{48}{195}\uchar{48}{215}}
+  \definecommand jaencodedtable                 {\uchar{136}{104}}
+  \definecommand jaencodedtablenotes            {\uchar{108}{232}\uchar{97}{15}}
+  \definecommand jaencodedtableofcontents       {\uchar{118}{238}\uchar{107}{33}}
+  \definecommand jaencodedtip                   {\uchar{48}{198}\uchar{48}{163}\uchar{48}{195}\uchar{48}{215}}
+  \definecommand jaencodedunexpectedelementname {\uchar{78}{13}\uchar{102}{14}\uchar{48}{106}\uchar{137}{129}\uchar{125}{32}\uchar{84}{13}}
+  \definecommand jaencodedunsupported           {\uchar{48}{181}\uchar{48}{221}\uchar{48}{252}\uchar{48}{200}\uchar{48}{87}\uchar{48}{126}\uchar{48}{91}\uchar{48}{147}}
+  \definecommand jaencodedwarning               {\uchar{139}{102}\uchar{84}{74}}
+
+  \definecommand jaencodedyear                  {\uchar{94}{116}}
+  \definecommand jaencodedmonth                 {\uchar{103}{8}}
+  \definecommand jaencodedday                   {\uchar{101}{229}}
+
+\stopencoding
+
+%D Taken from Chinese (will be investigated yet...)
+
+\startencoding[cjk-uni]
+
+  \definecommand jaencodedleftsentence     {\uchar{32}{20}\uchar{32}{20}}
+  \definecommand jaencodedrightsentence    {\uchar{32}{20}\uchar{32}{20}}
+  \definecommand jaencodedleftsubsentence  {\uchar{32}{20}\uchar{32}{20}}
+  \definecommand jaencodedrightsubsentence {\uchar{32}{20}\uchar{32}{20}}
+
+\stopencoding
+
+%D Special thanxx to Eizo Tsuchihashi (eizo@arcbrain.jp) for the following stuff
+
+\startencoding[cjk-uni]
+
+  \definecommand jaencodedchristiandate {\uchar{137}{127}\uchar{102}{166}}
+
+  \definecommand jaencodedtables        {\uchar{103}{58}}
+  \definecommand jaencodedfigures       {\uchar{86}{243}}
+  \definecommand jaencodedabbreviations {\uchar{117}{101}\uchar{138}{158}}
+  \definecommand jaencodedlogos         {\uchar{116}{6}\uchar{96}{39}}
+  \definecommand jaencodedunits         {\uchar{48}{230}\uchar{48}{203}\uchar{48}{195}\uchar{48}{196}}
+
+  \definecommand jaencodedgraphics      {\uchar{48}{176}\uchar{48}{233}\uchar{48}{213}}
+  \definecommand jaencodedintermezzo    {\uchar{149}{147}\uchar{89}{79}\uchar{102}{242}}
+  \definecommand jaencodedintermezzos   {\uchar{149}{147}\uchar{89}{79}\uchar{102}{242}}
+  \definecommand jaencodedillustration  {\uchar{48}{164}\uchar{48}{233}\uchar{48}{185}\uchar{48}{200}}
+  \definecommand jaencodedline          {\uchar{125}{218}}
+  \definecommand jaencodedlines         {\uchar{125}{218}}
+
+  \definecommand jaencodedjanuary       {\uchar{78}{0}\uchar{103}{8}}
+  \definecommand jaencodedfebruary      {\uchar{78}{140}\uchar{103}{8}}
+  \definecommand jaencodedmarch         {\uchar{78}{9}\uchar{103}{8}}
+  \definecommand jaencodedapril         {\uchar{86}{219}\uchar{103}{8}}
+  \definecommand jaencodedmay           {\uchar{78}{148}\uchar{103}{8}}
+  \definecommand jaencodedjune          {\uchar{81}{109}\uchar{103}{8}}
+  \definecommand jaencodedjuly          {\uchar{78}{3}\uchar{103}{8}}
+  \definecommand jaencodedaugust        {\uchar{81}{107}\uchar{103}{8}}
+  \definecommand jaencodedseptember     {\uchar{78}{93}\uchar{103}{8}}
+  \definecommand jaencodedoctober       {\uchar{83}{65}\uchar{103}{8}}
+  \definecommand jaencodednovember      {\uchar{83}{65}\uchar{78}{0}\uchar{103}{8}}
+  \definecommand jaencodeddecember      {\uchar{83}{65}\uchar{78}{140}\uchar{103}{8}}
+
+  \definecommand jaencodedsunday        {\uchar{103}{8}\uchar{102}{220}\uchar{101}{229}}
+  \definecommand jaencodedmonday        {\uchar{112}{107}\uchar{102}{220}\uchar{101}{229}}
+  \definecommand jaencodedtuesday       {\uchar{108}{52}\uchar{102}{220}\uchar{101}{229}}
+  \definecommand jaencodedwednesday     {\uchar{103}{40}\uchar{102}{220}\uchar{101}{229}}
+  \definecommand jaencodedthursday      {\uchar{145}{209}\uchar{102}{220}\uchar{101}{229}}
+  \definecommand jaencodedfriday        {\uchar{87}{31}\uchar{102}{220}\uchar{101}{229}}
+  \definecommand jaencodedsaturday      {\uchar{101}{229}\uchar{102}{220}\uchar{101}{229}}
+
+\stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/lang-jap.tex b/tex/context/base/lang-jap.tex
deleted file mode 100644
index 05c9b1d41..000000000
--- a/tex/context/base/lang-jap.tex
+++ /dev/null
@@ -1,234 +0,0 @@
-%D \module
-%D   [       file=lang-jap,
-%D        version=2006.01.13,
-%D          title=\CONTEXT\ Language Macros,
-%D       subtitle=Japanese,
-%D         author={Richard Gabriel},
-%D           date=\currentdate,
-%D      copyright={PRAGMA / RG}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% rgabriel@kerio.com
-
-\writestatus{loading}{ConTeXt Language Macros / Japanese}
-
-\unprotect
-
-\definesystemconstant {japanese} \definesystemconstant {ja}
-
-\installlanguage
-  [\s!ja]
-  [\c!leftsentence=\jaencoding\jaleftsentence,
-   \c!rightsentence=\jaencoding\jarightsentence,
-   \c!leftsubsentence=\jaencoding\jaleftsubsentence,
-   \c!rightsubsentence=\jaencoding\jarightsubsentence,
-   \c!leftquote=\jaencoding\jaencodedsinglestartquote,
-   \c!rightquote=\jaencoding\jaencodedsingleendquote,
-   \c!leftquotation=\jaencoding\jaencodedstartquote,
-   \c!rightquotation=\jaencoding\jaencodedendquote,
-   \c!date={\jaencodedchristiandate,\v!year,\jaencodedyear,\v!month,\jaencodedmonth,\v!day,\jaencodedday}]
-
-\setupheadtext [\s!ja]       [\v!content={\jaencoding\jaencodedtableofcontents}]
-\setupheadtext [\s!ja]        [\v!tables={\jaencoding\jaencodedtables}]
-\setupheadtext [\s!ja]       [\v!figures={\jaencoding\jaencodedfigures}]
-\setupheadtext [\s!ja]      [\v!graphics={\jaencoding\jaencodedgraphics}]
-\setupheadtext [\s!ja]    [\v!intermezzi={\jaencoding\jaencodedintermezzos}]
-\setupheadtext [\s!ja]         [\v!index={\jaencoding\jaencodedindex}]
-\setupheadtext [\s!ja] [\v!abbreviations={\jaencoding\jaencodedabbreviations}]
-\setupheadtext [\s!ja]         [\v!logos={\jaencoding\jaencodedlogos}]
-\setupheadtext [\s!ja]         [\v!units={\jaencoding\jaencodedunits}]
-
-\setuplabeltext [\s!ja]        [\v!table={\jaencoding\jaencodedtable}]
-\setuplabeltext [\s!ja]       [\v!figure={\jaencoding\jaencodedfigure}]
-\setuplabeltext [\s!ja]   [\v!intermezzo={\jaencoding\jaencodedintermezzo}]
-\setuplabeltext [\s!ja]      [\v!graphic={\jaencoding\jaencodedillustration}]
-\setuplabeltext [\s!ja]     [\v!appendix={\jaencoding\jaencodedappendix}]
-\setuplabeltext [\s!ja]         [\v!part={\jaencoding\jaencodedintro,\jaencoding\jaencodedpart}]
-\setuplabeltext [\s!ja]      [\v!chapter={\jaencoding\jaencodedintro,\jaencoding\jaencodedchapter}]
-\setuplabeltext [\s!ja]      [\v!section={\jaencoding\jaencodedintro,\jaencoding\jaencodedsection}]
-\setuplabeltext [\s!ja]         [\v!line={\jaencoding\jaencodedline}]
-\setuplabeltext [\s!ja]        [\v!lines={\jaencoding\jaencodedline}]
-
-\setuplabeltext [\s!ja]       [\v!subsection=]
-\setuplabeltext [\s!ja]    [\v!subsubsection=]
-\setuplabeltext [\s!ja] [\v!subsubsubsection=]
-
-%D Why are these languagespecifics ?
-
-\setuplabeltext [\s!ja]   [\v!january=1]
-\setuplabeltext [\s!ja]  [\v!february=2]
-\setuplabeltext [\s!ja]     [\v!march=3]
-\setuplabeltext [\s!ja]     [\v!april=4]
-\setuplabeltext [\s!ja]       [\v!may=5]
-\setuplabeltext [\s!ja]      [\v!june=6]
-\setuplabeltext [\s!ja]      [\v!july=7]
-\setuplabeltext [\s!ja]    [\v!august=8]
-\setuplabeltext [\s!ja] [\v!september=9]
-\setuplabeltext [\s!ja]   [\v!october=10]
-\setuplabeltext [\s!ja]  [\v!november=11]
-\setuplabeltext [\s!ja]  [\v!december=12]
-
-\setuplabeltext [\s!ja]    [\v!sunday=\jaencoding\jaencodedsunday   ]
-\setuplabeltext [\s!ja]    [\v!monday=\jaencoding\jaencodedmonday   ]
-\setuplabeltext [\s!ja]   [\v!tuesday=\jaencoding\jaencodedtuesday  ]
-\setuplabeltext [\s!ja] [\v!wednesday=\jaencoding\jaencodedwednesday]
-\setuplabeltext [\s!ja]  [\v!thursday=\jaencoding\jaencodedthursday ]
-\setuplabeltext [\s!ja]    [\v!friday=\jaencoding\jaencodedfriday   ]
-\setuplabeltext [\s!ja]  [\v!saturday=\jaencoding\jaencodedsaturday ]
-
-% Hardcoded - \japaneseencoding should be defined similarly to \chineseencoding
-
-\unexpanded\def\jaencoding{\enableencoding[cjk-uni]}
-
-%D This list is taken from DocBook XSL stylesheets (http://docbook.sourceforge.net/).
-
-\startencoding[cjk-uni]
-
-  \definecommand jaencodedabstract              {\uchar{105}{130}\uchar{137}{129}}
-  \definecommand jaencodedand                   {\uchar{48}{1}}
-  \definecommand jaencodedanswer                {\uchar{123}{84}\uchar{255}{26}}
-  \definecommand jaencodedappendix              {\uchar{78}{216}\uchar{147}{50}}
-  \definecommand jaencodedarticle               {\uchar{152}{5}\uchar{118}{238}}
-  \definecommand jaencodedbibliography          {\uchar{83}{194}\uchar{128}{3}\uchar{101}{135}\uchar{115}{46}}
-  \definecommand jaencodedbook                  {\uchar{48}{214}\uchar{48}{195}\uchar{48}{175}}
-  \definecommand jaencodedbridgehead            {\uchar{152}{5}}
-  \definecommand jaencodedbullet                {\uchar{37}{207}}
-  \definecommand jaencodedby                    {\uchar{255}{26}}
-  \definecommand jaencodedcaution               {\uchar{108}{232}\uchar{97}{15}}
-  \definecommand jaencodedcolophon              {\uchar{89}{101}\uchar{78}{216}}
-  \definecommand jaencodedcopyright             {\uchar{136}{253}\uchar{79}{92}\uchar{132}{87}\uchar{79}{92}}
-  \definecommand jaencodeddedication            {\uchar{139}{29}\uchar{143}{158}}
-  \definecommand jaencodededited                {\uchar{125}{232}\uchar{128}{5}}
-  \definecommand jaencodededitedby              {\uchar{125}{232}\uchar{128}{5}\uchar{255}{26}}
-  \definecommand jaencodededition               {\uchar{125}{232}\uchar{150}{198}}
-  \definecommand jaencodedendquote              {\uchar{48}{13}}
-  \definecommand jaencodedequation              {\uchar{95}{15}}
-  \definecommand jaencodedexample               {\uchar{79}{139}}
-  \definecommand jaencodedfigure                {\uchar{86}{243}}
-  \definecommand jaencodedglossary              {\uchar{117}{40}\uchar{138}{158}\uchar{150}{198}}
-  \definecommand jaencodedglosssee              {\uchar{83}{194}\uchar{113}{103}}
-  \definecommand jaencodedglossseealso          {\uchar{83}{194}\uchar{113}{103}}
-  \definecommand jaencodedchapter               {\uchar{122}{224}}
-  \definecommand jaencodedimportant             {\uchar{145}{205}\uchar{137}{129}\uchar{152}{5}\uchar{118}{238}}
-  \definecommand jaencodedindex                 {\uchar{118}{238}\uchar{107}{33}}
-  \definecommand jaencodedindexsymbols          {\uchar{48}{183}\uchar{48}{243}\uchar{48}{220}\uchar{48}{235}}
-  \definecommand jaencodedintro                 {\uchar{123}{44}}
-  \definecommand jaencodedlistofequations       {\uchar{95}{15}\uchar{118}{238}\uchar{107}{33}}
-  \definecommand jaencodedlistofexamples        {\uchar{79}{139}\uchar{118}{238}\uchar{107}{33}}
-  \definecommand jaencodedlistoffigures         {\uchar{86}{243}\uchar{118}{238}\uchar{107}{33}}
-  \definecommand jaencodedlistoftables          {\uchar{136}{104}\uchar{118}{238}\uchar{107}{33}}
-  \definecommand jaencodedlistofunknown         {\uchar{78}{13}\uchar{102}{14}\uchar{118}{238}\uchar{107}{33}}
-  \definecommand jaencodedmsgaud                {\uchar{91}{254}\uchar{140}{97}\uchar{128}{5}}
-  \definecommand jaencodedmsglevel              {\uchar{48}{236}\uchar{48}{217}\uchar{48}{235}}
-  \definecommand jaencodedmsgorig               {\uchar{118}{122}\uchar{79}{225}\uchar{81}{67}}
-  \definecommand jaencodednavhome               {\uchar{48}{219}\uchar{48}{252}\uchar{48}{224}}
-  \definecommand jaencodednavnext               {\uchar{107}{33}\uchar{48}{110}\uchar{48}{218}\uchar{48}{252}\uchar{48}{184}}
-  \definecommand jaencodednavnextsibling        {\uchar{101}{233}\uchar{144}{1}\uchar{48}{138}}
-  \definecommand jaencodednavprev               {\uchar{82}{77}\uchar{48}{110}\uchar{48}{218}\uchar{48}{252}\uchar{48}{184}}
-  \definecommand jaencodednavprevsibling        {\uchar{93}{251}\uchar{98}{59}\uchar{48}{87}}
-  \definecommand jaencodednavup                 {\uchar{78}{10}\uchar{48}{107}\uchar{98}{59}\uchar{48}{139}}
-  \definecommand jaencodednestedendquote        {\uchar{48}{15}}
-  \definecommand jaencodednestedstartquote      {\uchar{48}{14}}
-  \definecommand jaencodednonexistantelement    {\uchar{137}{129}\uchar{125}{32}\uchar{48}{76}\uchar{91}{88}\uchar{87}{40}\uchar{48}{87}\uchar{48}{126}\uchar{48}{91}\uchar{48}{147}}
-  \definecommand jaencodednote                  {\uchar{108}{232}\uchar{97}{15}}
-  \definecommand jaencodednotes                 {\uchar{108}{232}\uchar{97}{15}}
-  \definecommand jaencodedpages                 {\uchar{80}{103}\uchar{115}{46}}
-  \definecommand jaencodedpart                  {\uchar{48}{209}\uchar{48}{252}\uchar{48}{200}}
-  \definecommand jaencodedpreface               {\uchar{94}{143}\uchar{101}{135}}
-  \definecommand jaencodedprocedure             {\uchar{98}{75}\uchar{152}{6}}
-  \definecommand jaencodedprocedureformal       {\uchar{98}{75}\uchar{152}{6}}
-  \definecommand jaencodedproductionset         {\uchar{48}{215}\uchar{48}{237}\uchar{48}{192}\uchar{48}{175}\uchar{48}{183}\uchar{48}{231}\uchar{48}{243}}
-  \definecommand jaencodedproductionsetformal   {\uchar{48}{215}\uchar{48}{237}\uchar{48}{192}\uchar{48}{175}\uchar{48}{183}\uchar{48}{231}\uchar{48}{243}}
-  \definecommand jaencodedpublished             {\uchar{118}{122}\uchar{136}{76}}
-  \definecommand jaencodedqandadiv              {\uchar{85}{79}\uchar{255}{26}\uchar{48}{1}\uchar{123}{84}\uchar{255}{26}}
-  \definecommand jaencodedqandaentry            {\uchar{85}{79}\uchar{255}{26}}
-  \definecommand jaencodedquestion              {\uchar{85}{79}\uchar{255}{26}}
-  \definecommand jaencodedreference             {\uchar{83}{194}\uchar{113}{103}}
-  \definecommand jaencodedrefname               {\uchar{84}{13}\uchar{82}{77}}
-  \definecommand jaencodedrefsection            {\uchar{152}{5}}
-  \definecommand jaencodedrefsynopsisdiv        {\uchar{105}{130}\uchar{137}{129}}
-  \definecommand jaencodedrevhistory            {\uchar{101}{57}\uchar{138}{2}\uchar{92}{101}\uchar{107}{116}}
-  \definecommand jaencodedrevision              {\uchar{101}{57}\uchar{138}{2}}
-  \definecommand jaencodedsection               {\uchar{152}{5}}
-  \definecommand jaencodedsee                   {\uchar{83}{194}\uchar{113}{103}}
-  \definecommand jaencodedseealso               {\uchar{83}{194}\uchar{113}{103}}
-  \definecommand jaencodedseparator             {\uchar{48}{1}}
-  \definecommand jaencodedset                   {\uchar{138}{45}\uchar{91}{154}}
-  \definecommand jaencodedsetindex              {\uchar{118}{238}\uchar{107}{33}\uchar{138}{45}\uchar{91}{154}}
-  \definecommand jaencodedsidebar               {\uchar{48}{181}\uchar{48}{164}\uchar{48}{201}\uchar{48}{208}\uchar{48}{252}}
-  \definecommand jaencodedsimplesect            {\uchar{152}{5}}
-  \definecommand jaencodedsingleendquote        {\uchar{32}{25}}
-  \definecommand jaencodedsinglestartquote      {\uchar{32}{24}}
-  \definecommand jaencodedstartquote            {\uchar{48}{12}}
-  \definecommand jaencodedstep                  {\uchar{48}{185}\uchar{48}{198}\uchar{48}{195}\uchar{48}{215}}
-  \definecommand jaencodedtable                 {\uchar{136}{104}}
-  \definecommand jaencodedtablenotes            {\uchar{108}{232}\uchar{97}{15}}
-  \definecommand jaencodedtableofcontents       {\uchar{118}{238}\uchar{107}{33}}
-  \definecommand jaencodedtip                   {\uchar{48}{198}\uchar{48}{163}\uchar{48}{195}\uchar{48}{215}}
-  \definecommand jaencodedunexpectedelementname {\uchar{78}{13}\uchar{102}{14}\uchar{48}{106}\uchar{137}{129}\uchar{125}{32}\uchar{84}{13}}
-  \definecommand jaencodedunsupported           {\uchar{48}{181}\uchar{48}{221}\uchar{48}{252}\uchar{48}{200}\uchar{48}{87}\uchar{48}{126}\uchar{48}{91}\uchar{48}{147}}
-  \definecommand jaencodedwarning               {\uchar{139}{102}\uchar{84}{74}}
-
-  \definecommand jaencodedyear                  {\uchar{94}{116}}
-  \definecommand jaencodedmonth                 {\uchar{103}{8}}
-  \definecommand jaencodedday                   {\uchar{101}{229}}
-
-\stopencoding
-
-%D Taken from Chinese (will be investigated yet...)
-
-\startencoding[cjk-uni]
-
-  \definecommand jaencodedleftsentence     {\uchar{32}{20}\uchar{32}{20}}
-  \definecommand jaencodedrightsentence    {\uchar{32}{20}\uchar{32}{20}}
-  \definecommand jaencodedleftsubsentence  {\uchar{32}{20}\uchar{32}{20}}
-  \definecommand jaencodedrightsubsentence {\uchar{32}{20}\uchar{32}{20}}
-
-\stopencoding
-
-%D Special thanxx to Eizo Tsuchihashi (eizo@arcbrain.jp) for the following stuff
-
-\startencoding[cjk-uni]
-
-  \definecommand jaencodedchristiandate {\uchar{137}{127}\uchar{102}{166}}
-
-  \definecommand jaencodedtables        {\uchar{103}{58}}
-  \definecommand jaencodedfigures       {\uchar{86}{243}}
-  \definecommand jaencodedabbreviations {\uchar{117}{101}\uchar{138}{158}}
-  \definecommand jaencodedlogos         {\uchar{116}{6}\uchar{96}{39}}
-  \definecommand jaencodedunits         {\uchar{48}{230}\uchar{48}{203}\uchar{48}{195}\uchar{48}{196}}
-
-  \definecommand jaencodedgraphics      {\uchar{48}{176}\uchar{48}{233}\uchar{48}{213}}
-  \definecommand jaencodedintermezzo    {\uchar{149}{147}\uchar{89}{79}\uchar{102}{242}}
-  \definecommand jaencodedintermezzos   {\uchar{149}{147}\uchar{89}{79}\uchar{102}{242}}
-  \definecommand jaencodedillustration  {\uchar{48}{164}\uchar{48}{233}\uchar{48}{185}\uchar{48}{200}}
-  \definecommand jaencodedline          {\uchar{125}{218}}
-  \definecommand jaencodedlines         {\uchar{125}{218}}
-
-  \definecommand jaencodedjanuary       {\uchar{78}{0}\uchar{103}{8}}
-  \definecommand jaencodedfebruary      {\uchar{78}{140}\uchar{103}{8}}
-  \definecommand jaencodedmarch         {\uchar{78}{9}\uchar{103}{8}}
-  \definecommand jaencodedapril         {\uchar{86}{219}\uchar{103}{8}}
-  \definecommand jaencodedmay           {\uchar{78}{148}\uchar{103}{8}}
-  \definecommand jaencodedjune          {\uchar{81}{109}\uchar{103}{8}}
-  \definecommand jaencodedjuly          {\uchar{78}{3}\uchar{103}{8}}
-  \definecommand jaencodedaugust        {\uchar{81}{107}\uchar{103}{8}}
-  \definecommand jaencodedseptember     {\uchar{78}{93}\uchar{103}{8}}
-  \definecommand jaencodedoctober       {\uchar{83}{65}\uchar{103}{8}}
-  \definecommand jaencodednovember      {\uchar{83}{65}\uchar{78}{0}\uchar{103}{8}}
-  \definecommand jaencodeddecember      {\uchar{83}{65}\uchar{78}{140}\uchar{103}{8}}
-
-  \definecommand jaencodedsunday        {\uchar{103}{8}\uchar{102}{220}\uchar{101}{229}}
-  \definecommand jaencodedmonday        {\uchar{112}{107}\uchar{102}{220}\uchar{101}{229}}
-  \definecommand jaencodedtuesday       {\uchar{108}{52}\uchar{102}{220}\uchar{101}{229}}
-  \definecommand jaencodedwednesday     {\uchar{103}{40}\uchar{102}{220}\uchar{101}{229}}
-  \definecommand jaencodedthursday      {\uchar{145}{209}\uchar{102}{220}\uchar{101}{229}}
-  \definecommand jaencodedfriday        {\uchar{87}{31}\uchar{102}{220}\uchar{101}{229}}
-  \definecommand jaencodedsaturday      {\uchar{101}{229}\uchar{102}{220}\uchar{101}{229}}
-
-\stopencoding
-
-\protect \endinput
diff --git a/tex/context/base/lang-lab.mkiv b/tex/context/base/lang-lab.mkiv
index 60408f787..0be27b4ca 100644
--- a/tex/context/base/lang-lab.mkiv
+++ b/tex/context/base/lang-lab.mkiv
@@ -37,41 +37,65 @@
 %D \showsetup{setupheadtext}
 %D \showsetup{setuplabeltext}
 %D
-%D In a few paragraphs we'll show quite a lot of examples
-%D of its use.
+%D A regular \CONTEXT\ stores some 1500 labels at most.
 
 \let\handletextprefix\relax
 
-\def\setupheadtext {\dosetupsometextprefix[\c!title]}
-\def\setuplabeltext{\dosetupsometextprefix[\c!label]}
-
-\def\dosetupsometextprefix
-  {\let\dodocommand\xdosetupsometextprefix
-   \dotripleempty\dodosetupsometextprefix}
-
-% \def\dodosetupsometextprefix[#1][#2][#3]%
-%   {\ifthirdargument
-%      \def\docommand##1{\dodocommand[#1#2][##1]}%
-%      \processcommalist[#3]\docommand
-%    \else
-%      \def\docommand##1{\dodocommand[#1\currentmainlanguage][##1]}%
-%      \processcommalist[#2]\docommand
-%    \fi}
-
-\def\dodosetupsometextprefix[#1][#2][#3]%
-  {\ifthirdargument
-     \def\docommand##1{\expanded{\dodocommand[#1\reallanguagetag{#2}]}[##1]}%
-     \processcommalist[#3]\docommand
+\newconditional\protecttextprefixes
+
+\let\currenttextprefixtag  \s!unknown
+\let\currenttextprefixclass\s!unknown
+
+\def\setupheadtext {\setfalse\protecttextprefixes\let\currenttextprefixclass\??mh\dodoubleempty\dosetupsometextprefix}
+\def\setuplabeltext{\setfalse\protecttextprefixes\let\currenttextprefixclass\??ml\dodoubleempty\dosetupsometextprefix}
+
+\def\dosetupsometextprefix[#1][#2]%
+  {\ifsecondargument
+     \edef\currenttextprefixtag{\reallanguagetag{#1}}%
+     \processcommalist[#2]\dodosetupsometextprefix
    \else
-     \def\docommand##1{\expanded{\dodocommand[#1\reallanguagetag\currentmainlanguage]}[##1]}%
-     \processcommalist[#2]\docommand
+     \edef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
+     \processcommalist[#1]\dodosetupsometextprefix
    \fi}
 
-\def\doassignsometextprefix[#1][#2,#3,#4]%
-  {\setvalue{#1}{\handletextprefix{#2}{#3}}}
+\def\dodosetupsometextprefix#1%
+  {\dododosetupsometextprefix[#1]}
 
-\def\xdosetupsometextprefix[#1][#2=#3]%
-  {\doassignsometextprefix[#1#2][#3,,]}
+\def\dododosetupsometextprefix[#1=#2]%
+  {\doassignsometextprefix{#1}[#2,,]}
+
+\def\doassignsometextprefix#1%
+  {\ifconditional\protecttextprefixes
+     \ifcsname\currenttextprefixclass\currenttextprefixtag#1\endcsname
+       \expandafter\expandafter\expandafter\doassignsometextprefixnop
+     \else
+       \expandafter\expandafter\expandafter\doassignsometextprefixyes
+     \fi
+   \else
+     \expandafter\doassignsometextprefixyes
+   \fi{#1}}
+
+\ifdefined\Word\else \let\Word\relax \fi
+
+% Checking saves some 8K in the compressed format and getting rid of the embedded
+% \handletextprefix was good for another 6K. In the end the new solution is not
+% even that inefficient. And the checking is done at format generation time anyway.
+
+\def\doassignsometextprefixyes#1[#2,#3,#4]%
+  {\edef\!!stringa{#2}%
+   \edef\!!stringb{#3}%
+   \ifx\!!stringb\empty
+     \ifx\!!stringa\empty
+       \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{\empty\empty}%
+     \else
+       \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{{#2}\empty}%
+     \fi
+   \else
+       \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{{#2}{#3}}%
+   \fi}
+
+\def\doassignsometextprefixnop[#1][#2]%
+  {}
 
 %D By changing the meaning of \type {\handletextprefix} we
 %D can filter the left and right labeltext as well as convert
@@ -100,86 +124,61 @@
 %D
 %D The latter one has an upcased alternative \type{\LABELTEXT}.
 
-% \def\labellanguage{\currentmainlanguage}
-% \def\headlanguage {\currentmainlanguage}
-
-% \def\labellanguage{\defaultlanguage\currentmainlanguage}
-% \def\headlanguage {\defaultlanguage\currentmainlanguage}
-
 \def\labellanguage{\reallanguagetag{\defaultlanguage\currentmainlanguage}}
 \def\headlanguage {\reallanguagetag{\defaultlanguage\currentmainlanguage}}
 
 \appendtoks \let\labellanguage\currentlanguage \to \everycurrentdate
 
-\unexpanded\def\headtext
-  {\let\handletextprefix\firstoftwoarguments
-   \let\reporttextprefixerror\doreporttextprefixerror
-   \global\labeltextdonetrue
-   \dogetupsometextprefix\headlanguage\c!title}
-
-\unexpanded\def\leftlabeltext
-  {\let\handletextprefix\firstoftwoarguments
-   \let\reporttextprefixerror\doreporttextprefixerror
-   \global\labeltextdonetrue
-   \dogetupsometextprefix\labellanguage\c!label}
-
-\unexpanded\def\rightlabeltext
-  {\let\handletextprefix\secondoftwoarguments
-   \let\reporttextprefixerror\doreporttextprefixerror
-   \global\labeltextdonetrue
-   \dogetupsometextprefix\labellanguage\c!label}
-
-\unexpanded\def\LEFTLABELTEXT
-  {\def\handletextprefix##1##2{\uppercase{##1}}\DOLABELTEXT}
-
-\unexpanded\def\RIGHTLABELTEXT
-  {\def\handletextprefix##1##2{\uppercase{##2}}\DOLABELTEXT}
-
-\def\DOLABELTEXT#1%
-  {\bgroup
-   \the\everyuppercase
-   \let\reporttextprefixerror\doreporttextprefixerror
-   \global\labeltextdonetrue
-   \dogetupsometextprefix\labellanguage\c!label{#1}% not \labeltext (see \MONTH)
-   \egroup}
-
-\let\labeltext      \leftlabeltext
-\let\LABELTEXT      \LEFTLABELTEXT
-
-\unexpanded\def\labeltexts#1#2{\leftlabeltext{#1}#2\rightlabeltext{#1}}
-\unexpanded\def\LABELTEXTS#1#2{\LEFTLABELTEXT{#1}#2\RIGHTLABELTEXT{#1}}
-
-\newif\iflabeltextdone % needs to be reset elsewhere
-\newif\iftracelabels % shows missing labels
-
-\def\doreporttextprefixerror#1#2#3%
-  {\iftracelabels{\tttf[#2:~#3/#1]~}\fi}
-
-\def\dosetexpandedheadlabeltext#1#2#3%
-  {\bgroup
-   \let\handletextprefix\firstoftwoarguments
-   \let\reporttextprefixerror\gobblethreearguments
-   \keepencodedtokens % test on multilingual pascal, ok in stretched
-  %\dontexpandencodedtokens % not usable in token handler
-   \expanded
-     {\egroup\noexpand\def\noexpand#2% watch out, no \edef
-        {\dogetupsometextprefix{\headlanguage}{#1}{#3}}}}
-
-\def\setexpandedheadtext {\dosetexpandedheadlabeltext\c!title}
-\def\setexpandedlabeltext{\dosetexpandedheadlabeltext\c!label}
-
-\def\dogetupsometextprefix#1#2#3% must be expandable ! #1 == language
-  {\ifcsname#2#1#3\endcsname
-     \csname#2#1#3\endcsname
-   \else\ifcsname\??la#1\s!default\endcsname
-     \expandafter\dogetupsometextprefix\csname\??la#1\s!default\endcsname{#2}{#3}%
-   \else\ifcsname#2#3\endcsname
-     \csname#2#3\endcsname
-   \else\ifcsname#1\s!en#3\endcsname
-     \csname#2\s!en#3\endcsname
+\def\dummytextprefix{\empty\empty}
+
+\def\dogetupsomelabeltext#1%
+  {\ifcsname\??ml\labellanguage#1\endcsname
+     \expandafter\let\expandafter\thetextprefix\csname\??ml\labellanguage#1\endcsname
+   \else\ifcsname\??la\labellanguage\s!default\endcsname
+     \expandafter\dogetupsometextprefix\csname\??la\labellanguage\s!default\endcsname\??ml#1%
+   \else\ifcsname\??ml#1\endcsname
+     \expandafter\let\expandafter\thetextprefix\csname\??ml#1\endcsname
+   \else\ifcsname\??ml\s!en#1\endcsname
+     \expandafter\let\expandafter\thetextprefix\csname\??ml\s!en#1\endcsname
    \else
-     % \doreporttextprefixerror{#1}{#2}{#3}%
+     \let\thetextprefix\dummytextprefix
    \fi\fi\fi\fi}
+
+\def\dogetupsomeheadtext#1%
+  {\ifcsname\??mh\headlanguage#1\endcsname
+     \expandafter\let\expandafter\thetextprefix\csname\??mh\headlanguage#1\endcsname
+   \else\ifcsname\??la\headlanguage\s!default\endcsname
+     \expandafter\dogetupsometextprefix\csname\??la\headlanguage\s!default\endcsname\??mh#1%
+   \else\ifcsname\??mh#1\endcsname
+     \expandafter\let\expandafter\thetextprefix\csname\??mh#1\endcsname
+   \else\ifcsname\??mh\s!en#1\endcsname
+     \expandafter\let\expandafter\thetextprefix\csname\??mh\s!en#1\endcsname
+   \else
+     \let\thetextprefix\dummytextprefix
+   \fi\fi\fi\fi}
+
+% The WORD variants are a bit inefficient when #1/#2 are empty but they are
+% seldom used (one can better set the style).
+
+\let\flushleftlabeltext \firstoftwoarguments
+\let\flushrightlabeltext\secondoftwoarguments
+
+\def\flushleftlabelWORD #1#2{\WORD{#1}}
+\def\flushrightlabelWORD#1#2{\WORD{#2}}
+
+\def\flushbothlabeltexts#1#2#3{#1#3#2}
+\def\flushbothlabelTEXTS#1#2#3{\WORD{#1}#3\WORD{#2}}
+
+\unexpanded\def\headtext      #1{\dogetupsomeheadtext {#1}\expandafter\flushleftlabeltext \thetextprefix}
+\unexpanded\def\leftlabeltext #1{\dogetupsomelabeltext{#1}\expandafter\flushleftlabeltext \thetextprefix}
+\unexpanded\def\rightlabeltext#1{\dogetupsomelabeltext{#1}\expandafter\flushrightlabeltext\thetextprefix}
+\unexpanded\def\LEFTLABELTEXT #1{\dogetupsomelabeltext{#1}\expandafter\flushleftlabelWORD \thetextprefix}
+\unexpanded\def\RIGHTLABELTEXT#1{\dogetupsomelabeltext{#1}\expandafter\flushrightlabelWORD\thetextprefix}
+\unexpanded\def\labeltexts    #1{\dogetupsomelabeltext{#1}\expandafter\flushbothlabeltexts\thetextprefix} % #2
+\unexpanded\def\LABELTEXTS    #1{\dogetupsomelabeltext{#1}\expandafter\flushbothlabelTEXTS\thetextprefix} % #2
+
+\let\labeltext\leftlabeltext
+\let\LABELTEXT\LEFTLABELTEXT
 
 \ifx\simplifiedcommands\undefined \newtoks\simplifiedcommands \fi
 
@@ -201,15 +200,8 @@
 %D head and label texts without replacing predefined ones.
 %D These are internal macros.
 
-\def\xdopresetsometextprefix[#1][#2=#3]%
-  {\ifundefined{#1#2}\doassignsometextprefix[#1\reallanguagetag{#2}][#3,,]\fi}
-
-\def\dopresetsometextprefix
-  {\let\dodocommand\xdopresetsometextprefix
-   \dotripleempty\dodosetupsometextprefix}
-
-\def\presetheadtext {\dopresetsometextprefix[\c!title]}
-\def\presetlabeltext{\dopresetsometextprefix[\c!label]}
+\def\presetheadtext {\settrue\protecttextprefixes\let\currenttextprefixclass\??mh\dodoubleempty\dosetupsometextprefix}
+\def\presetlabeltext{\settrue\protecttextprefixes\let\currenttextprefixclass\??ml\dodoubleempty\dosetupsometextprefix}
 
 %D \macros
 %D   {translate}
diff --git a/tex/context/base/lang-mis.mkii b/tex/context/base/lang-mis.mkii
new file mode 100644
index 000000000..eb7bb1a04
--- /dev/null
+++ b/tex/context/base/lang-mis.mkii
@@ -0,0 +1,683 @@
+%D \module
+%D   [       file=lang-mis,
+%D        version=1997.03.20, % used to be supp-lan.tex
+%D          title=\CONTEXT\ Language Macros,
+%D       subtitle=Compounds,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Language Macros / Compounds}
+
+%D \gdef\starttest
+%D   {\blank
+%D    \noindent
+%D    \halign\bgroup\tt##\hskip2em#\hskip2em#\cr}
+%D
+%D \gdef\stoptest
+%D   {\egroup
+%D    \blank}
+%D
+%D \gdef\test#1%
+%D   {\defconvertedargument\ascii{#1}\ascii&\hyphenatedword{#1}\cr}
+
+\unprotect
+
+%D One of \TEX's strong points in building paragraphs is the way
+%D hyphenations are handled. Although for real good hyphenation
+%D of non||english languages some extensions to the program are
+%D needed, fairly good results can be reached with the standard
+%D mechanisms and an additional macro, at least in Dutch.
+
+%D \CONTEXT\ originates in the wish to typeset educational
+%D materials, especially in a technical environment. In
+%D production oriented environments, a lot of compound words
+%D are used. Because the Dutch language poses no limits on
+%D combining words, we often favor putting dashes between those
+%D words, because it facilitates reading, at least for those
+%D who are not that accustomed to it.
+%D
+%D In \TEX\ compound words, separated by a hyphen, are not
+%D hyphenated at all. In spite of the multiple pass paragraph
+%D typesetting this can lead to parts of words sticking into
+%D the margin. The solution lays in saying \type
+%D {spoelwater||terugwinunit} instead of \type
+%D {spoelwater-terugwinunit}. By using a one character command
+%D like \type {|}, delimited by the same character \type {|},
+%D we get ourselves both a decent visualization (in \TEXEDIT\
+%D and colored verbatim we color these commands yellow) and an
+%D efficient way of combining words.
+%D
+%D The sequence \type{||} simply leads to two words connected by
+%D a hyphen. Because we want to distinguish such a hyphen from
+%D the one inserted when \TEX\ hyphenates a word, we use a bit
+%D longer one.
+%D
+%D \hyphenation {spoel-wa-ter te-rug-win-unit}
+%D
+%D \starttest
+%D \test {spoelwater||terugwinunit}
+%D \stoptest
+%D
+%D As we already said, the \type{|} is a command. This commands
+%D accepts an optional argument before it's delimiter, which is
+%D also a \type{|}.
+%D
+%D \hyphenation {po-ly-meer che-mie}
+%D
+%D \starttest
+%D \test {polymeer|*|chemie}
+%D \stoptest
+%D
+%D Arguments like \type{*} are not interpreted and inserted
+%D directly, in contrary to arguments like:
+%D
+%D \starttest
+%D \test {polymeer|~|chemie}
+%D \test {|(|polymeer|)|chemie}
+%D \test {polymeer|(|chemie|)| }
+%D \stoptest
+%D
+%D Although such situations seldom occur |<|we typeset thousands
+%D of pages before we encountered one that forced us to enhance
+%D this mechanism|>| we also have to take care of comma's.
+%D
+%D \hyphenation {uit-stel-len}
+%D
+%D \starttest
+%D \test {op||, in|| en uitstellen}
+%D \stoptest
+%D
+%D The next special case (concerning quotes) was brought to my
+%D attention by Piet Tutelaers, one of the driving forces
+%D behind rebuilding hyphenation patterns for the dutch
+%D language.\footnote{In 1996 the spelling of the dutch
+%D language has been slightly reformed which made this topic
+%D actual again.} We'll also take care of this case.
+%D
+%D \starttest
+%D \test {AOW|'|er}
+%D \test {cd|'|tje}
+%D \test {ex|-|PTT|'|er}
+%D \test {rock|-|'n|-|roller}
+%D \stoptest
+%D
+%D Tobias Burnus pointed out that I should also support
+%D something like
+%D
+%D \starttest
+%D \test {well|_|known}
+%D \stoptest
+%D
+%D to stress the compoundness of hyphenated words.
+%D
+%D Of course we also have to take care of the special case:
+%D
+%D \starttest
+%D \test {text||color and ||font}
+%D \stoptest
+
+%D \macros
+%D   {installdiscretionaries}
+%D
+%D The mechanism described here is one of the older inner parts
+%D of \CONTEXT. The most recent extensions concerns some
+%D special cases as well as the possibility to install other
+%D characters as delimiters. The prefered way of specifying
+%D compound words is using \type{||}, which is installed by:
+%D
+%D \starttyping
+%D \installdiscretionaries || -
+%D \stoptyping
+%D
+%D Some alternative definitions are:
+%D
+%D \startbuffer
+%D \installdiscretionaries ** -
+%D \installdiscretionaries ++ -
+%D \installdiscretionaries // -
+%D \installdiscretionaries ~~ -
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D after which we can say:
+%D
+%D \bgroup
+%D \getbuffer
+%D \starttest
+%D \test {test**test**test}
+%D \test {test++test++test}
+%D \test {test//test//test}
+%D \test {test~~test~~test}
+%D \stoptest
+%D \egroup
+
+%D \macros
+%D   {compoundhyphen,
+%D    beginofsubsentence,endofsubsentence}
+%D
+%D Now let's go to the macros. First we define some variables.
+%D In the main \CONTEXT\ modules these can be tuned by a setup
+%D command. Watch the (maybe) better looking compound hyphen.
+
+\ifx\compoundhyphen           \undefined \def\compoundhyphen{\hbox{-\kern-.25ex-}} \fi
+
+\ifx\beginofsubsentence       \undefined \def\beginofsubsentence{\hbox{---}} \fi
+\ifx\endofsubsentence         \undefined \def\endofsubsentence  {\hbox{---}} \fi
+
+%D The last two variables are needed for subsentences
+%D |<|like this one|>| which we did not yet mention.
+%D
+%D We want to enable breaking but at the same time don't want
+%D compound characters like |-| or || to be separated from the
+%D words. \TEX\ hackers will recognise the next two macro's:
+
+\ifx\prewordbreak             \undefined \def\prewordbreak {\penalty\plustenthousand\hskip\zeropoint\relax} \fi
+%ifx\postwordbreak            \undefined \def\postwordbreak{\penalty\zerocount      \prewordbreak         } \fi
+\ifx\postwordbreak            \undefined \def\postwordbreak{\penalty\zerocount      \hskip\zeropoint\relax} \fi
+
+\ifx\hspaceamount             \undefined \def\hspaceamount#1#2{.16667em} \fi % language specific
+
+%D \macros
+%D   {beginofsubsentencespacing,endofsubsentencespacing}
+%D
+%D In the previous macros we provided two hooks which can be
+%D used to support nested sub||sentences. In \CONTEXT\ these
+%D hooks are used to insert a small space when needed.
+
+\ifx\beginofsubsentencespacing\undefined \let\beginofsubsentencespacing\relax \fi
+\ifx\endofsubsentencespacing  \undefined \let\endofsubsentencespacing  \relax \fi
+
+%D The following piece of code is a torture test compound
+%D hndling. The \type {\relax} before the \type {\ifmmode} is
+%D needed because of the alignment scanner (in \ETEX\ this
+%D problem is not present because there a protected macro is
+%D not expanded. Thanks to Tobias Burnus for providing this
+%D example.
+%D
+%D \startformula
+%D   \left|f(x_n)-{1\over2}\right| =
+%D      {\cases{|{1\over2}-x_n| &for $0\le x_n < {1\over2}$\cr
+%D              |x_n-{1\over2}| &for ${1\over2}\zeropoint
+     (\prewordbreak
+   \else
+     \prewordbreak\discretionary{}{(-}{(}\prewordbreak
+   \fi}
+
+\definetextmodediscretionary ~
+  {\prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak}
+
+\definetextmodediscretionary '
+  {\prewordbreak\discretionary{-}{}{'}\postwordbreak}
+
+\definetextmodediscretionary ^
+  {\prewordbreak\discretionary{\hbox{$|$}}{}{\hbox{$|$}}%
+   \allowbreak\postwordbreak} % bugged
+
+\definetextmodediscretionary <
+  {\beginofsubsentence\prewordbreak\beginofsubsentencespacing}
+
+\definetextmodediscretionary >
+  {\endofsubsentencespacing\prewordbreak\endofsubsentence}
+
+\definetextmodediscretionary =
+  {\prewordbreak\midsentence\prewordbreak} % {\prewordbreak\compoundhyphen}
+
+% french
+
+\definetextmodediscretionary : {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{:}:}
+\definetextmodediscretionary ; {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{;};}
+\definetextmodediscretionary ? {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{?}?}
+\definetextmodediscretionary ! {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{!}!}
+
+\definetextmodediscretionary *
+  {\prewordbreak\discretionary{-}{}{\kern.05em}\prewordbreak}
+
+% spanish
+
+\definetextmodediscretionary ?? {\prewordbreak\questiondown}
+\definetextmodediscretionary !! {\prewordbreak\exclamdown}
+
+% \ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+%D \installdiscretionary  | +
+%D \installdiscretionary + =
+
+\def\defaultdiscretionaryhyphen{\compoundhyphen}
+
+\installdiscretionary | \defaultdiscretionaryhyphen % installs in ctx and prt will fall back on it
+
+%D \macros
+%D   {fakecompoundhyphen}
+%D
+%D In headers and footers as well as in active pieces of text
+%D we need a dirty hack. Try to imagine what is needed to
+%D savely break the next text across a line and at the same
+%D time make the words interactive.
+%D
+%D \starttyping
+%D \goto{Some||Long||Word}
+%D \stoptyping
+
+\def\fakecompoundhyphen
+  {\def\|{\mathortext\vert\dofakecompoundhyphen}}
+
+\def\dofakecompoundhyphen
+  {\def##1|%
+     {\doifelsenothing{##1}\compoundhyphen{##1}%
+      \kern\compoundbreakpoint\allowbreak}}
+
+%D \macros
+%D   {midworddiscretionary}
+%D
+%D If needed, one can add a discretionary hyphen using \type
+%D {\midworddiscretionary}. This macro does the same as
+%D \PLAIN\ \TEX's \type {\-}, but, like the ones implemented
+%D earlier, this one also looks ahead for spaces and grouping
+%D tokens.
+
+\def\midworddiscretionary
+  {\futurelet\next\domidworddiscretionary}
+
+\def\domidworddiscretionary
+  {\ifx\next\blankspace\else
+   \ifx\next\bgroup    \else
+   \ifx\next\egroup    \else
+     \discretionary{-}{}{}%
+   \fi\fi\fi}
+
+%D \macros
+%D   {installcompoundcharacter}
+%D
+%D When Tobias Burnus started translating the dutch manual of
+%D \PPCHTEX\ into german, he suggested to let \CONTEXT\ support
+%D the \type{german.sty} method of handling compound
+%D characters, especially the umlaut. This package is meant for
+%D use with \PLAIN\ \TEX\ as well as \LATEX.
+%D
+%D I decided to implement compound character support as
+%D versatile as possible. As a result one can define his own
+%D compound character support, like:
+%D
+%D \starttyping
+%D \installcompoundcharacter "a {\"a}
+%D \installcompoundcharacter "e {\"e}
+%D \installcompoundcharacter "i {\"i}
+%D \installcompoundcharacter "u {\"u}
+%D \installcompoundcharacter "o {\"o}
+%D \installcompoundcharacter "s {\SS}
+%D \stoptyping
+%D
+%D or even
+%D
+%D \starttyping
+%D \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}}
+%D \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}}
+%D \stoptyping
+%D
+%D The support is not limited to alphabetic characters, so the
+%D next definition is also valid.
+%D
+%D \starttyping
+%D \installcompoundcharacter ". {.\doifnextcharelse{\spacetoken}{}{\kern.125em}}
+%D \stoptyping
+%D
+%D The implementation looks familiar and uses the same tricks as
+%D mentioned earlier in this module. We take care of two
+%D arguments, which complicates things a bit.
+
+\def\@nc@{@nc@} % normal character
+\def\@cc@{@cc@} % compound character
+\def\@cs@{@cs@} % compound characters
+\def\@cx@{@cx@} % compound definition
+
+%D When we started working on MK IV code, we needed a different
+%D approach for defining the active character itself. In MK II as
+%D well as in MK IV we now use the catcode vectors.
+
+\chardef\compoundcharactermode\plusone
+
+\def\installcompoundcharacter #1#2#3 #4% {#4} no grouping
+  {\ifcase\compoundcharactermode
+      % ignore mode
+   \else
+     \chardef\thecompoundcharacter`#1%
+     \@EA\chardef\csname\@nc@\string#1\endcsname\thecompoundcharacter
+     \def\!!stringa{#3}%
+     \@EA\def\csname\ifx\!!stringa\empty\@cc@\else\@cs@\fi\detokenize{#1#2#3}\endcsname{#4}%
+     \setevalue{\@cx@\detokenize{#1}}{\noexpand\handlecompoundcharacter{\detokenize{#1}}}% beter nr's
+%      \@EA\letcatcodecommand\@EA\prtcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+%      \@EA\letcatcodecommand\@EA\texcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+     \@EA\letcatcodecommand\@EA\ctxcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+   \fi}
+
+%D In order to serve the language specific well, we will introduce
+%D a namespace:
+
+% \ifx\currentlanguage\undefined
+  \let\compoundcharacterclass\empty
+% \else
+%   \def\compoundcharacterclass{\currentlanguage}
+% \fi
+
+\def\@cc@{@cc@\compoundcharacterclass} % compound character
+\def\@cs@{@cs@\compoundcharacterclass} % compound characters
+
+%D We can also ignore definitions (needed in for instance \XML). Beware,
+%D this macro is supposed to be used grouped!
+
+\def\ignorecompoundcharacter
+  {\chardef\compoundcharactermode\zerocount}
+
+\let\restorecompoundcharacter   \gobbleoneargument % obsolete
+\let\enableactivediscretionaries\relax             % obsolete
+
+%D In handling the compound characters we have to take care of
+%D \type{\bgroup} and \type{\egroup} tokens, so we end up with
+%D a multi||step interpretation macro. We look ahead for a
+%D \type{\bgroup}, \type{\egroup} or \type{\blankspace}. Being
+%D no user of this mechanism, the credits for testing them goes
+%D to Tobias Burnus, the first german user of \CONTEXT.
+%D
+%D We define these macros as \type{\long} because we can
+%D expect \type{\par} tokens. We need to look into the future
+%D with \type{\futurelet} to prevent spaces from
+%D disappearing.
+
+\def\handlecompoundcharacter#1%
+  {\def\xhandlecompoundcharacter{\dohandlecompoundcharacter{#1}}%
+   \futurelet\next\xhandlecompoundcharacter}
+
+\def\dohandlecompoundcharacter
+  {\ifx\next\bgroup
+    %\@EA\dodohandlecompoundcharacter % handle "{ee} -> \"ee
+    %\@EA\gobbleoneargument           % forget "{ee} -> ee
+     \@EA\handlecompoundcharacterone  % ignore "{ee} -> "ee
+   \else\ifx\next\egroup
+     \@EAEAEA\donohandlecompoundcharacter
+   \else\ifx\next\blankspace
+     \@EA\@EAEAEA\@EA\donohandlecompoundcharacter
+   \else
+     \@EA\@EAEAEA\@EA\dodohandlecompoundcharacter
+   \fi\fi\fi}
+
+\def\donohandlecompoundcharacter#1{\csname\@nc@\string#1\endcsname}
+
+\def\dododohandlecompoundcharacter
+  {\ifx\next\bgroup
+     \@EA\handlecompoundcharacterone
+   \else\ifx\next\egroup
+     \@EAEAEA\handlecompoundcharacterone
+   \else\ifx\next\blankspace
+     \@EA\@EAEAEA\@EA\handlecompoundcharacterone
+   \else
+     \@EA\@EAEAEA\@EA\handlecompoundcharactertwo
+   \fi\fi\fi}
+
+\def\dodohandlecompoundcharacter#1#2% preserve space
+  {\def\xdodohandlecompoundcharacter{\dododohandlecompoundcharacter#1#2}%
+   \futurelet\next\xdodohandlecompoundcharacter}
+
+%D Besides taken care of the grouping and space tokens, we have
+%D to deal with three situations. First we look if the next
+%D character equals the first one, if so, then we just insert
+%D the original. Next we look if indeed a compound character is
+%D defined. We either execute the compound character or just
+%D insert the first. So we have
+%D
+%D \starttyping
+%D     
+%D \stoptyping
+%D
+%D In later modules we will see how these commands are used.
+
+\long\def\handlecompoundcharacterone#1#2%
+  {\if\string#1\string#2% was: \ifx#1#2%
+     \def\next{\csname\@nc@\string#1\endcsname}%
+   \else\ifcsname\@cc@\string#1\string#2\endcsname
+     \def\next{\csname\@cc@\string#1\string#2\endcsname}%
+   \else
+     \def\next{\csname\@nc@\string#1\endcsname#2}%
+   \fi\fi
+   \next}
+
+\long\def\handlecompoundcharactertwo#1#2#3%
+  {\if\string#1\string#2%
+     \def\next{\csname\@nc@\string#1\endcsname#3}%
+   \else\ifcsname\@cs@\string#1\string#2\string#3\endcsname
+     \def\next{\csname\@cs@\string#1\string#2\string#3\endcsname}%
+   \else\ifcsname\@cc@\string#1\string#2\endcsname
+     \def\next{\csname\@cc@\string#1\string#2\endcsname#3}%
+   \else
+     \def\next{\csname\@nc@\string#1\endcsname#2#3}%
+   \fi\fi\fi
+   \next}
+
+%D For very obscure applications (see for an application \type
+%D {lang-sla.tex}) we provide:
+
+\def\simplifiedcompoundcharacter#1#2%
+  {\ifcsname\@cc@\string#1\string#2\endcsname
+     \@EA\@EA\@EA\firstofoneargument\csname\@cc@\string#1\string#2\endcsname
+   \else
+     #2%
+   \fi}
+
+%D \macros
+%D   {disablediscretionaries,disablecompoundcharacter}
+%D
+%D Occasionally we need to disable this mechanism. For the
+%D moment we assume that \type {|} is used.
+
+\let\disablediscretionaries   \ignorediscretionaries
+\let\disablecompoundcharacters\ignorecompoundcharacter
+
+%D \macros
+%D   {normalcompound}
+%D
+%D Handy in for instance XML. (Kind of obsolete)
+
+\ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+\protect \endinput
diff --git a/tex/context/base/lang-mis.mkiv b/tex/context/base/lang-mis.mkiv
new file mode 100644
index 000000000..eb7bb1a04
--- /dev/null
+++ b/tex/context/base/lang-mis.mkiv
@@ -0,0 +1,683 @@
+%D \module
+%D   [       file=lang-mis,
+%D        version=1997.03.20, % used to be supp-lan.tex
+%D          title=\CONTEXT\ Language Macros,
+%D       subtitle=Compounds,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Language Macros / Compounds}
+
+%D \gdef\starttest
+%D   {\blank
+%D    \noindent
+%D    \halign\bgroup\tt##\hskip2em#\hskip2em#\cr}
+%D
+%D \gdef\stoptest
+%D   {\egroup
+%D    \blank}
+%D
+%D \gdef\test#1%
+%D   {\defconvertedargument\ascii{#1}\ascii&\hyphenatedword{#1}\cr}
+
+\unprotect
+
+%D One of \TEX's strong points in building paragraphs is the way
+%D hyphenations are handled. Although for real good hyphenation
+%D of non||english languages some extensions to the program are
+%D needed, fairly good results can be reached with the standard
+%D mechanisms and an additional macro, at least in Dutch.
+
+%D \CONTEXT\ originates in the wish to typeset educational
+%D materials, especially in a technical environment. In
+%D production oriented environments, a lot of compound words
+%D are used. Because the Dutch language poses no limits on
+%D combining words, we often favor putting dashes between those
+%D words, because it facilitates reading, at least for those
+%D who are not that accustomed to it.
+%D
+%D In \TEX\ compound words, separated by a hyphen, are not
+%D hyphenated at all. In spite of the multiple pass paragraph
+%D typesetting this can lead to parts of words sticking into
+%D the margin. The solution lays in saying \type
+%D {spoelwater||terugwinunit} instead of \type
+%D {spoelwater-terugwinunit}. By using a one character command
+%D like \type {|}, delimited by the same character \type {|},
+%D we get ourselves both a decent visualization (in \TEXEDIT\
+%D and colored verbatim we color these commands yellow) and an
+%D efficient way of combining words.
+%D
+%D The sequence \type{||} simply leads to two words connected by
+%D a hyphen. Because we want to distinguish such a hyphen from
+%D the one inserted when \TEX\ hyphenates a word, we use a bit
+%D longer one.
+%D
+%D \hyphenation {spoel-wa-ter te-rug-win-unit}
+%D
+%D \starttest
+%D \test {spoelwater||terugwinunit}
+%D \stoptest
+%D
+%D As we already said, the \type{|} is a command. This commands
+%D accepts an optional argument before it's delimiter, which is
+%D also a \type{|}.
+%D
+%D \hyphenation {po-ly-meer che-mie}
+%D
+%D \starttest
+%D \test {polymeer|*|chemie}
+%D \stoptest
+%D
+%D Arguments like \type{*} are not interpreted and inserted
+%D directly, in contrary to arguments like:
+%D
+%D \starttest
+%D \test {polymeer|~|chemie}
+%D \test {|(|polymeer|)|chemie}
+%D \test {polymeer|(|chemie|)| }
+%D \stoptest
+%D
+%D Although such situations seldom occur |<|we typeset thousands
+%D of pages before we encountered one that forced us to enhance
+%D this mechanism|>| we also have to take care of comma's.
+%D
+%D \hyphenation {uit-stel-len}
+%D
+%D \starttest
+%D \test {op||, in|| en uitstellen}
+%D \stoptest
+%D
+%D The next special case (concerning quotes) was brought to my
+%D attention by Piet Tutelaers, one of the driving forces
+%D behind rebuilding hyphenation patterns for the dutch
+%D language.\footnote{In 1996 the spelling of the dutch
+%D language has been slightly reformed which made this topic
+%D actual again.} We'll also take care of this case.
+%D
+%D \starttest
+%D \test {AOW|'|er}
+%D \test {cd|'|tje}
+%D \test {ex|-|PTT|'|er}
+%D \test {rock|-|'n|-|roller}
+%D \stoptest
+%D
+%D Tobias Burnus pointed out that I should also support
+%D something like
+%D
+%D \starttest
+%D \test {well|_|known}
+%D \stoptest
+%D
+%D to stress the compoundness of hyphenated words.
+%D
+%D Of course we also have to take care of the special case:
+%D
+%D \starttest
+%D \test {text||color and ||font}
+%D \stoptest
+
+%D \macros
+%D   {installdiscretionaries}
+%D
+%D The mechanism described here is one of the older inner parts
+%D of \CONTEXT. The most recent extensions concerns some
+%D special cases as well as the possibility to install other
+%D characters as delimiters. The prefered way of specifying
+%D compound words is using \type{||}, which is installed by:
+%D
+%D \starttyping
+%D \installdiscretionaries || -
+%D \stoptyping
+%D
+%D Some alternative definitions are:
+%D
+%D \startbuffer
+%D \installdiscretionaries ** -
+%D \installdiscretionaries ++ -
+%D \installdiscretionaries // -
+%D \installdiscretionaries ~~ -
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D after which we can say:
+%D
+%D \bgroup
+%D \getbuffer
+%D \starttest
+%D \test {test**test**test}
+%D \test {test++test++test}
+%D \test {test//test//test}
+%D \test {test~~test~~test}
+%D \stoptest
+%D \egroup
+
+%D \macros
+%D   {compoundhyphen,
+%D    beginofsubsentence,endofsubsentence}
+%D
+%D Now let's go to the macros. First we define some variables.
+%D In the main \CONTEXT\ modules these can be tuned by a setup
+%D command. Watch the (maybe) better looking compound hyphen.
+
+\ifx\compoundhyphen           \undefined \def\compoundhyphen{\hbox{-\kern-.25ex-}} \fi
+
+\ifx\beginofsubsentence       \undefined \def\beginofsubsentence{\hbox{---}} \fi
+\ifx\endofsubsentence         \undefined \def\endofsubsentence  {\hbox{---}} \fi
+
+%D The last two variables are needed for subsentences
+%D |<|like this one|>| which we did not yet mention.
+%D
+%D We want to enable breaking but at the same time don't want
+%D compound characters like |-| or || to be separated from the
+%D words. \TEX\ hackers will recognise the next two macro's:
+
+\ifx\prewordbreak             \undefined \def\prewordbreak {\penalty\plustenthousand\hskip\zeropoint\relax} \fi
+%ifx\postwordbreak            \undefined \def\postwordbreak{\penalty\zerocount      \prewordbreak         } \fi
+\ifx\postwordbreak            \undefined \def\postwordbreak{\penalty\zerocount      \hskip\zeropoint\relax} \fi
+
+\ifx\hspaceamount             \undefined \def\hspaceamount#1#2{.16667em} \fi % language specific
+
+%D \macros
+%D   {beginofsubsentencespacing,endofsubsentencespacing}
+%D
+%D In the previous macros we provided two hooks which can be
+%D used to support nested sub||sentences. In \CONTEXT\ these
+%D hooks are used to insert a small space when needed.
+
+\ifx\beginofsubsentencespacing\undefined \let\beginofsubsentencespacing\relax \fi
+\ifx\endofsubsentencespacing  \undefined \let\endofsubsentencespacing  \relax \fi
+
+%D The following piece of code is a torture test compound
+%D hndling. The \type {\relax} before the \type {\ifmmode} is
+%D needed because of the alignment scanner (in \ETEX\ this
+%D problem is not present because there a protected macro is
+%D not expanded. Thanks to Tobias Burnus for providing this
+%D example.
+%D
+%D \startformula
+%D   \left|f(x_n)-{1\over2}\right| =
+%D      {\cases{|{1\over2}-x_n| &for $0\le x_n < {1\over2}$\cr
+%D              |x_n-{1\over2}| &for ${1\over2}\zeropoint
+     (\prewordbreak
+   \else
+     \prewordbreak\discretionary{}{(-}{(}\prewordbreak
+   \fi}
+
+\definetextmodediscretionary ~
+  {\prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak}
+
+\definetextmodediscretionary '
+  {\prewordbreak\discretionary{-}{}{'}\postwordbreak}
+
+\definetextmodediscretionary ^
+  {\prewordbreak\discretionary{\hbox{$|$}}{}{\hbox{$|$}}%
+   \allowbreak\postwordbreak} % bugged
+
+\definetextmodediscretionary <
+  {\beginofsubsentence\prewordbreak\beginofsubsentencespacing}
+
+\definetextmodediscretionary >
+  {\endofsubsentencespacing\prewordbreak\endofsubsentence}
+
+\definetextmodediscretionary =
+  {\prewordbreak\midsentence\prewordbreak} % {\prewordbreak\compoundhyphen}
+
+% french
+
+\definetextmodediscretionary : {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{:}:}
+\definetextmodediscretionary ; {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{;};}
+\definetextmodediscretionary ? {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{?}?}
+\definetextmodediscretionary ! {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{!}!}
+
+\definetextmodediscretionary *
+  {\prewordbreak\discretionary{-}{}{\kern.05em}\prewordbreak}
+
+% spanish
+
+\definetextmodediscretionary ?? {\prewordbreak\questiondown}
+\definetextmodediscretionary !! {\prewordbreak\exclamdown}
+
+% \ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+%D \installdiscretionary  | +
+%D \installdiscretionary + =
+
+\def\defaultdiscretionaryhyphen{\compoundhyphen}
+
+\installdiscretionary | \defaultdiscretionaryhyphen % installs in ctx and prt will fall back on it
+
+%D \macros
+%D   {fakecompoundhyphen}
+%D
+%D In headers and footers as well as in active pieces of text
+%D we need a dirty hack. Try to imagine what is needed to
+%D savely break the next text across a line and at the same
+%D time make the words interactive.
+%D
+%D \starttyping
+%D \goto{Some||Long||Word}
+%D \stoptyping
+
+\def\fakecompoundhyphen
+  {\def\|{\mathortext\vert\dofakecompoundhyphen}}
+
+\def\dofakecompoundhyphen
+  {\def##1|%
+     {\doifelsenothing{##1}\compoundhyphen{##1}%
+      \kern\compoundbreakpoint\allowbreak}}
+
+%D \macros
+%D   {midworddiscretionary}
+%D
+%D If needed, one can add a discretionary hyphen using \type
+%D {\midworddiscretionary}. This macro does the same as
+%D \PLAIN\ \TEX's \type {\-}, but, like the ones implemented
+%D earlier, this one also looks ahead for spaces and grouping
+%D tokens.
+
+\def\midworddiscretionary
+  {\futurelet\next\domidworddiscretionary}
+
+\def\domidworddiscretionary
+  {\ifx\next\blankspace\else
+   \ifx\next\bgroup    \else
+   \ifx\next\egroup    \else
+     \discretionary{-}{}{}%
+   \fi\fi\fi}
+
+%D \macros
+%D   {installcompoundcharacter}
+%D
+%D When Tobias Burnus started translating the dutch manual of
+%D \PPCHTEX\ into german, he suggested to let \CONTEXT\ support
+%D the \type{german.sty} method of handling compound
+%D characters, especially the umlaut. This package is meant for
+%D use with \PLAIN\ \TEX\ as well as \LATEX.
+%D
+%D I decided to implement compound character support as
+%D versatile as possible. As a result one can define his own
+%D compound character support, like:
+%D
+%D \starttyping
+%D \installcompoundcharacter "a {\"a}
+%D \installcompoundcharacter "e {\"e}
+%D \installcompoundcharacter "i {\"i}
+%D \installcompoundcharacter "u {\"u}
+%D \installcompoundcharacter "o {\"o}
+%D \installcompoundcharacter "s {\SS}
+%D \stoptyping
+%D
+%D or even
+%D
+%D \starttyping
+%D \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}}
+%D \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}}
+%D \stoptyping
+%D
+%D The support is not limited to alphabetic characters, so the
+%D next definition is also valid.
+%D
+%D \starttyping
+%D \installcompoundcharacter ". {.\doifnextcharelse{\spacetoken}{}{\kern.125em}}
+%D \stoptyping
+%D
+%D The implementation looks familiar and uses the same tricks as
+%D mentioned earlier in this module. We take care of two
+%D arguments, which complicates things a bit.
+
+\def\@nc@{@nc@} % normal character
+\def\@cc@{@cc@} % compound character
+\def\@cs@{@cs@} % compound characters
+\def\@cx@{@cx@} % compound definition
+
+%D When we started working on MK IV code, we needed a different
+%D approach for defining the active character itself. In MK II as
+%D well as in MK IV we now use the catcode vectors.
+
+\chardef\compoundcharactermode\plusone
+
+\def\installcompoundcharacter #1#2#3 #4% {#4} no grouping
+  {\ifcase\compoundcharactermode
+      % ignore mode
+   \else
+     \chardef\thecompoundcharacter`#1%
+     \@EA\chardef\csname\@nc@\string#1\endcsname\thecompoundcharacter
+     \def\!!stringa{#3}%
+     \@EA\def\csname\ifx\!!stringa\empty\@cc@\else\@cs@\fi\detokenize{#1#2#3}\endcsname{#4}%
+     \setevalue{\@cx@\detokenize{#1}}{\noexpand\handlecompoundcharacter{\detokenize{#1}}}% beter nr's
+%      \@EA\letcatcodecommand\@EA\prtcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+%      \@EA\letcatcodecommand\@EA\texcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+     \@EA\letcatcodecommand\@EA\ctxcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+   \fi}
+
+%D In order to serve the language specific well, we will introduce
+%D a namespace:
+
+% \ifx\currentlanguage\undefined
+  \let\compoundcharacterclass\empty
+% \else
+%   \def\compoundcharacterclass{\currentlanguage}
+% \fi
+
+\def\@cc@{@cc@\compoundcharacterclass} % compound character
+\def\@cs@{@cs@\compoundcharacterclass} % compound characters
+
+%D We can also ignore definitions (needed in for instance \XML). Beware,
+%D this macro is supposed to be used grouped!
+
+\def\ignorecompoundcharacter
+  {\chardef\compoundcharactermode\zerocount}
+
+\let\restorecompoundcharacter   \gobbleoneargument % obsolete
+\let\enableactivediscretionaries\relax             % obsolete
+
+%D In handling the compound characters we have to take care of
+%D \type{\bgroup} and \type{\egroup} tokens, so we end up with
+%D a multi||step interpretation macro. We look ahead for a
+%D \type{\bgroup}, \type{\egroup} or \type{\blankspace}. Being
+%D no user of this mechanism, the credits for testing them goes
+%D to Tobias Burnus, the first german user of \CONTEXT.
+%D
+%D We define these macros as \type{\long} because we can
+%D expect \type{\par} tokens. We need to look into the future
+%D with \type{\futurelet} to prevent spaces from
+%D disappearing.
+
+\def\handlecompoundcharacter#1%
+  {\def\xhandlecompoundcharacter{\dohandlecompoundcharacter{#1}}%
+   \futurelet\next\xhandlecompoundcharacter}
+
+\def\dohandlecompoundcharacter
+  {\ifx\next\bgroup
+    %\@EA\dodohandlecompoundcharacter % handle "{ee} -> \"ee
+    %\@EA\gobbleoneargument           % forget "{ee} -> ee
+     \@EA\handlecompoundcharacterone  % ignore "{ee} -> "ee
+   \else\ifx\next\egroup
+     \@EAEAEA\donohandlecompoundcharacter
+   \else\ifx\next\blankspace
+     \@EA\@EAEAEA\@EA\donohandlecompoundcharacter
+   \else
+     \@EA\@EAEAEA\@EA\dodohandlecompoundcharacter
+   \fi\fi\fi}
+
+\def\donohandlecompoundcharacter#1{\csname\@nc@\string#1\endcsname}
+
+\def\dododohandlecompoundcharacter
+  {\ifx\next\bgroup
+     \@EA\handlecompoundcharacterone
+   \else\ifx\next\egroup
+     \@EAEAEA\handlecompoundcharacterone
+   \else\ifx\next\blankspace
+     \@EA\@EAEAEA\@EA\handlecompoundcharacterone
+   \else
+     \@EA\@EAEAEA\@EA\handlecompoundcharactertwo
+   \fi\fi\fi}
+
+\def\dodohandlecompoundcharacter#1#2% preserve space
+  {\def\xdodohandlecompoundcharacter{\dododohandlecompoundcharacter#1#2}%
+   \futurelet\next\xdodohandlecompoundcharacter}
+
+%D Besides taken care of the grouping and space tokens, we have
+%D to deal with three situations. First we look if the next
+%D character equals the first one, if so, then we just insert
+%D the original. Next we look if indeed a compound character is
+%D defined. We either execute the compound character or just
+%D insert the first. So we have
+%D
+%D \starttyping
+%D     
+%D \stoptyping
+%D
+%D In later modules we will see how these commands are used.
+
+\long\def\handlecompoundcharacterone#1#2%
+  {\if\string#1\string#2% was: \ifx#1#2%
+     \def\next{\csname\@nc@\string#1\endcsname}%
+   \else\ifcsname\@cc@\string#1\string#2\endcsname
+     \def\next{\csname\@cc@\string#1\string#2\endcsname}%
+   \else
+     \def\next{\csname\@nc@\string#1\endcsname#2}%
+   \fi\fi
+   \next}
+
+\long\def\handlecompoundcharactertwo#1#2#3%
+  {\if\string#1\string#2%
+     \def\next{\csname\@nc@\string#1\endcsname#3}%
+   \else\ifcsname\@cs@\string#1\string#2\string#3\endcsname
+     \def\next{\csname\@cs@\string#1\string#2\string#3\endcsname}%
+   \else\ifcsname\@cc@\string#1\string#2\endcsname
+     \def\next{\csname\@cc@\string#1\string#2\endcsname#3}%
+   \else
+     \def\next{\csname\@nc@\string#1\endcsname#2#3}%
+   \fi\fi\fi
+   \next}
+
+%D For very obscure applications (see for an application \type
+%D {lang-sla.tex}) we provide:
+
+\def\simplifiedcompoundcharacter#1#2%
+  {\ifcsname\@cc@\string#1\string#2\endcsname
+     \@EA\@EA\@EA\firstofoneargument\csname\@cc@\string#1\string#2\endcsname
+   \else
+     #2%
+   \fi}
+
+%D \macros
+%D   {disablediscretionaries,disablecompoundcharacter}
+%D
+%D Occasionally we need to disable this mechanism. For the
+%D moment we assume that \type {|} is used.
+
+\let\disablediscretionaries   \ignorediscretionaries
+\let\disablecompoundcharacters\ignorecompoundcharacter
+
+%D \macros
+%D   {normalcompound}
+%D
+%D Handy in for instance XML. (Kind of obsolete)
+
+\ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+\protect \endinput
diff --git a/tex/context/base/lang-mis.tex b/tex/context/base/lang-mis.tex
deleted file mode 100644
index eb7bb1a04..000000000
--- a/tex/context/base/lang-mis.tex
+++ /dev/null
@@ -1,683 +0,0 @@
-%D \module
-%D   [       file=lang-mis,
-%D        version=1997.03.20, % used to be supp-lan.tex
-%D          title=\CONTEXT\ Language Macros,
-%D       subtitle=Compounds,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Language Macros / Compounds}
-
-%D \gdef\starttest
-%D   {\blank
-%D    \noindent
-%D    \halign\bgroup\tt##\hskip2em#\hskip2em#\cr}
-%D
-%D \gdef\stoptest
-%D   {\egroup
-%D    \blank}
-%D
-%D \gdef\test#1%
-%D   {\defconvertedargument\ascii{#1}\ascii&\hyphenatedword{#1}\cr}
-
-\unprotect
-
-%D One of \TEX's strong points in building paragraphs is the way
-%D hyphenations are handled. Although for real good hyphenation
-%D of non||english languages some extensions to the program are
-%D needed, fairly good results can be reached with the standard
-%D mechanisms and an additional macro, at least in Dutch.
-
-%D \CONTEXT\ originates in the wish to typeset educational
-%D materials, especially in a technical environment. In
-%D production oriented environments, a lot of compound words
-%D are used. Because the Dutch language poses no limits on
-%D combining words, we often favor putting dashes between those
-%D words, because it facilitates reading, at least for those
-%D who are not that accustomed to it.
-%D
-%D In \TEX\ compound words, separated by a hyphen, are not
-%D hyphenated at all. In spite of the multiple pass paragraph
-%D typesetting this can lead to parts of words sticking into
-%D the margin. The solution lays in saying \type
-%D {spoelwater||terugwinunit} instead of \type
-%D {spoelwater-terugwinunit}. By using a one character command
-%D like \type {|}, delimited by the same character \type {|},
-%D we get ourselves both a decent visualization (in \TEXEDIT\
-%D and colored verbatim we color these commands yellow) and an
-%D efficient way of combining words.
-%D
-%D The sequence \type{||} simply leads to two words connected by
-%D a hyphen. Because we want to distinguish such a hyphen from
-%D the one inserted when \TEX\ hyphenates a word, we use a bit
-%D longer one.
-%D
-%D \hyphenation {spoel-wa-ter te-rug-win-unit}
-%D
-%D \starttest
-%D \test {spoelwater||terugwinunit}
-%D \stoptest
-%D
-%D As we already said, the \type{|} is a command. This commands
-%D accepts an optional argument before it's delimiter, which is
-%D also a \type{|}.
-%D
-%D \hyphenation {po-ly-meer che-mie}
-%D
-%D \starttest
-%D \test {polymeer|*|chemie}
-%D \stoptest
-%D
-%D Arguments like \type{*} are not interpreted and inserted
-%D directly, in contrary to arguments like:
-%D
-%D \starttest
-%D \test {polymeer|~|chemie}
-%D \test {|(|polymeer|)|chemie}
-%D \test {polymeer|(|chemie|)| }
-%D \stoptest
-%D
-%D Although such situations seldom occur |<|we typeset thousands
-%D of pages before we encountered one that forced us to enhance
-%D this mechanism|>| we also have to take care of comma's.
-%D
-%D \hyphenation {uit-stel-len}
-%D
-%D \starttest
-%D \test {op||, in|| en uitstellen}
-%D \stoptest
-%D
-%D The next special case (concerning quotes) was brought to my
-%D attention by Piet Tutelaers, one of the driving forces
-%D behind rebuilding hyphenation patterns for the dutch
-%D language.\footnote{In 1996 the spelling of the dutch
-%D language has been slightly reformed which made this topic
-%D actual again.} We'll also take care of this case.
-%D
-%D \starttest
-%D \test {AOW|'|er}
-%D \test {cd|'|tje}
-%D \test {ex|-|PTT|'|er}
-%D \test {rock|-|'n|-|roller}
-%D \stoptest
-%D
-%D Tobias Burnus pointed out that I should also support
-%D something like
-%D
-%D \starttest
-%D \test {well|_|known}
-%D \stoptest
-%D
-%D to stress the compoundness of hyphenated words.
-%D
-%D Of course we also have to take care of the special case:
-%D
-%D \starttest
-%D \test {text||color and ||font}
-%D \stoptest
-
-%D \macros
-%D   {installdiscretionaries}
-%D
-%D The mechanism described here is one of the older inner parts
-%D of \CONTEXT. The most recent extensions concerns some
-%D special cases as well as the possibility to install other
-%D characters as delimiters. The prefered way of specifying
-%D compound words is using \type{||}, which is installed by:
-%D
-%D \starttyping
-%D \installdiscretionaries || -
-%D \stoptyping
-%D
-%D Some alternative definitions are:
-%D
-%D \startbuffer
-%D \installdiscretionaries ** -
-%D \installdiscretionaries ++ -
-%D \installdiscretionaries // -
-%D \installdiscretionaries ~~ -
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D after which we can say:
-%D
-%D \bgroup
-%D \getbuffer
-%D \starttest
-%D \test {test**test**test}
-%D \test {test++test++test}
-%D \test {test//test//test}
-%D \test {test~~test~~test}
-%D \stoptest
-%D \egroup
-
-%D \macros
-%D   {compoundhyphen,
-%D    beginofsubsentence,endofsubsentence}
-%D
-%D Now let's go to the macros. First we define some variables.
-%D In the main \CONTEXT\ modules these can be tuned by a setup
-%D command. Watch the (maybe) better looking compound hyphen.
-
-\ifx\compoundhyphen           \undefined \def\compoundhyphen{\hbox{-\kern-.25ex-}} \fi
-
-\ifx\beginofsubsentence       \undefined \def\beginofsubsentence{\hbox{---}} \fi
-\ifx\endofsubsentence         \undefined \def\endofsubsentence  {\hbox{---}} \fi
-
-%D The last two variables are needed for subsentences
-%D |<|like this one|>| which we did not yet mention.
-%D
-%D We want to enable breaking but at the same time don't want
-%D compound characters like |-| or || to be separated from the
-%D words. \TEX\ hackers will recognise the next two macro's:
-
-\ifx\prewordbreak             \undefined \def\prewordbreak {\penalty\plustenthousand\hskip\zeropoint\relax} \fi
-%ifx\postwordbreak            \undefined \def\postwordbreak{\penalty\zerocount      \prewordbreak         } \fi
-\ifx\postwordbreak            \undefined \def\postwordbreak{\penalty\zerocount      \hskip\zeropoint\relax} \fi
-
-\ifx\hspaceamount             \undefined \def\hspaceamount#1#2{.16667em} \fi % language specific
-
-%D \macros
-%D   {beginofsubsentencespacing,endofsubsentencespacing}
-%D
-%D In the previous macros we provided two hooks which can be
-%D used to support nested sub||sentences. In \CONTEXT\ these
-%D hooks are used to insert a small space when needed.
-
-\ifx\beginofsubsentencespacing\undefined \let\beginofsubsentencespacing\relax \fi
-\ifx\endofsubsentencespacing  \undefined \let\endofsubsentencespacing  \relax \fi
-
-%D The following piece of code is a torture test compound
-%D hndling. The \type {\relax} before the \type {\ifmmode} is
-%D needed because of the alignment scanner (in \ETEX\ this
-%D problem is not present because there a protected macro is
-%D not expanded. Thanks to Tobias Burnus for providing this
-%D example.
-%D
-%D \startformula
-%D   \left|f(x_n)-{1\over2}\right| =
-%D      {\cases{|{1\over2}-x_n| &for $0\le x_n < {1\over2}$\cr
-%D              |x_n-{1\over2}| &for ${1\over2}\zeropoint
-     (\prewordbreak
-   \else
-     \prewordbreak\discretionary{}{(-}{(}\prewordbreak
-   \fi}
-
-\definetextmodediscretionary ~
-  {\prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak}
-
-\definetextmodediscretionary '
-  {\prewordbreak\discretionary{-}{}{'}\postwordbreak}
-
-\definetextmodediscretionary ^
-  {\prewordbreak\discretionary{\hbox{$|$}}{}{\hbox{$|$}}%
-   \allowbreak\postwordbreak} % bugged
-
-\definetextmodediscretionary <
-  {\beginofsubsentence\prewordbreak\beginofsubsentencespacing}
-
-\definetextmodediscretionary >
-  {\endofsubsentencespacing\prewordbreak\endofsubsentence}
-
-\definetextmodediscretionary =
-  {\prewordbreak\midsentence\prewordbreak} % {\prewordbreak\compoundhyphen}
-
-% french
-
-\definetextmodediscretionary : {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{:}:}
-\definetextmodediscretionary ; {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{;};}
-\definetextmodediscretionary ? {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{?}?}
-\definetextmodediscretionary ! {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{!}!}
-
-\definetextmodediscretionary *
-  {\prewordbreak\discretionary{-}{}{\kern.05em}\prewordbreak}
-
-% spanish
-
-\definetextmodediscretionary ?? {\prewordbreak\questiondown}
-\definetextmodediscretionary !! {\prewordbreak\exclamdown}
-
-% \ifx\normalcompound\undefined \let\normalcompound=| \fi
-
-%D \installdiscretionary  | +
-%D \installdiscretionary + =
-
-\def\defaultdiscretionaryhyphen{\compoundhyphen}
-
-\installdiscretionary | \defaultdiscretionaryhyphen % installs in ctx and prt will fall back on it
-
-%D \macros
-%D   {fakecompoundhyphen}
-%D
-%D In headers and footers as well as in active pieces of text
-%D we need a dirty hack. Try to imagine what is needed to
-%D savely break the next text across a line and at the same
-%D time make the words interactive.
-%D
-%D \starttyping
-%D \goto{Some||Long||Word}
-%D \stoptyping
-
-\def\fakecompoundhyphen
-  {\def\|{\mathortext\vert\dofakecompoundhyphen}}
-
-\def\dofakecompoundhyphen
-  {\def##1|%
-     {\doifelsenothing{##1}\compoundhyphen{##1}%
-      \kern\compoundbreakpoint\allowbreak}}
-
-%D \macros
-%D   {midworddiscretionary}
-%D
-%D If needed, one can add a discretionary hyphen using \type
-%D {\midworddiscretionary}. This macro does the same as
-%D \PLAIN\ \TEX's \type {\-}, but, like the ones implemented
-%D earlier, this one also looks ahead for spaces and grouping
-%D tokens.
-
-\def\midworddiscretionary
-  {\futurelet\next\domidworddiscretionary}
-
-\def\domidworddiscretionary
-  {\ifx\next\blankspace\else
-   \ifx\next\bgroup    \else
-   \ifx\next\egroup    \else
-     \discretionary{-}{}{}%
-   \fi\fi\fi}
-
-%D \macros
-%D   {installcompoundcharacter}
-%D
-%D When Tobias Burnus started translating the dutch manual of
-%D \PPCHTEX\ into german, he suggested to let \CONTEXT\ support
-%D the \type{german.sty} method of handling compound
-%D characters, especially the umlaut. This package is meant for
-%D use with \PLAIN\ \TEX\ as well as \LATEX.
-%D
-%D I decided to implement compound character support as
-%D versatile as possible. As a result one can define his own
-%D compound character support, like:
-%D
-%D \starttyping
-%D \installcompoundcharacter "a {\"a}
-%D \installcompoundcharacter "e {\"e}
-%D \installcompoundcharacter "i {\"i}
-%D \installcompoundcharacter "u {\"u}
-%D \installcompoundcharacter "o {\"o}
-%D \installcompoundcharacter "s {\SS}
-%D \stoptyping
-%D
-%D or even
-%D
-%D \starttyping
-%D \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}}
-%D \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}}
-%D \stoptyping
-%D
-%D The support is not limited to alphabetic characters, so the
-%D next definition is also valid.
-%D
-%D \starttyping
-%D \installcompoundcharacter ". {.\doifnextcharelse{\spacetoken}{}{\kern.125em}}
-%D \stoptyping
-%D
-%D The implementation looks familiar and uses the same tricks as
-%D mentioned earlier in this module. We take care of two
-%D arguments, which complicates things a bit.
-
-\def\@nc@{@nc@} % normal character
-\def\@cc@{@cc@} % compound character
-\def\@cs@{@cs@} % compound characters
-\def\@cx@{@cx@} % compound definition
-
-%D When we started working on MK IV code, we needed a different
-%D approach for defining the active character itself. In MK II as
-%D well as in MK IV we now use the catcode vectors.
-
-\chardef\compoundcharactermode\plusone
-
-\def\installcompoundcharacter #1#2#3 #4% {#4} no grouping
-  {\ifcase\compoundcharactermode
-      % ignore mode
-   \else
-     \chardef\thecompoundcharacter`#1%
-     \@EA\chardef\csname\@nc@\string#1\endcsname\thecompoundcharacter
-     \def\!!stringa{#3}%
-     \@EA\def\csname\ifx\!!stringa\empty\@cc@\else\@cs@\fi\detokenize{#1#2#3}\endcsname{#4}%
-     \setevalue{\@cx@\detokenize{#1}}{\noexpand\handlecompoundcharacter{\detokenize{#1}}}% beter nr's
-%      \@EA\letcatcodecommand\@EA\prtcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
-%      \@EA\letcatcodecommand\@EA\texcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
-     \@EA\letcatcodecommand\@EA\ctxcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
-   \fi}
-
-%D In order to serve the language specific well, we will introduce
-%D a namespace:
-
-% \ifx\currentlanguage\undefined
-  \let\compoundcharacterclass\empty
-% \else
-%   \def\compoundcharacterclass{\currentlanguage}
-% \fi
-
-\def\@cc@{@cc@\compoundcharacterclass} % compound character
-\def\@cs@{@cs@\compoundcharacterclass} % compound characters
-
-%D We can also ignore definitions (needed in for instance \XML). Beware,
-%D this macro is supposed to be used grouped!
-
-\def\ignorecompoundcharacter
-  {\chardef\compoundcharactermode\zerocount}
-
-\let\restorecompoundcharacter   \gobbleoneargument % obsolete
-\let\enableactivediscretionaries\relax             % obsolete
-
-%D In handling the compound characters we have to take care of
-%D \type{\bgroup} and \type{\egroup} tokens, so we end up with
-%D a multi||step interpretation macro. We look ahead for a
-%D \type{\bgroup}, \type{\egroup} or \type{\blankspace}. Being
-%D no user of this mechanism, the credits for testing them goes
-%D to Tobias Burnus, the first german user of \CONTEXT.
-%D
-%D We define these macros as \type{\long} because we can
-%D expect \type{\par} tokens. We need to look into the future
-%D with \type{\futurelet} to prevent spaces from
-%D disappearing.
-
-\def\handlecompoundcharacter#1%
-  {\def\xhandlecompoundcharacter{\dohandlecompoundcharacter{#1}}%
-   \futurelet\next\xhandlecompoundcharacter}
-
-\def\dohandlecompoundcharacter
-  {\ifx\next\bgroup
-    %\@EA\dodohandlecompoundcharacter % handle "{ee} -> \"ee
-    %\@EA\gobbleoneargument           % forget "{ee} -> ee
-     \@EA\handlecompoundcharacterone  % ignore "{ee} -> "ee
-   \else\ifx\next\egroup
-     \@EAEAEA\donohandlecompoundcharacter
-   \else\ifx\next\blankspace
-     \@EA\@EAEAEA\@EA\donohandlecompoundcharacter
-   \else
-     \@EA\@EAEAEA\@EA\dodohandlecompoundcharacter
-   \fi\fi\fi}
-
-\def\donohandlecompoundcharacter#1{\csname\@nc@\string#1\endcsname}
-
-\def\dododohandlecompoundcharacter
-  {\ifx\next\bgroup
-     \@EA\handlecompoundcharacterone
-   \else\ifx\next\egroup
-     \@EAEAEA\handlecompoundcharacterone
-   \else\ifx\next\blankspace
-     \@EA\@EAEAEA\@EA\handlecompoundcharacterone
-   \else
-     \@EA\@EAEAEA\@EA\handlecompoundcharactertwo
-   \fi\fi\fi}
-
-\def\dodohandlecompoundcharacter#1#2% preserve space
-  {\def\xdodohandlecompoundcharacter{\dododohandlecompoundcharacter#1#2}%
-   \futurelet\next\xdodohandlecompoundcharacter}
-
-%D Besides taken care of the grouping and space tokens, we have
-%D to deal with three situations. First we look if the next
-%D character equals the first one, if so, then we just insert
-%D the original. Next we look if indeed a compound character is
-%D defined. We either execute the compound character or just
-%D insert the first. So we have
-%D
-%D \starttyping
-%D     
-%D \stoptyping
-%D
-%D In later modules we will see how these commands are used.
-
-\long\def\handlecompoundcharacterone#1#2%
-  {\if\string#1\string#2% was: \ifx#1#2%
-     \def\next{\csname\@nc@\string#1\endcsname}%
-   \else\ifcsname\@cc@\string#1\string#2\endcsname
-     \def\next{\csname\@cc@\string#1\string#2\endcsname}%
-   \else
-     \def\next{\csname\@nc@\string#1\endcsname#2}%
-   \fi\fi
-   \next}
-
-\long\def\handlecompoundcharactertwo#1#2#3%
-  {\if\string#1\string#2%
-     \def\next{\csname\@nc@\string#1\endcsname#3}%
-   \else\ifcsname\@cs@\string#1\string#2\string#3\endcsname
-     \def\next{\csname\@cs@\string#1\string#2\string#3\endcsname}%
-   \else\ifcsname\@cc@\string#1\string#2\endcsname
-     \def\next{\csname\@cc@\string#1\string#2\endcsname#3}%
-   \else
-     \def\next{\csname\@nc@\string#1\endcsname#2#3}%
-   \fi\fi\fi
-   \next}
-
-%D For very obscure applications (see for an application \type
-%D {lang-sla.tex}) we provide:
-
-\def\simplifiedcompoundcharacter#1#2%
-  {\ifcsname\@cc@\string#1\string#2\endcsname
-     \@EA\@EA\@EA\firstofoneargument\csname\@cc@\string#1\string#2\endcsname
-   \else
-     #2%
-   \fi}
-
-%D \macros
-%D   {disablediscretionaries,disablecompoundcharacter}
-%D
-%D Occasionally we need to disable this mechanism. For the
-%D moment we assume that \type {|} is used.
-
-\let\disablediscretionaries   \ignorediscretionaries
-\let\disablecompoundcharacters\ignorecompoundcharacter
-
-%D \macros
-%D   {normalcompound}
-%D
-%D Handy in for instance XML. (Kind of obsolete)
-
-\ifx\normalcompound\undefined \let\normalcompound=| \fi
-
-\protect \endinput
diff --git a/tex/context/base/lang-run.mkii b/tex/context/base/lang-run.mkii
new file mode 100644
index 000000000..4b332cfb9
--- /dev/null
+++ b/tex/context/base/lang-run.mkii
@@ -0,0 +1,36 @@
+%D \module
+%D   [       file=lang-run,
+%D        version=2005.09.08,
+%D          title=\CONTEXT\ Language Macros,
+%D       subtitle=Runtime Macros,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 is hooked into the core macros and saves some
+%D format space.]
+
+\unprotect
+
+\gdef\showpatterns
+  {\bgroup
+   \def\doshowpatterns##1##2##3##4% language number encoding mapping
+     {\NC##1\NC##3\NC##4\NC##2\NC
+      \specificlanguageparameter{##1}\s!lefthyphenmin \NC
+      \specificlanguageparameter{##1}\s!righthyphenmin\NC\NR}%
+   \starttabulate[|c|c|c|c|c|c|]
+   \HL
+   \NC \bf language \NC \bf encoding \NC \bf mapping \NC \bf number \NC
+       \bf left\low{min}  \NC
+       \bf right\low{min} \NC \NR
+   \HL
+   \preloadedpmessage
+   \HL
+   \stoptabulate
+   \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/lang-run.tex b/tex/context/base/lang-run.tex
deleted file mode 100644
index 4b332cfb9..000000000
--- a/tex/context/base/lang-run.tex
+++ /dev/null
@@ -1,36 +0,0 @@
-%D \module
-%D   [       file=lang-run,
-%D        version=2005.09.08,
-%D          title=\CONTEXT\ Language Macros,
-%D       subtitle=Runtime Macros,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 is hooked into the core macros and saves some
-%D format space.]
-
-\unprotect
-
-\gdef\showpatterns
-  {\bgroup
-   \def\doshowpatterns##1##2##3##4% language number encoding mapping
-     {\NC##1\NC##3\NC##4\NC##2\NC
-      \specificlanguageparameter{##1}\s!lefthyphenmin \NC
-      \specificlanguageparameter{##1}\s!righthyphenmin\NC\NR}%
-   \starttabulate[|c|c|c|c|c|c|]
-   \HL
-   \NC \bf language \NC \bf encoding \NC \bf mapping \NC \bf number \NC
-       \bf left\low{min}  \NC
-       \bf right\low{min} \NC \NR
-   \HL
-   \preloadedpmessage
-   \HL
-   \stoptabulate
-   \egroup}
-
-\protect \endinput
diff --git a/tex/context/base/lang-sla.tex b/tex/context/base/lang-sla.tex
index 0832e3f46..cd3c75b61 100644
--- a/tex/context/base/lang-sla.tex
+++ b/tex/context/base/lang-sla.tex
@@ -184,28 +184,6 @@
 
 \installlanguage [cz]        [\s!cs]
 
-% If this is really needed we should make an enco-fhr.
-%
-% \startlanguagespecifics[\s!hr]
-%
-%   %\installcompoundcharacter /, {\handlequotation\c!leftquotation}
-%   %\installcompoundcharacter /' {\handlequotation\c!rightquotation}
-%
-%   \def\setupHRlanguage%
-%     {\setuplanguage
-%        [\s!hr]
-%        [\c!leftsentence=\leftguillemot,
-%         \c!rightsentence=\rightguillemot,
-%         \c!leftsubsentence=\leftsubguillemot,
-%         \c!rightsubsentence=\rightsubguillemot]}
-%
-%   \installcompoundcharacter /< {{\setupHRlanguage|<|}}
-%   \installcompoundcharacter /> {{\setupHRlanguage|>|}}
-%
-%   \installcompoundcharacter /- {|-|}
-%
-% \stoplanguagespecifics
-
 % labels
 
 \setupheadtext [\s!pl] [\v!content=Spis tre\sacute ci]
diff --git a/tex/context/base/lang-spe.mkiv b/tex/context/base/lang-spe.mkiv
deleted file mode 100644
index 6f32888e6..000000000
--- a/tex/context/base/lang-spe.mkiv
+++ /dev/null
@@ -1,111 +0,0 @@
-%D \module
-%D   [       file=lang-spe,
-%D        version=2002.05.07, % 1996.01.25,
-%D          title=\CONTEXT\ Language Macros,
-%D       subtitle=Specifics,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Language Macros / Specifics}
-
-%D In \MKIV\ we will get away from this feature. See \MKII\ file
-%D for comments. So, consider this a temporary feature.
-
-\unprotect
-
-%D \macros
-%D   {everyresetlanguagespecifics,resetlanguagespecifics}
-%D
-%D Cleanup macros.
-
-\newevery \everyresetlanguagespecifics \relax
-
-\def\resetlanguagespecifics
-  {\ifcase\protectionlevel
-     \the\everyresetlanguagespecifics
-   \fi}
-
-\appendtoks
-  \resetlanguagespecifics
-\to \everycleanupfeatures
-
-%D \macros
-%D   {startlanguagespecifics,enablelanguagespecifics}
-
-\def\startlanguagespecifics
-  {\bgroup
-   \catcode`\^^I=\@@ignore
-   \catcode`\^^M=\@@ignore
-   \catcode`\^^L=\@@ignore
-   \dodoubleempty\dostartlanguagespecifics} % get rid of spaces
-
-\long\def\dostartlanguagespecifics[#1][#2]#3\stoplanguagespecifics
-  {\egroup
-   \processcommalist[#1]{\dosetlanguagespecifics{#3}}}
-
-\long\def\dosetlanguagespecifics#1#2% specifics language
-  {\ifcsname\??la#2\??la\endcsname \else
-     \expandafter\newtoks\csname\??la#2\??la\endcsname
-   \fi
-   \csname\??la#2\??la\endcsname\@EA{\the\csname\??la#2\??la\endcsname#1}%
-   \bgroup
-   \setbox\scratchbox\hbox{\enablelanguagespecifics[#2]}%
-   \ifdim\wd\scratchbox>\zeropoint
-     \showmessage\m!linguals7{#2,\the\wd\scratchbox\space}\wait
-   \else
-     \showmessage\m!linguals8{#2}%
-   \fi
-   \egroup
-   \doif{#2}\currentmainlanguage{\enablelanguagespecifics[#2]}}
-
-\def\forgetlanguagespecifics[#1]%
-  {\ifcsname\??la#1\??la\endcsname
-     \csname\??la#1\??la\endcsname\emptytoks
-   \fi}
-
-% \def\enablelanguagespecifics[#1]% no default language fallback (yet)
-%   {\ifcsname\??la#1\??la\endcsname
-%      \the\csname\??la#1\??la\endcsname\relax
-%    \fi}
-
-\def\enablelanguagespecifics[#1]%
-  {\edef\askedlanguagespecificslanguage{\defaultlanguage{#1}}%
-   \ifcsname\??la\askedlanguagespecificslanguage\??la\endcsname
-     \the\csname\??la\askedlanguagespecificslanguage\??la\endcsname
-   \fi}
-
-%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.
-
-\ifx\high          \undefined \let\high          \firstofoneargument \fi % todo
-\ifx\notsmallcapped\undefined \let\notsmallcapped\firstofoneargument \fi % todo
-
-\def\highordinalstr#1{\high{\notsmallcapped{#1}}}
-\def\ordinalstr    #1{\notsmallcapped{#1}}
-
-\def\ordinaldaynumber#1% \strippedcsname\ordinaldaynumber
-  {\expanded{\executeifdefined{\currentlanguage ordinaldaynumber}%
-     \noexpand\firstofoneargument{\number#1}}}
-
-%D Language specific converters have definitions like:
-%D
-%D \starttyping
-%D \def\enordinaldaynumber#1{...}
-%D \stoptyping
-%D
-%D Examples can be found in the other \type {lang} modules.
-
-\appendtoks
-  \ifprocessingXML \else \resetlanguagespecifics \fi
-\to \everylanguage
-
-\protect \endinput
diff --git a/tex/context/base/lpdf-ano.lua b/tex/context/base/lpdf-ano.lua
new file mode 100644
index 000000000..4f136ad79
--- /dev/null
+++ b/tex/context/base/lpdf-ano.lua
@@ -0,0 +1,573 @@
+if not modules then modules = { } end modules ['lpdf-ano'] = {
+    version   = 1.001,
+    comment   = "companion to lpdf-ini.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+local tostring, format, rep = tostring, string.rep, string.format
+local texcount = tex.count
+
+local trace_references   = false  trackers.register("references.references",   function(v) trace_references   = v end)
+local trace_destinations = false  trackers.register("references.destinations", function(v) trace_destinations = v end)
+local trace_bookmarks    = false  trackers.register("references.bookmarks",    function(v) trace_bookmarks    = v end)
+
+local variables = interfaces.variables
+local constants = interfaces.constants
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations  = backends.pdf.registrations
+
+jobreferences           = jobreferences           or { }
+jobreferences.runners   = jobreferences.runners   or { }
+jobreferences.specials  = jobreferences.specials  or { }
+jobreferences.handlers  = jobreferences.handlers  or { }
+jobreferences.executers = jobreferences.executers or { }
+
+local runners   = jobreferences.runners
+local specials  = jobreferences.specials
+local handlers  = jobreferences.handlers
+local executers = jobreferences.executers
+
+local pdfdictionary = lpdf.dictionary
+local pdfarray      = lpdf.array
+local pdfreference  = lpdf.reference
+local pdfunicode    = lpdf.unicode
+local pdfconstant   = lpdf.constant
+
+local pdfreserveobj   = pdf.reserveobj
+local pdfimmediateobj = pdf.immediateobj
+local pdfpageref      = tex.pdfpageref
+
+local pdfannot  = nodes.pdfannot
+local pdfdest   = nodes.pdfdest
+
+local pdf_uri        = pdfconstant("URI")
+local pdf_gotor      = pdfconstant("GoToR")
+local pdf_goto       = pdfconstant("GoTo")
+local pdf_launch     = pdfconstant("Launch")
+local pdf_javascript = pdfconstant("JavaScript")
+local pdf_link       = pdfconstant("Link")
+local pdf_n          = pdfconstant("N")
+local pdf_t          = pdfconstant("T")
+local pdf_border     = pdfarray { 0, 0, 0 }
+
+local cache = { }
+
+local function pagedest(n)
+    local pd = cache[n]
+    if not pd then
+        local a = pdfarray {
+            pdfreference(pdfpageref(n)),
+            pdfconstant("Fit")
+        }
+        pd = pdfreference(pdfimmediateobj(tostring(a)))
+        cache[n] = pd
+    end
+    return pd
+end
+
+lpdf.pagedest = pagedest
+
+local function link(url,filename,destination,page,actions)
+    if filename and filename ~= "" then
+        if file.basename(filename) == tex.jobname then
+            return false
+        else
+            filename = file.addsuffix(filename,"pdf")
+        end
+    end
+    if url and url ~= "" then
+        if filename and filename ~= "" then
+            if destination and destination ~= "" then
+                url = file.join(url,filename).."#"..destination
+            else
+                url = file.join(url,filename)
+            end
+        end
+        return pdfdictionary {
+            S = pdf_uri,
+            URI = url,
+        }
+    elseif filename and filename ~= "" then
+        return pdfdictionary {
+            S = pdf_gotor,
+            F = pdffile,
+            D = destination and destination ~= "" and destination,
+            NewWindow = (actions.newwindow and true) or nil,
+        }
+    elseif destination and destination ~= "" then
+        local realpage, p = texcount.realpageno, tonumber(page)
+        if not p then
+            -- sorry
+        elseif p > realpage then
+            texcount.referencepagestate = 3
+        elseif p < realpage then
+            texcount.referencepagestate = 2
+        else
+            texcount.referencepagestate = 1
+        end
+        return pdfdictionary {
+            S = pdf_goto,
+            D = destination,
+        }
+    elseif page and page ~= "" then
+        local realpage, p = texcount.realpageno, tonumber(page)
+        if p then
+            if p > realpage then
+                texcount.referencepagestate = 3
+            elseif p < realpage then
+                texcount.referencepagestate = 2
+            else
+                texcount.referencepagestate = 1
+            end
+            return pdfdictionary {
+                S = pdf_goto,
+                D = pagedest(p),
+            }
+        else
+            commands.writestatus("references","invalid page reference: %s",page or "?")
+        end
+    end
+    return false
+end
+
+lpdf.link = link
+
+function lpdf.launch(program,parameters)
+    if program and program ~= "" then
+        local d = pdfdictionary {
+            S = pdf_launch,
+            F = program,
+            D = ".",
+        }
+        if parameters and parameters ~= "" then
+            d.P = parameters
+        end
+        return d
+    end
+end
+
+function lpdf.javascript(name,arguments)
+    local script = javascripts.code(name,arguments) -- make into object (hash)
+    if script then
+        return pdfdictionary {
+            S  = pdf_javascript,
+            JS = script,
+        }
+    end
+end
+
+local function pdfaction(actions)
+    local nofactions = #actions
+    texcount.referencepagestate = 0 -- goodie, as we do all in the backend, we need to set it here too
+    if nofactions > 0 then
+        local a = actions[1]
+        local action = runners[a.kind]
+        if action then
+            action = action(a,actions)
+        end
+        if action then
+            local first = action
+            for i=2,nofactions do
+                local a = actions[i]
+                local what = runners[a.kind]
+                if what then
+                    what = what(a,actions)
+                end
+                if what then
+                    action.next = what
+                    action = what
+                else
+                    -- error
+                    return nil
+                end
+            end
+            return first
+        end
+    end
+end
+
+lpdf.pdfaction = pdfaction
+
+function codeinjections.prerollreference(actions)
+    local main = actions and pdfaction(actions)
+    if main then
+         main = pdfdictionary {
+            Subtype = pdf_link,
+            Border  = pdf_border,
+            H       = (not actions.highlight and pdf_n) or nil,
+            A       = main,
+        --  does not work at all in spite of specification
+        --  OC      = (actions.layer and lpdf.layerreferences[actions.layer]) or nil,
+        --  OC      = backends.pdf.layerreference(actions.layer),
+        }
+        return main("A") -- todo: cache this, maybe weak
+    end
+end
+
+-- local cache = { } -- no real gain in thsi
+--
+-- function codeinjections.prerollreference(actions)
+--     local main = actions and pdfaction(actions)
+--     if main then
+--          main = pdfdictionary {
+--             Subtype = pdf_link,
+--             Border  = pdf_border,
+--             H       = (not actions.highlight and pdf_n) or nil,
+--             A       = main,
+--         }
+--         local cm = cache[main]
+--         if not cm then
+--             cm = "/A ".. tostring(pdfreference(pdfimmediateobj(tostring(main))))
+--             cache[main] = cm
+--         end
+--         return cm
+--     end
+-- end
+
+function nodeinjections.reference(width,height,depth,prerolled)
+    if prerolled then
+        if swapdir then
+            width = - width
+        end
+        if trace_references then
+            logs.report("references","w=%s, h=%s, d=%s, a=%s",width,height,depth,prerolled)
+        end
+        return pdfannot(width,height,depth,prerolled)
+    end
+end
+
+function nodeinjections.destination(width,height,depth,name,view)
+    if swapdir then
+        width = - width
+    end
+    if trace_destinations then
+        logs.report("destinations","w=%s, h=%s, d=%s, n=%s, v=%s",width,height,depth,name,view or "no view")
+    end
+    return pdfdest(width,height,depth,name,view)
+end
+
+-- runners and specials
+
+local method = "internal"
+
+runners["inner"] = function(var,actions)
+    if method == "internal" then
+        local vir = var.i.references
+        local internal = vir and vir.internal
+        if internal then
+            var.inner = "aut:"..internal
+        end
+    end
+    return link(nil,nil,var.inner,var.r,actions)
+end
+
+runners["inner with arguments"] = function(var,actions)
+    return false
+end
+
+runners["outer"] = function(var,actions)
+    return link(nil,var.o,nil,nil,actions) -- var.o ?
+end
+
+runners["outer with inner"] = function(var,actions)
+    -- todo: resolve url/file name
+    return link(nil,var.f,var.inner,var.r,actions)
+end
+
+runners["special outer with operation"] = function(var,actions)
+    return false
+end
+
+runners["special outer"] = function(var,actions)
+    return false
+end
+
+runners["special"] = function(var,actions)
+    local handler = specials[var.special]
+    return handler and handler(var,actions)
+end
+
+runners["outer with inner with arguments"] = function(var,actions)
+    return false
+end
+
+runners["outer with special and operation and arguments"] = function(var,actions)
+    return false
+end
+
+runners["outer with special"] = function(var,actions)
+    return false
+end
+
+runners["outer with special and operation"] = function(var,actions)
+    return false
+end
+
+runners["special operation"]                = runners["special"]
+runners["special operation with arguments"] = runners["special"]
+
+function specials.internal(var,actions)
+    local i = tonumber(var.operation)
+    local v = jobreferences.internals[i]
+    if not v then
+        -- error
+    elseif method == "internal" then
+        -- named
+        return link(nil,nil,"aut:"..i,v.references.realpage,actions)
+    else
+        -- page
+        return link(nil,nil,nil,v.references.realpage,actions)
+    end
+end
+
+specials.i = specials.internal
+
+function specials.page(var,actions)
+    local p = jobreferences.pages[var.operation]
+    if type(p) == "function" then
+        p = p()
+    end
+    return link(nil,nil,nil,p or var.operation,actions)
+end
+
+function specials.url(var,actions)
+    local url = var.operation
+    if url then
+        local u = urls[url]
+        if u then
+            local u, f = u[1], u[2]
+            if f and f ~= "" then
+                url = u .. "/" .. f
+            else
+                url = u
+            end
+        end
+    end
+    return link(url,nil,var.arguments,nil,actions)
+end
+
+function specials.file(var,actions)
+    local file = var.operation
+    if file then
+        local f = files[file]
+        if f then
+            file = f[1]
+        end
+    end
+    return link(nil,file,var.arguments,nil,actions)
+end
+
+function specials.program(var,content)
+    local program = var.operation
+    if program then
+        local p = programs[program]
+        if p then
+            program = p[1]
+        end
+    end
+    return lpdf.launch(program,var.arguments)
+end
+
+function specials.javascript(var)
+    return lpdf.javascript(var.operation,var.arguments)
+end
+
+specials.JS = specials.javascript
+
+local pdf_named = pdfconstant("Named")
+
+executers.importform  = pdfdictionary { S = pdf_named, N = pdfconstant("AcroForm:ImportFDF") }
+executers.exportform  = pdfdictionary { S = pdf_named, N = pdfconstant("AcroForm:ExportFDF") }
+executers.first       = pdfdictionary { S = pdf_named, N = pdfconstant("FirstPage") }
+executers.previous    = pdfdictionary { S = pdf_named, N = pdfconstant("PrevPage") }
+executers.next        = pdfdictionary { S = pdf_named, N = pdfconstant("NextPage") }
+executers.last        = pdfdictionary { S = pdf_named, N = pdfconstant("LastPage") }
+executers.backward    = pdfdictionary { S = pdf_named, N = pdfconstant("GoBack") }
+executers.forward     = pdfdictionary { S = pdf_named, N = pdfconstant("GoForward") }
+executers.print       = pdfdictionary { S = pdf_named, N = pdfconstant("Print") }
+executers.exit        = pdfdictionary { S = pdf_named, N = pdfconstant("Quit") }
+executers.close       = pdfdictionary { S = pdf_named, N = pdfconstant("Close") }
+executers.save        = pdfdictionary { S = pdf_named, N = pdfconstant("Save") }
+executers.savenamed   = pdfdictionary { S = pdf_named, N = pdfconstant("SaveAs") }
+executers.opennamed   = pdfdictionary { S = pdf_named, N = pdfconstant("Open") }
+executers.help        = pdfdictionary { S = pdf_named, N = pdfconstant("HelpUserGuide") }
+executers.toggle      = pdfdictionary { S = pdf_named, N = pdfconstant("FullScreen") }
+executers.search      = pdfdictionary { S = pdf_named, N = pdfconstant("Find") }
+executers.searchagain = pdfdictionary { S = pdf_named, N = pdfconstant("FindAgain") }
+executers.gotopage    = pdfdictionary { S = pdf_named, N = pdfconstant("GoToPage") }
+executers.query       = pdfdictionary { S = pdf_named, N = pdfconstant("AcroSrch:Query") }
+executers.queryagain  = pdfdictionary { S = pdf_named, N = pdfconstant("AcroSrch:NextHit") }
+executers.fitwidth    = pdfdictionary { S = pdf_named, N = pdfconstant("FitWidth") }
+executers.fitheight   = pdfdictionary { S = pdf_named, N = pdfconstant("FitHeight") }
+
+local function fieldset(arguments)
+    -- [\dogetfieldset{#1}]
+    return nil
+end
+
+function executers.resetform(arguments)
+    arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+    return pdfdictionary {
+        S     = pdfconstant("ResetForm"),
+        Field = fieldset(arguments[1])
+    }
+end
+
+local formmethod = "post" -- "get" "post"
+local formformat = "xml"  -- "xml" "html" "fdf"
+
+-- bit 3 = html bit 6 = xml bit 4 = get
+
+local flags = {
+    get = {
+        html = 12, fdf = 8, xml = 40,
+    },
+    post = {
+        html = 4, fdf = 0, xml = 32,
+    }
+}
+
+function executers.submitform(arguments)
+    arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+    local flag = flags[formmethod] or flags.post
+    flag = (flag and (flag[formformat] or flag.xml)) or 32 -- default: post, xml
+    return pdfdictionary {
+        S     = pdfconstant("ResetForm"),
+        F     = fieldset(arguments[1]),
+        Field = fieldset(arguments[2]),
+        Flags = flag,
+    -- \PDFsubmitfiller
+    }
+end
+
+function executers.hide(arguments)
+    return pdfdictionary {
+        S = pdfconstant("Hide"),
+        H = true,
+        T = arguments,
+    }
+end
+
+function executers.show(arguments)
+    return pdfdictionary {
+        S = pdfconstant("Hide"),
+        H = false,
+        T = arguments,
+    }
+end
+
+local pdf_movie  = pdfconstant("Movie")
+local pdf_start  = pdfconstant("Start")
+local pdf_stop   = pdfconstant("Stop")
+local pdf_resume = pdfconstant("Resume")
+local pdf_pause  = pdfconstant("Pause")
+
+local function movie_or_sound(operation,arguments)
+    arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+    return pdfdictionary {
+        S         = pdf_movie,
+        T         = format("movie %s",arguments[1] or "noname"),
+        Operation = operation,
+    }
+end
+
+function executers.startmovie (arguments) return movie_or_sound(pdf_start ,arguments) end
+function executers.stopmovie  (arguments) return movie_or_sound(pdf_stop  ,arguments) end
+function executers.resumemovie(arguments) return movie_or_sound(pdf_resume,arguments) end
+function executers.pausemovie (arguments) return movie_or_sound(pdf_pause ,arguments) end
+
+function executers.startsound (arguments) return movie_or_sound(pdf_start ,arguments) end
+function executers.stopsound  (arguments) return movie_or_sound(pdf_stop  ,arguments) end
+function executers.resumesound(arguments) return movie_or_sound(pdf_resume,arguments) end
+function executers.pausesound (arguments) return movie_or_sound(pdf_pause ,arguments) end
+
+function specials.action(var)
+    local operation = var.operation
+    if var.operation and operation ~= "" then
+        local e = executers[operation]
+        if type(e) == "table" then
+            return e
+        elseif type(e) == "function" then
+            return e(var.arguments)
+        end
+    end
+end
+
+--~ entry.A = pdfdictionary {
+--~     S = pdfconstant("GoTo"),
+--~     D = ....
+--~ }
+
+local function build(levels,start,parent,method)
+    local startlevel = levels[start][1]
+    local i, n = start, 0
+    local child, entry, m, prev, first, last, f, l
+-- to be tested: i can be nil
+    while i and i <= #levels do
+        local li = levels[i]
+        local level, title, reference, open = li[1], li[2], li[3], li[4]
+        if level == startlevel then
+            if trace_bookmarks then
+                logs.report("bookmark","%3i %s%s %s",realpage,rep("  ",level-1),(open and "+") or "-",title)
+            end
+            local prev = child
+            child = pdfreserveobj()
+            if entry then
+                entry.Next = child and pdfreference(child)
+                pdfimmediateobj(prev,tostring(entry))
+            end
+            entry = pdfdictionary {
+                Title  = pdfunicode(title),
+                Parent = parent,
+                Prev   = prev and pdfreference(prev),
+            }
+            if method == "internal" then
+                entry.Dest = "aut:" .. reference.internal
+            else -- if method == "page" then
+                entry.Dest = pagedest(reference.realpage)
+            end
+            if not first then first, last = child, child end
+            prev = child
+            last = prev
+            n = n + 1
+            i = i + 1
+        elseif level < startlevel then
+            pdfimmediateobj(child,tostring(entry))
+            return i, n, first, last
+        elseif i < #levels and level > startlevel then
+            i, m, f, l = build(levels,i,pdfreference(child),method)
+            entry.Count = (open and m) or -m
+            if m > 0 then
+                entry.First, entry.Last = pdfreference(f), pdfreference(l)
+            end
+        else
+            -- missing intermediate level but ok
+            i, m, f, l = build(levels,i,pdfreference(child),method)
+            entry.Count = (open and m) or -m
+            if m > 0 then
+                entry.First, entry.Last = pdfreference(f), pdfreference(l)
+            end
+            pdfimmediateobj(child,tostring(entry))
+            return i, n, first, last
+        end
+    end
+    pdfimmediateobj(child,tostring(entry))
+    return _, n, first, last
+end
+
+function codeinjections.addbookmarks(levels,method)
+    local parent = pdfreserveobj()
+    local _, m, first, last = build(levels,1,pdfreference(parent),method or "internal")
+    local dict = pdfdictionary {
+        Type  = pdfconstant("Outlines"),
+        First = pdfreference(first),
+        Last  = pdfreference(last),
+        Count = m,
+    }
+    pdfimmediateobj(parent,tostring(dict))
+    lpdf.addtocatalog("Outlines",lpdf.reference(parent))
+end
diff --git a/tex/context/base/lpdf-col.lua b/tex/context/base/lpdf-col.lua
new file mode 100644
index 000000000..219188369
--- /dev/null
+++ b/tex/context/base/lpdf-col.lua
@@ -0,0 +1,150 @@
+if not modules then modules = { } end modules ['lpdf-mis'] = {
+    version   = 1.001,
+    comment   = "companion to back-pdf.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+local type = type
+local format, gsub = string.format, string.gsub
+
+-- colors         = colors         or { }
+-- transparencies = transparencies or { }
+
+local registercolor        = colors.register
+local registertransparancy = transparencies.register
+local colorsvalue          = colors.value
+local transparenciesvalue  = transparencies.value
+
+-- Literals needed to inject code in the mp stream, we cannot use attributes there
+-- since literals may have qQ's, much may go away once we have mplib code in place.
+--
+-- This module assumes that some functions are defined in the colors namespace
+-- which mostlikely will be loaded later.
+
+function lpdf.color(model,ca,default) -- todo: use gray when no color
+    local cv = colorsvalue(ca)
+    if cv then
+        if model == 1 then
+            model = cv[1]
+        end
+        if model == 2 then
+            local s = cv[2]
+            return format("%s g %s G",s,s)
+        elseif model == 3 then
+            local r, g, b = cv[3], cv[4], cv[5]
+            return format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b)
+        elseif model == 4 then
+            local c, m, y, k = cv[6],cv[7],cv[8],cv[9]
+            return format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k)
+        else
+            local n,f,d,p = cv[10],cv[11],cv[12],cv[13]
+            if type(p) == "string" then
+                p = gsub(p,","," ") -- brr misuse of spot
+            end
+            return format("/%s cs /%s CS %s SCN %s scn",n,n,p,p)
+        end
+    else
+        return format("%s g %s G",default or 0,default or 0)
+    end
+end
+
+function lpdf.transparency(ct,default)
+    -- beware, we need this hack because normally transparencies are not
+    -- yet registered and therefore the number is not not known ... we
+    -- might use the attribute number itself in the future
+    local ct = transparenciesvalue(ct)
+    if ct then
+        return format("/Tr%s gs",registertransparancy(nil,ct[1],ct[2]))
+    else
+        return "/Tr0 gs"
+    end
+end
+
+function lpdf.colorvalue(model,ca,default)
+    local cv = colorsvalue(ca)
+    if cv then
+        if model == 1 then
+            model = cv[1]
+        end
+        if model == 2 then
+            return format("%s",cv[2])
+        elseif model == 3 then
+            return format("%s %s %s",cv[3],cv[4],cv[5])
+        elseif model == 4 then
+            return format("%s %s %s %s",cv[6],cv[7],cv[8],cv[9])
+        else
+            return format("%s",cv[13])
+        end
+    else
+        return format("%s",default or 0)
+    end
+end
+
+function lpdf.fdfcolor(model,ca,default)
+    local cv = colorsvalue(ca)
+    if cv then
+        if model == 1 then
+            model = cv[1]
+        end
+        if model == 2 then
+            return format("[%s]",cv[2])
+        elseif model == 3 then
+            return format("[%s %s %s]",cv[3],cv[4],cv[5])
+        elseif model == 4 then
+            return format("[%s %s %s %s]",cv[6],cv[7],cv[8],cv[9])
+        elseif model == 4 then
+            return format("[%s]",cv[13])
+        end
+    else
+        return format("[%s]",default or 0)
+    end
+end
+
+function lpdf.colorspace(model,ca)
+    local cv = colorsvalue(ca)
+    if cv then
+        if model == 1 then
+            model = cv[1]
+        end
+        if model == 2 then
+            return "DeviceGray"
+        elseif model == 3 then
+            return "DeviceRGB"
+        elseif model == 4 then
+            return "DeviceCMYK"
+        end
+    end
+    return "DeviceGRAY"
+end
+
+-- by registering we getconversion for free (ok, at the cost of overhead)
+
+local intransparency = false
+local pdfcolor       = lpdf.color
+
+function lpdf.rgbcode(model,r,g,b)
+    return pdfcolor(model,registercolor('color',nil,'rgb',r,g,b))
+end
+function lpdf.cmykcode(model,c,m,y,k)
+    return pdfcolor(model,registercolor('color',nil,'cmyk',c,m,y,k))
+end
+function lpdf.graycode(model,s)
+    return pdfcolor(model,registercolor('color',nil,'gray',s))
+end
+function lpdf.spotcode(model,n,f,d,p)
+    return pdfcolor(model,registercolor('color',nil,'spot',n,f,d,p)) -- incorrect
+end
+function lpdf.transparencycode(a,t)
+    intransparency = true
+    return format("/Tr%s gs",registertransparancy(nil,a,t))
+end
+function lpdf.finishtransparencycode()
+    if intransparency then
+        intransparency = false
+        return "/Tr0 gs"  -- we happen to know this -)
+    else
+        return ""
+    end
+end
diff --git a/tex/context/base/lpdf-fld.lua b/tex/context/base/lpdf-fld.lua
new file mode 100644
index 000000000..b9c63347f
--- /dev/null
+++ b/tex/context/base/lpdf-fld.lua
@@ -0,0 +1,747 @@
+if not modules then modules = { } end modules ['lpdf-fld'] = {
+    version   = 1.001,
+    comment   = "companion to lpdf-ini.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+-- cleaned up, e.g. no longer older viewers
+-- always kids so no longer explicit main / clone / copy
+-- some optimizations removed (will come bakc if needed)
+
+local gmatch, lower, format = string.gmatch, string.lower, string.format
+
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+
+local variables = interfaces.variables
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations  = backends.pdf.registrations
+
+local registeredsymbol = codeinjections.registeredsymbol
+
+local pdfstream     = lpdf.stream
+local pdfdictionary = lpdf.dictionary
+local pdfarray      = lpdf.array
+local pdfreference  = lpdf.reference
+local pdfunicode    = lpdf.unicode
+local pdfstring     = lpdf.string
+local pdfconstant   = lpdf.constant
+local pdftoeight    = lpdf.toeight
+
+local pdfimmediateobj = pdf.immediateobj
+local pdfreserveobj   = pdf.reserveobj
+
+local submitoutputformat = 0 --  0=unknown 1=HTML 2=FDF 3=XML   => not yet used, needs to be checked
+
+local splitter = lpeg.splitat("=>")
+
+local formats = {
+    html = 1, fdf = 2, xml = 3,
+}
+
+function codeinjections.setformsmethod(name)
+    submitoutputformat = formats[lower(name)] or 3
+end
+
+local flag = {
+    MultiLine       =     4096, --  13
+    NoToggleToOff   =    16384, --  15
+    Radio           =    32768, --  16
+    PushButton      =    65536, --  17
+    PopUp           =   131072, --  18
+    Edit            =   262144, --  19
+    RadiosInUnison  = 33554432, --  26
+    DoNotSpellCheck =  4194304, --  23
+    DoNotScroll     =  8388608, --  24
+    ReadOnly        =        1, --   1
+    Required        =        2, --   2
+    NoExport        =        4, --   3
+    Password        =     8192, --  14
+    Sort            =   524288, --  20
+    FileSelect      =  1048576, --  21
+}
+
+local plus = {
+    Invisible       =        1, --   1
+    Hidden          =        2, --   2
+    Printable       =        4, --   3
+    NoView          =       32, --   6
+    ToggleNoView    =      256, --   9
+    AutoView        =      256, -- 288 (6+9)
+}
+
+flag.readonly    = flag.ReadOnly
+flag.required    = flag.Required
+flag.protected   = flag.Password
+flag.sorted      = flag.Sort
+flag.unavailable = flag.NoExport
+flag.nocheck     = flag.DoNotSpellCheck
+flag.fixed       = flag.DoNotScroll
+flag.file        = flag.FileSelect
+
+plus.hidden      = plus.Hidden
+plus.printable   = plus.Printable
+plus.auto        = plus.AutoView
+
+-- some day .. lpeg with function
+
+local function fieldflag(specification)
+    local o, n = specification.options, 0
+    if o and o ~= "" then
+        for f in gmatch(o,"[^, ]+") do
+            n = n + (flag[f] or 0)
+        end
+    end
+    return n
+end
+
+local function fieldplus(specification)
+    local o, n = specification.options, 0
+    if o and o ~= "" then
+        for p in gmatch(o,"[^, ]") do
+            n = n + (plus[p] or 0)
+        end
+    end
+    return n
+end
+
+
+local function checked(what)
+    if what and what ~= "" then
+        local set, bug = jobreferences.identify("",what)
+        return not bug and #set > 0 and lpdf.pdfaction(set)
+    end
+end
+
+local function fieldactions(specification) -- share actions
+    local d, a = { }, nil
+    a = specification.mousedown         if a and a ~= "" then d.D  = checked(a) end
+    a = specification.mouseup           if a and a ~= "" then d.U  = checked(a) end
+    a = specification.enterregion       if a and a ~= "" then d.E  = checked(a) end
+    a = specification.exitregion        if a and a ~= "" then d.X  = checked(a) end
+    a = specification.afterkeystroke    if a and a ~= "" then d.K  = checked(a) end
+    a = specification.formatresult      if a and a ~= "" then d.F  = checked(a) end
+    a = specification.validateresult    if a and a ~= "" then d.V  = checked(a) end
+    a = specification.calculatewhatever if a and a ~= "" then d.C  = checked(a) end
+    a = specification.focusin           if a and a ~= "" then d.Fo = checked(a) end
+    a = specification.focusout          if a and a ~= "" then d.Bl = checked(a) end
+ -- a = specification.openpage          if a and a ~= "" then d.PO = checked(a) end
+ -- a = specification.closepage         if a and a ~= "" then d.PC = checked(a) end
+ -- a = specification.visiblepage       if a and a ~= "" then d.PV = checked(a) end
+ -- a = specification.invisiblepage     if a and a ~= "" then d.PI = checked(a) end
+    return next(d) and pdfdictionary(d)
+end
+
+-- fonts and color
+
+local fontnames = {
+    rmtf = "Times-Roman",           rmbf = "Times-Bold",
+    rmit = "Times-Italic",          rmsl = "Times-Italic",
+    rmbi = "Times-BoldItalic",      rmbs = "Times-BoldItalic",
+    sstf = "Helvetica",             ssbf = "Helvetica-Bold",
+    ssit = "Helvetica-Oblique",     sssl = "Helvetica-Oblique",
+    ssbi = "Helvetica-BoldOblique", ssbs = "Helvetica-BoldOblique",
+    tttf = "Courier",               ttbf = "Courier-Bold",
+    ttit = "Courier-Oblique",       ttsl = "Courier-Oblique",
+    ttbi = "Courier-BoldOblique",   ttbs = "Courier-BoldOblique",
+}
+
+local usedfonts = { }
+
+local function fieldsurrounding(specification)
+    local tag = (specification.fontstyle or "tt") .. (specification.fontalternative or "tf")
+    if not fontnames[tag] then
+        tag = "tttf"
+    end
+    local size = specification.fontsize
+    local stream = pdfstream {
+        pdfconstant(tag),
+        format("%s Tf",(size and (number.dimenfactors.bp * size)) or 12),
+    }
+    usedfonts[tag] = true
+    -- add color to stream: 0 g
+    -- move up with "x.y Ts"
+    return tostring(stream)
+end
+
+local function registerfonts()
+    if next(usedfonts) then
+        local d = pdfdictionary()
+        for tag, _ in next, usedfonts do
+            local f = pdfdictionary {
+                Type     = pdfconstant("Font"),
+                Subtype  = pdfconstant("Type1"), -- todo
+                Name     = pdfconstant(tag),
+                BaseFont = pdfconstant(fontnames[tag]),
+            }
+            d[tag] = pdfreference(pdfimmediateobj(tostring(f)))
+        end
+        return d
+    end
+end
+
+-- cache
+
+local function fieldattributes(specification)
+--~     return pdfarray {
+--~     --    BG = -- backgroundcolor
+--~     --    BC = -- framecolor
+--~     }
+    return nil
+end
+
+-- symbols
+
+local function fieldappearances(specification)
+    -- todo: caching
+    local values = specification.values
+    local default = specification.default
+    if not values then
+        -- error
+        return
+    end
+    local v = aux.settings_to_array(values)
+    local n, r, d
+    if #v == 1 then
+        n, r, d = v[1], v[1], v[1]
+    elseif #v == 2 then
+        n, r, d = v[1], v[1], v[2]
+    else
+        n, r, d = v[1], v[2], v[3]
+    end
+    local appearance = pdfdictionary { -- cache this one
+        N = registeredsymbol(n), R = registeredsymbol(r), D = registeredsymbol(d),
+    }
+    return lpdf.sharedobj(tostring(appearance))
+end
+
+local function fieldstates(specification)
+    -- splitter not needed, wil go
+    -- todo: caching
+    local values, default = specification.values, specification.default
+    if not values then
+        -- error
+        return
+    end
+    local v = aux.settings_to_array(values)
+    local yes, off
+    if #v == 1 then
+        yes, off = v[1], v[1]
+    else
+        yes, off = v[1], v[2]
+    end
+    local yesshown, yesvalue = splitter:match(yes)
+    if not (yesshown and yesvalue) then
+        yesshown = yes, yes
+    end
+    yes = aux.settings_to_array(yesshown)
+    local offshown, offvalue = splitter:match(off)
+    if not (offshown and offvalue) then
+        offshown = off, off
+    end
+    off = aux.settings_to_array(offshown)
+    if #yes == 1 then
+        yesn, yesr, yesd = yes[1], yes[1], yes[1]
+    elseif #yes == 2 then
+        yesn, yesr, yesd = yes[1], yes[1], yes[2]
+    else
+        yesn, yesr, yesd = yes[1], yes[2], yes[3]
+    end
+    if #off == 1 then
+        offn, offr, offd = off[1], off[1], off[1]
+    elseif #off == 2 then
+        offn, offr, offd = off[1], off[1], off[2]
+    else
+        offn, offr, offd = off[1], off[2], off[3]
+    end
+    if not yesvalue then
+        yesvalue = yesn
+    end
+    if not offvalue then
+        offvalue = offn
+    end
+    if default == yesn then
+        default = pdfconstant(yesn)
+    else
+        default = pdfconstant("Off")
+    end
+    local appearance = pdfdictionary { -- mayeb also cache components
+        N = pdfdictionary { [yesn] = registeredsymbol(yesn), Off = registeredsymbol(offn) },
+        R = pdfdictionary { [yesr] = registeredsymbol(yesr), Off = registeredsymbol(offr) },
+        D = pdfdictionary { [yesd] = registeredsymbol(yesd), Off = registeredsymbol(offd) }
+    }
+    local appearanceref = lpdf.sharedobj(tostring(appearance))
+    return appearanceref, default
+end
+
+local function fieldoptions(specification)
+    local values = specification.values
+    local default = specification.default
+    if values then
+        local v = aux.settings_to_array(values)
+        for i=1,#v do
+            local vi = v[i]
+            local shown, value = splitter:match(vi)
+            if shown and value then
+                v[i] = pdfarray { pdfunicode(value), shown }
+            else
+                v[i] = pdfunicode(v[i])
+            end
+        end
+        return pdfarray(v)
+    end
+end
+
+local function radiodefault(parent,field)
+    local default, values = parent.default, parent.values
+    if not default or default == "" then
+        values = aux.settings_to_array(values)
+        default = values[1]
+    end
+    local name = field.name
+    local fieldvalues = aux.settings_to_array(field.values)
+    local yes, off = fieldvalues[1], fieldvalues[2] or fieldvalues[1]
+    if not default then
+        return pdfconstant(yes)
+    elseif default == name then
+        return pdfconstant(default)
+    else
+        return pdfconstant("Off")
+    end
+end
+
+-- layers
+
+local function fieldlayer(specification) -- we can move this in line
+    local layer = specification.layer
+    return (layer and lpdf.layerreferences[layer]) or nil
+end
+
+-- defining
+
+local fields, radios, fieldsets, calculationset = { }, { }, { }, nil
+
+function codeinjections.definefieldset(tag,list)
+    fieldsets[tag] = list
+end
+
+function codeinjections.getfieldset(tag)
+    return fieldsets[tag]
+end
+
+local function fieldsetlist(tag)
+    if tag then
+        local ft = fieldsets[tag]
+        if ft then
+            local a = pdfarray()
+            for name in gmatch(list,"[^, ]+") do
+                local f = field[name]
+                if f and f.pobj then
+                    a[#a+1] = pdfreference(f.pobj)
+                end
+            end
+            return a
+        end
+    end
+end
+
+function codeinjections.setfieldcalculationset(tag)
+    calculationset = tag
+end
+
+local function predefinesymbols(specification)
+    local values = specification.values
+    if values then
+        local a, b = splitter:match(values)
+        codeinjections.presetsymbollist(a or values)
+    end
+end
+
+function codeinjections.getdefaultfieldvalue(name)
+    local f = fields[name]
+    if f then
+        local values  = f.values
+        local default = f.default
+        if not default or default == "" then
+            local a, b = splitter:match(values)
+            values = a or values
+            for name in gmatch(list,"[^, ]+") do
+                default = name
+                break
+            end
+        end
+        if default then
+            tex.sprint(ctxcatcodes,default)
+        end
+    end
+end
+
+
+function codeinjections.definefield(specification)
+    local n = specification.name
+    local f = fields[n]
+    if not f then
+        local kind = specification.kind
+        if not kind then
+            -- name and kind are mandate
+        elseif kind == "radio" then
+            local values = specification.values
+            if values and values ~= "" then
+                values = aux.settings_to_array(values)
+                for v=1,#values do
+                    radios[values[v]] = { parent = n }
+                end
+                fields[n] = specification
+            else
+                -- invalid radio specification
+            end
+        elseif kind == "sub" then
+            -- not in main field list !
+            local radio = radios[n]
+            if radio then
+                -- merge specification
+                for key, value in next, specification do
+                    radio[key] = value
+                end
+            end
+            predefinesymbols(specification)
+        else
+            fields[n] = specification
+            predefinesymbols(specification)
+        end
+    else
+        -- already done
+    end
+end
+
+function codeinjections.clonefield(specification)
+    local p = specification.parent
+    local c = specification.children
+    if not p or not c then
+        -- parent and children are mandate
+    else
+        for n in gmatch(c,"[^, ]+") do
+            local f = fields[n]
+            if f and not f.done then
+                -- already done
+            else
+                fields[n] = specification
+            end
+        end
+    end
+end
+
+function codeinjections.getfieldgroup(name)
+    local f = fields[name]
+    if f and f.group then
+        texsprint(ctxcatcodes,f.group)
+    end
+end
+
+--
+
+function codeinjections.doiffieldset(tag)
+    commands.testcase(fieldsets[tag])
+end
+
+function codeinjections.doiffieldelse(name)
+    commands.testcase(fields[name])
+end
+
+--
+
+local alignments = {
+    flushleft  = 0, right  = 0,
+    center     = 1, middle = 1,
+    flushright = 2, left   = 2,
+}
+
+local function fieldalignment(specification)
+    return alignments[specification.align] or 0
+end
+
+local function enhance(specification,option)
+    local so = specification.options
+    if so and so ~= "" then
+        specification.options = so .. "," .. option
+    else
+        specification.options = option
+    end
+    return specification
+end
+
+-- finish
+
+local collected = pdfarray()
+
+function codeinjections.finishfields()
+    for name, field in next, fields do
+        local kids = field.kids
+        if kids then
+            pdfimmediateobj(field.kobj,tostring(kids))
+        end
+        local pobj = field.pobj
+    end
+    for name, field in next, radios do
+        local kids = field.kids
+        if kids then
+            pdfimmediateobj(field.kobj,tostring(kids))
+        end
+    end
+    if #collected > 0 then
+        local acroform = pdfdictionary {
+            NeedAppearances = true,
+            Fields = pdfreference(pdfimmediateobj(tostring(collected))),
+            DR     = pdfdictionary { Font = registerfonts() },
+            CO     = fieldsetlist(calculationset),
+            DA     = "/tttf 12 Tf 0 g",
+        }
+        lpdf.addtocatalog("AcroForm",pdfreference(pdfimmediateobj(tostring(acroform))))
+    end
+    lpdf.finishfields = function() end
+end
+
+local pdf_widget = pdfconstant("Widget")
+local pdf_tx     = pdfconstant("Tx")
+local pdf_ch     = pdfconstant("Ch")
+local pdf_btn    = pdfconstant("Btn")
+local pdf_yes    = pdfconstant("Yes")
+local pdf_p      = pdfconstant("P") -- None Invert Outline Push
+local pdf_n      = pdfconstant("N") -- None Invert Outline Push
+--
+local pdf_no_rect = pdfarray { 0, 0, 0, 0 }
+
+local methods = { }
+
+function codeinjections.typesetfield(name,specification)
+    local field = fields[name] or radios[name]
+    if not field then
+        tex.write("error: " .. name)
+        -- unknown field
+        return
+    end
+    local method = methods[field.kind]
+    if method then
+        method(name,specification)
+    end
+end
+
+-- can be optional multipass optimization (share objects)
+
+local function save_parent(field,specification,d)
+    local kn = pdfreserveobj()
+    d.Kids = pdfreference(kn)
+    field.kobj = kn
+    field.kids = pdfarray()
+    local pn = pdfimmediateobj(tostring(d))
+    field.pobj = pn
+    collected[#collected+1] = pdfreference(pn)
+end
+
+local function save_kid(field,specification,d)
+    local kn = pdfreserveobj()
+    field.kids[#field.kids+1] = pdfreference(kn)
+    node.write(nodes.pdfannot(specification.width,specification.height,0,d(),kn))
+end
+
+function methods.line(name,specification,extras)
+    local field = fields[name]
+    local kind = field.kind
+    if not field.pobj then
+        if extras then
+            enhance(specification,extras)
+        end
+        local text = pdfunicode(specification.default)
+        local d = pdfdictionary {
+            Subtype  = pdf_widget,
+            T        = pdfunicode(specification.title),
+            F        = fieldplus(specification),
+            Ff       = fieldflag(specification),
+            OC       = fieldlayer(specification),
+            MK       = fieldsurrounding(specification),
+            AA       = fieldactions(specification),
+            FT       = pdf_tx,
+            Q        = fieldalignment(specification),
+            MaxLen   = (specification.length == 0 and 1000) or specification.length,
+            DV       = text,
+            V        = text,
+        }
+        save_parent(field,specification,d)
+        field.specification = specification
+    end
+    specification = field.specification or { } -- todo: radio spec
+    local d = pdfdictionary {
+        Subtype = pdf_widget,
+        Parent  = pdfreference(field.pobj),
+        F       = fieldplus(specification),
+        DA      = fieldattributes(specification),
+        OC      = fieldlayer(specification),
+        MK      = fieldsurrounding(specification),
+        AA      = fieldactions(specification),
+        Q       = fieldalignment(specification)
+    }
+    save_kid(field,specification,d)
+end
+
+function methods.text(name,specification)
+    methods.line(name,specification,"MultiLine")
+end
+
+function methods.choice(name,specification,extras)
+    local field = fields[name]
+    local kind = field.kind
+    local d
+    if not field.pobj then
+        if extras then
+            enhance(specification,extras)
+        end
+        local d = pdfdictionary {
+            Subtype  = pdf_widget,
+            T        = pdfunicode(specification.title),
+            F        = fieldplus(specification),
+            Ff       = fieldflag(specification),
+            OC       = fieldlayer(specification),
+            AA       = fieldactions(specification),
+            FT       = pdf_ch,
+            Opt      = fieldoptions(field),
+        }
+        save_parent(field,specification,d)
+        field.specification = specification
+    end
+    specification = field.specification or { }
+    local d = pdfdictionary {
+        Subtype = pdf_widget,
+        Parent  = pdfreference(field.pobj),
+        F       = fieldplus(specification),
+        DA      = fieldattributes(specification),
+        OC      = fieldlayer(specification),
+        AA      = fieldactions(specification),
+    }
+    save_kid(field,specification,d)
+end
+
+function methods.popup(name,specification)
+    methods.choice(name,specification,"PopUp")
+end
+function methods.combo(name,specification)
+    methods.choice(name,specification,"PopUp,Edit")
+end
+
+-- probably no default appearance needed for first kid
+
+function methods.check(name,specification)
+    -- no /Opt because (1) it's messy - see pdf spec, (2) it discouples kids and
+    -- contrary to radio there is no way to associate then
+    local field = fields[name]
+    local kind = field.kind
+    local appearance, default = fieldstates(field)
+    if not field.pobj then
+        local d = pdfdictionary {
+            Subtype  = pdf_widget,
+            T        = pdfunicode(specification.title),
+            F        = fieldplus(specification),
+            Ff       = fieldflag(specification),
+            OC       = fieldlayer(specification),
+            AA       = fieldactions(specification),
+            FT       = pdf_btn,
+            DV       = default,
+            V        = default,
+            AS       = default,
+            AP       = appearance,
+            H        = pdf_n,
+        }
+        save_parent(field,specification,d)
+        field.specification = specification
+    end
+    specification = field.specification or { } -- todo: radio spec
+    local d = pdfdictionary {
+        Subtype = pdf_widget,
+        Parent  = pdfreference(field.pobj),
+        F       = fieldplus(specification),
+        DA      = fieldattributes(specification),
+        OC      = fieldlayer(specification),
+        AA      = fieldactions(specification),
+        DV      = default,
+        V       = default,
+        AS      = default,
+        AP      = appearance,
+        H       = pdf_n,
+    }
+    save_kid(field,specification,d)
+end
+
+function methods.push(name,specification)
+    local field = fields[name]
+    local kind = field.kind
+    if not field.pobj then
+        enhance(specification,"PushButton")
+        local d = pdfdictionary {
+            Subtype  = pdf_widget,
+            T        = pdfunicode(specification.title),
+            F        = fieldplus(specification),
+            Ff       = fieldflag(specification),
+            OC       = fieldlayer(specification),
+            AA       = fieldactions(specification),
+            FT       = pdf_btn,
+            AP       = fieldappearances(field),
+            H        = pdf_p,
+        }
+        save_parent(field,specification,d)
+        field.specification = specification
+    end
+    specification = field.specification or { } -- todo: radio spec
+    local d = pdfdictionary {
+        Subtype = pdf_widget,
+        Parent  = pdfreference(field.pobj),
+        F       = fieldplus(specification),
+        DA      = fieldattributes(specification),
+        OC      = fieldlayer(specification),
+        AA      = fieldactions(specification),
+        AP      = fieldappearances(field),
+        H       = pdf_p,
+    }
+    save_kid(field,specification,d)
+end
+
+function methods.sub(name,specification)
+    local field = radios[name]
+    if not field then
+        return
+    end
+    local parent = fields[field.parent]
+    if not parent then
+        return
+    end
+    if not parent.pobj then
+        local specification = parent.specification or { }
+        enhance(specification,"Radio,RadiosInUnison")
+        local d = pdfdictionary {
+            T    = parent.name,
+            FT   = pdf_btn,
+            Rect = pdf_no_rect,
+            F    = fieldplus(specification),
+            Ff   = fieldflag(specification),
+            H    = pdf_n,
+        }
+        save_parent(parent,specification,d)
+    end
+    local appearance = fieldstates(field)
+    local default = radiodefault(parent,field)
+    local d = pdfdictionary {
+        Subtype = pdf_widget,
+        Parent  = pdfreference(parent.pobj),
+        F       = fieldplus(specification),
+        DA      = fieldattributes(specification),
+        OC      = fieldlayer(specification),
+        AA      = fieldactions(specification),
+        DV      = default,
+        V       = default,
+        AS      = default,
+        AP      = appearance,
+        H       = pdf_n,
+    }
+    save_kid(parent,specification,d)
+end
diff --git a/tex/context/base/lpdf-grp.lua b/tex/context/base/lpdf-grp.lua
new file mode 100644
index 000000000..119d25ee4
--- /dev/null
+++ b/tex/context/base/lpdf-grp.lua
@@ -0,0 +1,70 @@
+if not modules then modules = { } end modules ['lpdf-grp'] = {
+    version   = 1.001,
+    comment   = "companion to lpdf-ini.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+local format = string.format
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations  = backends.pdf.registrations
+
+local pdfdictionary = lpdf.dictionary
+local pdfarray      = lpdf.array
+local pdfconstant   = lpdf.constant
+local pdfreference  = lpdf.reference
+
+local pdfreserveobj   = pdf.reserveobj
+local pdfimmediateobj = pdf.immediateobj
+
+local function shade(stype,name,domain,color_a,color_b,n,colorspace,coordinates)
+    local f = pdfdictionary {
+        FunctionType = 2,
+        Domain       = pdfarray(domain), -- domain is actually a string
+        C0           = pdfarray(color_a),
+        C1           = pdfarray(color_b),
+        N            = tonumber(n),
+    }
+    local s = pdfdictionary {
+        ShadingType = stype,
+        ColorSpace  = pdfconstant(colorspace),
+        Function    = pdfreference(pdfimmediateobj(tostring(f))),
+        Coords      = pdfarray(coordinates),
+        Extend      = pdfarray { true, true },
+    }
+    lpdf.adddocumentshade(name,pdfreference(pdfimmediateobj(tostring(s))))
+end
+
+function lpdf.circularshade(name,domain,color_a,color_b,n,colorspace,coordinates)
+    shade(3,name,domain,color_a,color_b,n,colorspace,coordinates)
+end
+
+function lpdf.linearshade(name,domain,color_a,color_b,n,colorspace,coordinates)
+    shade(2,name,domain,color_a,color_b,n,colorspace,coordinates)
+end
+
+function lpdf.colorspec(model,ca,default)
+    if ca and ca > 0 then
+        local cv = colors.value(ca)
+        if cv then
+            if model == 1 then
+                model = cv[1]
+            end
+            if model == 2 then
+                return pdfarray { cv[2] }
+            elseif model == 3 then
+                return pdfarray { cv[3],cv[4],cv[5] }
+            elseif model == 4 then
+                return pdfarray { cv[6],cv[7],cv[8],cv[9] }
+            elseif model == 5 then
+                return pdfarray { cv[13] }
+            end
+        end
+    end
+    if default then
+        return default
+    end
+end
diff --git a/tex/context/base/lpdf-ini.lua b/tex/context/base/lpdf-ini.lua
index 92207d728..bc89c4872 100644
--- a/tex/context/base/lpdf-ini.lua
+++ b/tex/context/base/lpdf-ini.lua
@@ -8,9 +8,11 @@ if not modules then modules = { } end modules ['back-pdf'] = {
 
 -- This code is very experimental !
 
-local setmetatable, getmetatable, type, next, tostring, tonumber = setmetatable, getmetatable, type, next, tostring, tonumber
+local setmetatable, getmetatable, type, next, tostring, tonumber, rawset = setmetatable, getmetatable, type, next, tostring, tonumber, rawset
 local char, byte, format, gsub, concat = string.char, string.byte, string.format, string.gsub, table.concat
 local utfvalues = string.utfvalues
+local texwrite = tex.write
+local sind, cosd = math.sind, math.cosd
 
 lpdf = lpdf or { }
 
@@ -31,6 +33,47 @@ local function tosixteen(str)
     end
 end
 
+lpdf.tosixteen = tosixteen
+
+-- lpeg is some 5 times faster than gsub (in test) on escaping
+
+local escapes = {
+    ["\\"] = "\\\\",
+    ["/"] = "\\/", ["#"] = "\\#",
+    ["<"] = "\\<", [">"] = "\\>",
+    ["["] = "\\[", ["]"] = "\\]",
+    ["("] = "\\(", [")"] = "\\)",
+}
+
+local escaped = lpeg.Cs(lpeg.Cc("(") * (lpeg.S("\\/#<>[]()")/escapes + lpeg.P(1))^0 * lpeg.Cc(")"))
+
+local function toeight(str)
+ -- if not str or str == "" then
+ --     return "()"
+ -- else
+ --     return escaped:match(str)
+ -- end
+ --
+ -- no need for escaping .. just use unicode instead
+    return "(" .. str .. ")"
+end
+
+lpdf.toeight = toeight
+
+local escapes = "-"
+
+local escaped = lpeg.Cs(lpeg.Cc("(") * (lpeg.S("\\/#<>[]()")/escapes + lpeg.P(1))^0 * lpeg.Cc(")"))
+
+local function cleaned(str)
+    if not str or str == "" then
+        return "()"
+    else
+        return escaped:match(str)
+    end
+end
+
+lpdf.cleaned = cleaned
+
 local function merge_t(a,b)
     local t = { }
     for k,v in next, a do t[k] = v end
@@ -40,14 +83,20 @@ end
 
 local tostring_a, tostring_d
 
-tostring_d = function(t)
+tostring_d = function(t,contentonly,key)
     if not next(t) then
-        return "<< >>"
+        if contentonly then
+            return ""
+        else
+            return "<< >>"
+        end
     else
-        local r = { "<<" }
+        local r = { }
         for k, v in next, t do
             local tv = type(v)
             if tv == "string" then
+                r[#r+1] = format("/%s %s",k,toeight(v))
+            elseif tv == "unicode" then
                 r[#r+1] = format("/%s %s",k,tosixteen(v))
             elseif tv == "table" then
                 local mv = getmetatable(v)
@@ -62,19 +111,30 @@ tostring_d = function(t)
                 r[#r+1] = format("/%s %s",k,tostring(v))
             end
         end
-        r[#r+1] = ">>"
-        return concat(r, " ")
+        if contentonly then
+            return concat(r, " ")
+        elseif key then
+            return format("/%s << %s >>", key, concat(r, " "))
+        else
+            return format("<< %s >>", concat(r, " "))
+        end
     end
 end
 
-tostring_a = function(t)
+tostring_a = function(t,contentonly,key)
     if #t == 0 then
-        return "[ ]"
+        if contentonly then
+            return ""
+        else
+            return "[ ]"
+        end
     else
-        local r = { "[" }
+        local r = { }
         for k, v in next, t do
             local tv = type(v)
             if tv == "string" then
+                r[#r+1] = toeight(v)
+            elseif tv == "unicode" then
                 r[#r+1] = tosixteen(v)
             elseif tv == "table" then
                 local mv = getmetatable(v)
@@ -89,54 +149,82 @@ tostring_a = function(t)
                 r[#r+1] = tostring(v)
             end
         end
-        r[#r+1] = "]"
-        return concat(r, " ")
+        if contentonly then
+            return concat(r, " ")
+        elseif key then
+            return format("/%s [ %s ]", key, concat(r, " "))
+        else
+            return format("[ %s ]", concat(r, " "))
+        end
     end
 end
 
-local tostring_s = function(t) return tosixteen(t[1]) end
+local tostring_x = function(t) return concat(t, " ")  end
+local tostring_s = function(t) return toeight(t[1])   end
+local tostring_u = function(t) return tosixteen(t[1]) end
 local tostring_n = function(t) return tostring(t[1])  end -- tostring not needed
 local tostring_c = function(t) return t[1]            end -- already prefixed (hashed)
 local tostring_z = function()  return "null"          end
 local tostring_t = function()  return "true"          end
 local tostring_f = function()  return "false"         end
-
-local function value_s(t) return t[1]        end -- the call is experimental
-local function value_n(t) return t[1]        end -- the call is experimental
-local function value_c(t) return sub(t[1],2) end -- the call is experimental
-local function value_d(t) return t           end -- the call is experimental
-local function value_a(t) return t           end -- the call is experimental
-local function value_z()  return nil         end -- the call is experimental
-local function value_t()  return true        end -- the call is experimental
-local function value_b()  return false       end -- the call is experimental
-
+local tostring_r = function(t) return t[1] .. " 0 R"  end
+local tostring_v = function(t) return concat(t, "")   end
+
+local function value_x(t)     return t                      end -- the call is experimental
+local function value_s(t,key) return t[1]                   end -- the call is experimental
+local function value_u(t,key) return t[1]                   end -- the call is experimental
+local function value_n(t,key) return t[1]                   end -- the call is experimental
+local function value_c(t)     return sub(t[1],2)            end -- the call is experimental
+local function value_d(t)     return tostring_d(t,true,key) end -- the call is experimental
+local function value_a(t)     return tostring_a(t,true,key) end -- the call is experimental
+local function value_z()      return nil                    end -- the call is experimental
+local function value_t()      return true                   end -- the call is experimental
+local function value_b()      return false                  end -- the call is experimental
+local function value_r()      return t[1]                   end -- the call is experimental
+local function value_v()      return t                      end -- the call is experimental
+
+local function add_x(t,k,v) rawset(t,k,tostring(v)) end
+
+local mt_x = { __lpdftype = "stream",     __tostring = tostring_x, __call = value_x, __newindex = add_x }
 local mt_d = { __lpdftype = "dictionary", __tostring = tostring_d, __call = value_d }
 local mt_a = { __lpdftype = "array",      __tostring = tostring_a, __call = value_a }
+local mt_u = { __lpdftype = "unicode",    __tostring = tostring_u, __call = value_u }
 local mt_s = { __lpdftype = "string",     __tostring = tostring_s, __call = value_s }
 local mt_n = { __lpdftype = "number",     __tostring = tostring_n, __call = value_n }
 local mt_c = { __lpdftype = "constant",   __tostring = tostring_c, __call = value_c }
 local mt_z = { __lpdftype = "null",       __tostring = tostring_z, __call = value_z }
 local mt_t = { __lpdftype = "true",       __tostring = tostring_t, __call = value_t }
 local mt_f = { __lpdftype = "false",      __tostring = tostring_f, __call = value_f }
+local mt_r = { __lpdftype = "reference",  __tostring = tostring_r, __call = value_r }
+local mt_v = { __lpdftype = "verbose",    __tostring = tostring_v, __call = value_v }
+
+function lpdf.stream(t)
+    if t then
+        for i=1,#t do
+            t[i] = tostring(t[i])
+        end
+    end
+    return setmetatable(t or { },mt_x)
+end
 
 function lpdf.dictionary(t)
     return setmetatable(t or { },mt_d)
 end
 
 function lpdf.array(t)
-    return setmetatable(t or { },mt_a)
+    if type(t) == "string"then
+        return setmetatable({ t },mt_a)
+    else
+        return setmetatable(t or { },mt_a)
+    end
 end
 
-local cache = { } -- can be weak
-
 function lpdf.string(str,default)
-    str = str or default or ""
-    local c = cache[str]
-    if not c then
-        c = setmetatable({ str },mt_s)
-        cache[str] = c
-    end
-    return c
+    return setmetatable({ str or default or "" },mt_s)
+end
+
+function lpdf.unicode(str,default)
+    return setmetatable({ str or default or "" },mt_u)
 end
 
 local cache = { } -- can be weak
@@ -181,6 +269,14 @@ function lpdf.boolean(b,default)
     end
 end
 
+function lpdf.reference(r)
+    return setmetatable({ r or 0 },mt_r)
+end
+
+function lpdf.verbose(t)
+    return setmetatable(t or { },mt_v)
+end
+
 --~ local d = lpdf.dictionary()
 --~ local e = lpdf.dictionary { ["e"] = "abc" }
 --~ local f = lpdf.dictionary { ["f"] = "ABC" }
@@ -266,3 +362,157 @@ function lpdf.limited(n,min,max,default)
         end
     end
 end
+
+-- there will be more of this
+
+local pdfreference    = lpdf.reference
+local pdfdictionary   = lpdf.dictionary
+local pdfreserveobj   = pdf.reserveobj
+local pdfimmediateobj = pdf.immediateobj
+
+local texset, texsprint, ctxcatcodes = tex.set, tex.sprint, tex.ctxcatcodes
+
+local pdfobjcache = { }
+
+function lpdf.sharedobj(content)
+    local r = pdfobjcache[content]
+    if not r then
+        r = pdfreference(pdfimmediateobj(content))
+        pdfobjcache[content] = r
+    end
+    return r
+end
+
+-- saves definitions later on
+
+backends     = backends or { }
+backends.pdf = backends.pdf or {
+    comment        = "backend for directly generating pdf output",
+    nodeinjections = { },
+    codeinjections = { },
+    registrations  = { },
+    helpers        = { },
+}
+
+--
+
+local pagefinalizers, documentfinalizers = { }, { }
+
+local pageresources, pageattributes, pagesattributes
+
+local function resetpageproperties()
+    pageresources   = pdfdictionary()
+    pageattributes  = pdfdictionary()
+    pagesattributes = pdfdictionary()
+end
+
+local function setpageproperties()
+    texset("global", "pdfpageresources", pageresources  ())
+    texset("global", "pdfpageattr",      pageattributes ())
+    texset("global", "pdfpagesattr",     pagesattributes())
+end
+
+function lpdf.addtopageresources  (k,v) pageresources  [k] = v end
+function lpdf.addtopageattributes (k,v) pageattributes [k] = v end
+function lpdf.addtopagesattributes(k,v) pagesattributes[k] = v end
+
+local function set(where, f)
+    where[#where+1] = f
+end
+
+local function run(where)
+    for i=1,#where do
+        where[i]()
+    end
+end
+
+function lpdf.registerpagefinalizer(f)
+    set(pagefinalizers,f)
+end
+
+function lpdf.registerdocumentfinalizer(f)
+    set(documentfinalizers,f)
+end
+
+function lpdf.finalizepage()
+    if not environment.initex then
+        resetpageproperties()
+        run(pagefinalizers)
+        setpageproperties()
+    end
+end
+
+function lpdf.finalizedocument()
+    if not environment.initex then
+        run(documentfinalizers)
+    end
+end
+
+local c_template = "\\normalpdfcatalog{/%s %s}"
+local i_template = "\\normalpdfinfo{/%s %s}"
+local n_template = "\\normalpdfnames{/%s %s}"
+
+function lpdf.addtocatalog(k,v) if not environment.initex then texsprint(ctxcatcodes,format(c_template,k,tostring(v))) end end
+function lpdf.addtoinfo   (k,v) if not environment.initex then texsprint(ctxcatcodes,format(i_template,k,tostring(v))) end end
+function lpdf.addtonames  (k,v) if not environment.initex then texsprint(ctxcatcodes,format(n_template,k,tostring(v))) end end
+
+local r_extgstates,  d_extgstates  = pdfreserveobj(), pdfdictionary()  local p_extgstates  = pdfreference(r_extgstates)
+local r_colorspaces, d_colorspaces = pdfreserveobj(), pdfdictionary()  local p_colorspaces = pdfreference(r_colorspaces)
+local r_patterns,    d_patterns    = pdfreserveobj(), pdfdictionary()  local p_patterns    = pdfreference(r_patterns)
+local r_shades,      d_shades      = pdfreserveobj(), pdfdictionary()  local p_shades      = pdfreference(r_shades)
+
+local function checkextgstates () if next(d_extgstates ) then lpdf.addtopageresources("ExtGState", p_extgstates ) end end
+local function checkcolorspaces() if next(d_colorspaces) then lpdf.addtopageresources("ColorSpace",p_colorspaces) end end
+local function checkpatterns   () if next(d_patterns   ) then lpdf.addtopageresources("Pattern",   p_patterns   ) end end
+local function checkshades     () if next(d_shades     ) then lpdf.addtopageresources("Shading",   p_shades     ) end end
+
+local function flushextgstates () pdfimmediateobj(r_extgstates, tostring(d_extgstates )) end
+local function flushcolorspaces() pdfimmediateobj(r_colorspaces,tostring(d_colorspaces)) end
+local function flushpatterns   () pdfimmediateobj(r_patterns,   tostring(d_patterns   )) end
+local function flushshades     () pdfimmediateobj(r_shades,     tostring(d_shades     )) end
+
+--~ function lpdf.collectedresources()
+--~     local collected = pdfdictionary {
+--~         ExtGState  = (next(d_extgstates)  and p_extgstates ) or nil,
+--~         ColorSpace = (next(d_colorspaces) and p_colorspaces) or nil,
+--~         Pattern    = (next(d_patterns)    and p_patterns   ) or nil,
+--~         Shading    = (next(d_shades)      and p_shades     ) or nil,
+--~     }
+--~     if next(collected) then
+--~         tex.sprint(tex.ctxcatcodes,collected())
+--~     end
+--~ end
+
+local collected = pdfdictionary {
+    ExtGState  = p_extgstates,
+    ColorSpace = p_colorspaces,
+    Pattern    = p_patterns,
+    Shading    = p_shades,
+} ; collected = collected()
+
+function lpdf.collectedresources()
+    tex.sprint(tex.ctxcatcodes,collected)
+end
+
+function lpdf.adddocumentextgstate (k,v) d_extgstates [k] = v end
+function lpdf.adddocumentcolorspace(k,v) d_colorspaces[k] = v end
+function lpdf.adddocumentpattern   (k,v) d_patterns   [k] = v end
+function lpdf.adddocumentshade     (k,v) d_shades     [k] = v end
+
+lpdf.registerdocumentfinalizer(flushextgstates)
+lpdf.registerdocumentfinalizer(flushcolorspaces)
+lpdf.registerdocumentfinalizer(flushpatterns)
+lpdf.registerdocumentfinalizer(flushshades)
+
+lpdf.registerpagefinalizer(checkextgstates)
+lpdf.registerpagefinalizer(checkcolorspaces)
+lpdf.registerpagefinalizer(checkpatterns)
+lpdf.registerpagefinalizer(checkshades)
+
+--
+
+function lpdf.rotationcm(a)
+    local s, c = sind(a), cosd(a)
+    texwrite(format("%s %s %s %s 0 0 cm",c,s,-s,c))
+end
+
diff --git a/tex/context/base/lpdf-ini.mkiv b/tex/context/base/lpdf-ini.mkiv
index 23a81cfec..52ed6c383 100644
--- a/tex/context/base/lpdf-ini.mkiv
+++ b/tex/context/base/lpdf-ini.mkiv
@@ -14,5 +14,246 @@
 \writestatus{loading}{ConTeXt Backend Macros / PDF}
 
 \registerctxluafile{lpdf-ini}{1.001}
+\registerctxluafile{lpdf-nod}{1.001}
+%registerctxluafile{lpdf-col}{1.001} % will be loaded later
+\registerctxluafile{lpdf-mis}{1.001}
+\registerctxluafile{lpdf-ano}{1.001}
+\registerctxluafile{lpdf-ren}{1.001}
+\registerctxluafile{lpdf-grp}{1.001}
+\registerctxluafile{lpdf-wid}{1.001}
+\registerctxluafile{lpdf-fld}{1.001}
+\registerctxluafile{lpdf-u3d}{1.001}
 
-\endinput
+\unprotect
+
+% for the moment here
+
+%D \macros
+%D  {doovalbox}
+%D
+%D Drawing frames with round corners is inherited from the
+%D main module.
+%D
+%D For drawing ovals we use quite raw \PDF\ code. The next
+%D implementation does not differ that much from the one
+%D implemented in the \POSTSCRIPT\ driver.
+
+\def\doPDFovalcalc#1#2#3%
+  {\PointsToBigPoints{\dimexpr#1+#2\relax}#3}
+
+\def\doovalbox#1#2#3#4#5#6#7#8% todo: \scratchdimen/\scatchbox
+  {\forcecolorhack
+   \bgroup
+   \dimen0=#4\divide\dimen0 \plustwo
+   \doPDFovalcalc{0pt}{+\dimen0}\xmin
+   \doPDFovalcalc{#1}{-\dimen0}\xmax
+   \doPDFovalcalc{#2}{-\dimen0}\ymax
+   \doPDFovalcalc{-#3}{+\dimen0}\ymin
+   \advance\dimen0 by #5%
+   \doPDFovalcalc{0pt}{+\dimen0}\xxmin
+   \doPDFovalcalc{#1}{-\dimen0}\xxmax
+   \doPDFovalcalc{#2}{-\dimen0}\yymax
+   \doPDFovalcalc{-#3}{+\dimen0}\yymin
+   \doPDFovalcalc{#4}{\zeropoint}\stroke
+   \doPDFovalcalc{#5}{\zeropoint}\radius
+   \edef\dostroke{#6}%
+   \edef\dofill{#7}%
+   \edef\mode{\number#8 \space}%
+   % no \ifcase, else \relax in pdfcode
+   \setbox\scratchbox\hbox
+     {\ifnum\dostroke\dofill>\zerocount
+        \pdfliteral
+          {q
+           \stroke\space               w
+           \ifcase\mode
+             \xxmin\space \ymin \space m
+             \xxmax\space \ymin \space l
+             \xmax \space \ymin \space \xmax \space \yymin\space y
+             \xmax \space \yymax\space l
+             \xmax \space \ymax \space \xxmax\space \ymax \space y
+             \xxmin\space \ymax \space l
+             \xmin \space \ymax \space \xmin \space \yymax\space y
+             \xmin \space \yymin\space l
+             \xmin \space \ymin \space \xxmin\space \ymin \space y
+             h
+           \or % 1
+             \xxmin\space \ymin \space m
+             \xxmax\space \ymin \space l
+             \xmax \space \ymin \space \xmax \space \yymin\space y
+             \xmax \space \ymax \space l
+             \xmin \space \ymax \space l
+             \xmin \space \yymin\space l
+             \xmin \space \ymin \space \xxmin\space \ymin \space y
+             h
+           \or % 2
+             \xxmin\space \ymin \space m
+             \xmax \space \ymin \space l
+             \xmax \space \ymax \space l
+             \xxmin\space \ymax \space l
+             \xmin \space \ymax \space \xmin \space \yymax\space y
+             \xmin \space \yymin\space l
+             \xmin \space \ymin \space \xxmin\space \ymin \space y
+             h
+           \or % 3
+             \xmin \space \ymin \space m
+             \xmax \space \ymin \space l
+             \xmax \space \yymax\space l
+             \xmax \space \ymax \space \xxmax\space \ymax \space y
+             \xxmin\space \ymax \space l
+             \xmin \space \ymax \space \xmin \space \yymax\space y
+             \xmin \space \ymin \space l
+             h
+           \or % 4
+             \xmin \space \ymin \space m
+             \xxmax\space \ymin \space l
+             \xmax \space \ymin \space \xmax \space \yymin\space y
+             \xmax \space \yymax\space l
+             \xmax \space \ymax \space \xxmax\space \ymax \space y
+             \xmin \space \ymax \space l
+             \xmin \space \ymin\space l
+             h
+           \or % 5
+             \xmin \space \ymin \space m
+             \xmax \space \ymin \space l
+             \xmax \space \yymax\space l
+             \xmax \space \ymax \space \xxmax\space \ymax \space y
+             \xmin \space \ymax \space l
+             \xmin \space \ymin \space l
+             h
+           \or % 6
+             \xmin \space \ymin \space m
+             \xxmax\space \ymin \space l
+             \xmax \space \ymin \space \xmax \space \yymin\space y
+             \xmax \space \ymax \space l
+             \xmin \space \ymax \space l
+             \xmin \space \ymin \space l
+             h
+           \or
+             \xxmin\space \ymin \space m
+             \xmax \space \ymin \space l
+             \xmax \space \ymax \space l
+             \xmin \space \ymax \space l
+             \xmin \space \yymin\space l
+             \xmin \space \ymin \space \xxmin\space \ymin \space y
+             h
+           \or
+             \xmin \space \ymin \space m
+             \xmax \space \ymin \space l
+             \xmax \space \ymax \space l
+             \xxmin\space \ymax \space l
+             \xmin \space \ymax \space \xmin \space \yymax\space y
+             \xmin \space \ymin \space l
+             h
+           \or % 9 top open
+             \xmin \space \ymax \space m
+             \xmin \space \yymin\space l
+             \xmin \space \ymin \space \xxmin\space \ymin \space y
+             \xxmax\space \ymin \space l
+             \xmax \space \ymin \space \xmax \space \yymin\space y
+             \xmax \space \ymax \space l
+           \or % 10 right open
+             \xmax \space \ymax \space m
+             \xxmin\space \ymax \space l
+             \xmin \space \ymax \space \xmin \space \yymax\space y
+             \xmin \space \yymin\space l
+             \xmin \space \ymin \space \xxmin\space \ymin \space y
+             \xmax\space  \ymin \space l
+           \or % 11 bottom open
+             \xmax \space \ymin \space m
+             \xmax \space \yymax\space l
+             \xmax \space \ymax \space \xxmax \space \ymax\space y
+             \xxmin\space \ymax \space l
+             \xmin \space \ymax \space \xmin \space \yymax\space y
+             \xmin \space \ymin \space l
+           \or % 12 left open
+             \xmin \space \ymax \space m
+             \xxmax\space \ymax \space l
+             \xmax \space \ymax \space \xmax \space \yymax\space y
+             \xmax \space \yymin\space l
+             \xmax \space \ymin \space \xxmax\space \ymin \space y
+             \xmin \space \ymin \space l
+           \or % 13
+             \xmin \space \ymax \space m
+             \xxmax\space \ymax \space l
+             \xmax \space \ymax \space \xmax \space \yymax\space y
+             \xmax\space  \ymin \space l
+           \or % 14
+             \xmax \space \ymax \space m
+             \xmax \space \yymin\space l
+             \xmax \space \ymin \space \xxmax\space \ymin \space y
+             \xmin \space \ymin \space l
+           \or % 15
+             \xmax \space \ymin \space m
+             \xxmin\space \ymin \space l
+             \xmin \space \ymin \space \xmin \space \yymin\space y
+             \xmin \space \ymax \space l
+           \or % 16
+             \xmin \space \ymin \space m
+             \xmin \space \yymax\space l
+             \xmin \space \ymax \space \xxmin\space \ymax \space y
+             \xmax \space \ymax \space l
+           \or % 17
+             \xxmax\space \ymax \space m
+             \xmax \space \ymax \space \xmax \space \yymax\space y
+           \or % 18
+             \xmax \space \yymin\space m
+             \xmax \space \ymin \space \xxmax\space \ymin \space y
+           \or % 19
+             \xxmin\space \ymin \space m
+             \xmin \space \ymin \space \xmin \space \yymin\space y
+           \or % 20
+             \xmin \space \yymax\space m
+             \xmin \space \ymax \space \xxmin\space \ymax \space y
+           \or % 21
+             \xxmax\space \ymax \space m
+             \xmax \space \ymax \space \xmax \space \yymax\space y
+             \xmin \space \yymax\space m
+             \xmin \space \ymax \space \xxmin\space \ymax \space y
+           \or % 22
+             \xxmax\space \ymax \space m
+             \xmax \space \ymax \space \xmax \space \yymax\space y
+             \xmax \space \yymin\space m
+             \xmax \space \ymin \space \xxmax\space \ymin \space y
+           \or % 23
+             \xmax \space \yymin\space m
+             \xmax \space \ymin \space \xxmax\space \ymin \space y
+             \xxmin\space \ymin \space m
+             \xmin \space \ymin \space \xmin \space \yymin\space y
+           \or % 24
+             \xxmin\space \ymin \space m
+             \xmin \space \ymin \space \xmin \space \yymin\space y
+             \xmin \space \yymax\space m
+             \xmin \space \ymax \space \xxmin\space \ymax \space y
+           \or % 25
+             \xxmax\space \ymax \space m
+             \xmax \space \ymax \space \xmax \space \yymax\space y
+             \xmax \space \yymin\space m
+             \xmax \space \ymin \space \xxmax\space \ymin \space y
+             \xxmin\space \ymin \space m
+             \xmin \space \ymin \space \xmin \space \yymin\space y
+             \xmin \space \yymax\space m
+             \xmin \space \ymax \space \xxmin\space \ymax \space y
+           \or % 26
+             \xmax \space \yymin\space m
+             \xmax \space \ymin \space \xxmax\space \ymin \space y
+             \xmin \space \yymax\space m
+             \xmin \space \ymax \space \xxmin\space \ymax \space y
+           \or % 27
+             \xxmax\space \ymax \space m
+             \xmax \space \ymax \space \xmax \space \yymax\space y
+             \xxmin\space \ymin \space m
+             \xmin \space \ymin \space \xmin \space \yymin\space y
+           \or % 28
+           \fi
+           \ifnum\mode>8
+                                       S
+           \else
+             \ifnum\dostroke=\plusone  S \fi
+             \ifnum\dofill  =\plusone  f \fi
+           \fi
+           Q}%
+      \fi}%
+   \wd\scratchbox#1\ht\scratchbox#2\dp\scratchbox#3\box\scratchbox
+   \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/lpdf-mis.lua b/tex/context/base/lpdf-mis.lua
new file mode 100644
index 000000000..4a8a097ff
--- /dev/null
+++ b/tex/context/base/lpdf-mis.lua
@@ -0,0 +1,230 @@
+if not modules then modules = { } end modules ['lpdf-mis'] = {
+    version   = 1.001,
+    comment   = "companion to back-pdf.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+-- Although we moved most pdf handling to the lua end, we didn't change
+-- the overall approach. For instance we share all resources i.e. we
+-- don't make subsets for each xform or page. The current approach is
+-- quite efficient. A big difference between MkII and MkIV is that we
+-- now use forward references. In this respect the MkII code shows that
+-- it evolved over a long period, when backends didn't provide forward
+-- referencing and references had to be tracked in multiple passes. Of
+-- course there are a couple of more changes.
+
+local next, tostring = next, tostring
+local format = string.format
+local texsprint, texset = tex.sprint, tex.set
+local ctxcatcodes = tex.ctxcatcodes
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations  = backends.pdf.registrations
+
+local pdfdictionary = lpdf.dictionary
+local pdfarray      = lpdf.array
+local pdfboolean    = lpdf.boolean
+local pdfconstant   = lpdf.constant
+local pdfreference  = lpdf.reference
+local pdfunicode    = lpdf.unicode
+local pdfstring     = lpdf.string
+
+local pdfreserveobj   = pdf.reserveobj
+local pdfimmediateobj = pdf.immediateobj
+
+local tobasepoints = number.tobasepoints
+
+lpdf.addtoinfo   ("Trapped", pdfboolean(false))
+lpdf.addtocatalog("Version", pdfconstant(format("1.%s",tex.pdfminorversion)))
+
+-- we could do this selectively
+
+local function initializenegative()
+    local a = pdfarray { 0, 1 }
+    local g = pdfconstant("ExtGState")
+    local d = pdfdictionary {
+        FunctionType = 4,
+        Range        = a,
+        Domain       = a,
+    }
+    local negative = pdfdictionary { Type = g, TR = pdfreference(pdf.immediateobj("stream","1 exch sub",d())) }
+    local positive = pdfdictionary { Type = g, TR = pdfconstant("Identity") }
+    lpdf.adddocumentextgstate("GSnegative", pdfreference(pdfimmediateobj(tostring(negative))))
+    lpdf.adddocumentextgstate("GSPositive", pdfreference(pdfimmediateobj(tostring(positive))))
+end
+
+local function initializeoverprint()
+    local g = pdfconstant("ExtGState")
+    local knockout  = pdfdictionary { Type = g, OP = false, OPM  = 0 }
+    local overprint = pdfdictionary { Type = g, OP = true,  OPM  = 1 }
+    lpdf.adddocumentextgstate("GSknockout",  pdfreference(pdfimmediateobj(tostring(knockout ))))
+    lpdf.adddocumentextgstate("GSoverprint", pdfreference(pdfimmediateobj(tostring(overprint))))
+end
+
+lpdf.registerdocumentfinalizer(initializenegative)
+lpdf.registerdocumentfinalizer(initializeoverprint)
+
+function codeinjections.addtransparencygroup()
+    -- png: /CS /DeviceRGB /I true
+    local d = tostring ( pdfdictionary {
+        S = pdfconstant("Transparency"),
+        I = true,
+        K = true,
+    } )
+    lpdf.registerpagefinalizer(function() lpdf.addtopageattributes("Group",d) end)
+end
+
+-- actions (todo: store and update when changed)
+
+local openpage, closepage, opendocument, closedocument
+
+function codeinjections.flushdocumentactions(open,close)
+    opendocument, closedocument = open, close
+end
+
+function codeinjections.flushpageactions(open,close)
+    openpage, closepage = open, close
+end
+
+local function flushdocumentactions()
+    if opendocument then
+        lpdf.addtocatalog("OpenAction",lpdf.pdfaction(opendocument))
+    end
+    if closedocument then
+        lpdf.addtocatalog("CloseAction",lpdf.pdfaction(closedocument))
+    end
+end
+
+local function flushpageactions()
+    if openpage or closepage then
+        local d = pdfdictionary()
+        if openpage then
+            d.O = lpdf.pdfaction(openpage)
+        end
+        if closepage then
+            d.C = lpdf.pdfaction(closepage)
+        end
+        lpdf.addtopageattributes("AA",d)
+    end
+end
+
+lpdf.registerpagefinalizer(flushpageactions)
+lpdf.registerdocumentfinalizer(flushdocumentactions)
+
+--- info
+
+function codeinjections.setupidentity(specification)
+    local title = specification.title or "" if title ~= "" then
+        lpdf.addtoinfo("Title", pdfunicode(title))
+    end
+    local subject = specification.subject or "" if subject ~= "" then
+        lpdf.addtoinfo("Subject", pdfunicode(subject))
+    end
+    local author = specification.author or "" if author ~= "" then
+        lpdf.addtoinfo("Author",  pdfunicode(author))
+    end
+    local creator = specification.creator or "" if creator ~= "" then
+        lpdf.addtoinfo("Creator", pdfunicode(creator))
+    end
+    local date = specification.date or "" if date ~= "" then
+        lpdf.addtoinfo("ModDate", pdfstring(date))
+    end
+    local keywords = specification.keywords or "" if keywords ~= "" then
+        keywords = string.gsub("[%s,]+", " ")
+        lpdf.addtoinfo("Keywords",pdfunicode(keywords))
+    end
+    lpdf.addtoinfo("ID", pdfstring(format("%s.%s",tex.jobname,os.date("%Y%m%d.%H%M")))) -- needed for pdf/x
+end
+
+local function flushjavascripts()
+    local t = javascripts.flushpreambles()
+    local a = pdfarray()
+    local pdf_javascript = pdfconstant("JavaScript")
+    for i=1,#t do
+        local name, script = t[i][1], t[i][2]
+        local j = pdfdictionary {
+            S  = pdf_javascript,
+            JS = pdfreference(pdfimmediateobj("stream",script)),
+        }
+        a[#a+1] = pdfstring(name)
+        a[#a+1] = pdfreference(pdfimmediateobj(tostring(j)))
+    end
+    lpdf.addtonames("JavaScript",pdfreference(pdfimmediateobj(tostring(pdfdictionary{ Names = a }))))
+end
+
+lpdf.registerdocumentfinalizer(flushjavascripts)
+
+-- -- --
+
+local pagespecs = {
+    max         = { "FullScreen", false, false },
+    bookmark    = { "UseOutlines", false, false },
+    fit         = { "UseNone", false, true },
+    doublesided = { "UseNone", "TwoColumnRight", true },
+    default     = { "UseNone", "auto", false },
+}
+
+local pagespec, topoffset, leftoffset, height, width, doublesided = "default", 0, 0, 0, 0, false
+
+function codeinjections.setupcanvas(specification)
+    local paperheight = specification.paperheight
+    local paperwidth  = specification.paperwidth
+    local paperdouble = specification.doublesided
+    if paperheight then
+        texset('global','pdfpageheight',paperheight)
+    end
+    if paperwidth then
+        texset('global','pdfpagewidth',paperwidth)
+    end
+    pagespec    = specification.mode       or pagespec
+    topoffset   = specification.topoffset  or 0
+    leftoffset  = specification.leftoffset or 0
+    height      = specification.height     or tex.pdfpageheight
+    width       = specification.width      or tex.pdfpagewidth
+    if paperdouble ~= nil then
+        doublesided = paperdouble
+    end
+end
+
+local function documentspecification()
+    local spec = pagespecs[pagespec] or pagespecs.default
+    local mode, layout, fit = spec[1], spec[2], spec[3]
+    if layout == "auto" and doublesided then
+        spec = pagespecs.doublesided
+        mode, layout, fit = spec[1], spec[2], spec[3]
+    end
+    mode = mode and pdfconstant(mode)
+    layout = layout and pdfconstant(layout)
+    fit = fit and pdfdictionary { FitWindow = true }
+    if layout then
+        lpdf.addtocatalog("PageLayout",layout)
+    end
+    if mode then
+        lpdf.addtocatalog("PageMode",mode)
+    end
+    if fit then
+        lpdf.addtocatalog("ViewerPreferences",fit)
+    end
+end
+
+local factor = number.dimenfactors.bp
+
+local function pagespecification()
+    local pageheight = tex.pdfpageheight
+    local box = pdfarray { -- can be cached
+        factor * (leftoffset),
+        factor * (pageheight-topoffset-height),
+        factor * (width-leftoffset),
+        factor * (pageheight-topoffset),
+    }
+    lpdf.addtopageattributes("CropBox",box) -- mandate for rendering
+    lpdf.addtopageattributes("TrimBox",box) -- mandate for pdf/x
+ -- lpdf.addtopageattributes("BleedBox",box)
+ -- lpdf.addtopageattributes("ArtBox",box)
+end
+
+lpdf.registerpagefinalizer(pagespecification)
+lpdf.registerdocumentfinalizer(documentspecification)
diff --git a/tex/context/base/lpdf-nod.lua b/tex/context/base/lpdf-nod.lua
new file mode 100644
index 000000000..f40039b94
--- /dev/null
+++ b/tex/context/base/lpdf-nod.lua
@@ -0,0 +1,53 @@
+if not modules then modules = { } end modules ['lpdf-nod'] = {
+    version   = 1.001,
+    comment   = "companion to lpdf-ini.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+local copy_node, new_node = node.copy, node.new
+
+local pdfliteral = nodes.register(new_node("whatsit", 8))    pdfliteral.mode  = 1
+local pdfdest    = nodes.register(new_node("whatsit",19))    pdfdest.named_id = 1 -- xyz_zoom untouched
+local pdfannot   = nodes.register(new_node("whatsit",15))
+
+local variables = interfaces.variables
+
+local views = { -- beware, we do support the pdf keys but this is *not* official
+    xyz   = 0, [variables.standard]  = 0,
+    fit   = 1, [variables.fit]       = 1,
+    fith  = 2, [variables.width]     = 2,
+    fitv  = 3, [variables.height]    = 3,
+    fitb  = 4,
+    fitbh = 5, [variables.minheight] = 5,
+    fitbv = 6, [variables.minheight] = 6,
+    fitr  = 7,
+}
+
+function nodes.pdfliteral(str)
+    local t = copy_node(pdfliteral)
+    t.data = str
+    return t
+end
+
+function nodes.pdfannot(w,h,d,data,n)
+    local t = copy_node(pdfannot)
+    if w and w ~= 0 then t.width  = w end
+    if h and h ~= 0 then t.height = h end
+    if d and d ~= 0 then t.depth  = d end
+    if n            then t.objnum = n end
+    if data and data ~= "" then t.data = data end
+    return t
+end
+
+function nodes.pdfdest(w,h,d,name,view,n)
+    local t = copy_node(pdfdest)
+    if w and w ~= 0 then t.width  = w end
+    if h and h ~= 0 then t.height = h end
+    if d and d ~= 0 then t.depth  = d end
+    if n            then t.objnum = n end
+    t.dest_id = name
+    t.dest_type = views[view] or view or 1 -- fit is default
+    return t
+end
diff --git a/tex/context/base/lpdf-ren.lua b/tex/context/base/lpdf-ren.lua
new file mode 100644
index 000000000..05a6658e7
--- /dev/null
+++ b/tex/context/base/lpdf-ren.lua
@@ -0,0 +1,210 @@
+if not modules then modules = { } end modules ['lpdf-ren'] = {
+    version   = 1.001,
+    comment   = "companion to lpdf-ini.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+-- rendering
+
+local tostring, tonumber, next = tostring, tonumber, next
+local format = string.format
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations  = backends.pdf.registrations
+
+jobreferences          = jobreferences          or { }
+--~ jobreferences.runners  = jobreferences.runners  or { }
+--~ jobreferences.specials = jobreferences.specials or { }
+--~ jobreferences.handlers = jobreferences.handlers or { }
+jobreferences.executers = jobreferences.executers or { }
+
+--~ local runners   = jobreferences.runners
+--~ local specials  = jobreferences.specials
+--~ local handlers  = jobreferences.handlers
+local executers = jobreferences.executers
+
+local variables = interfaces.variables
+
+local pdfconstant   = lpdf.constant
+local pdfdictionary = lpdf.dictionary
+local pdfarray      = lpdf.array
+local pdfreference  = lpdf.reference
+
+local pdfreserveobj   = pdf.reserveobj
+local pdfimmediateobj = pdf.immediateobj
+
+local pdf_ocg         = pdfconstant("OCG")
+local pdf_ocmd        = pdfconstant("OCMD")
+local pdf_off         = pdfconstant("OFF")
+local pdf_on          = pdfconstant("ON")
+local pdf_toggle      = pdfconstant("Toggle")
+local pdf_setocgstate = pdfconstant("SetOCGState")
+
+local lpdf_usage = pdfdictionary { Print = pdfdictionary { PrintState = pdfconstant("OFF") } }
+
+local pdfln, pdfld = { }, { }
+local textlayers, hidelayers, videlayers = pdfarray(), pdfarray(), pdfarray()
+local pagelayers = pdfdictionary()
+
+lpdf.layerreferences = pdfln
+
+function backends.pdf.layerreference(name)
+    return pdfln[name]
+end
+
+
+function codeinjections.defineviewerlayer(specification)
+    if textlayers then
+        local tag = specification.tag
+        -- todo: reserve
+        local n = pdfdictionary {
+            Type   = pdf_ocg,
+            Name   = specification.title or "unknown",
+            Intent = ((specification.kind > 0) and pdf_design) or nil, -- disable layer hiding by user
+            Usage  = ((specification.printable == variables.no) and lpdf_usage) or nil , -- printable or not
+        }
+        local nr = pdfreference(pdfimmediateobj(tostring(n)))
+        pdfln[tag] = nr -- was n
+        local d = pdfdictionary {
+            Type = pdf_ocmd,
+            OCGs = pdfarray { nr },
+        }
+        local dr = pdfreference(pdfimmediateobj(tostring(d)))
+        pdfld[tag] = dr
+        textlayers[#textlayers+1] = nr
+        if specification.visible == variables.start then
+            videlayers[#videlayers+1] = nr
+        else
+            hidelayers[#hidelayers+1] = nr
+        end
+        pagelayers[tag] = dr -- check
+    end
+end
+
+local function flushtextlayers()
+    if textlayers and #textlayers > 0 then
+        local d = pdfdictionary {
+            OCGs = textlayers,
+            D    = pdfdictionary {
+                Order = textlayers,
+                ON    = videlayers,
+                OFF   = hidelayers,
+            },
+        }
+        lpdf.addtocatalog("OCProperties",d)
+        textlayers = nil
+    end
+end
+
+local function flushpagelayers()
+    if next(pagelayers) then
+        lpdf.addtopageresources("Properties",pagelayers)
+    end
+end
+
+lpdf.registerpagefinalizer    (flushpagelayers)
+lpdf.registerdocumentfinalizer(flushtextlayers)
+
+local function setlayer(what,arguments)
+    -- maybe just a gmatch of even better, earlier in lpeg
+    arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+    local state = pdfarray { what }
+    for i=1,#arguments do
+        local p = pdfln[arguments[i]]
+        if p then
+            state[#state+1] = p
+        end
+    end
+    return pdfdictionary {
+        S     = pdf_setocgstate,
+        State = state,
+    }
+end
+
+function executers.hidelayer  (arguments) setlayer(pdf_off,   arguments) end
+function executers.videlayer  (arguments) setlayer(pdf_on,    arguments) end
+function executers.togglelayer(arguments) setlayer(pdf_toggle,arguments) end
+
+-- transitions
+
+local pagetransitions = {
+    {"split","in","vertical"}, {"split","in","horizontal"},
+    {"split","out","vertical"}, {"split","out","horizontal"},
+    {"blinds","horizontal"}, {"blinds","vertical"},
+    {"box","in"}, {"box","out"},
+    {"wipe","east"}, {"wipe","west"}, {"wipe","north"}, {"wipe","south"},
+    {"dissolve"},
+    {"glitter","east"}, {"glitter","south"},
+    {"fly","in","east"}, {"fly","in","west"}, {"fly","in","north"}, {"fly","in","south"},
+    {"fly","out","east"}, {"fly","out","west"}, {"fly","out","north"}, {"fly","out","south"},
+    {"push","east"}, {"push","west"}, {"push","north"}, {"push","south"},
+    {"cover","east"}, {"cover","west"}, {"cover","north"}, {"cover","south"},
+    {"uncover","east"}, {"uncover","west"}, {"uncover","north"}, {"uncover","south"},
+    {"fade"},
+}
+
+local mapping = {
+    split      = { "S"  , pdfconstant("Split") },
+    blinds     = { "S"  , pdfconstant("Blinds") },
+    box        = { "S"  , pdfconstant("Box") },
+    wipe       = { "S"  , pdfconstant("Wipe") },
+    dissolve   = { "S"  , pdfconstant("Dissolve") },
+    glitter    = { "S"  , pdfconstant("Glitter") },
+    replace    = { "S"  , pdfconstant("R") },
+    fly        = { "S"  , pdfconstant("Fly") },
+    push       = { "S"  , pdfconstant("Push") },
+    cover      = { "S"  , pdfconstant("Cover") },
+    uncover    = { "S"  , pdfconstant("Uncover") },
+    fade       = { "S"  , pdfconstant("Fade") },
+    horizontal = { "Dm" , pdfconstant("H") },
+    vertical   = { "Dm" , pdfconstant("V") },
+    ["in"]     = { "M"  , pdfconstant("I") },
+    out        = { "M"  , pdfconstant("O") },
+    east       = { "Di" ,   0 },
+    north      = { "Di" ,  90 },
+    west       = { "Di" , 180 },
+    south      = { "Di" , 270 },
+}
+
+local last = 0
+
+-- n: number, "stop", "reset", "random", "a,b,c" delay: number, "none"
+
+function codeinjections.setpagetransition(specification)
+    local n, delay = specification.n, specification.delay
+    if n == variables.auto then
+        if last >= #pagetransitions then
+            last = 0
+        end
+        n = last + 1
+    elseif n == variables.stop then
+        return
+    elseif n == variables.reset then
+        last = 0
+        return
+    elseif n == variables.random then
+        n = math.random(1,#pagetransitions)
+    else
+        n = tonumber(n)
+    end
+    local t = n and pagetransitions[n] or pagetransitions[1]
+    if not t then
+        t = aux.settings_to_array(n)
+    end
+    if t and #t > 0 then
+        local d = pdfdictionary()
+        for i=1,#t do
+            local m = mapping[t[i]]
+            d[m[1]] = m[2]
+        end
+        delay = tonumber(delay)
+        if delay and delay > 0 then
+            lpdf.addtopageattributes("Dur",delay)
+        end
+        lpdf.addtopageattributes("Trans",d)
+    end
+end
diff --git a/tex/context/base/lpdf-u3d.lua b/tex/context/base/lpdf-u3d.lua
new file mode 100644
index 000000000..5f7a770b1
--- /dev/null
+++ b/tex/context/base/lpdf-u3d.lua
@@ -0,0 +1,427 @@
+if not modules then modules = { } end modules ['lpdf-u3d'] = {
+    version   = 1.001,
+    comment   = "companion to lpdf-ini.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+-- The following code is based on a working prototype provided
+-- by Michael Vidiassov. It is rewritten using the lpdf library
+-- and different checking is used. The macro calls are adapted
+-- (and will eventually be removed). The user interface needs
+-- an overhaul. There are some messy leftovers that will be
+-- removed in future versions.
+
+local format = string.format
+local cos, sin, sqrt, pi, atan2, abs = math.cos, math.sin, math.sqrt, math.pi, math.atan2, math.abs
+
+local pdfconstant   = lpdf.constant
+local pdfboolean    = lpdf.boolean
+local pdfunicode    = lpdf.unicode
+local pdfdictionary = lpdf.dictionary
+local pdfarray      = lpdf.array
+local pdfnull       = lpdf.null
+local pdfreference  = lpdf.reference
+
+local checkedkey    = lpdf.checkedkey
+local limited       = lpdf.limited
+
+local schemes = table.tohash {
+    "Artwork", "None", "White", "Day", "Night", "Hard",
+    "Primary", "Blue", "Red", "Cube", "CAD", "Headlamp",
+}
+
+local modes = table.tohash {
+    "Solid", "SolidWireframe", "Transparent", "TransparentWireframe", "BoundingBox",
+    "TransparentBoundingBox", "TransparentBoundingBoxOutline", "Wireframe",
+    "ShadedWireframe", "HiddenWireframe", "Vertices", "ShadedVertices", "Illustration",
+    "SolidOutline", "ShadedIllustration",
+}
+
+local function normalize(x, y, z)
+    local modulo = sqrt(x*x + y*y + z*z);
+    if modulo ~= 0 then
+        return x/modulo, y/modulo, z/modulo
+    else
+        return x, y, z
+    end
+end
+
+local function rotate(vect_x,vect_y,vect_z, tet, axis_x,axis_y,axis_z)
+    -- rotate vect by tet about axis counterclockwise
+    local c, s = cos(tet*pi/180), sin(tet*pi/180)
+    local r = 1 - c
+    local n = sqrt(axis_x*axis_x+axis_y*axis_y+axis_z*axis_z)
+    axis_x, axis_y, axis_z = axis_x/n, axis_y/n, axis_z/n
+    return
+        (axis_x*axis_x*r+c       )*vect_x + (axis_x*axis_y*r-axis_z*s)*vect_y + (axis_x*axis_z*r+axis_y*s)*vect_z,
+        (axis_x*axis_y*r+axis_z*s)*vect_x + (axis_y*axis_y*r+c       )*vect_y + (axis_y*axis_z*r-axis_x*s)*vect_z,
+        (axis_x*axis_z*r-axis_y*s)*vect_x + (axis_y*axis_z*r+axis_x*s)*vect_y + (axis_z*axis_z*r+c       )*vect_z
+end
+
+local function make3dview(view)
+
+    local name = viewname
+    local name = pdfunicode((view.name ~= "" and name) or "unknown view")
+
+    local viewdict = pdfdictionary {
+       Type = pdfconstant("3DView"),
+       XN   = name,
+       IN   = name,
+    }
+
+    local bg = checkedkey(view,"bg","table")
+    if bg then
+        viewdict.BG = pdfdictionary {
+            Type = pdfconstant("3DBG"),
+            C    = pdfarray { limited(bg[1],1,1,1), limited(bg[2],1,1,1), limited(bg[3],1,1,1) },
+        }
+    end
+
+    local lights = checkedkey(view,"lights","string")
+    if lights and schemes[lights] then
+        viewdict.LS =  pdfdictionary {
+            Type    = pdfconstant("3DLightingScheme"),
+            Subtype = pdfconstant(lights),
+        }
+    end
+
+    -- camera position is taken from 3d model
+
+    local u3dview = checkedkey(view, "u3dview", "string")
+    if u3dview then
+        viewdict.MS      = pdfconstant("U3D")
+        viewdict.U3DPath = u3dview
+    end
+
+    -- position the camera as given
+
+    local c2c      = checkedkey(view, "c2c", "table")
+    local coo      = checkedkey(view, "coo", "table")
+    local roo      = checkedkey(view, "roo", "number")
+    local azimuth  = checkedkey(view, "azimuth", "number")
+    local altitude = checkedkey(view, "altitude", "number")
+
+    if c2c or coo or roo or azimuth or altitude then
+
+        local pos  = checkedkey(view, "pos", "table")
+        local dir  = checkedkey(view, "dir", "table")
+        local upv  = checkedkey(view, "upv", "table")
+        local roll = checkedkey(view, "roll", "table")
+
+        local coo_x, coo_y, coo_z       = 0, 0, 0
+        local dir_x, dir_y, dir_z       = 0, 0, 0
+        local trans_x, trans_y, trans_z = 0, 0, 0
+        local left_x, left_y, left_z    = 0, 0, 0
+        local up_x, up_y, up_z          = 0, 0, 0
+
+        -- point camera is aimed at
+
+        if coo then
+            coo_x, coo_y, coo_z = tonumber(coo[1]) or 0, tonumber(coo[2]) or 0, tonumber(coo[3]) or 0
+        end
+
+        -- distance from camera to target
+
+        if roo then
+           roo = abs(roo)
+        end
+        if not roo or roo == 0 then
+            roo = 0.000000000000000001
+        end
+
+        -- set it via camera position
+
+        if pos then
+            dir_x = coo_x - (tonumber(pos[1]) or 0)
+            dir_y = coo_y - (tonumber(pos[2]) or 0)
+            dir_z = coo_z - (tonumber(pos[3]) or 0)
+            if not roo then
+                roo = sqrt(dir_x*dir_x + dir_y*dir_y + dir_z*dir_z)
+            end
+            if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end
+            dir_x, dir_y, dir_z = normalize(dir_x,dir_y,dir_z)
+        end
+
+        -- set it directly
+
+        if dir then
+            dir_x, dir_y, dir_z = tonumber(dir[1] or 0), tonumber(dir[2] or 0), tonumber(dir[3] or 0)
+            if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end
+            dir_x, dir_y, dir_z = normalize(dir_x,dir_y,dir_z)
+        end
+
+        -- set it movie15 style with vector from target to camera
+
+        if c2c then
+            dir_x, dir_y, dir_z = - tonumber(c2c[1] or 0), - tonumber(c2c[2] or 0), - tonumber(c2c[3] or 0)
+            if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end
+            dir_x, dir_y, dir_z = normalize(dir_x,dir_y,dir_z)
+        end
+
+        -- set it with azimuth and altitutde
+
+        if altitude or azimuth then
+            dir_x, dir_y, dir_z = -1, 0, 0
+            if altitude then  dir_x, dir_y, dir_z = rotate(dir_x,dir_y,dir_z, -altitude, 0,1,0) end
+            if azimuth  then  dir_x, dir_y, dir_z = rotate(dir_x,dir_y,dir_z,  azimuth,  0,0,1) end
+        end
+
+        -- set it with rotation like in MathGL
+
+        if rot then
+            if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_z = -1 end
+            dir_x,dir_y,dir_z = rotate(dir_x,dir_y,dir_z, tonumber(rot[1]) or 0, 1,0,0)
+            dir_x,dir_y,dir_z = rotate(dir_x,dir_y,dir_z, tonumber(rot[2]) or 0, 0,1,0)
+            dir_x,dir_y,dir_z = rotate(dir_x,dir_y,dir_z, tonumber(rot[3]) or 0, 0,0,1)
+        end
+
+        -- set it with default movie15 orientation looking up y axis
+
+        if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end
+
+        -- left-vector
+        -- up-vector
+
+        if upv then
+            up_x, up_y, up_z = tonumber(upv[1]) or 0, tonumber(upv[2]) or 0, tonumber(upv[3]) or 0
+        else
+            -- set default up-vector
+            if abs(dir_x) == 0 and abs(dir_y) == 0 then
+                if dir_z < 0 then
+                    up_y =  1 -- top view
+                else
+                    up_y = -1 -- bottom view
+                end
+            else
+                -- other camera positions than top and bottom, up-vector = up_world - (up_world dot dir) dir
+                up_x, up_y, up_z = - dir_z*dir_x, - dir_z*dir_y, - dir_z*dir_z + 1
+            end
+        end
+
+        -- normalize up-vector
+
+        up_x, up_y, up_z = normalize(up_x,up_y,up_z)
+
+        -- left vector = up x dir
+
+        left_x, left_y, left_z = dir_z*up_y - dir_y*up_z, dir_x*up_z - dir_z*up_x, dir_y*up_x - dir_x*up_y
+
+        -- normalize left vector
+
+        left_x, left_y, left_z = normalize(left_x,left_y,left_z)
+
+        -- apply camera roll
+
+        if roll then
+            local sinroll = sin((roll/180.0)*pi)
+            local cosroll = cos((roll/180.0)*pi)
+            left_x = left_x*cosroll + up_x*sinroll
+            left_y = left_y*cosroll + up_y*sinroll
+            left_z = left_z*cosroll + up_z*sinroll
+            up_x = up_x*cosroll + left_x*sinroll
+            up_y = up_y*cosroll + left_y*sinroll
+            up_z = up_z*cosroll + left_z*sinroll
+        end
+
+        -- translation vector
+
+        trans_x, trans_y, trans_z = coo_x - roo*dir_x, coo_y - roo*dir_y, coo_z - roo*dir_z
+
+        viewdict.MS  = pdfconstant("M")
+        viewdict.CO  = roo
+        viewdict.C2W = pdfarray {
+             left_x, left_y, left_z,
+             up_x, up_y, up_z,
+             dir_x, dir_y,  dir_z,
+             trans_x, trans_y, trans_z,
+        }
+
+    end
+
+    local aac = tonumber(view.aac) -- perspective projection
+    local mag = tonumber(view.mag) -- ortho projection
+
+    if aac and aac > 0 and aac < 180 then
+        viewdict.P = pdfdictionary {
+            Subtype = pdfconstant("P"),
+            PS      = pdfconstant("Min"),
+            FOV     = aac,
+        }
+    elseif mag and mag > 0 then
+        viewdict.P = pdfdictionary {
+            Subtype = pdfconstant("O"),
+            OS      = mag,
+        }
+    end
+
+    local mode = modes[view.rendermode]
+    if mode then
+        pdfdictionary {
+            Type    = pdfconstant("3DRenderMode"),
+            Subtype = pdfconstant(mode),
+        }
+    end
+
+    -- crosssection
+
+    local crosssection = checkedkey(view,"crosssection","table")
+    if crosssection then
+        local crossdict = pdfdictionary {
+            Type = pdfconstant("3DCrossSection")
+        }
+
+        local c = checkedkey(crosssection,"point","table") or checkedkey(crosssection,"center","table")
+        if c then
+            crossdict.C = pdfarray { tonumber(c[1]) or 0, tonumber(c[2]) or 0, tonumber(c[3]) or 0 }
+        end
+
+        local normal = checkedkey(crosssection,"normal","table")
+        if normal then
+            local x, y, z = tonumber(normal[1] or 0), tonumber(normal[2] or 0), tonumber(normal[3] or 0)
+            if sqrt(x*x + y*y + z*z) == 0 then
+                x, y, z = 1, 0, 0
+            end
+            crossdict.O = pdfarray {
+                pdfnull,
+                atan2(-z,sqrt(x*x + y*y))*180/pi,
+                atan2(y,x)*180/pi,
+            }
+        end
+
+        local orient = checkedkey(crosssection,"orient","table")
+        if orient then
+            crossdict.O = pdfarray {
+                tonumber(orient[1]) or 1,
+                tonumber(orient[2]) or 0,
+                tonumber(orient[3]) or 0,
+            }
+        end
+
+        crossdict.IV = cross.intersection or false
+        crossdict.ST = cross.transparent or false
+
+        viewdict.SA = next(crossdict) and pdfarray { crossdict } -- maybe test if # > 1
+    end
+
+    local nodes = checkedkey(view,"nodes","table")
+    if nodes then
+        local nodelist = pdfarray()
+        for i=1,#nodes do
+            local node = checkedkey(nodes,i,"table")
+            if node then
+                local position = checkedkey(node,"position","table")
+                position = position and #position == 12 and pdfarray(position)
+                if position then
+                    nodelist[#nodelist+1] = pdfdictionary {
+                        Type = pdfconstant("3DNode"),
+                        N    = node.name or ("node_" .. i), -- pdfunicode ?
+                        V    = node.visible or true,
+                        O    = node.opacity or 0,
+                        RM   = pdfdictionary {
+                            Type    = pdfconstant("3DRenderMode"),
+                            Subtype = pdfconstant(node.rendermode or "Solid"),
+                        },
+                        M    = position,
+                    }
+                end
+            end
+      end
+      viewdict.NR = true
+      viewdict.NA = nodelist
+   end
+
+   return viewdict
+
+end
+
+local stored_js, stored_3d, stored_pr, streams = { }, { }, { }, { }
+
+function backends.pdf.helpers.insert3d(spec) -- width, height, factor, display, controls, label, foundname
+
+    local width, height, factor = spec.width, spec.height, spec.factor or number.dimenfactors.bp
+    local display, controls, label, foundname = spec.display, spec.controls, spec.label, spec.foundname
+
+    local param       = (display  and parametersets[display])  or { }
+    local streamparam = (controls and parametersets[controls]) or { }
+    local name        = "3D Artwork " .. (param.name or label or "Unknown")
+
+    local activationdict = pdfdictionary {
+       TB = pdfboolean(param.toolbar,true),
+       NP = pdfboolean(param.tree,true),
+    }
+
+    local stream = streams[label]
+    if not stream then
+        local attr = pdfdictionary {
+            Type    = pdfconstant("3D"),
+            Subtype = pdfconstant("U3D"),
+        }
+        local streamviews = checkedkey(streamparam, "views", "table")
+        if streamviews then
+            local list = pdfarray()
+            for i=1,#streamviews do
+                local v = checkedkey(streamviews, i, "table")
+                if v then
+                    list[#list+1] = make3dview(v)
+                end
+            end
+            attr.VA = list
+        end
+        if checkedkey(streamparam, "view", "table") then
+            attr.DV = make3dview(streamparam.view)
+        elseif checkedkey(streamparam, "view", "string") then
+            attr.DV = streamparam.view
+        end
+        local js = checkedkey(streamparam, "js", "string")
+        if js then
+            local jsref = stored_js[js]
+            if not jsref then
+                jsref = pdf.immediateobj("streamfile",js)
+                stored_js[js] = jsref
+            end
+            attr.OnInstantiate = pdfreference(jsref)
+        end
+        stored_3d[label] = pdf.immediateobj("streamfile",foundname,attr())
+        stream = 1
+    else
+       stream = stream + 1
+    end
+    streams[label] = stream
+
+    local name = pdfunicode(name)
+
+    local annot  = pdfdictionary {
+        Subtype  = pdfconstant("3D"),
+        T        = name,
+        Contents = name,
+        NM       = name,
+        ["3DD"]  = pdfreference(stored_3d[label]),
+        ["3DA"]  = activationdict,
+    }
+    if checkedkey(param,"view","table") then
+        annot["3DV"] = make3dview(param.view)
+    elseif checkedkey(param,"view","string") then
+        annot["3DV"] = param.view
+    end
+
+    local preview = checkedkey(param,"preview","string")
+    if preview then
+        activationdict.A = pdfconstant("XA")
+        local tag = format("%s:%s:%s",label,stream,preview)
+        local ref = stored_pr[tag]
+        if not ref then
+        --  weird, has to be a /Form and not an /Image so we need a wrap = true key
+        --  local figure = img.immediatewrite { filename = preview, width = width, height = height }
+            local figure = img.immediatewrite { stream = ".5 .75 .75 rg 0 0 20 10 re f", bbox = {0,0,20,10 } }
+            ref = figure.objnum
+            stored_pr[tag] = ref
+        end
+        annot.AP = ref and pdfdictionary { N = pdfreference(ref) }
+        return annot, figure, ref
+    else
+        activationdict.A = pdfconstant("PV")
+        return annot, nil, nil
+    end
+end
diff --git a/tex/context/base/lpdf-wid.lua b/tex/context/base/lpdf-wid.lua
new file mode 100644
index 000000000..cc61a4f96
--- /dev/null
+++ b/tex/context/base/lpdf-wid.lua
@@ -0,0 +1,328 @@
+if not modules then modules = { } end modules ['lpdf-wid'] = {
+    version   = 1.001,
+    comment   = "companion to lpdf-ini.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+local format, gmatch, gsub, find = string.format, string.gmatch, string.gsub, string.find
+local texsprint, ctxcatcodes, texbox, texcount = tex.sprint, tex.ctxcatcodes, tex.box, tex.count
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations  = backends.pdf.registrations
+
+local executers = jobreferences.executers
+local variables = interfaces.variables
+
+local pdfconstant   = lpdf.constant
+local pdfdictionary = lpdf.dictionary
+local pdfarray      = lpdf.array
+local pdfreference  = lpdf.reference
+local pdfunicode    = lpdf.unicode
+local pdfcolorspec  = lpdf.colorspec
+
+local pdfreserveobj   = pdf.reserveobj
+local pdfimmediateobj = pdf.immediateobj
+
+-- symbols
+
+local presets = { } -- xforms
+
+function codeinjections.registersymbol(name,n)
+    presets[name] = pdfreference(n)
+end
+
+function codeinjections.registeredsymbol(name)
+    return presets[name]
+end
+
+function codeinjections.presetsymbollist(list)
+    if list then
+        for s in gmatch(list,"[^, ]+") do
+            if not presets[s] then
+                texsprint(ctxcatcodes,format("\\predefinesymbol[%s]",s))
+            end
+        end
+    end
+end
+
+-- comments
+
+local symbols = {
+    New          = pdfconstant("Insert"),
+    Insert       = pdfconstant("Insert"),
+    Balloon      = pdfconstant("Comment"),
+    Comment      = pdfconstant("Comment"),
+    Text         = pdfconstant("Note"),
+    Addition     = pdfconstant("NewParagraph"),
+    NewParagraph = pdfconstant("NewParagraph"),
+    Help         = pdfconstant("Help"),
+    Paragraph    = pdfconstant("Paragraph"),
+    Key          = pdfconstant("Key"),
+    Graph        = pdfconstant("Graph"),
+    Paperclip    = pdfconstant("Paperclip"),
+    Attachment   = pdfconstant("Attachment"),
+    Tag          = pdfconstant("Tag"),
+}
+
+symbols[variables.normal] = pdfconstant("Note")
+
+local nofcomments, usepopupcomments, stripleading = 0, true, true
+
+local function analyzesymbol(symbol)
+    if not symbol or symbol == "" then
+        return symbols.normal, nil
+    elseif symbols[symbol] then
+        return symbols[symbol], nil
+    else
+        local set = aux.settings_to_array(symbol)
+        local normal, down = set[1], set[2]
+        if normal then
+            normal = codeinjections.registeredsymbol(down or normal)
+        end
+        if down then
+            down = codeinjections.registeredsymbol(normal)
+        end
+        if down or normal then
+            return nil, pdfdictionary {
+                N = normal,
+                D = down,
+            }
+        end
+    end
+end
+
+local function analyzelayer(layer)
+    -- todo:  (specification.layer ~= "" and pdfreference(specification.layer)) or nil, -- todo: ref to layer
+end
+
+function codeinjections.registercomment(specification)
+    nofcomments = nofcomments + 1
+    local text = buffers.collect(specification.buffer)
+    if stripleading then
+        text = gsub(text,"[\n\r] *","\n")
+    end
+    local name, appearance = analyzesymbol(specification.symbol)
+    local d = pdfdictionary {
+        Subtype   = pdfconstant("Text"),
+        Open      = specification.open,
+        Contents  = pdfunicode(text),
+        T         = (specification.title ~= "" and pdfunicode(specification.title)) or nil,
+        C         = pdfcolorspec(specification.colormodel,specification.colorvalue),
+        OC        = analyzelayer(specification.layer),
+        Name      = name,
+        AP        = appearance,
+    }
+    -- watch the nice feed back to tex hack
+    if usepopupcomments then
+        local nd = pdfreserveobj()
+        local nc = pdfreserveobj()
+        local c = pdfdictionary {
+            Subtype = pdfconstant("Popup"),
+            Parent  = pdfreference(nd),
+        }
+        d.Popup = pdfreference(nc)
+        texbox["commentboxone"] = node.hpack(nodes.pdfannot(0,0,0,d(),nd))
+        texbox["commentboxtwo"] = node.hpack(nodes.pdfannot(specification.width,specification.height,0,c(),nc))
+    else
+        texbox["commentboxone"] = node.hpack(nodes.pdfannot(0,0,0,d()))
+        texbox["commentboxtwo"] = nil
+    end
+end
+
+--
+
+local nofattachments, attachments, filestreams = 0, { }, { }
+
+function codeinjections.attachfile(specification)
+    local attachment = interactions.attachment(specification.label)
+    if not attachment then
+        -- todo: message
+        return
+    end
+    local filename = attachment.filename
+    if not filename or filename == "" then
+        -- todo: message
+        return
+    end
+    nofattachments = nofattachments + 1
+    local label   = attachment.label   or ""
+    local title   = attachment.title   or ""
+    local newname = attachment.newname or ""
+    if label   == "" then label   = filename end
+    if title   == "" then title   = label    end
+    if newname == "" then newname = filename end
+    local aref = attachments[label]
+    if not aref then
+        if not lfs.isfile(filename) then
+            interfaces.showmessage("interactions",5,filename)
+            return -- todo: message
+        else
+            local f = pdf.immediateobj("streamfile",filename)
+            filestreams[filename] = f
+            local d = pdfdictionary {
+                Type = pdfconstant("Filespec"),
+                F    = newname,
+                EF   = pdfdictionary { F = pdfreference(d) },
+            }
+            aref = pdfreference(pdfimmediateobj(tostring(d)))
+            attachments[label] = aref
+        end
+    end
+    local name, appearance = analyzesymbol(specification.symbol)
+    local d = pdfdictionary {
+        Subtype  = pdfconstant("FileAttachment"),
+        FS       = aref,
+        Contents = pdfunicode(title),
+        Name     = name,
+        AP       = appearance,
+        OC       = analyzelayer(specification.layer),
+        C        = pdfcolorspec(specification.colormodel,specification.colorvalue),
+    }
+    local width  = specification.width  or 0
+    local height = specification.height or 0
+    local depth  = specification.depth  or 0
+    node.write(nodes.pdfannot(width,height,depth,d()))
+end
+
+function codeinjections.attachmentid(filename)
+    return filestreams[filename]
+end
+
+-- rendering stuff
+--
+-- object_1  -> <> >>
+-- object_2  -> <> >>
+-- rendering -> <>
+--
+-- we only work foreward here
+-- annotation is to be packed at the tex end
+
+-- aiff audio/aiff
+-- au   audio/basic
+-- avi  video/avi
+-- mid  audio/midi
+-- mov  video/quicktime
+-- mp3  audio/x-mp3 (mpeg)
+-- mp4  audio/mp4
+-- mp4  video/mp4
+-- mpeg video/mpeg
+-- smil application/smil
+-- swf  application/x-shockwave-flash
+
+local ms, mu, mf = { }, { }, { }
+
+local delayed = { }
+
+local function insertrenderingwindow(label,width,height,specification)
+    if options == variables.auto then
+        if openpageaction then
+            -- \handlereferenceactions{\v!StartRendering{#2}}
+        end
+        if closepageaction then
+            -- \handlereferenceactions{\v!StopRendering {#2}}
+        end
+    end
+    local actions = nil
+    if openpage or closepage then
+        actions = pdfdictionary {
+            PO = (openpage  and lpdf.pdfaction(openpage )) or nil,
+            PC = (closepage and lpdf.pdfaction(closepage)) or nil,
+        }
+    end
+    local page = tonumber(specification.page) or texcount.realpageno
+    local d = pdfdictionary {
+        Subtype = pdfconstant("Screen"),
+        P       = pdfreference(tex.pdfpageref(page)),
+        A       = mf[label],
+        Border  = pdfarray { 0, 0, 0 } ,
+        AA      = actions,
+    }
+    local r = pdfreserveobj("annot")
+    node.write(nodes.pdfannot(label,width,height,d(),r)) -- save ref
+    return pdfreference(r)
+end
+
+local function insertrendering(specification)
+    local label = specification.label
+    if not mf[label] then
+        local filename = specification.filename
+        local isurl = find(filename,"://")
+        local d = pdfdictionary {
+            Type = pdfconstant("Rendition"),
+            S    = pdfconstant("MR"),
+            C    = pdfdictionary {
+                Type = pdfconstant("MediaClip"),
+                S    = pdfconstant("MCD"),
+                N    = label,
+                CT   = specification.mime,
+                Alt  = pdfarray {
+                    "", "file not found", -- language id + message
+                },
+                D    = pdfdictionary {
+                    Type = pdfconstant("Filespec"),
+                    F    = filename,
+                    FS   = (isurl and pdfconstant("URL")) or nil,
+                }
+            }
+        }
+        mf[label] = pdfreference(pdfimmediateobj(tostring(d)))
+        if not ms[label]  then
+            mu[label] = insertrenderingwindow(label,0,0,specification.options)
+        end
+    end
+end
+
+local function insertrenderingobject(specification)
+    local label = specification.label
+    if not mf[label] then
+        local d = pdfdictionary {
+            Type = pdfconstant("Rendition"),
+            S    = pdfconstant("MR"),
+            C    = pdfdictionary {
+                Type = pdfconstant("MediaClip"),
+                S    = pdfconstant("MCD"),
+                N    = label,
+                D    = pdfreference(unknown), -- not label but objectname, hm
+            }
+        }
+        mf[label] = pdfreference(pdfimmediateobj(tostring(d)))
+        if ms[label] then
+            insertrenderingwindow(label,0,0,specification)
+        end
+    end
+end
+
+function codeinjections.insertrenderingwindow(specification)
+    local label = specification.label
+    codeinjections.processrendering(label) -- was check at tex end
+    ms[label] = insertrenderingwindow(label,specification.width,specification.height,specification)
+end
+
+function codeinjections.processrendering(label)
+    local specification = interactions.rendering(label)
+    if specification then
+        if specification.kind == "external" then
+            insertrendering(specification)
+        else
+            insertrenderingobject(specification)
+        end
+    end
+end
+
+local function set(operation,arguments)
+    codeinjections.processrendering(arguments) -- was check at the tex end
+    return pdfdictionary {
+        S  = pdfconstant("Rendition"),
+        OP = operation,
+        R  = mf[arguments],
+        AN = ms[arguments] or mu[arguments],
+    }
+end
+
+function executers.startrendering (arguments) return set(0,arguments) end
+function executers.stoprendering  (arguments) return set(1,arguments) end
+function executers.pauserendering (arguments) return set(2,arguments) end
+function executers.resumerendering(arguments) return set(3,arguments) end
diff --git a/tex/context/base/luat-bas.mkiv b/tex/context/base/luat-bas.mkiv
index a78455173..581a5d95a 100644
--- a/tex/context/base/luat-bas.mkiv
+++ b/tex/context/base/luat-bas.mkiv
@@ -51,6 +51,7 @@
 \registerctxluafile{l-dimen}  {1.001}
 \registerctxluafile{l-url}    {1.001}
 \registerctxluafile{l-set}    {1.001}
+\registerctxluafile{l-dimen}  {1.001}
 
 % \registerctxluafile{socket.lua}{}
 % \registerctxluafile{ltn12.lua} {}
diff --git a/tex/context/base/luat-cod.mkiv b/tex/context/base/luat-cod.mkiv
index 07db36483..001cc2aa9 100644
--- a/tex/context/base/luat-cod.mkiv
+++ b/tex/context/base/luat-cod.mkiv
@@ -60,7 +60,7 @@
 %D Here we operate in the \TEX\ catcode regime as we haven't yet defined
 %D catcode regimes. A chicken or egg problem.
 
-\long\def\startruntimeluacode#1\stopruntimeluacode % only simple code (load +init)
+\normalprotected\long\def\startruntimeluacode#1\stopruntimeluacode % only simple code (load +init)
   {\ifproductionrun
      \global\let\startruntimeluacode\relax
      \global\let\stopruntimeluacode \relax
@@ -69,7 +69,7 @@
    \fi
    #1} % maybe no interference
 
-\long\def\startruntimectxluacode#1\stopruntimectxluacode
+\normalprotected\long\def\startruntimectxluacode#1\stopruntimectxluacode
   {\startruntimeluacode\ctxlua{#1}\stopruntimeluacode}
 
 %D Next we load the initialization code.
@@ -133,7 +133,7 @@
 
 \def\ctxluabyteload#1#2% registers and compiles chunk
   {\global\advance\luabytecodecounter \plusone
-   \expanded{\startruntimectxluacode
+   \normalexpanded{\startruntimectxluacode
      lua.bytedata[\the\luabytecodecounter] = { "#1", "#2" }
    \stopruntimectxluacode}%
    \ctxlua {
diff --git a/tex/context/base/luat-ini.mkiv b/tex/context/base/luat-ini.mkiv
index 2a132c38e..84214ea73 100644
--- a/tex/context/base/luat-ini.mkiv
+++ b/tex/context/base/luat-ini.mkiv
@@ -134,24 +134,12 @@
    \obeyluatokens
    \csname dodostartnamed#1\v!code\endcsname}
 
-\ifdefined\closelua
-
-    \def\definenamedlua[#1]#2[#3]% no optional arg handling here yet
-      {\expanded{\long\def\csname dodostartnamed#1\v!code\endcsname####1\csname\e!stop#1\v!code\endcsname}%
-         {\normalexpanded{\endgroup\noexpand\directlua\!!name{#3}\zerocount{protect("#1\s!data")##1}}}%
-       \long\expandafter\def\csname\e!start#1\v!code\endcsname   {\dostartnamedluacode{#1}}%
-       \long\expandafter\def\csname        #1\v!code\endcsname##1{\directlua\!!name{#3}\zerocount{protect("#1\s!data")##1}}}
-
-\else
-
-    \def\definenamedlua[#1]#2[#3]% no optional arg handling here yet
-      {\scratchcounter\ctxlua{lua.registername("#1","#3")}%
-       \expanded{\long\edef\csname dodostartnamed#1\v!code\endcsname####1\csname\e!stop#1\v!code\endcsname}%
-         {\endgroup\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}%
-       \long\expandafter\def \csname\e!start#1\v!code\endcsname   {\dostartnamedluacode{#1}}%
-       \long\expandafter\edef\csname        #1\v!code\endcsname##1{\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}}
-
-\fi
+\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet
+  {\scratchcounter\ctxlua{lua.registername("#1","#3")}%
+   \normalexpanded{\long\edef\csname dodostartnamed#1\v!code\endcsname##1\csname\e!stop#1\v!code\endcsname}%
+     {\endgroup\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}%
+   \long\expandafter\def \csname\e!start#1\v!code\endcsname   {\dostartnamedluacode{#1}}%
+   \long\expandafter\edef\csname        #1\v!code\endcsname##1{\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}}
 
 %D We predefine a few.
 
@@ -244,4 +232,8 @@
 %
 % options=\luaparameterset{u3d:myset:display:1}{toolbar=false,tree=true}
 
+%D A Handy helper:
+
+\def\luaconditional#1{\ifcase#1tru\else fals\fi e}
+
 \protect \endinput
diff --git a/tex/context/base/luat-lib.mkiv b/tex/context/base/luat-lib.mkiv
index 1905ee67d..f8f71dd0a 100644
--- a/tex/context/base/luat-lib.mkiv
+++ b/tex/context/base/luat-lib.mkiv
@@ -42,7 +42,7 @@
 \registerctxluafile{luat-ini} {1.001}
 \registerctxluafile{luat-env} {1.001}
 
-\registerctxluafile{l-xml}    {1.001} % we want tracking
+\registerctxluafile{l-xml}    {1.001} % we need to load lxml-tab earlier so this will change !
 
 \startruntimeluacode
     \edef\asciia{\ctxlua{tex.sprint(logs.mode)}}
diff --git a/tex/context/base/lxml-ini.mkiv b/tex/context/base/lxml-ini.mkiv
new file mode 100644
index 000000000..494e4f0b7
--- /dev/null
+++ b/tex/context/base/lxml-ini.mkiv
@@ -0,0 +1,408 @@
+%D \module
+%D   [       file=lxml-ini,
+%D        version=2007.08.17,
+%D          title=\CONTEXT\ \XML\ Support,
+%D       subtitle=Initialization,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 XML Support / Initialization}
+
+\registerctxluafile{lxml-tab}{1.001}
+\registerctxluafile{lxml-pth}{1.001}
+\registerctxluafile{lxml-ent}{1.001}
+\registerctxluafile{lxml-mis}{1.001}
+\registerctxluafile{lxml-ini}{1.001}
+
+\unprotect
+
+\def\xmlmain               #1{\ctxlua{lxml.main("#1")}}
+\def\xmlall              #1#2{\ctxlua{lxml.all("#1","#2")}}
+\def\xmlatt              #1#2{\ctxlua{lxml.attribute("#1","/","#2")}}
+\def\xmlattdef         #1#2#3{\ctxlua{lxml.attribute("#1","/","#2","#3")}}
+\def\xmlattribute      #1#2#3{\ctxlua{lxml.attribute("#1","#2","#3")}}
+\def\xmlattributedef #1#2#3#4{\ctxlua{lxml.attribute("#1","#2","#3","#4")}}
+\def\xmlcommand        #1#2#3{\ctxlua{lxml.command("#1","#2","#3")}}
+\def\xmlconcat         #1#2#3{\ctxlua{lxml.concat("#1","#2",[[\detokenize{#3}]])}}
+\def\xmlconcatrange#1#2#3#4#5{\ctxlua{lxml.concatrange("#1","#2","#3","#4",[[\detokenize{#5}]])}}
+\def\xmlcount            #1#2{\ctxlua{lxml.count("#1","#2")}}
+\def\xmldelete           #1#2{\ctxlua{xml.delete(lxml.id("#1"),"#2")}}
+\def\xmldirectives         #1{\ctxlua{lxml.directives.setup("#1")}}
+\def\xmldirectivesbefore   #1{\ctxlua{lxml.directives.before("#1")}}
+\def\xmldirectivesafter    #1{\ctxlua{lxml.directives.after("#1")}}
+\def\xmlfilter           #1#2{\ctxlua{lxml.filter("#1",\!!bs#2\!!es)}}
+\def\xmlfirst            #1#2{\ctxlua{lxml.first("#1","#2")}}
+\def\xmlflush              #1{\ctxlua{lxml.flush("#1")}}
+% \def\xmlcontent            #1{\ctxlua{lxml.content("#1")}}
+% \def\xmlstrip              #1{\ctxlua{lxml.strip("#1")}}
+% \def\xmlflushstripped      #1{\ctxlua{lxml.strip("#1",true)}}
+\def\xmldirect             #1{\ctxlua{lxml.direct("#1")}} % in loops, not dt but root
+\def\xmlidx            #1#2#3{\ctxlua{lxml.idx("#1","#2",\number#3)}}
+\def\xmlinclude        #1#2#3{\ctxlua{lxml.include("#1","#2","#3",true)}}
+\def\xmlindex          #1#2#3{\ctxlua{lxml.index("#1","#2",\number#3)}}
+\def\xmlinfo               #1{\hbox{\ttxx[\ctxlua{lxml.info("#1")}]}}
+\def\xmlshow               #1{\startpacked\ttx\xmlverbatim{#1}\stoppacked}
+\def\xmllast             #1#2{\ctxlua{lxml.last("#1","#2")}}
+\def\xmlload             #1#2{\ctxlua{lxml.load("#1","#2")}}
+\def\xmlloadbuffer       #1#2{\ctxlua{lxml.loadbuffer("#1","#2")}}
+\def\xmlloaddata         #1#2{\ctxlua{lxml.loaddata("#1",\!!bs#2\!!es)}}
+\def\xmlloadregistered   #1#2{\ctxlua{lxml.loadregistered("#1")}}
+\def\xmlloaddirectives     #1{\ctxlua{lxml.directives.load("#1")}}
+\def\xmlname               #1{\ctxlua{lxml.name("#1")}}
+\def\xmlnamespace          #1{\ctxlua{lxml.namespace("#1")}}
+\def\xmlnonspace         #1#2{\ctxlua{lxml.nonspace("#1","#2")}}
+\def\xmlraw              #1#2{\ctxlua{lxml.raw("#1","#2")}}
+\def\xmlsnippet          #1#2{\ctxlua{lxml.snippet("#1",#2)}}
+\def\xmlelement          #1#2{\ctxlua{lxml.element("#1",#2)}}
+\def\xmlnofelements        #1{\ctxlua{lxml.nofelements("#1")}}
+\def\xmlregisterns       #1#2{\ctxlua{xml.registerns("#1","#2")}}                    % document
+\def\xmlremapname    #1#2#3#4{\ctxlua{xml.remapname(lxml.id("#1"),"#2","#3","#4")}}  % element
+\def\xmlremapnamespace #1#2#3{\ctxlua{xml.rename_space(lxml.id("#1"),"#2","#3")}}    % document
+\def\xmlchecknamespace #1#2#3{\ctxlua{xml.check_namespace(lxml.id("#1"),"#2","#3")}} % element
+\def\xmlsetfunction    #1#2#3{\ctxlua{lxml.setaction("#1","#2",#3)}}
+\def\xmlsetsetup       #1#2#3{\ctxlua{lxml.setsetup("#1","#2","#3")}}
+\def\xmlstrip            #1#2{\ctxlua{lxml.strip("#1","#2")}}
+\def\xmlstripped         #1#2{\ctxlua{lxml.stripped("#1","#2")}}
+\def\xmlstripnolines     #1#2{\ctxlua{lxml.strip("#1","#2",true)}}
+\def\xmlstrippednolines  #1#2{\ctxlua{lxml.stripped("#1","#2",true)}}
+\def\xmltag                #1{\ctxlua{lxml.tag("#1")}}
+\def\xmltext             #1#2{\ctxlua{lxml.text("#1","#2")}}
+\def\xmltags             #1#2{\ctxlua{lxml.tags("#1","#2")}}
+\def\xmlutfize             #1{\ctxlua{lxml.utfize("#1")}}
+\def\xmlverbatim           #1{\ctxlua{lxml.verbatim("#1")}}
+\def\xmldisplayverbatim    #1{\ctxlua{lxml.displayverbatim("#1")}}
+\def\xmlinlineverbatim     #1{\ctxlua{lxml.inlineverbatim("#1")}}
+
+%def\xmldoifelse         #1#2{\ctxlua{cs.testcase(xml.found(lxml.id("#1"),"#2",false))}}
+%def\xmldoifelsetext     #1#2{\ctxlua{cs.testcase(xml.found(lxml.id("#1"),"#2",true ))}}
+
+% kind of special:
+
+\def\xmlstartraw{\ctxlua{lxml.startraw()}}
+\def\xmlstopraw {\ctxlua{lxml.stopraw()}}
+
+% todo: \xmldoifelseattribute
+
+\def\xmldoif             #1#2{\ctxlua{lxml.doif("#1","#2")}}
+\def\xmldoifnot          #1#2{\ctxlua{lxml.doifnot("#1","#2")}}
+\def\xmldoifelse         #1#2{\ctxlua{lxml.doifelse("#1","#2")}}
+\def\xmldoiftext         #1#2{\ctxlua{lxml.doiftext("#1","#2")}}
+\def\xmldoifnottext      #1#2{\ctxlua{lxml.doifnottext("#1","#2")}}
+\def\xmldoifelsetext     #1#2{\ctxlua{lxml.doifelsetext("#1","#2")}}
+\def\xmldoifelseempty    #1#2{\ctxlua{lxml.doifelseempty("#1","#2")}} % #2, "*" or "" == self not yet implemented
+\def\xmldoifelseselfempty  #1{\ctxlua{lxml.doifelseempty("#1")}}
+
+\def\xmldefaulttotext      #1{\ifcase\xmlprocessingmode\or\or   \ctxlua{lxml.set_command_to_text("#1")}\fi}
+\def\xmldefaulttonone      #1{\ifcase\xmlprocessingmode\or\or\or\ctxlua{lxml.set_command_to_none("#1")}\fi}
+
+% \startxmlsetups xml:include
+%     \xmlinclude{main}{include}{filename|href}
+% \stopxmlsetups
+%
+% \xmlprependsetup{xml:include}
+
+\let\xmlgrab\xmlsetsetup
+
+\def\xmlsetup#1#2%              % we pass the reference so that we have access to the frozen number
+  {\def\xmlself{#1}%            % by using #1 inside a setup
+   \setupwithargument{#2}{#1}}
+
+\newtoks \registeredxmlsetups
+
+% todo: 1:xml:whatever alwas before 3:xml:something
+
+\def\xmlprependsetup           #1{\ctxlua{lxml.installsetup(1,"*","#1")}}
+\def\xmlappendsetup            #1{\ctxlua{lxml.installsetup(2,"*","#1")}}
+\def\xmlbeforesetup          #1#2{\ctxlua{lxml.installsetup(3,"*","#1","#2"))}}
+\def\xmlaftersetup           #1#2{\ctxlua{lxml.installsetup(4,"*","#1","#2"))}}
+
+\def\xmlprependdocumentsetup #1#2{\ctxlua{lxml.installsetup(1,"#1","#2")}}
+\def\xmlappenddocumentsetup  #1#2{\ctxlua{lxml.installsetup(2,"#1","#2")}}
+\def\xmlbeforedocumentsetup#1#2#3{\ctxlua{lxml.installsetup(3,"#1","#2","#3"))}}
+\def\xmlafterdocumentsetup #1#2#3{\ctxlua{lxml.installsetup(4,"#1","#2","#3"))}}
+
+\def\xmlremovesetup            #1{\ctxlua{lxml.removesetup("*","#1")}}
+\def\xmlremovedocumentsetup  #1#2{\ctxlua{lxml.removesetup("#1","#2")}}
+
+\def\xmlflushdocumentsetups    #1{\ctxlua{lxml.flushsetups("*","#1")}}
+\def\xmlresetdocumentsetups    #1{\ctxlua{lxml.resetsetups("#1")}}
+
+\let\xmlregistersetup        \xmlappendsetup
+\let\xmlregisterdocumentsetup\xmlappenddocumentsetup
+
+\def\xmldocument{main}
+
+\def\xmlregisteredsetups
+  {\xmlstarttiming
+   \xmlflushsetups
+   \xmldefaulttotext\xmldocument % after include
+   \xmlstoptiming}
+
+\def\xmlregistereddocumentsetups#1%
+  {\xmlstarttiming
+   % todo: test for duplicates !
+   \xmlflushdocumentsetups{#1}%
+   \xmldefaulttotext{#1}% after include
+   \xmlstoptiming}
+
+\def\xmlstarttiming{\ctxlua{statistics.starttiming(lxml)}}
+\def\xmlstoptiming {\ctxlua{statistics.stoptiming (lxml)}}
+
+\def\doxmlprocess#1#2#3#4%
+  {\begingroup
+   \edef\xmldocument{#2}% #2 can be \xmldocument and set as such
+   #1{#2}{#3}%
+   \ifcase\xmlprocessingmode
+     \enableXML
+   \else
+     \setcatcodetable\notcatcodes
+   \fi
+   \doifelsenothing{#4}
+     {\directsetup{xml:process}}
+     {\directsetup{#4}}%
+   \endgroup}
+
+\def\xmlprocessfile      {\doxmlprocess\xmlload}
+\def\xmlprocessdata      {\doxmlprocess\xmlloaddata}
+\def\xmlprocessbuffer    {\doxmlprocess\xmlloadbuffer}
+\def\xmlprocessregistered{\doxmlprocess\xmlloadregistered}
+\let\xmlprocess           \xmlprocessfile
+
+% beware: \xmlmain takes the real root, so also processing
+% instructions preceding the root element; well, in some
+% sense that is the root
+
+\startsetups xml:process
+    \xmlregistereddocumentsetups\xmldocument
+    \xmlmain\xmldocument
+\stopsetups
+
+\long\def\xmlloop#1#2#3%
+  {\def\xmli##1##2{\xmlidx{#1}{#2/##1}{##2}}%
+   \dorecurse{\xmlcount{#1}{#2}}{#3}}
+
+\long\def\xmlconnect#1#2#3% inefficient
+  {\scratchcounter\xmlcount{#1}{#2}\relax
+   \ifcase\scratchcounter \or
+       \xmlall{#1}{#2}%
+   \else
+       \dorecurse \scratchcounter {
+           \ifnum\recurselevel>\plusone#3\fi
+           \xmlidx{#1}{#2}{\recurselevel}
+       }
+   \fi}
+
+\def\xmlcdataobeyedline {\obeyedline}
+\def\xmlcdataobeyedspace{\strut\obeyedspace}
+\def\xmlcdatabefore     {\bgroup\tt}
+\def\xmlcdataafter      {\egroup}
+
+% verbatim (dodo:pre/post whitespace, maybe splot verbatim and
+% cdata commands), experimental:
+%
+% \xmlsetfunction{main}{verbatim}{lxml.displayverbatim}
+% \xmlsetfunction{main}{verb}    {lxml.inlineverbatim}
+
+% \def\startxmldisplayverbatim[#1]{}
+% \def\stopxmldisplayverbatim     {}
+% \def\startxmlinlineverbatim [#1]{}
+% \def\stopxmlinlineverbatim      {}
+
+% we use an xml: namespace so one has to define a suitable verbatim, say
+%
+% \definetyping[xml:verbatim][typing]
+%
+% this is experimental!
+
+\def\startxmldisplayverbatim[#1]%
+  {\startpacked % \begingroup
+   \let\currenttypingclass\??tp
+   \edef\currenttyping{xml:#1}%
+   \def\stopxmldisplayverbatim
+     {\endofverbatimlines
+      \stoppacked} % \endgroup
+   \mkinitializeverbatim
+   \beginofverbatimlines}
+
+\def\startxmlinlineverbatim[#1]%
+  {\begingroup
+   \let\currenttypingclass\??ty
+   \edef\currenttyping{xml:#1}%
+   \let\stopxmldisplayverbatim\endgroup
+   \mkinitializeverbatim}
+
+% will move but is developed for xml
+
+\newtoks \collectingtoks
+
+\def\startcollect#1\stopcollect
+  {\collectingtoks\@EA{\the\collectingtoks#1}}
+
+\def\startexpandedcollect#1\stopexpandedcollect
+  {\expanded{\collectingtoks{\the\collectingtoks#1}}}
+
+\def\startcollecting{\collectingtoks\emptytoks}
+\def\stopcollecting {\the\collectingtoks}
+
+\def\inlinemessage #1{\dontleavehmode{\tttf#1}}
+\def\displaymessage#1{\blank\inlinemessage{#1}\blank}
+
+\def\xmltraceentities
+  {\ctxlua{xml.set_text_cleanup(lxml.trace_text_entities)}%
+   \appendtoks\ctxlua{lxml.show_text_entities()}\to\everygoodbye}
+
+% processing instructions
+
+\def\xmlcontextdirective#1% kind class key value
+  {\executeifdefined{xml#1directive}\gobblethreearguments}
+
+% setting up xml:
+%
+% \setupxml[\c!method=mkii]                    % mixed mkiv and mkii
+% \setupxml[\c!method=mkiv,\c!default=]        % mkiv only
+% \setupxml[\c!method=mkiv,\c!default=\v!none] % mkiv only, undefined -> hidden
+% \setupxml[\c!method=mkiv,\c!default=\v!text] % mkiv only, undefined -> text
+
+% \def\xmlctxdirective#1#2#3{\doif{#1}{clue}{\doif{#2}{page}}{\page[#3]}}
+
+\chardef\xmlprocessingmode=0 % 0=mixed, 1=mkivonly, 2=mkivonly-default-text, 3=mkivonly-default-none
+
+% \setupxml[method=mkiv,strip=yes,entities=yes,default=text]
+
+\newtoks\everysetupxml
+
+\def\setupxml[#1]{\getparameters[\??xm][#1]\the\everysetupxml}
+
+\def\c!entities{entities} % to be internationalized
+\def\s!mkiv    {mkiv}
+\def\s!mkii    {mkii}
+
+% entities
+
+\newif\ifautoXMLentities
+
+\def\xmlkeepentities{\ctxlua{lxml.reset_entityhandler()}}
+\def\xmlmkiientities{\ctxlua{lxml.set_mkii_entityhandler()}\autoXMLentitiestrue}
+\def\xmlmkiventities{\ctxlua{lxml.set_mkiv_entityhandler()}}
+
+\let\xmlresolveentities\xmlmkiventities % will become \xmlmkiventities
+
+\letvalue{\??xm:1:\s!mkii  }\zerocount
+\letvalue{\??xm:1:\s!mkiv  }\plusone
+
+\letvalue{\??xm:2:\v!none  }\plusone
+\letvalue{\??xm:2:\v!text  }\plustwo
+\letvalue{\??xm:2:\v!hidden}\plusthree
+
+\letvalue{\??xm:ii:\v!yes }\xmlresolveentities
+\letvalue{\??xm:ii:\v!no  }\xmlkeepentities
+\letvalue{\??xm:ii:\s!mkii}\xmlmkiientities
+\letvalue{\??xm:ii:\s!mkiv}\xmlmkiventities
+
+\letvalue{\??xm:iv:\v!yes }\xmlresolveentities
+\letvalue{\??xm:iv:\v!no  }\xmlkeepentities
+\letvalue{\??xm:iv:\s!mkii}\xmlmkiventities
+\letvalue{\??xm:iv:\s!mkiv}\xmlmkiventities
+
+\appendtoks
+    \chardef\xmlprocessingmode\executeifdefined{\??xm:1:\@@xmmethod}\zerocount
+    \ifcase\xmlprocessingmode
+        % mkii, permits both methods
+        \executeifdefined{\??xm:ii:\@@xmentities}\xmlkeepentities
+    \or
+        % mkiv, mkiv exclusively
+        \chardef\xmlprocessingmode\executeifdefined{\??xm:2:\@@xmdefault}\plusone
+        \executeifdefined{\??xm:iv:\@@xmentities}\xmlresolveentities
+    \else
+        % unset
+    \fi
+    \ifcase\xmlprocessingmode
+        \ctxlua{characters.setmkiientities()}%
+    \else
+        \ctxlua{characters.setmkiventities()}%
+    \fi
+    \doifelse\@@xmcompress\v!yes % this key may change, maybe compress=yes|no
+      {\ctxlua{xml.strip_cm_and_dt=true}}
+      {\ctxlua{xml.strip_cm_and_dt=false}}%
+\to \everysetupxml
+
+\def\xmlinitialize{\the\everysetupxml}
+
+\newcount\charactersactiveoffset \charactersactiveoffset="10000
+
+\startextendcatcodetable\ctxcatcodes
+    \catcode\numexpr\charactersactiveoffset+`<\relax=13
+    \catcode\numexpr\charactersactiveoffset+`&\relax=13
+    \catcode\numexpr\charactersactiveoffset+`>\relax=13
+\stopextendcatcodetable
+\startextendcatcodetable\xmlcatcodes
+    \catcode\numexpr\charactersactiveoffset+`<\relax=13
+    \catcode\numexpr\charactersactiveoffset+`&\relax=13
+    \catcode\numexpr\charactersactiveoffset+`>\relax=13
+\stopextendcatcodetable
+
+\ctxlua { % entities are remembered in the format
+    characters.remapentity("<",characters.active_offset + utf.byte("<"))
+    characters.remapentity("&",characters.active_offset + utf.byte("&"))
+    characters.remapentity(">",characters.active_offset + utf.byte(">"))
+}
+
+\setupxml
+  [\c!method=mkii,       % mixed mode
+   \c!default=\v!hidden, % ignore elements that are not defined
+   \c!compress=\v!no,    % strip comment
+   \c!entities=\v!yes]   % replace entities
+
+% \defineXMLenvironment[y]{(}{)}
+%
+% \startxmlsetups x
+%     /\xmlflush{#1}/
+% \stopxmlsetups
+%
+% \startxmlsetups xx
+%     \xmlsetsetup{main}{x}{*}
+% \stopxmlsetups
+%
+% \xmlregistersetup{xx}
+%
+% \startbuffer
+% a <&>{b} c
+% \stopbuffer
+%
+% mkii: [\processXMLbuffer]\quad mkiv: [\xmlprocessbuffer{main}{}{}]
+
+% some mkii commands, but mkiv-ified
+
+\def\xmlmapvalue#1#2#3{\setvalue{\??xm:v:#1:#2}{#3}} % keep #3 to grab spaces
+\def\xmlvalue   #1#2#3{\executeifdefined{\??xm:v:#1:#2}{#3}}
+
+\let\xmlmapval\xmlmapvalue
+\let\xmlval   \xmlvalue
+
+% brrrr, give this at the top of a style that needs to stub mkiv loading
+
+\def\remapXMLtoMKIV
+  {\ifx\xmldocument\undefined\def\xmldocument{main}\fi
+   \def\processXMLfile          ##1{\xmlprocessfile  \xmldocument{##1}{}}%
+   \def\processXMLfilegrouped   ##1{\xmlprocessfile  \xmldocument{##1}{}}% maybe still grouped?
+   \def\processXMLbuffer           {\dosingleempty\doprocessXMLbuffer}%
+   \def\doprocessXMLbuffer    [##1]{\xmlprocessbuffer\xmldocument{##1}{}}%
+   \def\XMLdata                 ##1{\xmlprocessdata  \xmldocument{##1}{}}%
+   \def\startXMLdata##1\stopXMLdata{\xmlprocessdata  \xmldocument{##1}{}}}
+
+\let\normalprocessXMLfilegrouped\processXMLfilegrouped
+
+\def\processXMLfileMKIV % one-shot, will become obsolete, personal hack
+  {\dosingleempty\doprocessXMLfileMKIV}
+
+\def\doprocessXMLfileMKIV[#1]%
+  {\def\processXMLfilegrouped##1%
+     {\let\processXMLfilegrouped\normalprocessXMLfilegrouped
+      \doifelsenothing{#1}{\xmlprocess{main}{##1}{}}{\xmlprocess{#1}{##1}{}}}}
+
+\protect \endinput
diff --git a/tex/context/base/lxml-ini.tex b/tex/context/base/lxml-ini.tex
deleted file mode 100644
index 494e4f0b7..000000000
--- a/tex/context/base/lxml-ini.tex
+++ /dev/null
@@ -1,408 +0,0 @@
-%D \module
-%D   [       file=lxml-ini,
-%D        version=2007.08.17,
-%D          title=\CONTEXT\ \XML\ Support,
-%D       subtitle=Initialization,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 XML Support / Initialization}
-
-\registerctxluafile{lxml-tab}{1.001}
-\registerctxluafile{lxml-pth}{1.001}
-\registerctxluafile{lxml-ent}{1.001}
-\registerctxluafile{lxml-mis}{1.001}
-\registerctxluafile{lxml-ini}{1.001}
-
-\unprotect
-
-\def\xmlmain               #1{\ctxlua{lxml.main("#1")}}
-\def\xmlall              #1#2{\ctxlua{lxml.all("#1","#2")}}
-\def\xmlatt              #1#2{\ctxlua{lxml.attribute("#1","/","#2")}}
-\def\xmlattdef         #1#2#3{\ctxlua{lxml.attribute("#1","/","#2","#3")}}
-\def\xmlattribute      #1#2#3{\ctxlua{lxml.attribute("#1","#2","#3")}}
-\def\xmlattributedef #1#2#3#4{\ctxlua{lxml.attribute("#1","#2","#3","#4")}}
-\def\xmlcommand        #1#2#3{\ctxlua{lxml.command("#1","#2","#3")}}
-\def\xmlconcat         #1#2#3{\ctxlua{lxml.concat("#1","#2",[[\detokenize{#3}]])}}
-\def\xmlconcatrange#1#2#3#4#5{\ctxlua{lxml.concatrange("#1","#2","#3","#4",[[\detokenize{#5}]])}}
-\def\xmlcount            #1#2{\ctxlua{lxml.count("#1","#2")}}
-\def\xmldelete           #1#2{\ctxlua{xml.delete(lxml.id("#1"),"#2")}}
-\def\xmldirectives         #1{\ctxlua{lxml.directives.setup("#1")}}
-\def\xmldirectivesbefore   #1{\ctxlua{lxml.directives.before("#1")}}
-\def\xmldirectivesafter    #1{\ctxlua{lxml.directives.after("#1")}}
-\def\xmlfilter           #1#2{\ctxlua{lxml.filter("#1",\!!bs#2\!!es)}}
-\def\xmlfirst            #1#2{\ctxlua{lxml.first("#1","#2")}}
-\def\xmlflush              #1{\ctxlua{lxml.flush("#1")}}
-% \def\xmlcontent            #1{\ctxlua{lxml.content("#1")}}
-% \def\xmlstrip              #1{\ctxlua{lxml.strip("#1")}}
-% \def\xmlflushstripped      #1{\ctxlua{lxml.strip("#1",true)}}
-\def\xmldirect             #1{\ctxlua{lxml.direct("#1")}} % in loops, not dt but root
-\def\xmlidx            #1#2#3{\ctxlua{lxml.idx("#1","#2",\number#3)}}
-\def\xmlinclude        #1#2#3{\ctxlua{lxml.include("#1","#2","#3",true)}}
-\def\xmlindex          #1#2#3{\ctxlua{lxml.index("#1","#2",\number#3)}}
-\def\xmlinfo               #1{\hbox{\ttxx[\ctxlua{lxml.info("#1")}]}}
-\def\xmlshow               #1{\startpacked\ttx\xmlverbatim{#1}\stoppacked}
-\def\xmllast             #1#2{\ctxlua{lxml.last("#1","#2")}}
-\def\xmlload             #1#2{\ctxlua{lxml.load("#1","#2")}}
-\def\xmlloadbuffer       #1#2{\ctxlua{lxml.loadbuffer("#1","#2")}}
-\def\xmlloaddata         #1#2{\ctxlua{lxml.loaddata("#1",\!!bs#2\!!es)}}
-\def\xmlloadregistered   #1#2{\ctxlua{lxml.loadregistered("#1")}}
-\def\xmlloaddirectives     #1{\ctxlua{lxml.directives.load("#1")}}
-\def\xmlname               #1{\ctxlua{lxml.name("#1")}}
-\def\xmlnamespace          #1{\ctxlua{lxml.namespace("#1")}}
-\def\xmlnonspace         #1#2{\ctxlua{lxml.nonspace("#1","#2")}}
-\def\xmlraw              #1#2{\ctxlua{lxml.raw("#1","#2")}}
-\def\xmlsnippet          #1#2{\ctxlua{lxml.snippet("#1",#2)}}
-\def\xmlelement          #1#2{\ctxlua{lxml.element("#1",#2)}}
-\def\xmlnofelements        #1{\ctxlua{lxml.nofelements("#1")}}
-\def\xmlregisterns       #1#2{\ctxlua{xml.registerns("#1","#2")}}                    % document
-\def\xmlremapname    #1#2#3#4{\ctxlua{xml.remapname(lxml.id("#1"),"#2","#3","#4")}}  % element
-\def\xmlremapnamespace #1#2#3{\ctxlua{xml.rename_space(lxml.id("#1"),"#2","#3")}}    % document
-\def\xmlchecknamespace #1#2#3{\ctxlua{xml.check_namespace(lxml.id("#1"),"#2","#3")}} % element
-\def\xmlsetfunction    #1#2#3{\ctxlua{lxml.setaction("#1","#2",#3)}}
-\def\xmlsetsetup       #1#2#3{\ctxlua{lxml.setsetup("#1","#2","#3")}}
-\def\xmlstrip            #1#2{\ctxlua{lxml.strip("#1","#2")}}
-\def\xmlstripped         #1#2{\ctxlua{lxml.stripped("#1","#2")}}
-\def\xmlstripnolines     #1#2{\ctxlua{lxml.strip("#1","#2",true)}}
-\def\xmlstrippednolines  #1#2{\ctxlua{lxml.stripped("#1","#2",true)}}
-\def\xmltag                #1{\ctxlua{lxml.tag("#1")}}
-\def\xmltext             #1#2{\ctxlua{lxml.text("#1","#2")}}
-\def\xmltags             #1#2{\ctxlua{lxml.tags("#1","#2")}}
-\def\xmlutfize             #1{\ctxlua{lxml.utfize("#1")}}
-\def\xmlverbatim           #1{\ctxlua{lxml.verbatim("#1")}}
-\def\xmldisplayverbatim    #1{\ctxlua{lxml.displayverbatim("#1")}}
-\def\xmlinlineverbatim     #1{\ctxlua{lxml.inlineverbatim("#1")}}
-
-%def\xmldoifelse         #1#2{\ctxlua{cs.testcase(xml.found(lxml.id("#1"),"#2",false))}}
-%def\xmldoifelsetext     #1#2{\ctxlua{cs.testcase(xml.found(lxml.id("#1"),"#2",true ))}}
-
-% kind of special:
-
-\def\xmlstartraw{\ctxlua{lxml.startraw()}}
-\def\xmlstopraw {\ctxlua{lxml.stopraw()}}
-
-% todo: \xmldoifelseattribute
-
-\def\xmldoif             #1#2{\ctxlua{lxml.doif("#1","#2")}}
-\def\xmldoifnot          #1#2{\ctxlua{lxml.doifnot("#1","#2")}}
-\def\xmldoifelse         #1#2{\ctxlua{lxml.doifelse("#1","#2")}}
-\def\xmldoiftext         #1#2{\ctxlua{lxml.doiftext("#1","#2")}}
-\def\xmldoifnottext      #1#2{\ctxlua{lxml.doifnottext("#1","#2")}}
-\def\xmldoifelsetext     #1#2{\ctxlua{lxml.doifelsetext("#1","#2")}}
-\def\xmldoifelseempty    #1#2{\ctxlua{lxml.doifelseempty("#1","#2")}} % #2, "*" or "" == self not yet implemented
-\def\xmldoifelseselfempty  #1{\ctxlua{lxml.doifelseempty("#1")}}
-
-\def\xmldefaulttotext      #1{\ifcase\xmlprocessingmode\or\or   \ctxlua{lxml.set_command_to_text("#1")}\fi}
-\def\xmldefaulttonone      #1{\ifcase\xmlprocessingmode\or\or\or\ctxlua{lxml.set_command_to_none("#1")}\fi}
-
-% \startxmlsetups xml:include
-%     \xmlinclude{main}{include}{filename|href}
-% \stopxmlsetups
-%
-% \xmlprependsetup{xml:include}
-
-\let\xmlgrab\xmlsetsetup
-
-\def\xmlsetup#1#2%              % we pass the reference so that we have access to the frozen number
-  {\def\xmlself{#1}%            % by using #1 inside a setup
-   \setupwithargument{#2}{#1}}
-
-\newtoks \registeredxmlsetups
-
-% todo: 1:xml:whatever alwas before 3:xml:something
-
-\def\xmlprependsetup           #1{\ctxlua{lxml.installsetup(1,"*","#1")}}
-\def\xmlappendsetup            #1{\ctxlua{lxml.installsetup(2,"*","#1")}}
-\def\xmlbeforesetup          #1#2{\ctxlua{lxml.installsetup(3,"*","#1","#2"))}}
-\def\xmlaftersetup           #1#2{\ctxlua{lxml.installsetup(4,"*","#1","#2"))}}
-
-\def\xmlprependdocumentsetup #1#2{\ctxlua{lxml.installsetup(1,"#1","#2")}}
-\def\xmlappenddocumentsetup  #1#2{\ctxlua{lxml.installsetup(2,"#1","#2")}}
-\def\xmlbeforedocumentsetup#1#2#3{\ctxlua{lxml.installsetup(3,"#1","#2","#3"))}}
-\def\xmlafterdocumentsetup #1#2#3{\ctxlua{lxml.installsetup(4,"#1","#2","#3"))}}
-
-\def\xmlremovesetup            #1{\ctxlua{lxml.removesetup("*","#1")}}
-\def\xmlremovedocumentsetup  #1#2{\ctxlua{lxml.removesetup("#1","#2")}}
-
-\def\xmlflushdocumentsetups    #1{\ctxlua{lxml.flushsetups("*","#1")}}
-\def\xmlresetdocumentsetups    #1{\ctxlua{lxml.resetsetups("#1")}}
-
-\let\xmlregistersetup        \xmlappendsetup
-\let\xmlregisterdocumentsetup\xmlappenddocumentsetup
-
-\def\xmldocument{main}
-
-\def\xmlregisteredsetups
-  {\xmlstarttiming
-   \xmlflushsetups
-   \xmldefaulttotext\xmldocument % after include
-   \xmlstoptiming}
-
-\def\xmlregistereddocumentsetups#1%
-  {\xmlstarttiming
-   % todo: test for duplicates !
-   \xmlflushdocumentsetups{#1}%
-   \xmldefaulttotext{#1}% after include
-   \xmlstoptiming}
-
-\def\xmlstarttiming{\ctxlua{statistics.starttiming(lxml)}}
-\def\xmlstoptiming {\ctxlua{statistics.stoptiming (lxml)}}
-
-\def\doxmlprocess#1#2#3#4%
-  {\begingroup
-   \edef\xmldocument{#2}% #2 can be \xmldocument and set as such
-   #1{#2}{#3}%
-   \ifcase\xmlprocessingmode
-     \enableXML
-   \else
-     \setcatcodetable\notcatcodes
-   \fi
-   \doifelsenothing{#4}
-     {\directsetup{xml:process}}
-     {\directsetup{#4}}%
-   \endgroup}
-
-\def\xmlprocessfile      {\doxmlprocess\xmlload}
-\def\xmlprocessdata      {\doxmlprocess\xmlloaddata}
-\def\xmlprocessbuffer    {\doxmlprocess\xmlloadbuffer}
-\def\xmlprocessregistered{\doxmlprocess\xmlloadregistered}
-\let\xmlprocess           \xmlprocessfile
-
-% beware: \xmlmain takes the real root, so also processing
-% instructions preceding the root element; well, in some
-% sense that is the root
-
-\startsetups xml:process
-    \xmlregistereddocumentsetups\xmldocument
-    \xmlmain\xmldocument
-\stopsetups
-
-\long\def\xmlloop#1#2#3%
-  {\def\xmli##1##2{\xmlidx{#1}{#2/##1}{##2}}%
-   \dorecurse{\xmlcount{#1}{#2}}{#3}}
-
-\long\def\xmlconnect#1#2#3% inefficient
-  {\scratchcounter\xmlcount{#1}{#2}\relax
-   \ifcase\scratchcounter \or
-       \xmlall{#1}{#2}%
-   \else
-       \dorecurse \scratchcounter {
-           \ifnum\recurselevel>\plusone#3\fi
-           \xmlidx{#1}{#2}{\recurselevel}
-       }
-   \fi}
-
-\def\xmlcdataobeyedline {\obeyedline}
-\def\xmlcdataobeyedspace{\strut\obeyedspace}
-\def\xmlcdatabefore     {\bgroup\tt}
-\def\xmlcdataafter      {\egroup}
-
-% verbatim (dodo:pre/post whitespace, maybe splot verbatim and
-% cdata commands), experimental:
-%
-% \xmlsetfunction{main}{verbatim}{lxml.displayverbatim}
-% \xmlsetfunction{main}{verb}    {lxml.inlineverbatim}
-
-% \def\startxmldisplayverbatim[#1]{}
-% \def\stopxmldisplayverbatim     {}
-% \def\startxmlinlineverbatim [#1]{}
-% \def\stopxmlinlineverbatim      {}
-
-% we use an xml: namespace so one has to define a suitable verbatim, say
-%
-% \definetyping[xml:verbatim][typing]
-%
-% this is experimental!
-
-\def\startxmldisplayverbatim[#1]%
-  {\startpacked % \begingroup
-   \let\currenttypingclass\??tp
-   \edef\currenttyping{xml:#1}%
-   \def\stopxmldisplayverbatim
-     {\endofverbatimlines
-      \stoppacked} % \endgroup
-   \mkinitializeverbatim
-   \beginofverbatimlines}
-
-\def\startxmlinlineverbatim[#1]%
-  {\begingroup
-   \let\currenttypingclass\??ty
-   \edef\currenttyping{xml:#1}%
-   \let\stopxmldisplayverbatim\endgroup
-   \mkinitializeverbatim}
-
-% will move but is developed for xml
-
-\newtoks \collectingtoks
-
-\def\startcollect#1\stopcollect
-  {\collectingtoks\@EA{\the\collectingtoks#1}}
-
-\def\startexpandedcollect#1\stopexpandedcollect
-  {\expanded{\collectingtoks{\the\collectingtoks#1}}}
-
-\def\startcollecting{\collectingtoks\emptytoks}
-\def\stopcollecting {\the\collectingtoks}
-
-\def\inlinemessage #1{\dontleavehmode{\tttf#1}}
-\def\displaymessage#1{\blank\inlinemessage{#1}\blank}
-
-\def\xmltraceentities
-  {\ctxlua{xml.set_text_cleanup(lxml.trace_text_entities)}%
-   \appendtoks\ctxlua{lxml.show_text_entities()}\to\everygoodbye}
-
-% processing instructions
-
-\def\xmlcontextdirective#1% kind class key value
-  {\executeifdefined{xml#1directive}\gobblethreearguments}
-
-% setting up xml:
-%
-% \setupxml[\c!method=mkii]                    % mixed mkiv and mkii
-% \setupxml[\c!method=mkiv,\c!default=]        % mkiv only
-% \setupxml[\c!method=mkiv,\c!default=\v!none] % mkiv only, undefined -> hidden
-% \setupxml[\c!method=mkiv,\c!default=\v!text] % mkiv only, undefined -> text
-
-% \def\xmlctxdirective#1#2#3{\doif{#1}{clue}{\doif{#2}{page}}{\page[#3]}}
-
-\chardef\xmlprocessingmode=0 % 0=mixed, 1=mkivonly, 2=mkivonly-default-text, 3=mkivonly-default-none
-
-% \setupxml[method=mkiv,strip=yes,entities=yes,default=text]
-
-\newtoks\everysetupxml
-
-\def\setupxml[#1]{\getparameters[\??xm][#1]\the\everysetupxml}
-
-\def\c!entities{entities} % to be internationalized
-\def\s!mkiv    {mkiv}
-\def\s!mkii    {mkii}
-
-% entities
-
-\newif\ifautoXMLentities
-
-\def\xmlkeepentities{\ctxlua{lxml.reset_entityhandler()}}
-\def\xmlmkiientities{\ctxlua{lxml.set_mkii_entityhandler()}\autoXMLentitiestrue}
-\def\xmlmkiventities{\ctxlua{lxml.set_mkiv_entityhandler()}}
-
-\let\xmlresolveentities\xmlmkiventities % will become \xmlmkiventities
-
-\letvalue{\??xm:1:\s!mkii  }\zerocount
-\letvalue{\??xm:1:\s!mkiv  }\plusone
-
-\letvalue{\??xm:2:\v!none  }\plusone
-\letvalue{\??xm:2:\v!text  }\plustwo
-\letvalue{\??xm:2:\v!hidden}\plusthree
-
-\letvalue{\??xm:ii:\v!yes }\xmlresolveentities
-\letvalue{\??xm:ii:\v!no  }\xmlkeepentities
-\letvalue{\??xm:ii:\s!mkii}\xmlmkiientities
-\letvalue{\??xm:ii:\s!mkiv}\xmlmkiventities
-
-\letvalue{\??xm:iv:\v!yes }\xmlresolveentities
-\letvalue{\??xm:iv:\v!no  }\xmlkeepentities
-\letvalue{\??xm:iv:\s!mkii}\xmlmkiventities
-\letvalue{\??xm:iv:\s!mkiv}\xmlmkiventities
-
-\appendtoks
-    \chardef\xmlprocessingmode\executeifdefined{\??xm:1:\@@xmmethod}\zerocount
-    \ifcase\xmlprocessingmode
-        % mkii, permits both methods
-        \executeifdefined{\??xm:ii:\@@xmentities}\xmlkeepentities
-    \or
-        % mkiv, mkiv exclusively
-        \chardef\xmlprocessingmode\executeifdefined{\??xm:2:\@@xmdefault}\plusone
-        \executeifdefined{\??xm:iv:\@@xmentities}\xmlresolveentities
-    \else
-        % unset
-    \fi
-    \ifcase\xmlprocessingmode
-        \ctxlua{characters.setmkiientities()}%
-    \else
-        \ctxlua{characters.setmkiventities()}%
-    \fi
-    \doifelse\@@xmcompress\v!yes % this key may change, maybe compress=yes|no
-      {\ctxlua{xml.strip_cm_and_dt=true}}
-      {\ctxlua{xml.strip_cm_and_dt=false}}%
-\to \everysetupxml
-
-\def\xmlinitialize{\the\everysetupxml}
-
-\newcount\charactersactiveoffset \charactersactiveoffset="10000
-
-\startextendcatcodetable\ctxcatcodes
-    \catcode\numexpr\charactersactiveoffset+`<\relax=13
-    \catcode\numexpr\charactersactiveoffset+`&\relax=13
-    \catcode\numexpr\charactersactiveoffset+`>\relax=13
-\stopextendcatcodetable
-\startextendcatcodetable\xmlcatcodes
-    \catcode\numexpr\charactersactiveoffset+`<\relax=13
-    \catcode\numexpr\charactersactiveoffset+`&\relax=13
-    \catcode\numexpr\charactersactiveoffset+`>\relax=13
-\stopextendcatcodetable
-
-\ctxlua { % entities are remembered in the format
-    characters.remapentity("<",characters.active_offset + utf.byte("<"))
-    characters.remapentity("&",characters.active_offset + utf.byte("&"))
-    characters.remapentity(">",characters.active_offset + utf.byte(">"))
-}
-
-\setupxml
-  [\c!method=mkii,       % mixed mode
-   \c!default=\v!hidden, % ignore elements that are not defined
-   \c!compress=\v!no,    % strip comment
-   \c!entities=\v!yes]   % replace entities
-
-% \defineXMLenvironment[y]{(}{)}
-%
-% \startxmlsetups x
-%     /\xmlflush{#1}/
-% \stopxmlsetups
-%
-% \startxmlsetups xx
-%     \xmlsetsetup{main}{x}{*}
-% \stopxmlsetups
-%
-% \xmlregistersetup{xx}
-%
-% \startbuffer
-% a <&>{b} c
-% \stopbuffer
-%
-% mkii: [\processXMLbuffer]\quad mkiv: [\xmlprocessbuffer{main}{}{}]
-
-% some mkii commands, but mkiv-ified
-
-\def\xmlmapvalue#1#2#3{\setvalue{\??xm:v:#1:#2}{#3}} % keep #3 to grab spaces
-\def\xmlvalue   #1#2#3{\executeifdefined{\??xm:v:#1:#2}{#3}}
-
-\let\xmlmapval\xmlmapvalue
-\let\xmlval   \xmlvalue
-
-% brrrr, give this at the top of a style that needs to stub mkiv loading
-
-\def\remapXMLtoMKIV
-  {\ifx\xmldocument\undefined\def\xmldocument{main}\fi
-   \def\processXMLfile          ##1{\xmlprocessfile  \xmldocument{##1}{}}%
-   \def\processXMLfilegrouped   ##1{\xmlprocessfile  \xmldocument{##1}{}}% maybe still grouped?
-   \def\processXMLbuffer           {\dosingleempty\doprocessXMLbuffer}%
-   \def\doprocessXMLbuffer    [##1]{\xmlprocessbuffer\xmldocument{##1}{}}%
-   \def\XMLdata                 ##1{\xmlprocessdata  \xmldocument{##1}{}}%
-   \def\startXMLdata##1\stopXMLdata{\xmlprocessdata  \xmldocument{##1}{}}}
-
-\let\normalprocessXMLfilegrouped\processXMLfilegrouped
-
-\def\processXMLfileMKIV % one-shot, will become obsolete, personal hack
-  {\dosingleempty\doprocessXMLfileMKIV}
-
-\def\doprocessXMLfileMKIV[#1]%
-  {\def\processXMLfilegrouped##1%
-     {\let\processXMLfilegrouped\normalprocessXMLfilegrouped
-      \doifelsenothing{#1}{\xmlprocess{main}{##1}{}}{\xmlprocess{#1}{##1}{}}}}
-
-\protect \endinput
diff --git a/tex/context/base/lxml-tab.lua b/tex/context/base/lxml-tab.lua
index 6ceadb678..77c28f8d3 100644
--- a/tex/context/base/lxml-tab.lua
+++ b/tex/context/base/lxml-tab.lua
@@ -445,7 +445,7 @@ generic table copier. Since we know what we're dealing with we
 can speed up things a bit. The second argument is not to be used!
 --ldx]]--
 
-function copy(old,tables)
+local function copy(old,tables)
     if old then
         tables = tables or { }
         local new = { }
diff --git a/tex/context/base/m-format.tex b/tex/context/base/m-format.tex
new file mode 100644
index 000000000..0f274b236
--- /dev/null
+++ b/tex/context/base/m-format.tex
@@ -0,0 +1,409 @@
+%D \module
+%D   [       file=m-formay,
+%D        version=ancient,
+%D          title=\CONTEXT\ Modules,
+%D       subtitle=Ancient Formatting Code,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Here is some code that I had laying around and had forgotten
+%D about. Let's make it a module and see if there is interest in
+%D such things.
+
+% \defineformatblock   [poem]
+% \defineformatsegment [verse] % [poem]
+% \defineformatline    [line]  % [verse]
+%
+% \startpoem  [title] [author]
+% \startverse [ref]
+% \startline  [ref]
+%
+% block   : voor na tussen *tekstletter *tekstkleur
+%
+% segment : voor na tussen *tekstletter *tekstkleur
+%         : links rechts linkeroffset rechteroffset
+%         : ?marge *evenmarge *onevenmarge breedte
+%         : nummer *nummercommando *conversie
+%         : nummerletter nummerkleur *label
+%
+% line    : voor na tussen *tekstletter *tekstkleur
+%         : nummer *nummercommando *conversie
+%         : nummerletter nummerkleur *label
+%
+% * = todo
+
+\unprotect
+
+\definesystemvariable {fx}   % format block
+\definesystemvariable {fy}   % format segment
+\definesystemvariable {fz}   % format line
+
+\def\defineformatblock
+  {\dodoubleempty\dodefineformatblock}
+
+\def\dodefineformatblock[#1][#2]%
+  {\setupformatblock
+     [#1]
+     [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank,
+      \c!textstyle=,\c!textcolor=,#2]%
+   \setvalue{\e!start#1}{\startformatblock[#1]}%
+   \setvalue{\e!stop #1}{\stopformatblock}}
+
+\def\setupformatblock
+  {\dodoubleempty\dosetupformatblock}
+
+\def\setupformatblock[#1]%
+  {\getparameters[\??fx#1]}
+
+\def\startformatblock[#1]%
+  {\dotriplegroupempty\dostartformatblock{#1}}
+
+\def\dostartformatblock#1#2#3
+  {\bgroup
+   \getvalue{\??fx#1\c!before}
+   \doglobal\newcounter\formatsegmentcounter
+   \doglobal\newcounter\formatlinecounter
+   \doglobal\newcounter\formatlinesubcounter
+   \doglobal\newcounter\formatlinemaxcounter
+   \doifsomething{#2}{\leftaligned{#2}\getvalue{\??fx#1\c!inbetween}}
+   \def\stopformatblock%
+     {\doifsomething{#3}{\getvalue{\??fx#1\c!inbetween}\leftaligned{#3}}
+      \getvalue{\??fx#1\c!after}
+      \egroup}}
+
+\def\defineformatsegment
+  {\dodoubleempty\dodefineformatsegment}
+
+\def\dodefineformatsegment[#1][#2]%
+  {\setupformatsegment
+     [#1]
+     [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank,
+      \c!textstyle=,\c!textcolor=,\c!left=,\c!right=,
+      \c!leftoffset=\!!zeropoint,\c!rightoffset=\!!zeropoint,
+     %\c!margin=\!!zeropoint,\c!evenmargin=\!!zeropoint,\c!oddmargin=\hsize,
+      \c!width=\hsize,\c!numberstyle=,\c!numbercolor=,\c!number=\v!no,
+      \c!numbercommand=,\c!conversion=,\c!label=,
+      #2]%
+   \setvalue{\e!start#1}{\startformatsegment[#1]}%
+   \setvalue{\e!stop #1}{\stopformatsegment}}
+
+\def\setupformatsegment
+  {\dodoubleempty\dosetupformatsegment}
+
+\def\setupformatsegment[#1]%
+  {\getparameters[\??fy#1]}
+
+\def\placeformatsegmentcounter
+  {\formatsegmentcounter\quad\hphantom{\placeformatlinecounter}}
+
+\def\placeformatlinecounter
+  {\formatlinecounter}
+
+\def\startformatsegment[#1]%
+  {\bgroup
+   \doifelsevalue{\??fy#1\c!number}\v!yes
+     {\def\doplaceformatsegmentcounter
+        {\inleftmargin
+           {\doattributes{\??fy#1}\c!numberstyle\c!numbercolor
+              {\placeformatsegmentcounter}}}}
+     {\let\doplaceformatsegmentcounter\relax}%
+   \getvalue{\??fy#1\c!before}
+   \doglobal\increment\formatsegmentcounter
+   \def\formatrightoffset{\getvalue{\??fy#1\c!rightoffset}}
+   \def\formatleftoffset {\getvalue{\??fy#1\c!leftoffset}}
+   \def\formatminwidth   {\getvalue{\??fy#1\c!minwidth}}
+   \def\formatwidth      {\getvalue{\??fy#1\c!width}}
+  %\def\formatmargin     {\getvalue{\??fy#1\c!margin}}
+   \def\formatbefore     {\getvalue{\??fy#1\c!before}}
+   \def\formatinbetween  {\getvalue{\??fy#1\c!inbetween}}
+   \def\formatafter      {\getvalue{\??fy#1\c!after}}
+   \def\formatleft       {\getvalue{\??fy#1\c!left}}
+   \def\formatright      {\getvalue{\??fy#1\c!right}}
+   \@@segmentvarianta
+   \getvalue{@@segmentvariant\getvalue{\??fy#1\c!alternative}}
+   \def\stopformatsegment
+     {\getvalue{\??fy#1\c!after}
+      \egroup}}
+
+\newif\iftraceformatblock
+
+\def\@@segmentvarianta % ragged right, symbols
+  {\let\formatraggedness\raggedright
+   \let\dostartformatline\dostartformatlineab
+   \let\formatleftfirst\relax \let\formatrightfirst\hfill
+   \let\formatleftnext \hfill \let\formatrightnext \relax}
+
+\def\@@segmentvariantb % ragged right, equal parts, symbols
+  {\let\formatraggedness\raggedcenter
+   \let\dostartformatline\dostartformatlineab
+   \let\formatleftfirst\relax \let\formatrightfirst\hfill
+   \let\formatleftnext \hfill \let\formatrightnext \relax}
+
+\def\@@segmentvariantc % ragged right
+  {\let\formatraggedness\veryraggedright
+   \let\dostartformatline\dostartformatlinecde
+   \let\formatleftnext\relax \let\formatrightnext\hfill}
+
+\def\@@segmentvariantd % ragged center
+  {\let\formatraggedness\veryraggedcenter
+   \let\dostartformatline\dostartformatlinecde
+   \let\formatleftnext\hfill \let\formatrightnext\hfill}
+
+\def\@@segmentvariante % ragged left
+  {\let\formatraggedness\veryraggedleft
+   \let\dostartformatline\dostartformatlinecde
+   \let\formatleftnext\hfill \let\formatrightnext\relax}
+
+\def\defineformatline
+  {\dodoubleempty\dodefineformatline}
+
+\def\dodefineformatline[#1][#2]%
+  {\setupformatline
+     [#1]
+     [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank,
+      \c!textstyle=,\c!textcolor=,
+      \c!number=\v!no,\c!numbercommand=,\c!conversion=,
+      \c!numberstyle=,\c!numbercolor=,\c!label=,
+      #2]%
+   \setvalue{\e!start#1}{\startformatline[#1]}%
+   \setvalue{\e!stop #1}{\stopformatline}}
+
+\def\setupformatline
+  {\dodoubleempty\dosetupformatline}
+
+\def\setupformatline[#1]%
+  {\getparameters[\??fz#1]}
+
+\newconditional\formatforcedbreak
+
+\def\startformatline[#1]%
+  {\bgroup
+   \doifelsevalue{\??fz#1\c!number}\v!yes
+    {\def\doplaceformatlinecounter
+       {\inleftmargin
+          {\doattributes{\??fz#1}\c!numberstyle\c!numbercolor
+             {\placeformatlinecounter}}}}
+     {\let\doplaceformatlinecounter\relax}%
+   \global\setfalse\formatforcedbreak
+   \def\\{\break\global\settrue\formatforcedbreak}%
+   \hsize\formatwidth
+   \doglobal\increment\formatlinecounter
+   \par
+   \nobreak
+   \def\stopformatline
+     {\unskip\unskip\unskip\unskip\unskip\egroup
+      \let\doplaceformatsegmentcounter\relax}
+   \postponenotes
+   \dowithnextbox{\dostartformatline}\hbox\bgroup\ignorespaces}
+
+\def\dostartformatlineab
+  {%\dosetleftskipadaption\formatmargin
+   %\advance\hsize-\leftskipadaption\relax
+   \ifdim\nextboxwd>\hsize
+     \beginofshapebox
+       \forgetall
+       \hangafter\plusone
+       \hangindent\formatleftoffset
+       \formatraggedness
+       \hskip\formatrightoffset
+       \unhbox\nextbox\par
+     \endofshapebox
+    %\advance\hsize \leftskipadaption
+     \doglobal\newcounter\formatlinesubcounter
+     \reshapebox
+       {\doglobal\increment\formatlinesubcounter}
+     \global\let\formatlinemaxcounter\formatlinesubcounter
+     \reshapebox
+       {\doglobal\decrement\formatlinesubcounter
+        \ifnum\formatlinesubcounter=\zerocount
+          \doplaceformatsegmentcounter
+          \doplaceformatlinecounter
+          \hskip-\formatrightoffset
+         %\hskip\leftskipadaption
+          \formatleftfirst
+          \unhbox\shapebox
+          \ifnum\formatlinemaxcounter>\plusone
+            \ifx\formatright\empty\else
+              \shapedhbox to \zeropoint{\formatright\hss}%
+            \fi
+          \fi
+          \formatrightfirst
+          \iftraceformatblock
+            \ruledhskip\formatrightoffset\hskip-\formatrightoffset
+          \fi
+        \else
+         %\hskip\leftskipadaption
+          \iftraceformatblock
+            \ruledhskip\formatleftoffset\hskip-\formatleftoffset
+          \fi
+          \formatleftnext
+          \ifx\formatleft\empty\else
+            \shapedhbox to \zeropoint{\hss\formatleft}%
+          \fi
+          \unhbox\shapebox
+          \formatrightnext
+        \fi}
+     \flushshapebox
+   \else
+     \dontleavehmode\hbox
+       {\doplaceformatsegmentcounter
+        \doplaceformatlinecounter
+       %\hskip\leftskipadaption
+        \formatleftfirst
+        \unhbox\nextbox
+        \formatrightfirst}
+   \fi
+   \par
+   \egroup}
+
+\def\dostartformatlinecde
+  {%\dosetleftskipadaption\formatmargin
+   %\advance\hsize -\leftskipadaption\relax
+   \dimen0=\hsize
+   \ifconditional\formatforcedbreak\else
+     \ifdim\formatminwidth>\zeropoint\relax
+       \ifdim\nextboxwd>\hsize
+         \doloop
+           {\global\dimen1=\dimen0
+            \beginofshapebox
+              \hsize\dimen0
+              \forgetall
+              \formatraggedness
+              \unhcopy\nextbox\par
+            \endofshapebox
+            \reshapebox
+              {\setbox\scratchbox=\hbox{\unhbox\shapebox}%
+               \ifdim\wd\scratchbox<\dimen1
+                 \global\dimen1=\wd\scratchbox
+               \fi}
+            \ifdim\dimen1<\formatminwidth\relax
+              \advance\dimen0 by -.25em
+            \else
+              \exitloop
+            \fi
+            \ifdim\dimen0<10em
+              \dimen0=\hsize
+              \exitloop
+            \fi}
+       \fi
+     \fi
+   \fi
+   \beginofshapebox
+     \hsize\dimen0
+     \forgetall
+     \formatraggedness
+     \unhcopy\nextbox\par
+   \endofshapebox
+  %\advance\hsize \leftskipadaption
+   \doglobal\newcounter\formatlinesubcounter
+   \reshapebox
+     {\doglobal\increment\formatlinesubcounter}%
+   \global\let\formatlinemaxcounter\formatlinesubcounter
+   \reshapebox
+     {\doglobal\decrement\formatlinesubcounter
+      \ifnum\formatlinesubcounter=\zerocount
+        \doplaceformatsegmentcounter
+        \doplaceformatlinecounter
+      \fi
+     %\hskip\leftskipadaption
+      \formatleftnext
+      \unhbox\shapebox
+      \formatrightnext\strut}% strut prevents unskip
+   \flushshapebox
+   \par
+   \egroup}
+
+\defineformatblock[poem]
+  [\c!before=\blank,
+   \c!inbetween={\blank[\v!medium]},
+   \c!after=\blank]
+
+\defineformatsegment[verse]
+  [\c!alternative=\v!left,
+   \c!width=\hsize,
+  %\c!margin=\!!zeropoint,
+   \c!before={\blank[\v!medium]},
+   \c!after={\blank[\v!medium]},
+   \c!inbetween={\blank[\v!medium]},
+   \c!leftoffset=3em,
+   \c!rightoffset=2em,
+   \c!minwidth=5em,
+   \c!left={$[$\enspace},
+   \c!right={\enspace$]$}]
+
+\defineformatline[line]
+  []
+
+\protect \doifnotmode{demo} {\endinput}
+
+% evt defineblank[formatbefore,formatinbetween,formatafter]
+
+%\showframe \traceformatblocktrue
+
+\usemodule[visual]
+
+\setuplayout[height=middle,topspace=1cm,header=0pt,footer=0pt]
+\setupbodyfont[10pt]
+
+% All interfaces supported, but testing with english; todo:
+% more options, more alternatives, inheritance and mixed
+% definitions, and so.
+
+\starttext
+
+\startbuffer
+\startbuffer[poem]
+\startpoem{A Random Poem}{Hans Hagen}
+  \startverse
+    \startline \fakewords{4}{8} \stopline
+    \startline \fakewords{4}{8} \stopline
+    \startline \fakewords{4}{8} \stopline
+    \startline \fakewords{4}{8} \stopline
+  \stopverse
+  \startverse
+    \startline \fakewords{4}{8} \stopline
+    \startline \fakewords{4}{8} \stopline
+    \startline \fakewords{4}{8} \stopline
+    \startline \fakewords{4}{8} \stopline
+  \stopverse
+\stoppoem
+\stopbuffer
+
+\setupformatsegment[verse][width=.4\hsize,number=yes,numberstyle=slanted]
+\setupformatline   [line] [number=yes,numberstyle=smallslanted]
+
+\startbuffer[x]
+\setupformatsegment[verse][leftoffset=0pt,rightoffset=0pt,left=,right=]
+\stopbuffer
+
+\section{Alternative A}
+
+\setupformatsegment[verse][alternative=a] {\getbuffer[poem]}
+\setupformatsegment[verse][alternative=a] {\getbuffer[x,poem]}
+
+\section{Alternative B}
+
+\setupformatsegment[verse][alternative=b] {\getbuffer[poem]}
+\setupformatsegment[verse][alternative=b] {\getbuffer[x,poem]}
+
+\section{Alternative C}
+
+\setupformatsegment[verse][alternative=c] {\getbuffer[poem]}
+
+\section{Alternative D}
+
+\setupformatsegment[verse][alternative=d] {\getbuffer[poem]}
+
+\section{Alternative E}
+
+\setupformatsegment[verse][alternative=e] {\getbuffer[poem]}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\stoptext
diff --git a/tex/context/base/math-ams.mkii b/tex/context/base/math-ams.mkii
new file mode 100644
index 000000000..83070d01a
--- /dev/null
+++ b/tex/context/base/math-ams.mkii
@@ -0,0 +1,336 @@
+%D \module
+%D   [       file=math-ams,
+%D        version=2001.04.12,
+%D          title=\CONTEXT\ Math Macros,
+%D       subtitle=AMS Specials,
+%D         author={Hans Hagen \& Taco Hoekwater},
+%D           date=\currentdate,
+%D      copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+% maybe we should just include these into the default tex one
+
+\definefamilysynonym [default] [blackboard]   [mb]
+
+\startmathcollection [default]
+
+\definemathsymbol [varGamma]   [ord] [letters] ["00]
+\definemathsymbol [varDelta]   [ord] [letters] ["01]
+\definemathsymbol [varTheta]   [ord] [letters] ["02]
+\definemathsymbol [varLambda]  [ord] [letters] ["03]
+\definemathsymbol [varXi]      [ord] [letters] ["04]
+\definemathsymbol [varPi]      [ord] [letters] ["05]
+\definemathsymbol [varSigma]   [ord] [letters] ["06]
+\definemathsymbol [varUpsilon] [ord] [letters] ["07]
+\definemathsymbol [varPhi]     [ord] [letters] ["08]
+\definemathsymbol [varPsi]     [ord] [letters] ["09]
+\definemathsymbol [varOmega]   [ord] [letters] ["0A]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [internalAnd] [rel] [operators] ["26]
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathsymbol [boxdot]              [bin]   [ma] ["00]
+\definemathsymbol [boxplus]             [bin]   [ma] ["01]
+\definemathsymbol [boxtimes]            [bin]   [ma] ["02]
+\definemathsymbol [square]              [ord]   [ma] ["03]
+\definemathsymbol [Box]                 [ord]   [ma] ["03] % square
+\definemathsymbol [blacksquare]         [ord]   [ma] ["04]
+\definemathsymbol [centerdot]           [bin]   [ma] ["05]
+\definemathsymbol [Diamond]             [ord]   [ma] ["06]
+\definemathsymbol [lozenge]             [ord]   [ma] ["06] % Diamond
+\definemathsymbol [blacklozenge]        [ord]   [ma] ["07]
+\definemathsymbol [circlearrowright]    [rel]   [ma] ["08]
+\definemathsymbol [circlearrowleft]     [rel]   [ma] ["09]
+\definemathsymbol [rightleftharpoons]   [rel]   [ma] ["0A]
+\definemathsymbol [leftrightharpoons]   [rel]   [ma] ["0B]
+\definemathsymbol [boxminus]            [bin]   [ma] ["0C]
+\definemathsymbol [Vdash]               [rel]   [ma] ["0D]
+\definemathsymbol [Vvdash]              [rel]   [ma] ["0E]
+\definemathsymbol [vDash]               [rel]   [ma] ["0F]
+\definemathsymbol [twoheadrightarrow]   [rel]   [ma] ["10]
+\definemathsymbol [twoheadleftarrow]    [rel]   [ma] ["11]
+\definemathsymbol [leftleftarrows]      [rel]   [ma] ["12]
+\definemathsymbol [rightrightarrows]    [rel]   [ma] ["13]
+\definemathsymbol [upuparrows]          [rel]   [ma] ["14]
+\definemathsymbol [downdownarrows]      [rel]   [ma] ["15]
+\definemathsymbol [upharpoonright]      [rel]   [ma] ["16]
+\definemathsymbol [restriction]         [rel]   [ma] ["16]
+\definemathsymbol [downharpoonright]    [rel]   [ma] ["17]
+\definemathsymbol [upharpoonleft]       [rel]   [ma] ["18]
+\definemathsymbol [downharpoonleft]     [rel]   [ma] ["19]
+\definemathsymbol [rightarrowtail]      [rel]   [ma] ["1A]
+\definemathsymbol [leftarrowtail]       [rel]   [ma] ["1B]
+\definemathsymbol [leftrightarrows]     [rel]   [ma] ["1C]
+\definemathsymbol [rightleftarrows]     [rel]   [ma] ["1D]
+\definemathsymbol [Lsh]                 [rel]   [ma] ["1E]
+\definemathsymbol [Rsh]                 [rel]   [ma] ["1F]
+\definemathsymbol [rightsquigarrow]     [rel]   [ma] ["20]
+\definemathsymbol [leadsto]             [rel]   [ma] ["20] % rightsquigarrow
+\definemathsymbol [leftrightsquigarrow] [rel]   [ma] ["21]
+\definemathsymbol [looparrowleft]       [rel]   [ma] ["22]
+\definemathsymbol [looparrowright]      [rel]   [ma] ["23]
+\definemathsymbol [circeq]              [rel]   [ma] ["24]
+\definemathsymbol [succsim]             [rel]   [ma] ["25]
+\definemathsymbol [gtrsim]              [rel]   [ma] ["26]
+\definemathsymbol [gtrapprox]           [rel]   [ma] ["27]
+\definemathsymbol [multimap]            [rel]   [ma] ["28]
+\definemathsymbol [therefore]           [rel]   [ma] ["29]
+\definemathsymbol [because]             [rel]   [ma] ["2A]
+\definemathsymbol [doteqdot]            [rel]   [ma] ["2B]
+\definemathsymbol [Doteq]               [rel]   [ma] ["2B] % doteqdot
+\definemathsymbol [triangleq]           [rel]   [ma] ["2C]
+\definemathsymbol [precsim]             [rel]   [ma] ["2D]
+\definemathsymbol [lesssim]             [rel]   [ma] ["2E]
+\definemathsymbol [lessapprox]          [rel]   [ma] ["2F]
+\definemathsymbol [eqslantless]         [rel]   [ma] ["30]
+\definemathsymbol [eqslantgtr]          [rel]   [ma] ["31]
+\definemathsymbol [curlyeqprec]         [rel]   [ma] ["32]
+\definemathsymbol [curlyeqsucc]         [rel]   [ma] ["33]
+\definemathsymbol [preccurlyeq]         [rel]   [ma] ["34]
+\definemathsymbol [leqq]                [rel]   [ma] ["35]
+\definemathsymbol [leqslant]            [rel]   [ma] ["36]
+\definemathsymbol [lessgtr]             [rel]   [ma] ["37]
+\definemathsymbol [backprime]           [ord]   [ma] ["38]
+\definemathsymbol [dabar@]              [ord]   [ma] ["39] % @
+\definemathsymbol [risingdotseq]        [rel]   [ma] ["3A]
+\definemathsymbol [fallingdotseq]       [rel]   [ma] ["3B]
+\definemathsymbol [succcurlyeq]         [rel]   [ma] ["3C]
+\definemathsymbol [geqq]                [rel]   [ma] ["3D]
+\definemathsymbol [geqslant]            [rel]   [ma] ["3E]
+\definemathsymbol [gtrless]             [rel]   [ma] ["3F]
+\definemathsymbol [sqsubset]            [rel]   [ma] ["40]
+\definemathsymbol [sqsupset]            [rel]   [ma] ["41]
+\definemathsymbol [vartriangleright]    [rel]   [ma] ["42]
+\definemathsymbol [rhd]                 [bin]   [ma] ["42]
+\definemathsymbol [lhd]                 [bin]   [ma] ["43]
+\definemathsymbol [vartriangleleft]     [rel]   [ma] ["43]
+\definemathsymbol [trianglerighteq]     [rel]   [ma] ["44]
+\definemathsymbol [unrhd]               [bin]   [ma] ["44] % trianglerighteq
+\definemathsymbol [trianglelefteq]      [rel]   [ma] ["45]
+\definemathsymbol [unlhd]               [bin]   [ma] ["45] % trianglelefteq
+\definemathsymbol [bigstar]             [ord]   [ma] ["46]
+\definemathsymbol [between]             [rel]   [ma] ["47]
+\definemathsymbol [blacktriangledown]   [ord]   [ma] ["48]
+\definemathsymbol [blacktriangleright]  [rel]   [ma] ["49]
+\definemathsymbol [blacktriangleleft]   [rel]   [ma] ["4A]
+\definemathsymbol [vartriangle]         [rel]   [ma] ["4D]
+\definemathsymbol [triangleup]          [ord]   [ma] ["4D] % vartriangle
+\definemathsymbol [blacktriangle]       [ord]   [ma] ["4E]
+\definemathsymbol [triangledown]        [ord]   [ma] ["4F]
+\definemathsymbol [eqcirc]              [rel]   [ma] ["50]
+\definemathsymbol [lesseqgtr]           [rel]   [ma] ["51]
+\definemathsymbol [gtreqless]           [rel]   [ma] ["52]
+\definemathsymbol [lesseqqgtr]          [rel]   [ma] ["53]
+\definemathsymbol [gtreqqless]          [rel]   [ma] ["54]
+\definemathsymbol [Rrightarrow]         [rel]   [ma] ["56]
+\definemathsymbol [Lleftarrow]          [rel]   [ma] ["57]
+\definemathsymbol [veebar]              [bin]   [ma] ["59]
+\definemathsymbol [barwedge]            [bin]   [ma] ["5A]
+\definemathsymbol [doublebarwedge]      [bin]   [ma] ["5B]
+\definemathsymbol [angle]               [ord]   [ma] ["5C]
+\definemathsymbol [measuredangle]       [ord]   [ma] ["5D]
+\definemathsymbol [sphericalangle]      [ord]   [ma] ["5E]
+\definemathsymbol [varpropto]           [rel]   [ma] ["5F]
+\definemathsymbol [smallsmile]          [rel]   [ma] ["60]
+\definemathsymbol [smallfrown]          [rel]   [ma] ["61]
+\definemathsymbol [Subset]              [rel]   [ma] ["62]
+\definemathsymbol [Supset]              [rel]   [ma] ["63]
+\definemathsymbol [Cup]                 [bin]   [ma] ["64]
+\definemathsymbol [doublecup]           [bin]   [ma] ["64] % Cup
+\definemathsymbol [Cap]                 [bin]   [ma] ["65]
+\definemathsymbol [doublecap]           [bin]   [ma] ["65]
+\definemathsymbol [curlywedge]          [bin]   [ma] ["66]
+\definemathsymbol [curlyvee]            [bin]   [ma] ["67]
+\definemathsymbol [leftthreetimes]      [bin]   [ma] ["68]
+\definemathsymbol [rightthreetimes]     [bin]   [ma] ["69]
+\definemathsymbol [subseteqq]           [rel]   [ma] ["6A]
+\definemathsymbol [supseteqq]           [rel]   [ma] ["6B]
+\definemathsymbol [bumpeq]              [rel]   [ma] ["6C]
+\definemathsymbol [Bumpeq]              [rel]   [ma] ["6D]
+\definemathsymbol [llless]              [rel]   [ma] ["6E]
+\definemathsymbol [lll]                 [rel]   [ma] ["6E] % llless
+\definemathsymbol [gggtr]               [rel]   [ma] ["6F]
+\definemathsymbol [ggg]                 [rel]   [ma] ["6F] % gggtr
+\definemathsymbol [ulcorner]            [open]  [ma] ["70] [ma] ["70]
+\definemathsymbol [urcorner]            [close] [ma] ["71] [ma] ["71]
+\definemathsymbol [circledS]            [ord]   [ma] ["73]
+\definemathsymbol [pitchfork]           [rel]   [ma] ["74]
+\definemathsymbol [dotplus]             [bin]   [ma] ["75]
+\definemathsymbol [backsim]             [rel]   [ma] ["76]
+\definemathsymbol [backsimeq]           [rel]   [ma] ["77]
+\definemathsymbol [llcorner]            [open]  [ma] ["78] [ma] ["78]
+\definemathsymbol [lrcorner]            [close] [ma] ["79] [ma] ["79]
+\definemathsymbol [complement]          [ord]   [ma] ["7B]
+\definemathsymbol [intercal]            [bin]   [ma] ["7C]
+\definemathsymbol [circledcirc]         [bin]   [ma] ["7D]
+\definemathsymbol [circledast]          [bin]   [ma] ["7E]
+\definemathsymbol [circleddash]         [bin]   [ma] ["7F]
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathcommand [integers]       {\blackboard{Z}}
+\definemathcommand [reals]          {\blackboard{R}}
+\definemathcommand [rationals]      {\blackboard{Q}}
+\definemathcommand [naturalnumbers] {\blackboard{N}}
+\definemathcommand [complexes]      {\blackboard{C}}
+\definemathcommand [primes]         {\blackboard{P}}
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathsymbol [lvertneqq]           [rel]   [mb] ["00]
+\definemathsymbol [gvertneqq]           [rel]   [mb] ["01]
+\definemathsymbol [nleq]                [rel]   [mb] ["02]
+\definemathsymbol [ngeq]                [rel]   [mb] ["03]
+\definemathsymbol [nless]               [rel]   [mb] ["04]
+\definemathsymbol [ngtr]                [rel]   [mb] ["05]
+\definemathsymbol [nprec]               [rel]   [mb] ["06]
+\definemathsymbol [nsucc]               [rel]   [mb] ["07]
+\definemathsymbol [lneqq]               [rel]   [mb] ["08]
+\definemathsymbol [gneqq]               [rel]   [mb] ["09]
+\definemathsymbol [nleqslant]           [rel]   [mb] ["0A]
+\definemathsymbol [ngeqslant]           [rel]   [mb] ["0B]
+\definemathsymbol [lneq]                [rel]   [mb] ["0C]
+\definemathsymbol [gneq]                [rel]   [mb] ["0D]
+\definemathsymbol [npreceq]             [rel]   [mb] ["0E]
+\definemathsymbol [nsucceq]             [rel]   [mb] ["0F]
+\definemathsymbol [precnsim]            [rel]   [mb] ["10]
+\definemathsymbol [succnsim]            [rel]   [mb] ["11]
+\definemathsymbol [lnsim]               [rel]   [mb] ["12]
+\definemathsymbol [gnsim]               [rel]   [mb] ["13]
+\definemathsymbol [nleqq]               [rel]   [mb] ["14]
+\definemathsymbol [ngeqq]               [rel]   [mb] ["15]
+\definemathsymbol [precneqq]            [rel]   [mb] ["16]
+\definemathsymbol [succneqq]            [rel]   [mb] ["17]
+\definemathsymbol [precnapprox]         [rel]   [mb] ["18]
+\definemathsymbol [succnapprox]         [rel]   [mb] ["19]
+\definemathsymbol [lnapprox]            [rel]   [mb] ["1A]
+\definemathsymbol [gnapprox]            [rel]   [mb] ["1B]
+\definemathsymbol [nsim]                [rel]   [mb] ["1C]
+\definemathsymbol [ncong]               [rel]   [mb] ["1D]
+\definemathsymbol [diagup]              [ord]   [mb] ["1E]
+\definemathsymbol [diagdown]            [ord]   [mb] ["1F]
+\definemathsymbol [varsubsetneq]        [rel]   [mb] ["20]
+\definemathsymbol [varsupsetneq]        [rel]   [mb] ["21]
+\definemathsymbol [nsubseteqq]          [rel]   [mb] ["22]
+\definemathsymbol [nsupseteqq]          [rel]   [mb] ["23]
+\definemathsymbol [subsetneqq]          [rel]   [mb] ["24]
+\definemathsymbol [supsetneqq]          [rel]   [mb] ["25]
+\definemathsymbol [varsubsetneqq]       [rel]   [mb] ["26]
+\definemathsymbol [varsupsetneqq]       [rel]   [mb] ["27]
+\definemathsymbol [subsetneq]           [rel]   [mb] ["28]
+\definemathsymbol [supsetneq]           [rel]   [mb] ["29]
+\definemathsymbol [nsubseteq]           [rel]   [mb] ["2A]
+\definemathsymbol [nsupseteq]           [rel]   [mb] ["2B]
+\definemathsymbol [nparallel]           [rel]   [mb] ["2C]
+\definemathsymbol [nmid]                [rel]   [mb] ["2D]
+\definemathsymbol [nshortmid]           [rel]   [mb] ["2E]
+\definemathsymbol [nshortparallel]      [rel]   [mb] ["2F]
+\definemathsymbol [nvdash]              [rel]   [mb] ["30]
+\definemathsymbol [nVdash]              [rel]   [mb] ["31]
+\definemathsymbol [nvDash]              [rel]   [mb] ["32]
+\definemathsymbol [nVDash]              [rel]   [mb] ["33]
+\definemathsymbol [ntrianglerighteq]    [rel]   [mb] ["34]
+\definemathsymbol [ntrianglelefteq]     [rel]   [mb] ["35]
+\definemathsymbol [ntriangleleft]       [rel]   [mb] ["36]
+\definemathsymbol [ntriangleright]      [rel]   [mb] ["37]
+\definemathsymbol [nleftarrow]          [rel]   [mb] ["38]
+\definemathsymbol [nrightarrow]         [rel]   [mb] ["39]
+\definemathsymbol [nLeftarrow]          [rel]   [mb] ["3A]
+\definemathsymbol [nRightarrow]         [rel]   [mb] ["3B]
+\definemathsymbol [nLeftrightarrow]     [rel]   [mb] ["3C]
+\definemathsymbol [nleftrightarrow]     [rel]   [mb] ["3D]
+\definemathsymbol [divideontimes]       [bin]   [mb] ["3E]
+\definemathsymbol [varnothing]          [ord]   [mb] ["3F]
+\definemathsymbol [nexists]             [ord]   [mb] ["40]
+\definemathsymbol [Finv]                [ord]   [mb] ["60]
+\definemathsymbol [Game]                [ord]   [mb] ["61]
+\definemathsymbol [mho]                 [ord]   [mb] ["66]
+\definemathsymbol [eth]                 [ord]   [mb] ["67]
+\definemathsymbol [eqsim]               [rel]   [mb] ["68]
+\definemathsymbol [beth]                [ord]   [mb] ["69]
+\definemathsymbol [gimel]               [ord]   [mb] ["6A]
+\definemathsymbol [daleth]              [ord]   [mb] ["6B]
+\definemathsymbol [lessdot]             [bin]   [mb] ["6C]
+\definemathsymbol [gtrdot]              [bin]   [mb] ["6D]
+\definemathsymbol [ltimes]              [bin]   [mb] ["6E]
+\definemathsymbol [rtimes]              [bin]   [mb] ["6F]
+\definemathsymbol [shortmid]            [rel]   [mb] ["70]
+\definemathsymbol [shortparallel]       [rel]   [mb] ["71]
+\definemathsymbol [smallsetminus]       [bin]   [mb] ["72]
+\definemathsymbol [thicksim]            [rel]   [mb] ["73]
+\definemathsymbol [thickapprox]         [rel]   [mb] ["74]
+\definemathsymbol [approxeq]            [rel]   [mb] ["75]
+\definemathsymbol [succapprox]          [rel]   [mb] ["76]
+\definemathsymbol [precapprox]          [rel]   [mb] ["77]
+\definemathsymbol [curvearrowleft]      [rel]   [mb] ["78]
+\definemathsymbol [curvearrowright]     [rel]   [mb] ["79]
+\definemathsymbol [digamma]             [ord]   [mb] ["7A]
+\definemathsymbol [varkappa]            [ord]   [mb] ["7B]
+\definemathsymbol [Bbbk]                [ord]   [mb] ["7C]
+\definemathsymbol [hslash]              [ord]   [mb] ["7D]
+\definemathsymbol [hbar]                [ord]   [mb] ["7E]
+\definemathsymbol [backepsilon]         [rel]   [mb] ["7F]
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathcommand [yen]            [nothing] {\mathhexbox{\hexmafam}55}
+\definemathcommand [checkmark]      [nothing] {\mathhexbox{\hexmafam}58}
+\definemathcommand [circledR]       [nothing] {\mathhexbox{\hexmafam}72}
+\definemathcommand [maltese]        [nothing] {\mathhexbox{\hexmafam}7A}
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathcommand [dashrightarrow] [rel]     {\dabar@\dabar@ \mathchar"0C4B}
+\definemathcommand [dashleftarrow]  [rel]     {\mathchar"0C4C\dabar@ \dabar@}
+\definemathcommand [dasharrow]      [rel]     {\dabar@\dabar@ \mathchar"0C4B}
+\definemathcommand [Join]           [rel]     {\mathchar"0D6F\mkern-13.8mu\mathchar"0D6E}
+\definemathcommand [implies]        [rel]     {\;\Longrightarrow\;}
+\definemathcommand [impliedby]      [rel]     {\;\Longleftarrow\;}
+\definemathcommand [And]            [rel]     {\;\internalAnd\;}
+
+\stopmathcollection
+
+\def\AMSwidehat#1%
+  {\setbox\scratchbox\hbox{$\mathsurround\zeropoint#1$}%
+   \ifdim\wd\scratchbox>2em
+     \mathaccent"0\purefamilyhex{mb}5B{#1}%
+   \else
+     \mathaccent"0\purefamilyhex{ex}62{#1}%
+   \fi}
+
+\def\AMSwidetilde#1%
+  {\setbox\scratchbox\hbox{$\mathsurround\zeropoint#1$}%
+   \ifdim\wd\scratchbox>2em
+     \mathaccent"0\purefamilyhex{mb}5D{#1}%
+   \else
+     \mathaccent"0\purefamilyhex{ex}65{#1}%
+   \fi}
+
+\startmathcollection [default]
+
+\definemathcommand [widehat]   {\AMSwidehat}
+\definemathcommand [widetilde] {\AMSwidetilde}
+
+\stopmathcollection
+
+\protect \endinput
diff --git a/tex/context/base/math-ams.tex b/tex/context/base/math-ams.tex
deleted file mode 100644
index 83070d01a..000000000
--- a/tex/context/base/math-ams.tex
+++ /dev/null
@@ -1,336 +0,0 @@
-%D \module
-%D   [       file=math-ams,
-%D        version=2001.04.12,
-%D          title=\CONTEXT\ Math Macros,
-%D       subtitle=AMS Specials,
-%D         author={Hans Hagen \& Taco Hoekwater},
-%D           date=\currentdate,
-%D      copyright=\PRAGMA]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\unprotect
-
-% maybe we should just include these into the default tex one
-
-\definefamilysynonym [default] [blackboard]   [mb]
-
-\startmathcollection [default]
-
-\definemathsymbol [varGamma]   [ord] [letters] ["00]
-\definemathsymbol [varDelta]   [ord] [letters] ["01]
-\definemathsymbol [varTheta]   [ord] [letters] ["02]
-\definemathsymbol [varLambda]  [ord] [letters] ["03]
-\definemathsymbol [varXi]      [ord] [letters] ["04]
-\definemathsymbol [varPi]      [ord] [letters] ["05]
-\definemathsymbol [varSigma]   [ord] [letters] ["06]
-\definemathsymbol [varUpsilon] [ord] [letters] ["07]
-\definemathsymbol [varPhi]     [ord] [letters] ["08]
-\definemathsymbol [varPsi]     [ord] [letters] ["09]
-\definemathsymbol [varOmega]   [ord] [letters] ["0A]
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathsymbol [internalAnd] [rel] [operators] ["26]
-
-\stopmathcollection
-
-\startmathcollection [default]
-
-\definemathsymbol [boxdot]              [bin]   [ma] ["00]
-\definemathsymbol [boxplus]             [bin]   [ma] ["01]
-\definemathsymbol [boxtimes]            [bin]   [ma] ["02]
-\definemathsymbol [square]              [ord]   [ma] ["03]
-\definemathsymbol [Box]                 [ord]   [ma] ["03] % square
-\definemathsymbol [blacksquare]         [ord]   [ma] ["04]
-\definemathsymbol [centerdot]           [bin]   [ma] ["05]
-\definemathsymbol [Diamond]             [ord]   [ma] ["06]
-\definemathsymbol [lozenge]             [ord]   [ma] ["06] % Diamond
-\definemathsymbol [blacklozenge]        [ord]   [ma] ["07]
-\definemathsymbol [circlearrowright]    [rel]   [ma] ["08]
-\definemathsymbol [circlearrowleft]     [rel]   [ma] ["09]
-\definemathsymbol [rightleftharpoons]   [rel]   [ma] ["0A]
-\definemathsymbol [leftrightharpoons]   [rel]   [ma] ["0B]
-\definemathsymbol [boxminus]            [bin]   [ma] ["0C]
-\definemathsymbol [Vdash]               [rel]   [ma] ["0D]
-\definemathsymbol [Vvdash]              [rel]   [ma] ["0E]
-\definemathsymbol [vDash]               [rel]   [ma] ["0F]
-\definemathsymbol [twoheadrightarrow]   [rel]   [ma] ["10]
-\definemathsymbol [twoheadleftarrow]    [rel]   [ma] ["11]
-\definemathsymbol [leftleftarrows]      [rel]   [ma] ["12]
-\definemathsymbol [rightrightarrows]    [rel]   [ma] ["13]
-\definemathsymbol [upuparrows]          [rel]   [ma] ["14]
-\definemathsymbol [downdownarrows]      [rel]   [ma] ["15]
-\definemathsymbol [upharpoonright]      [rel]   [ma] ["16]
-\definemathsymbol [restriction]         [rel]   [ma] ["16]
-\definemathsymbol [downharpoonright]    [rel]   [ma] ["17]
-\definemathsymbol [upharpoonleft]       [rel]   [ma] ["18]
-\definemathsymbol [downharpoonleft]     [rel]   [ma] ["19]
-\definemathsymbol [rightarrowtail]      [rel]   [ma] ["1A]
-\definemathsymbol [leftarrowtail]       [rel]   [ma] ["1B]
-\definemathsymbol [leftrightarrows]     [rel]   [ma] ["1C]
-\definemathsymbol [rightleftarrows]     [rel]   [ma] ["1D]
-\definemathsymbol [Lsh]                 [rel]   [ma] ["1E]
-\definemathsymbol [Rsh]                 [rel]   [ma] ["1F]
-\definemathsymbol [rightsquigarrow]     [rel]   [ma] ["20]
-\definemathsymbol [leadsto]             [rel]   [ma] ["20] % rightsquigarrow
-\definemathsymbol [leftrightsquigarrow] [rel]   [ma] ["21]
-\definemathsymbol [looparrowleft]       [rel]   [ma] ["22]
-\definemathsymbol [looparrowright]      [rel]   [ma] ["23]
-\definemathsymbol [circeq]              [rel]   [ma] ["24]
-\definemathsymbol [succsim]             [rel]   [ma] ["25]
-\definemathsymbol [gtrsim]              [rel]   [ma] ["26]
-\definemathsymbol [gtrapprox]           [rel]   [ma] ["27]
-\definemathsymbol [multimap]            [rel]   [ma] ["28]
-\definemathsymbol [therefore]           [rel]   [ma] ["29]
-\definemathsymbol [because]             [rel]   [ma] ["2A]
-\definemathsymbol [doteqdot]            [rel]   [ma] ["2B]
-\definemathsymbol [Doteq]               [rel]   [ma] ["2B] % doteqdot
-\definemathsymbol [triangleq]           [rel]   [ma] ["2C]
-\definemathsymbol [precsim]             [rel]   [ma] ["2D]
-\definemathsymbol [lesssim]             [rel]   [ma] ["2E]
-\definemathsymbol [lessapprox]          [rel]   [ma] ["2F]
-\definemathsymbol [eqslantless]         [rel]   [ma] ["30]
-\definemathsymbol [eqslantgtr]          [rel]   [ma] ["31]
-\definemathsymbol [curlyeqprec]         [rel]   [ma] ["32]
-\definemathsymbol [curlyeqsucc]         [rel]   [ma] ["33]
-\definemathsymbol [preccurlyeq]         [rel]   [ma] ["34]
-\definemathsymbol [leqq]                [rel]   [ma] ["35]
-\definemathsymbol [leqslant]            [rel]   [ma] ["36]
-\definemathsymbol [lessgtr]             [rel]   [ma] ["37]
-\definemathsymbol [backprime]           [ord]   [ma] ["38]
-\definemathsymbol [dabar@]              [ord]   [ma] ["39] % @
-\definemathsymbol [risingdotseq]        [rel]   [ma] ["3A]
-\definemathsymbol [fallingdotseq]       [rel]   [ma] ["3B]
-\definemathsymbol [succcurlyeq]         [rel]   [ma] ["3C]
-\definemathsymbol [geqq]                [rel]   [ma] ["3D]
-\definemathsymbol [geqslant]            [rel]   [ma] ["3E]
-\definemathsymbol [gtrless]             [rel]   [ma] ["3F]
-\definemathsymbol [sqsubset]            [rel]   [ma] ["40]
-\definemathsymbol [sqsupset]            [rel]   [ma] ["41]
-\definemathsymbol [vartriangleright]    [rel]   [ma] ["42]
-\definemathsymbol [rhd]                 [bin]   [ma] ["42]
-\definemathsymbol [lhd]                 [bin]   [ma] ["43]
-\definemathsymbol [vartriangleleft]     [rel]   [ma] ["43]
-\definemathsymbol [trianglerighteq]     [rel]   [ma] ["44]
-\definemathsymbol [unrhd]               [bin]   [ma] ["44] % trianglerighteq
-\definemathsymbol [trianglelefteq]      [rel]   [ma] ["45]
-\definemathsymbol [unlhd]               [bin]   [ma] ["45] % trianglelefteq
-\definemathsymbol [bigstar]             [ord]   [ma] ["46]
-\definemathsymbol [between]             [rel]   [ma] ["47]
-\definemathsymbol [blacktriangledown]   [ord]   [ma] ["48]
-\definemathsymbol [blacktriangleright]  [rel]   [ma] ["49]
-\definemathsymbol [blacktriangleleft]   [rel]   [ma] ["4A]
-\definemathsymbol [vartriangle]         [rel]   [ma] ["4D]
-\definemathsymbol [triangleup]          [ord]   [ma] ["4D] % vartriangle
-\definemathsymbol [blacktriangle]       [ord]   [ma] ["4E]
-\definemathsymbol [triangledown]        [ord]   [ma] ["4F]
-\definemathsymbol [eqcirc]              [rel]   [ma] ["50]
-\definemathsymbol [lesseqgtr]           [rel]   [ma] ["51]
-\definemathsymbol [gtreqless]           [rel]   [ma] ["52]
-\definemathsymbol [lesseqqgtr]          [rel]   [ma] ["53]
-\definemathsymbol [gtreqqless]          [rel]   [ma] ["54]
-\definemathsymbol [Rrightarrow]         [rel]   [ma] ["56]
-\definemathsymbol [Lleftarrow]          [rel]   [ma] ["57]
-\definemathsymbol [veebar]              [bin]   [ma] ["59]
-\definemathsymbol [barwedge]            [bin]   [ma] ["5A]
-\definemathsymbol [doublebarwedge]      [bin]   [ma] ["5B]
-\definemathsymbol [angle]               [ord]   [ma] ["5C]
-\definemathsymbol [measuredangle]       [ord]   [ma] ["5D]
-\definemathsymbol [sphericalangle]      [ord]   [ma] ["5E]
-\definemathsymbol [varpropto]           [rel]   [ma] ["5F]
-\definemathsymbol [smallsmile]          [rel]   [ma] ["60]
-\definemathsymbol [smallfrown]          [rel]   [ma] ["61]
-\definemathsymbol [Subset]              [rel]   [ma] ["62]
-\definemathsymbol [Supset]              [rel]   [ma] ["63]
-\definemathsymbol [Cup]                 [bin]   [ma] ["64]
-\definemathsymbol [doublecup]           [bin]   [ma] ["64] % Cup
-\definemathsymbol [Cap]                 [bin]   [ma] ["65]
-\definemathsymbol [doublecap]           [bin]   [ma] ["65]
-\definemathsymbol [curlywedge]          [bin]   [ma] ["66]
-\definemathsymbol [curlyvee]            [bin]   [ma] ["67]
-\definemathsymbol [leftthreetimes]      [bin]   [ma] ["68]
-\definemathsymbol [rightthreetimes]     [bin]   [ma] ["69]
-\definemathsymbol [subseteqq]           [rel]   [ma] ["6A]
-\definemathsymbol [supseteqq]           [rel]   [ma] ["6B]
-\definemathsymbol [bumpeq]              [rel]   [ma] ["6C]
-\definemathsymbol [Bumpeq]              [rel]   [ma] ["6D]
-\definemathsymbol [llless]              [rel]   [ma] ["6E]
-\definemathsymbol [lll]                 [rel]   [ma] ["6E] % llless
-\definemathsymbol [gggtr]               [rel]   [ma] ["6F]
-\definemathsymbol [ggg]                 [rel]   [ma] ["6F] % gggtr
-\definemathsymbol [ulcorner]            [open]  [ma] ["70] [ma] ["70]
-\definemathsymbol [urcorner]            [close] [ma] ["71] [ma] ["71]
-\definemathsymbol [circledS]            [ord]   [ma] ["73]
-\definemathsymbol [pitchfork]           [rel]   [ma] ["74]
-\definemathsymbol [dotplus]             [bin]   [ma] ["75]
-\definemathsymbol [backsim]             [rel]   [ma] ["76]
-\definemathsymbol [backsimeq]           [rel]   [ma] ["77]
-\definemathsymbol [llcorner]            [open]  [ma] ["78] [ma] ["78]
-\definemathsymbol [lrcorner]            [close] [ma] ["79] [ma] ["79]
-\definemathsymbol [complement]          [ord]   [ma] ["7B]
-\definemathsymbol [intercal]            [bin]   [ma] ["7C]
-\definemathsymbol [circledcirc]         [bin]   [ma] ["7D]
-\definemathsymbol [circledast]          [bin]   [ma] ["7E]
-\definemathsymbol [circleddash]         [bin]   [ma] ["7F]
-
-\stopmathcollection
-
-\startmathcollection [default]
-
-\definemathcommand [integers]       {\blackboard{Z}}
-\definemathcommand [reals]          {\blackboard{R}}
-\definemathcommand [rationals]      {\blackboard{Q}}
-\definemathcommand [naturalnumbers] {\blackboard{N}}
-\definemathcommand [complexes]      {\blackboard{C}}
-\definemathcommand [primes]         {\blackboard{P}}
-
-\stopmathcollection
-
-\startmathcollection [default]
-
-\definemathsymbol [lvertneqq]           [rel]   [mb] ["00]
-\definemathsymbol [gvertneqq]           [rel]   [mb] ["01]
-\definemathsymbol [nleq]                [rel]   [mb] ["02]
-\definemathsymbol [ngeq]                [rel]   [mb] ["03]
-\definemathsymbol [nless]               [rel]   [mb] ["04]
-\definemathsymbol [ngtr]                [rel]   [mb] ["05]
-\definemathsymbol [nprec]               [rel]   [mb] ["06]
-\definemathsymbol [nsucc]               [rel]   [mb] ["07]
-\definemathsymbol [lneqq]               [rel]   [mb] ["08]
-\definemathsymbol [gneqq]               [rel]   [mb] ["09]
-\definemathsymbol [nleqslant]           [rel]   [mb] ["0A]
-\definemathsymbol [ngeqslant]           [rel]   [mb] ["0B]
-\definemathsymbol [lneq]                [rel]   [mb] ["0C]
-\definemathsymbol [gneq]                [rel]   [mb] ["0D]
-\definemathsymbol [npreceq]             [rel]   [mb] ["0E]
-\definemathsymbol [nsucceq]             [rel]   [mb] ["0F]
-\definemathsymbol [precnsim]            [rel]   [mb] ["10]
-\definemathsymbol [succnsim]            [rel]   [mb] ["11]
-\definemathsymbol [lnsim]               [rel]   [mb] ["12]
-\definemathsymbol [gnsim]               [rel]   [mb] ["13]
-\definemathsymbol [nleqq]               [rel]   [mb] ["14]
-\definemathsymbol [ngeqq]               [rel]   [mb] ["15]
-\definemathsymbol [precneqq]            [rel]   [mb] ["16]
-\definemathsymbol [succneqq]            [rel]   [mb] ["17]
-\definemathsymbol [precnapprox]         [rel]   [mb] ["18]
-\definemathsymbol [succnapprox]         [rel]   [mb] ["19]
-\definemathsymbol [lnapprox]            [rel]   [mb] ["1A]
-\definemathsymbol [gnapprox]            [rel]   [mb] ["1B]
-\definemathsymbol [nsim]                [rel]   [mb] ["1C]
-\definemathsymbol [ncong]               [rel]   [mb] ["1D]
-\definemathsymbol [diagup]              [ord]   [mb] ["1E]
-\definemathsymbol [diagdown]            [ord]   [mb] ["1F]
-\definemathsymbol [varsubsetneq]        [rel]   [mb] ["20]
-\definemathsymbol [varsupsetneq]        [rel]   [mb] ["21]
-\definemathsymbol [nsubseteqq]          [rel]   [mb] ["22]
-\definemathsymbol [nsupseteqq]          [rel]   [mb] ["23]
-\definemathsymbol [subsetneqq]          [rel]   [mb] ["24]
-\definemathsymbol [supsetneqq]          [rel]   [mb] ["25]
-\definemathsymbol [varsubsetneqq]       [rel]   [mb] ["26]
-\definemathsymbol [varsupsetneqq]       [rel]   [mb] ["27]
-\definemathsymbol [subsetneq]           [rel]   [mb] ["28]
-\definemathsymbol [supsetneq]           [rel]   [mb] ["29]
-\definemathsymbol [nsubseteq]           [rel]   [mb] ["2A]
-\definemathsymbol [nsupseteq]           [rel]   [mb] ["2B]
-\definemathsymbol [nparallel]           [rel]   [mb] ["2C]
-\definemathsymbol [nmid]                [rel]   [mb] ["2D]
-\definemathsymbol [nshortmid]           [rel]   [mb] ["2E]
-\definemathsymbol [nshortparallel]      [rel]   [mb] ["2F]
-\definemathsymbol [nvdash]              [rel]   [mb] ["30]
-\definemathsymbol [nVdash]              [rel]   [mb] ["31]
-\definemathsymbol [nvDash]              [rel]   [mb] ["32]
-\definemathsymbol [nVDash]              [rel]   [mb] ["33]
-\definemathsymbol [ntrianglerighteq]    [rel]   [mb] ["34]
-\definemathsymbol [ntrianglelefteq]     [rel]   [mb] ["35]
-\definemathsymbol [ntriangleleft]       [rel]   [mb] ["36]
-\definemathsymbol [ntriangleright]      [rel]   [mb] ["37]
-\definemathsymbol [nleftarrow]          [rel]   [mb] ["38]
-\definemathsymbol [nrightarrow]         [rel]   [mb] ["39]
-\definemathsymbol [nLeftarrow]          [rel]   [mb] ["3A]
-\definemathsymbol [nRightarrow]         [rel]   [mb] ["3B]
-\definemathsymbol [nLeftrightarrow]     [rel]   [mb] ["3C]
-\definemathsymbol [nleftrightarrow]     [rel]   [mb] ["3D]
-\definemathsymbol [divideontimes]       [bin]   [mb] ["3E]
-\definemathsymbol [varnothing]          [ord]   [mb] ["3F]
-\definemathsymbol [nexists]             [ord]   [mb] ["40]
-\definemathsymbol [Finv]                [ord]   [mb] ["60]
-\definemathsymbol [Game]                [ord]   [mb] ["61]
-\definemathsymbol [mho]                 [ord]   [mb] ["66]
-\definemathsymbol [eth]                 [ord]   [mb] ["67]
-\definemathsymbol [eqsim]               [rel]   [mb] ["68]
-\definemathsymbol [beth]                [ord]   [mb] ["69]
-\definemathsymbol [gimel]               [ord]   [mb] ["6A]
-\definemathsymbol [daleth]              [ord]   [mb] ["6B]
-\definemathsymbol [lessdot]             [bin]   [mb] ["6C]
-\definemathsymbol [gtrdot]              [bin]   [mb] ["6D]
-\definemathsymbol [ltimes]              [bin]   [mb] ["6E]
-\definemathsymbol [rtimes]              [bin]   [mb] ["6F]
-\definemathsymbol [shortmid]            [rel]   [mb] ["70]
-\definemathsymbol [shortparallel]       [rel]   [mb] ["71]
-\definemathsymbol [smallsetminus]       [bin]   [mb] ["72]
-\definemathsymbol [thicksim]            [rel]   [mb] ["73]
-\definemathsymbol [thickapprox]         [rel]   [mb] ["74]
-\definemathsymbol [approxeq]            [rel]   [mb] ["75]
-\definemathsymbol [succapprox]          [rel]   [mb] ["76]
-\definemathsymbol [precapprox]          [rel]   [mb] ["77]
-\definemathsymbol [curvearrowleft]      [rel]   [mb] ["78]
-\definemathsymbol [curvearrowright]     [rel]   [mb] ["79]
-\definemathsymbol [digamma]             [ord]   [mb] ["7A]
-\definemathsymbol [varkappa]            [ord]   [mb] ["7B]
-\definemathsymbol [Bbbk]                [ord]   [mb] ["7C]
-\definemathsymbol [hslash]              [ord]   [mb] ["7D]
-\definemathsymbol [hbar]                [ord]   [mb] ["7E]
-\definemathsymbol [backepsilon]         [rel]   [mb] ["7F]
-
-\stopmathcollection
-
-\startmathcollection [default]
-
-\definemathcommand [yen]            [nothing] {\mathhexbox{\hexmafam}55}
-\definemathcommand [checkmark]      [nothing] {\mathhexbox{\hexmafam}58}
-\definemathcommand [circledR]       [nothing] {\mathhexbox{\hexmafam}72}
-\definemathcommand [maltese]        [nothing] {\mathhexbox{\hexmafam}7A}
-
-\stopmathcollection
-
-\startmathcollection [default]
-
-\definemathcommand [dashrightarrow] [rel]     {\dabar@\dabar@ \mathchar"0C4B}
-\definemathcommand [dashleftarrow]  [rel]     {\mathchar"0C4C\dabar@ \dabar@}
-\definemathcommand [dasharrow]      [rel]     {\dabar@\dabar@ \mathchar"0C4B}
-\definemathcommand [Join]           [rel]     {\mathchar"0D6F\mkern-13.8mu\mathchar"0D6E}
-\definemathcommand [implies]        [rel]     {\;\Longrightarrow\;}
-\definemathcommand [impliedby]      [rel]     {\;\Longleftarrow\;}
-\definemathcommand [And]            [rel]     {\;\internalAnd\;}
-
-\stopmathcollection
-
-\def\AMSwidehat#1%
-  {\setbox\scratchbox\hbox{$\mathsurround\zeropoint#1$}%
-   \ifdim\wd\scratchbox>2em
-     \mathaccent"0\purefamilyhex{mb}5B{#1}%
-   \else
-     \mathaccent"0\purefamilyhex{ex}62{#1}%
-   \fi}
-
-\def\AMSwidetilde#1%
-  {\setbox\scratchbox\hbox{$\mathsurround\zeropoint#1$}%
-   \ifdim\wd\scratchbox>2em
-     \mathaccent"0\purefamilyhex{mb}5D{#1}%
-   \else
-     \mathaccent"0\purefamilyhex{ex}65{#1}%
-   \fi}
-
-\startmathcollection [default]
-
-\definemathcommand [widehat]   {\AMSwidehat}
-\definemathcommand [widetilde] {\AMSwidetilde}
-
-\stopmathcollection
-
-\protect \endinput
diff --git a/tex/context/base/math-cow.mkii b/tex/context/base/math-cow.mkii
new file mode 100644
index 000000000..f0fc811c8
--- /dev/null
+++ b/tex/context/base/math-cow.mkii
@@ -0,0 +1,31 @@
+%D \module
+%D   [       file=math-cow,
+%D        version=2006.06.23,
+%D          title=\CONTEXT\ Math Macros,
+%D       subtitle=Cow Math,
+%D         author={Hans Hagen \& Taco Hoekwater},
+%D           date=\currentdate,
+%D      copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\def\COWsqrt     {\mthsqrt{\char"7A}{\char"7B}}
+\def\COWfrac     {\mthfrac{\char"7C}{\char"7A}{\char"7B}}
+\def\COWarrowfill{\mtharrowfill 1001}
+
+\startmathcollection [cow]
+    % todo
+\stopmathcollection
+
+\startrawmathcollection[cow]
+    \definemathcommand [frac]   {\COWfrac}
+    \definemathcommand [sqrt]   {\COWsqrt}
+    %definemathcommand [r@@t]   {\COWroot}
+    %definemathcommand [matrix] {\COWmatrix}
+\stoprawmathcollection
+
+\protect \endinput
diff --git a/tex/context/base/math-cow.tex b/tex/context/base/math-cow.tex
deleted file mode 100644
index f0fc811c8..000000000
--- a/tex/context/base/math-cow.tex
+++ /dev/null
@@ -1,31 +0,0 @@
-%D \module
-%D   [       file=math-cow,
-%D        version=2006.06.23,
-%D          title=\CONTEXT\ Math Macros,
-%D       subtitle=Cow Math,
-%D         author={Hans Hagen \& Taco Hoekwater},
-%D           date=\currentdate,
-%D      copyright=\PRAGMA]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\unprotect
-
-\def\COWsqrt     {\mthsqrt{\char"7A}{\char"7B}}
-\def\COWfrac     {\mthfrac{\char"7C}{\char"7A}{\char"7B}}
-\def\COWarrowfill{\mtharrowfill 1001}
-
-\startmathcollection [cow]
-    % todo
-\stopmathcollection
-
-\startrawmathcollection[cow]
-    \definemathcommand [frac]   {\COWfrac}
-    \definemathcommand [sqrt]   {\COWsqrt}
-    %definemathcommand [r@@t]   {\COWroot}
-    %definemathcommand [matrix] {\COWmatrix}
-\stoprawmathcollection
-
-\protect \endinput
diff --git a/tex/context/base/math-def.mkiv b/tex/context/base/math-def.mkiv
index 9e6ad28c1..0438777fa 100644
--- a/tex/context/base/math-def.mkiv
+++ b/tex/context/base/math-def.mkiv
@@ -132,7 +132,7 @@
 
 \def\setoperatorlimits#1#2% operator limits
   {\savenormalmeaning{#1}%
-   \def#1{\getvalue{normal\strippedcsname#1}#2}}
+   \def#1{\csname normal\strippedcsname#1\endcsname#2}}
 
 \setoperatorlimits\int              \intlimits
 \setoperatorlimits\iint             \intlimits
diff --git a/tex/context/base/math-eul.mkii b/tex/context/base/math-eul.mkii
new file mode 100644
index 000000000..7552957a8
--- /dev/null
+++ b/tex/context/base/math-eul.mkii
@@ -0,0 +1,277 @@
+%D \module
+%D   [       file=math-eul,
+%D        version=2003.02.03,
+%D          title=\CONTEXT\ Math Macros,
+%D       subtitle=Virtual Euler Specials,
+%D         author={Hans Hagen \& Taco Hoekwater \& Adam Lindsay},
+%D           date=\currentdate,
+%D      copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details. Further modified by Adam Lindsay.
+
+\unprotect
+
+%D We follow the following mappings from type-eul:
+%D
+%D  mr [MathRoman]      [Euler-Roman]     [zeurm10]
+
+%D  mi [MathItalic]     [Euler-Italic]    [eufm10]
+
+%D  ex [MathExtension]  [Euler-Extension] [zeuex10]
+%D  sy [MathSymbol]     [Euler-Symbol]    [zeusm10]
+
+%D  mb [MathBeta]       [Charter-Roman]   [bchr8r] XXX
+%D  mc [MathGamma]      [Euler-Fraktur]   [eufm10] XXX
+%D
+%D The inclusion of Bitstream Charter was originally for the text accents.
+%D Obviously, it's not a proper ``MathBeta'' font.
+
+%D The varrho and varsigma characters don't exist in eulervm,
+%D so we point at the normal types.
+
+\definefamilysynonym [eul]     [calligraphic] [sy]
+\definefamilysynonym [eul]     [oldstyle]     [mi]
+\definefamilysynonym [eul]     [gothic]       [mi]
+\definefamilysynonym [eul]     [fraktur]      [mi]
+
+\definefamilysynonym [eul]     [lcgreek]      [mr]
+\definefamilysynonym [eul]     [ucgreek]      [mr]
+\definefamilysynonym [eul]     [vargreek]     [mr]
+
+%% Well, you don't know until you try!
+%\definefamilysynonym [eul]     [accents]      [Serif]
+
+\startmathcollection [eul]
+
+\definemathsymbol [varrho]   [nothing] [vargreek] ["1A]
+\definemathsymbol [varsigma] [nothing] [vargreek] ["1B]
+
+%D Changes necessitated by collapsing mr \& mi into one:
+\definemathsymbol [imath]    [nothing] [mr] ["7B]
+\definemathsymbol [jmath]    [nothing] [mr] ["7C]
+\definemathsymbol [ell]      [nothing] [mr] ["60]
+\definemathsymbol [wp]       [nothing] [mr] ["7D]
+\definemathsymbol [partial]  [nothing] [mr] ["40]
+
+\definemathsymbol [flat]         [ord] [mr] ["5B]
+\definemathsymbol [natural]      [ord] [mr] ["5C]
+\definemathsymbol [sharp]        [ord] [mr] ["5D]
+
+\definemathsymbol [triangleleft] [bin] [mr] ["2F]
+\definemathsymbol [triangleright][bin] [mr] ["2E]
+
+\definemathsymbol [star]         [bin] [mr] ["3F]
+
+\definemathsymbol [smile]            [rel] [mr] ["5E]
+\definemathsymbol [frown]            [rel] [mr] ["5F]
+\definemathsymbol [leftharpoonup]    [rel] [mr] ["28]
+\definemathsymbol [leftharpoondown]  [rel] [mr] ["29]
+\definemathsymbol [rightharpoonup]   [rel] [mr] ["2A]
+\definemathsymbol [rightharpoondown] [rel] [mr] ["2B]
+\definemathsymbol [lhook]            [rel] [mr] ["2C]
+\definemathsymbol [rhook]            [rel] [mr] ["2D]
+
+\definemathsymbol [mathperiod] [ord]   [mr] ["3A]
+\definemathsymbol [textperiod] [punct] [mr] ["3A]
+
+\definemathsymbol [mathcomma]  [ord]   [mr] ["3B]
+\definemathsymbol [textcomma]  [punct] [mr] ["3B]
+
+\definemathsymbol [ldotp] [punct] [mr] ["3A]
+
+% extras from AMS:
+\definemathsymbol [hslash]   [ord]   [mr] ["80] %beauty over truth
+
+\stopmathcollection
+
+\startmathcollection [eul]
+% Ugh. no way around this to keep it compact in the font defs.
+
+\definemathcharacter [a]   [alpha] [mr] ["61]
+\definemathcharacter [b]   [alpha] [mr] ["62]
+\definemathcharacter [c]   [alpha] [mr] ["63]
+\definemathcharacter [d]   [alpha] [mr] ["64]
+\definemathcharacter [e]   [alpha] [mr] ["65]
+\definemathcharacter [f]   [alpha] [mr] ["66]
+\definemathcharacter [g]   [alpha] [mr] ["67]
+\definemathcharacter [h]   [alpha] [mr] ["68]
+\definemathcharacter [i]   [alpha] [mr] ["69]
+\definemathcharacter [j]   [alpha] [mr] ["6A]
+\definemathcharacter [k]   [alpha] [mr] ["6B]
+\definemathcharacter [l]   [alpha] [mr] ["6C]
+\definemathcharacter [m]   [alpha] [mr] ["6D]
+\definemathcharacter [n]   [alpha] [mr] ["6E]
+\definemathcharacter [o]   [alpha] [mr] ["6F]
+\definemathcharacter [p]   [alpha] [mr] ["70]
+\definemathcharacter [q]   [alpha] [mr] ["71]
+\definemathcharacter [r]   [alpha] [mr] ["72]
+\definemathcharacter [s]   [alpha] [mr] ["73]
+\definemathcharacter [t]   [alpha] [mr] ["74]
+\definemathcharacter [u]   [alpha] [mr] ["75]
+\definemathcharacter [v]   [alpha] [mr] ["76]
+\definemathcharacter [w]   [alpha] [mr] ["77]
+\definemathcharacter [x]   [alpha] [mr] ["78]
+\definemathcharacter [y]   [alpha] [mr] ["79]
+\definemathcharacter [z]   [alpha] [mr] ["7A]
+
+\definemathcharacter [A]   [alpha] [mr] ["41]
+\definemathcharacter [B]   [alpha] [mr] ["42]
+\definemathcharacter [C]   [alpha] [mr] ["43]
+\definemathcharacter [D]   [alpha] [mr] ["44]
+\definemathcharacter [E]   [alpha] [mr] ["45]
+\definemathcharacter [F]   [alpha] [mr] ["46]
+\definemathcharacter [G]   [alpha] [mr] ["47]
+\definemathcharacter [H]   [alpha] [mr] ["48]
+\definemathcharacter [I]   [alpha] [mr] ["49]
+\definemathcharacter [J]   [alpha] [mr] ["4A]
+\definemathcharacter [K]   [alpha] [mr] ["4B]
+\definemathcharacter [L]   [alpha] [mr] ["4C]
+\definemathcharacter [M]   [alpha] [mr] ["4D]
+\definemathcharacter [N]   [alpha] [mr] ["4E]
+\definemathcharacter [O]   [alpha] [mr] ["4F]
+\definemathcharacter [P]   [alpha] [mr] ["50]
+\definemathcharacter [Q]   [alpha] [mr] ["51]
+\definemathcharacter [R]   [alpha] [mr] ["52]
+\definemathcharacter [S]   [alpha] [mr] ["53]
+\definemathcharacter [T]   [alpha] [mr] ["54]
+\definemathcharacter [U]   [alpha] [mr] ["55]
+\definemathcharacter [V]   [alpha] [mr] ["56]
+\definemathcharacter [W]   [alpha] [mr] ["57]
+\definemathcharacter [X]   [alpha] [mr] ["58]
+\definemathcharacter [Y]   [alpha] [mr] ["59]
+\definemathcharacter [Z]   [alpha] [mr] ["5A]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathcharacter [!]   [close] [sy] ["A1]
+\definemathcharacter [(]   [open]  [sy] ["A8]
+\definemathcharacter [)]   [close] [sy] ["A9]
+\definemathcharacter [+]   [bin]   [sy] ["AB]
+\definemathcharacter [:]   [rel]   [sy] ["BA]
+\definemathcharacter [;]   [punct] [sy] ["BB]
+\definemathcharacter [=]   [rel]   [sy] ["BD]
+\definemathcharacter [?]   [close] [sy] ["BF]
+\definemathcharacter [91]  [open]  [sy] ["DB] % [
+\definemathcharacter [93]  [close] [sy] ["DD] % ]
+
+\definemathcharacter [,]   [punct] [mr] ["3B]
+\definemathcharacter [.]   [ord]   [mr] ["3A]
+\definemathcharacter [/]   [ord]   [mr] ["3D]
+\definemathcharacter [<]   [rel]   [mr] ["3C]
+\definemathcharacter [>]   [rel]   [mr] ["3E]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathcharacter [(]   [nothing] [sy] ["A8] [ex] ["00]
+\definemathcharacter [)]   [nothing] [sy] ["A9] [ex] ["01]
+\definemathcharacter [91]  [nothing] [sy] ["DB] [ex] ["02] % [
+\definemathcharacter [93]  [nothing] [sy] ["DD] [ex] ["03] % ]
+\definemathcharacter [/]   [nothing] [mr] ["3D] [ex] ["0E]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathsymbol [hbar]   [nothing] [mr] ["80]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathsymbol [ddagger] [bin] [sy] ["7A]
+\definemathsymbol [dagger]  [bin] [sy] ["79]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathsymbol [colon] [punct] [sy] ["BA]
+
+\stopmathcollection
+
+%D This used to be very hackish; it brought in text
+%D accents from the well-matched Bitstream Charter.
+
+%D But now, these characters don't exist. I would prefer to pull
+%D them from the text font, but  I don't know how.
+%D Instead, I'm just pointing to null characters!
+
+\startmathcollection [eul]
+
+\definemathsymbol [acute] [accent] [mr] ["90]
+\definemathsymbol [grave] [accent] [mr] ["91]
+\definemathsymbol [ddot]  [accent] [mr] ["92]
+\definemathsymbol [tilde] [accent] [mr] ["93]
+\definemathsymbol [bar]   [accent] [mr] ["94]
+\definemathsymbol [breve] [accent] [mr] ["95]
+\definemathsymbol [check] [accent] [mr] ["96]
+\definemathsymbol [hat]   [accent] [mr] ["97]
+\definemathsymbol [dot]   [accent] [mr] ["98]
+%\definemathsymbol [acute] [accent] [accents] ["B4]
+%\definemathsymbol [grave] [accent] [accents] ["1E]
+%\definemathsymbol [ddot]  [accent] [accents] ["A8]
+%\definemathsymbol [tilde] [accent] [accents] ["98]
+%\definemathsymbol [bar]   [accent] [accents] ["AF]
+%\definemathsymbol [breve] [accent] [accents] ["0B]
+%\definemathsymbol [check] [accent] [accents] ["10]
+%\definemathsymbol [hat]   [accent] [accents] ["5E]
+%\definemathsymbol [dot]   [accent] [accents] ["01]
+
+\definemathsymbol [vec]   [accent] [mr] ["7E] % [ord]
+\definemathsymbol [hat]   [accent] [sy] ["DE]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathsymbol [lgroup] [open]  [sy] ["A8] [ex] ["3A] % ?
+\definemathsymbol [rgroup] [close] [sy] ["A9] [ex] ["3B] % ?
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathsymbol [dag]  [box] [sy] ["79]
+\definemathsymbol [ddag] [box] [sy] ["7A]
+\definemathsymbol [S]    [box] [sy] ["78]
+\definemathsymbol [P]    [box] [sy] ["7B]
+
+\stopmathcollection
+
+%D Aditya's additionl definitions:
+
+\startmathcollection[eul:texnansi]
+   \definemathsymbol [acute]    [accent] [tf] ["13]
+   \definemathsymbol [grave]    [accent] [tf] ["12]
+   \definemathsymbol [ddot]     [accent] [tf] ["A8]
+   \definemathsymbol [tilde]    [accent] [tf] ["98]
+   \definemathsymbol [bar]      [accent] [tf] ["16]
+   \definemathsymbol [breve]    [accent] [tf] ["15]
+   \definemathsymbol [check]    [accent] [tf] ["14]
+   \definemathsymbol [hat]      [accent] [tf] ["88]
+   \definemathsymbol [dot]      [accent] [tf] ["5]
+   % Why is mathring not defined??
+   \definemathsymbol [mathring] [accent] [tf] ["17]
+\stopmathcollection
+
+\startmathcollection[eul:ec]
+   \definemathsymbol [acute]    [accent] [tf] ["1]
+   \definemathsymbol [grave]    [accent] [tf] ["0]
+   \definemathsymbol [ddot]     [accent] [tf] ["4]
+   \definemathsymbol [tilde]    [accent] [tf] ["3]
+   \definemathsymbol [bar]      [accent] [tf] ["9]
+   \definemathsymbol [breve]    [accent] [tf] ["8]
+   \definemathsymbol [check]    [accent] [tf] ["7]
+   \definemathsymbol [hat]      [accent] [tf] ["2]
+   \definemathsymbol [dot]      [accent] [tf] ["A]
+   % Why is mathring not defined??
+   \definemathsymbol [mathring] [accent] [tf] ["6]
+\stopmathcollection
+
+\protect \endinput
diff --git a/tex/context/base/math-eul.tex b/tex/context/base/math-eul.tex
deleted file mode 100644
index 7552957a8..000000000
--- a/tex/context/base/math-eul.tex
+++ /dev/null
@@ -1,277 +0,0 @@
-%D \module
-%D   [       file=math-eul,
-%D        version=2003.02.03,
-%D          title=\CONTEXT\ Math Macros,
-%D       subtitle=Virtual Euler Specials,
-%D         author={Hans Hagen \& Taco Hoekwater \& Adam Lindsay},
-%D           date=\currentdate,
-%D      copyright=\PRAGMA]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details. Further modified by Adam Lindsay.
-
-\unprotect
-
-%D We follow the following mappings from type-eul:
-%D
-%D  mr [MathRoman]      [Euler-Roman]     [zeurm10]
-
-%D  mi [MathItalic]     [Euler-Italic]    [eufm10]
-
-%D  ex [MathExtension]  [Euler-Extension] [zeuex10]
-%D  sy [MathSymbol]     [Euler-Symbol]    [zeusm10]
-
-%D  mb [MathBeta]       [Charter-Roman]   [bchr8r] XXX
-%D  mc [MathGamma]      [Euler-Fraktur]   [eufm10] XXX
-%D
-%D The inclusion of Bitstream Charter was originally for the text accents.
-%D Obviously, it's not a proper ``MathBeta'' font.
-
-%D The varrho and varsigma characters don't exist in eulervm,
-%D so we point at the normal types.
-
-\definefamilysynonym [eul]     [calligraphic] [sy]
-\definefamilysynonym [eul]     [oldstyle]     [mi]
-\definefamilysynonym [eul]     [gothic]       [mi]
-\definefamilysynonym [eul]     [fraktur]      [mi]
-
-\definefamilysynonym [eul]     [lcgreek]      [mr]
-\definefamilysynonym [eul]     [ucgreek]      [mr]
-\definefamilysynonym [eul]     [vargreek]     [mr]
-
-%% Well, you don't know until you try!
-%\definefamilysynonym [eul]     [accents]      [Serif]
-
-\startmathcollection [eul]
-
-\definemathsymbol [varrho]   [nothing] [vargreek] ["1A]
-\definemathsymbol [varsigma] [nothing] [vargreek] ["1B]
-
-%D Changes necessitated by collapsing mr \& mi into one:
-\definemathsymbol [imath]    [nothing] [mr] ["7B]
-\definemathsymbol [jmath]    [nothing] [mr] ["7C]
-\definemathsymbol [ell]      [nothing] [mr] ["60]
-\definemathsymbol [wp]       [nothing] [mr] ["7D]
-\definemathsymbol [partial]  [nothing] [mr] ["40]
-
-\definemathsymbol [flat]         [ord] [mr] ["5B]
-\definemathsymbol [natural]      [ord] [mr] ["5C]
-\definemathsymbol [sharp]        [ord] [mr] ["5D]
-
-\definemathsymbol [triangleleft] [bin] [mr] ["2F]
-\definemathsymbol [triangleright][bin] [mr] ["2E]
-
-\definemathsymbol [star]         [bin] [mr] ["3F]
-
-\definemathsymbol [smile]            [rel] [mr] ["5E]
-\definemathsymbol [frown]            [rel] [mr] ["5F]
-\definemathsymbol [leftharpoonup]    [rel] [mr] ["28]
-\definemathsymbol [leftharpoondown]  [rel] [mr] ["29]
-\definemathsymbol [rightharpoonup]   [rel] [mr] ["2A]
-\definemathsymbol [rightharpoondown] [rel] [mr] ["2B]
-\definemathsymbol [lhook]            [rel] [mr] ["2C]
-\definemathsymbol [rhook]            [rel] [mr] ["2D]
-
-\definemathsymbol [mathperiod] [ord]   [mr] ["3A]
-\definemathsymbol [textperiod] [punct] [mr] ["3A]
-
-\definemathsymbol [mathcomma]  [ord]   [mr] ["3B]
-\definemathsymbol [textcomma]  [punct] [mr] ["3B]
-
-\definemathsymbol [ldotp] [punct] [mr] ["3A]
-
-% extras from AMS:
-\definemathsymbol [hslash]   [ord]   [mr] ["80] %beauty over truth
-
-\stopmathcollection
-
-\startmathcollection [eul]
-% Ugh. no way around this to keep it compact in the font defs.
-
-\definemathcharacter [a]   [alpha] [mr] ["61]
-\definemathcharacter [b]   [alpha] [mr] ["62]
-\definemathcharacter [c]   [alpha] [mr] ["63]
-\definemathcharacter [d]   [alpha] [mr] ["64]
-\definemathcharacter [e]   [alpha] [mr] ["65]
-\definemathcharacter [f]   [alpha] [mr] ["66]
-\definemathcharacter [g]   [alpha] [mr] ["67]
-\definemathcharacter [h]   [alpha] [mr] ["68]
-\definemathcharacter [i]   [alpha] [mr] ["69]
-\definemathcharacter [j]   [alpha] [mr] ["6A]
-\definemathcharacter [k]   [alpha] [mr] ["6B]
-\definemathcharacter [l]   [alpha] [mr] ["6C]
-\definemathcharacter [m]   [alpha] [mr] ["6D]
-\definemathcharacter [n]   [alpha] [mr] ["6E]
-\definemathcharacter [o]   [alpha] [mr] ["6F]
-\definemathcharacter [p]   [alpha] [mr] ["70]
-\definemathcharacter [q]   [alpha] [mr] ["71]
-\definemathcharacter [r]   [alpha] [mr] ["72]
-\definemathcharacter [s]   [alpha] [mr] ["73]
-\definemathcharacter [t]   [alpha] [mr] ["74]
-\definemathcharacter [u]   [alpha] [mr] ["75]
-\definemathcharacter [v]   [alpha] [mr] ["76]
-\definemathcharacter [w]   [alpha] [mr] ["77]
-\definemathcharacter [x]   [alpha] [mr] ["78]
-\definemathcharacter [y]   [alpha] [mr] ["79]
-\definemathcharacter [z]   [alpha] [mr] ["7A]
-
-\definemathcharacter [A]   [alpha] [mr] ["41]
-\definemathcharacter [B]   [alpha] [mr] ["42]
-\definemathcharacter [C]   [alpha] [mr] ["43]
-\definemathcharacter [D]   [alpha] [mr] ["44]
-\definemathcharacter [E]   [alpha] [mr] ["45]
-\definemathcharacter [F]   [alpha] [mr] ["46]
-\definemathcharacter [G]   [alpha] [mr] ["47]
-\definemathcharacter [H]   [alpha] [mr] ["48]
-\definemathcharacter [I]   [alpha] [mr] ["49]
-\definemathcharacter [J]   [alpha] [mr] ["4A]
-\definemathcharacter [K]   [alpha] [mr] ["4B]
-\definemathcharacter [L]   [alpha] [mr] ["4C]
-\definemathcharacter [M]   [alpha] [mr] ["4D]
-\definemathcharacter [N]   [alpha] [mr] ["4E]
-\definemathcharacter [O]   [alpha] [mr] ["4F]
-\definemathcharacter [P]   [alpha] [mr] ["50]
-\definemathcharacter [Q]   [alpha] [mr] ["51]
-\definemathcharacter [R]   [alpha] [mr] ["52]
-\definemathcharacter [S]   [alpha] [mr] ["53]
-\definemathcharacter [T]   [alpha] [mr] ["54]
-\definemathcharacter [U]   [alpha] [mr] ["55]
-\definemathcharacter [V]   [alpha] [mr] ["56]
-\definemathcharacter [W]   [alpha] [mr] ["57]
-\definemathcharacter [X]   [alpha] [mr] ["58]
-\definemathcharacter [Y]   [alpha] [mr] ["59]
-\definemathcharacter [Z]   [alpha] [mr] ["5A]
-
-\stopmathcollection
-
-\startmathcollection [eul]
-
-\definemathcharacter [!]   [close] [sy] ["A1]
-\definemathcharacter [(]   [open]  [sy] ["A8]
-\definemathcharacter [)]   [close] [sy] ["A9]
-\definemathcharacter [+]   [bin]   [sy] ["AB]
-\definemathcharacter [:]   [rel]   [sy] ["BA]
-\definemathcharacter [;]   [punct] [sy] ["BB]
-\definemathcharacter [=]   [rel]   [sy] ["BD]
-\definemathcharacter [?]   [close] [sy] ["BF]
-\definemathcharacter [91]  [open]  [sy] ["DB] % [
-\definemathcharacter [93]  [close] [sy] ["DD] % ]
-
-\definemathcharacter [,]   [punct] [mr] ["3B]
-\definemathcharacter [.]   [ord]   [mr] ["3A]
-\definemathcharacter [/]   [ord]   [mr] ["3D]
-\definemathcharacter [<]   [rel]   [mr] ["3C]
-\definemathcharacter [>]   [rel]   [mr] ["3E]
-
-\stopmathcollection
-
-\startmathcollection [eul]
-
-\definemathcharacter [(]   [nothing] [sy] ["A8] [ex] ["00]
-\definemathcharacter [)]   [nothing] [sy] ["A9] [ex] ["01]
-\definemathcharacter [91]  [nothing] [sy] ["DB] [ex] ["02] % [
-\definemathcharacter [93]  [nothing] [sy] ["DD] [ex] ["03] % ]
-\definemathcharacter [/]   [nothing] [mr] ["3D] [ex] ["0E]
-
-\stopmathcollection
-
-\startmathcollection [eul]
-
-\definemathsymbol [hbar]   [nothing] [mr] ["80]
-
-\stopmathcollection
-
-\startmathcollection [eul]
-
-\definemathsymbol [ddagger] [bin] [sy] ["7A]
-\definemathsymbol [dagger]  [bin] [sy] ["79]
-
-\stopmathcollection
-
-\startmathcollection [eul]
-
-\definemathsymbol [colon] [punct] [sy] ["BA]
-
-\stopmathcollection
-
-%D This used to be very hackish; it brought in text
-%D accents from the well-matched Bitstream Charter.
-
-%D But now, these characters don't exist. I would prefer to pull
-%D them from the text font, but  I don't know how.
-%D Instead, I'm just pointing to null characters!
-
-\startmathcollection [eul]
-
-\definemathsymbol [acute] [accent] [mr] ["90]
-\definemathsymbol [grave] [accent] [mr] ["91]
-\definemathsymbol [ddot]  [accent] [mr] ["92]
-\definemathsymbol [tilde] [accent] [mr] ["93]
-\definemathsymbol [bar]   [accent] [mr] ["94]
-\definemathsymbol [breve] [accent] [mr] ["95]
-\definemathsymbol [check] [accent] [mr] ["96]
-\definemathsymbol [hat]   [accent] [mr] ["97]
-\definemathsymbol [dot]   [accent] [mr] ["98]
-%\definemathsymbol [acute] [accent] [accents] ["B4]
-%\definemathsymbol [grave] [accent] [accents] ["1E]
-%\definemathsymbol [ddot]  [accent] [accents] ["A8]
-%\definemathsymbol [tilde] [accent] [accents] ["98]
-%\definemathsymbol [bar]   [accent] [accents] ["AF]
-%\definemathsymbol [breve] [accent] [accents] ["0B]
-%\definemathsymbol [check] [accent] [accents] ["10]
-%\definemathsymbol [hat]   [accent] [accents] ["5E]
-%\definemathsymbol [dot]   [accent] [accents] ["01]
-
-\definemathsymbol [vec]   [accent] [mr] ["7E] % [ord]
-\definemathsymbol [hat]   [accent] [sy] ["DE]
-
-\stopmathcollection
-
-\startmathcollection [eul]
-
-\definemathsymbol [lgroup] [open]  [sy] ["A8] [ex] ["3A] % ?
-\definemathsymbol [rgroup] [close] [sy] ["A9] [ex] ["3B] % ?
-
-\stopmathcollection
-
-\startmathcollection [eul]
-
-\definemathsymbol [dag]  [box] [sy] ["79]
-\definemathsymbol [ddag] [box] [sy] ["7A]
-\definemathsymbol [S]    [box] [sy] ["78]
-\definemathsymbol [P]    [box] [sy] ["7B]
-
-\stopmathcollection
-
-%D Aditya's additionl definitions:
-
-\startmathcollection[eul:texnansi]
-   \definemathsymbol [acute]    [accent] [tf] ["13]
-   \definemathsymbol [grave]    [accent] [tf] ["12]
-   \definemathsymbol [ddot]     [accent] [tf] ["A8]
-   \definemathsymbol [tilde]    [accent] [tf] ["98]
-   \definemathsymbol [bar]      [accent] [tf] ["16]
-   \definemathsymbol [breve]    [accent] [tf] ["15]
-   \definemathsymbol [check]    [accent] [tf] ["14]
-   \definemathsymbol [hat]      [accent] [tf] ["88]
-   \definemathsymbol [dot]      [accent] [tf] ["5]
-   % Why is mathring not defined??
-   \definemathsymbol [mathring] [accent] [tf] ["17]
-\stopmathcollection
-
-\startmathcollection[eul:ec]
-   \definemathsymbol [acute]    [accent] [tf] ["1]
-   \definemathsymbol [grave]    [accent] [tf] ["0]
-   \definemathsymbol [ddot]     [accent] [tf] ["4]
-   \definemathsymbol [tilde]    [accent] [tf] ["3]
-   \definemathsymbol [bar]      [accent] [tf] ["9]
-   \definemathsymbol [breve]    [accent] [tf] ["8]
-   \definemathsymbol [check]    [accent] [tf] ["7]
-   \definemathsymbol [hat]      [accent] [tf] ["2]
-   \definemathsymbol [dot]      [accent] [tf] ["A]
-   % Why is mathring not defined??
-   \definemathsymbol [mathring] [accent] [tf] ["6]
-\stopmathcollection
-
-\protect \endinput
diff --git a/tex/context/base/math-fou.mkii b/tex/context/base/math-fou.mkii
new file mode 100644
index 000000000..8a72f1288
--- /dev/null
+++ b/tex/context/base/math-fou.mkii
@@ -0,0 +1,196 @@
+%D \module
+%D   [       file=math-fou,
+%D        version=2001.04.12,
+%D          title=\CONTEXT\ Math Macros,
+%D       subtitle=Fourier Specials,
+%D         author={Michel Biovani \& Hans Hagen},
+%D           date=\currentdate,
+%D      copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% see end of file for todo
+
+\unprotect
+
+\startmathcollection [fou]
+
+  \definemathsymbol [Gamma]   [alpha] [mi] ["00]
+  \definemathsymbol [Delta]   [alpha] [mi] ["01]
+  \definemathsymbol [Theta]   [alpha] [mi] ["02]
+  \definemathsymbol [Lambda]  [alpha] [mi] ["03]
+  \definemathsymbol [Xi]      [alpha] [mi] ["04]
+  \definemathsymbol [Pi]      [alpha] [mi] ["05]
+  \definemathsymbol [Sigma]   [alpha] [mi] ["06]
+  \definemathsymbol [Upsilon] [alpha] [mi] ["07]
+  \definemathsymbol [Phi]     [alpha] [mi] ["08]
+  \definemathsymbol [Psi]     [alpha] [mi] ["09]
+  \definemathsymbol [Omega]   [alpha] [mi] ["0A]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+  \definemathcharacter [+] [bin] [sy] ["80]
+  \definemathcharacter [=] [rel] [sy] ["81]
+  \definemathcharacter [<] [rel] [sy] ["82]
+  \definemathcharacter [>] [rel] [sy] ["83]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+  \definemathsymbol [leqslant]           [rel] [sy] ["84]
+  \definemathsymbol [geqslant]           [rel] [sy] ["85]
+  \definemathsymbol [parallelslant]      [rel] [sy] ["86]
+  \definemathsymbol [thething]           [ord] [sy] ["87]
+  \definemathsymbol [vDash]              [rel] [sy] ["88]
+  \definemathsymbol [blacktriangleleft]  [rel] [sy] ["89]
+  \definemathsymbol [blacktriangleright] [rel] [sy] ["8A]
+  \definemathsymbol [nleqslant]          [rel] [sy] ["8B]
+  \definemathsymbol [ngeqslant]          [rel] [sy] ["8C]
+  \definemathsymbol [parallel]           [rel] [sy] ["8D]
+  \definemathsymbol [nparallel]          [rel] [sy] ["8E]
+  \definemathsymbol [nparallelslant]     [rel] [sy] ["8F]
+  \definemathsymbol [nvDash]             [rel] [sy] ["90]
+  \definemathsymbol [intercal]           [bin] [sy] ["91]
+  \definemathsymbol [hslash]             [ord] [sy] ["92]
+  \definemathsymbol [nexists]            [ord] [sy] ["93]
+  \definemathsymbol [varsubsetneq]       [rel] [sy] ["93]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+  \definemathcharacter [(]   [nothing] [mr] ["28] [ex] ["A1]
+  \definemathcharacter [)]   [nothing] [mr] ["29] [ex] ["A2]
+  \definemathcharacter [91]  [nothing] [mr] ["5B] [ex] ["A3] % [
+  \definemathcharacter [93]  [nothing] [mr] ["5D] [ex] ["A4] % ]
+  \definemathcharacter [/]   [nothing] [mr] ["2F] [ex] ["B1]
+
+  \definemathcharacter [124] [nothing] [sy] ["6A] [ex] ["AF] % |
+  \definemathcharacter [92]  [nothing] [sy] ["6E] [ex] ["B2] % \
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+  \definemathsymbol [Vert]          [nothing] [sy] ["6B] [ex] ["B0]
+  \definemathsymbol [vert]          [nothing] [sy] ["6A] [ex] ["AF]
+  \definemathsymbol [VERT]          [nothing] [sy] ["98] [ex] ["93]
+  \definemathsymbol [Downarrow]     [rel]     [sy] ["2B] [ex] ["C4]
+  \definemathsymbol [backslash]     [nothing] [sy] ["6E] [ex] ["B2]
+  \definemathsymbol [rangle]        [close]   [sy] ["69] [ex] ["AE]
+  \definemathsymbol [langle]        [open]    [sy] ["68] [ex] ["AD]
+  \definemathsymbol [rbrace]        [close]   [sy] ["67] [ex] ["AA]
+  \definemathsymbol [lbrace]        [open]    [sy] ["66] [ex] ["A9]
+  \definemathsymbol [rceil]         [close]   [sy] ["65] [ex] ["A8]
+  \definemathsymbol [lceil]         [open]    [sy] ["64] [ex] ["A7]
+  \definemathsymbol [rfloor]        [close]   [sy] ["63] [ex] ["A6]
+  \definemathsymbol [lfloor]        [open]    [sy] ["62] [ex] ["A5]
+  \definemathsymbol [dblbrackleft]  [open]    [sy] ["99] [ex] ["85]
+  \definemathsymbol [dblbrackright] [close]   [sy] ["9A] [ex] ["86]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+  \definemathsymbol [varkappa]      [ord] [mi] ["80] % check this
+  \definemathsymbol [varvarrho]     [ord] [mi] ["81] % check this
+  \definemathsymbol [xswordsup]     [ord] [sy] ["96]
+  \definemathsymbol [xswordsdown]   [ord] [sy] ["97]
+  \definemathsymbol [notowns]       [rel] [sy] ["9C]
+  \definemathsymbol [hbar]          [ord] [sy] ["9D]
+  \definemathsymbol [smallsetminus] [bin] [sy] ["9E]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+  \definemathsymbol [notin] [rel] [sy] ["9B]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+  \definemathsymbol [iintop]     [op] [ex] ["CE]
+  \definemathsymbol [iiintop]    [op] [ex] ["D0]
+  \definemathsymbol [oiintop]    [op] [ex] ["D2]
+  \definemathsymbol [oiiintop]   [op] [ex] ["D4]
+  \definemathsymbol [slashintop] [op] [ex] ["D6]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+  \definemathcommand [iint]     {\iintop    \nolimits}
+  \definemathcommand [iiint]    {\iiintop   \nolimits}
+  \definemathcommand [oiint]    {\oiintop   \nolimits}
+  \definemathcommand [oiiint]   {\oiiintop  \nolimits}
+  \definemathcommand [slashint] {\slashintop\nolimits}
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+  \definemathsymbol [acute]    [accent] [mr] ["1]
+  \definemathsymbol [grave]    [accent] [mr] ["0]
+  \definemathsymbol [ddot]     [accent] [mr] ["4]
+  \definemathsymbol [tilde]    [accent] [mr] ["3]
+  \definemathsymbol [bar]      [accent] [mr] ["9]
+  \definemathsymbol [breve]    [accent] [mr] ["8]
+  \definemathsymbol [check]    [accent] [mr] ["7]
+  \definemathsymbol [hat]      [accent] [mr] ["2]
+  \definemathsymbol [dot]      [accent] [mr] ["A]
+  \definemathsymbol [mathring] [accent] [mr] ["6]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+  \definemathsymbol [otheralpha]   [ord] [mi] ["0B]
+  \definemathsymbol [otherbeta]    [ord] [mi] ["0C]
+  \definemathsymbol [othergamma]   [ord] [mi] ["0D]
+  \definemathsymbol [otherdelta]   [ord] [mi] ["0E]
+  \definemathsymbol [otherepsilon] [ord] [mi] ["0F]
+  \definemathsymbol [otherzeta]    [ord] [mi] ["10]
+
+\stopmathcollection
+
+\protect \endinput
+
+% from a mail of Michel B / todo
+
+% \definemathsymbol [acute]    [accent] [operators] ["1]
+% \definemathsymbol [grave]    [accent] [operators] ["0]
+% \definemathsymbol [ddot]     [accent] [operators] ["4]
+% \definemathsymbol [tilde]    [accent] [operators] ["3]
+% \definemathsymbol [bar]      [accent] [operators] ["9]
+% \definemathsymbol [breve]    [accent] [operators] ["8]
+% \definemathsymbol [check]    [accent] [operators] ["7]
+% \definemathsymbol [hat]      [accent] [operators] ["2]
+% \definemathsymbol [dot]      [accent] [operators] ["A]
+% \definemathsymbol [mathring] [accent] [operators] ["6]
+
+% \definemathsymbol [wideparen] [ord]    [largesymbols] ["94]
+% \definemathsymbol [widearc]   [accent] [largesymbols] ["D8]
+
+% check for definition of \overset (ams)
+
+% \def\FOUwidering#1%
+%   {\overset{\smash{\vbox to .2ex{\hbox{$\mathring{}$}}}}{\wideparen{#1}}}
+
+% \startmathcollection [default] % [ams]
+%
+% \definemathcommand [widering]  {\FOUwidering}
+%
+% \stopmathcollection
+
+% \definemathsymbol [otheralpha]   [ord] [otherletters] ["0B]
+% \definemathsymbol [otherbeta]    [ord] [otherletters] ["0C]
+% \definemathsymbol [othergamma]   [ord] [otherletters] ["0D]
+% \definemathsymbol [otherdelta]   [ord] [otherletters] ["0E]
+% \definemathsymbol [otherepsilon] [ord] [otherletters] ["0F]
+% \definemathsymbol [otherzeta]    [ord] [otherletters] ["10]
diff --git a/tex/context/base/math-fou.tex b/tex/context/base/math-fou.tex
deleted file mode 100644
index 8a72f1288..000000000
--- a/tex/context/base/math-fou.tex
+++ /dev/null
@@ -1,196 +0,0 @@
-%D \module
-%D   [       file=math-fou,
-%D        version=2001.04.12,
-%D          title=\CONTEXT\ Math Macros,
-%D       subtitle=Fourier Specials,
-%D         author={Michel Biovani \& Hans Hagen},
-%D           date=\currentdate,
-%D      copyright=\PRAGMA]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% see end of file for todo
-
-\unprotect
-
-\startmathcollection [fou]
-
-  \definemathsymbol [Gamma]   [alpha] [mi] ["00]
-  \definemathsymbol [Delta]   [alpha] [mi] ["01]
-  \definemathsymbol [Theta]   [alpha] [mi] ["02]
-  \definemathsymbol [Lambda]  [alpha] [mi] ["03]
-  \definemathsymbol [Xi]      [alpha] [mi] ["04]
-  \definemathsymbol [Pi]      [alpha] [mi] ["05]
-  \definemathsymbol [Sigma]   [alpha] [mi] ["06]
-  \definemathsymbol [Upsilon] [alpha] [mi] ["07]
-  \definemathsymbol [Phi]     [alpha] [mi] ["08]
-  \definemathsymbol [Psi]     [alpha] [mi] ["09]
-  \definemathsymbol [Omega]   [alpha] [mi] ["0A]
-
-\stopmathcollection
-
-\startmathcollection [fou]
-
-  \definemathcharacter [+] [bin] [sy] ["80]
-  \definemathcharacter [=] [rel] [sy] ["81]
-  \definemathcharacter [<] [rel] [sy] ["82]
-  \definemathcharacter [>] [rel] [sy] ["83]
-
-\stopmathcollection
-
-\startmathcollection [fou]
-
-  \definemathsymbol [leqslant]           [rel] [sy] ["84]
-  \definemathsymbol [geqslant]           [rel] [sy] ["85]
-  \definemathsymbol [parallelslant]      [rel] [sy] ["86]
-  \definemathsymbol [thething]           [ord] [sy] ["87]
-  \definemathsymbol [vDash]              [rel] [sy] ["88]
-  \definemathsymbol [blacktriangleleft]  [rel] [sy] ["89]
-  \definemathsymbol [blacktriangleright] [rel] [sy] ["8A]
-  \definemathsymbol [nleqslant]          [rel] [sy] ["8B]
-  \definemathsymbol [ngeqslant]          [rel] [sy] ["8C]
-  \definemathsymbol [parallel]           [rel] [sy] ["8D]
-  \definemathsymbol [nparallel]          [rel] [sy] ["8E]
-  \definemathsymbol [nparallelslant]     [rel] [sy] ["8F]
-  \definemathsymbol [nvDash]             [rel] [sy] ["90]
-  \definemathsymbol [intercal]           [bin] [sy] ["91]
-  \definemathsymbol [hslash]             [ord] [sy] ["92]
-  \definemathsymbol [nexists]            [ord] [sy] ["93]
-  \definemathsymbol [varsubsetneq]       [rel] [sy] ["93]
-
-\stopmathcollection
-
-\startmathcollection [fou]
-
-  \definemathcharacter [(]   [nothing] [mr] ["28] [ex] ["A1]
-  \definemathcharacter [)]   [nothing] [mr] ["29] [ex] ["A2]
-  \definemathcharacter [91]  [nothing] [mr] ["5B] [ex] ["A3] % [
-  \definemathcharacter [93]  [nothing] [mr] ["5D] [ex] ["A4] % ]
-  \definemathcharacter [/]   [nothing] [mr] ["2F] [ex] ["B1]
-
-  \definemathcharacter [124] [nothing] [sy] ["6A] [ex] ["AF] % |
-  \definemathcharacter [92]  [nothing] [sy] ["6E] [ex] ["B2] % \
-
-\stopmathcollection
-
-\startmathcollection [fou]
-
-  \definemathsymbol [Vert]          [nothing] [sy] ["6B] [ex] ["B0]
-  \definemathsymbol [vert]          [nothing] [sy] ["6A] [ex] ["AF]
-  \definemathsymbol [VERT]          [nothing] [sy] ["98] [ex] ["93]
-  \definemathsymbol [Downarrow]     [rel]     [sy] ["2B] [ex] ["C4]
-  \definemathsymbol [backslash]     [nothing] [sy] ["6E] [ex] ["B2]
-  \definemathsymbol [rangle]        [close]   [sy] ["69] [ex] ["AE]
-  \definemathsymbol [langle]        [open]    [sy] ["68] [ex] ["AD]
-  \definemathsymbol [rbrace]        [close]   [sy] ["67] [ex] ["AA]
-  \definemathsymbol [lbrace]        [open]    [sy] ["66] [ex] ["A9]
-  \definemathsymbol [rceil]         [close]   [sy] ["65] [ex] ["A8]
-  \definemathsymbol [lceil]         [open]    [sy] ["64] [ex] ["A7]
-  \definemathsymbol [rfloor]        [close]   [sy] ["63] [ex] ["A6]
-  \definemathsymbol [lfloor]        [open]    [sy] ["62] [ex] ["A5]
-  \definemathsymbol [dblbrackleft]  [open]    [sy] ["99] [ex] ["85]
-  \definemathsymbol [dblbrackright] [close]   [sy] ["9A] [ex] ["86]
-
-\stopmathcollection
-
-\startmathcollection [fou]
-
-  \definemathsymbol [varkappa]      [ord] [mi] ["80] % check this
-  \definemathsymbol [varvarrho]     [ord] [mi] ["81] % check this
-  \definemathsymbol [xswordsup]     [ord] [sy] ["96]
-  \definemathsymbol [xswordsdown]   [ord] [sy] ["97]
-  \definemathsymbol [notowns]       [rel] [sy] ["9C]
-  \definemathsymbol [hbar]          [ord] [sy] ["9D]
-  \definemathsymbol [smallsetminus] [bin] [sy] ["9E]
-
-\stopmathcollection
-
-\startmathcollection [fou]
-
-  \definemathsymbol [notin] [rel] [sy] ["9B]
-
-\stopmathcollection
-
-\startmathcollection [fou]
-
-  \definemathsymbol [iintop]     [op] [ex] ["CE]
-  \definemathsymbol [iiintop]    [op] [ex] ["D0]
-  \definemathsymbol [oiintop]    [op] [ex] ["D2]
-  \definemathsymbol [oiiintop]   [op] [ex] ["D4]
-  \definemathsymbol [slashintop] [op] [ex] ["D6]
-
-\stopmathcollection
-
-\startmathcollection [fou]
-
-  \definemathcommand [iint]     {\iintop    \nolimits}
-  \definemathcommand [iiint]    {\iiintop   \nolimits}
-  \definemathcommand [oiint]    {\oiintop   \nolimits}
-  \definemathcommand [oiiint]   {\oiiintop  \nolimits}
-  \definemathcommand [slashint] {\slashintop\nolimits}
-
-\stopmathcollection
-
-\startmathcollection [fou]
-
-  \definemathsymbol [acute]    [accent] [mr] ["1]
-  \definemathsymbol [grave]    [accent] [mr] ["0]
-  \definemathsymbol [ddot]     [accent] [mr] ["4]
-  \definemathsymbol [tilde]    [accent] [mr] ["3]
-  \definemathsymbol [bar]      [accent] [mr] ["9]
-  \definemathsymbol [breve]    [accent] [mr] ["8]
-  \definemathsymbol [check]    [accent] [mr] ["7]
-  \definemathsymbol [hat]      [accent] [mr] ["2]
-  \definemathsymbol [dot]      [accent] [mr] ["A]
-  \definemathsymbol [mathring] [accent] [mr] ["6]
-
-\stopmathcollection
-
-\startmathcollection [fou]
-
-  \definemathsymbol [otheralpha]   [ord] [mi] ["0B]
-  \definemathsymbol [otherbeta]    [ord] [mi] ["0C]
-  \definemathsymbol [othergamma]   [ord] [mi] ["0D]
-  \definemathsymbol [otherdelta]   [ord] [mi] ["0E]
-  \definemathsymbol [otherepsilon] [ord] [mi] ["0F]
-  \definemathsymbol [otherzeta]    [ord] [mi] ["10]
-
-\stopmathcollection
-
-\protect \endinput
-
-% from a mail of Michel B / todo
-
-% \definemathsymbol [acute]    [accent] [operators] ["1]
-% \definemathsymbol [grave]    [accent] [operators] ["0]
-% \definemathsymbol [ddot]     [accent] [operators] ["4]
-% \definemathsymbol [tilde]    [accent] [operators] ["3]
-% \definemathsymbol [bar]      [accent] [operators] ["9]
-% \definemathsymbol [breve]    [accent] [operators] ["8]
-% \definemathsymbol [check]    [accent] [operators] ["7]
-% \definemathsymbol [hat]      [accent] [operators] ["2]
-% \definemathsymbol [dot]      [accent] [operators] ["A]
-% \definemathsymbol [mathring] [accent] [operators] ["6]
-
-% \definemathsymbol [wideparen] [ord]    [largesymbols] ["94]
-% \definemathsymbol [widearc]   [accent] [largesymbols] ["D8]
-
-% check for definition of \overset (ams)
-
-% \def\FOUwidering#1%
-%   {\overset{\smash{\vbox to .2ex{\hbox{$\mathring{}$}}}}{\wideparen{#1}}}
-
-% \startmathcollection [default] % [ams]
-%
-% \definemathcommand [widering]  {\FOUwidering}
-%
-% \stopmathcollection
-
-% \definemathsymbol [otheralpha]   [ord] [otherletters] ["0B]
-% \definemathsymbol [otherbeta]    [ord] [otherletters] ["0C]
-% \definemathsymbol [othergamma]   [ord] [otherletters] ["0D]
-% \definemathsymbol [otherdelta]   [ord] [otherletters] ["0E]
-% \definemathsymbol [otherepsilon] [ord] [otherletters] ["0F]
-% \definemathsymbol [otherzeta]    [ord] [otherletters] ["10]
diff --git a/tex/context/base/math-frc.mkiv b/tex/context/base/math-frc.mkiv
index d40306199..2305cec30 100644
--- a/tex/context/base/math-frc.mkiv
+++ b/tex/context/base/math-frc.mkiv
@@ -126,21 +126,21 @@
 % let's see who complains ... \mathstyle is now a primitive
 %
 % \unexpanded\def\ch#1%
-%   {\ifundefined\@@chemicalletter
-%      \mathstyle{\rm#1}%
-%    \else
+%   {\ifdefined\@@chemicalletter
 %      \dosetsubscripts
 %      \mathstyle{\@@chemicalletter{#1}}%
 %      \doresetsubscripts
+%    \else
+%      \mathstyle{\rm#1}%
 %    \fi}
 
 % \unexpanded\def\ch#1%
-%   {\ifundefined\@@chemicalletter
-%      \mathematics{\rm#1}%
-%    \else
+%   {\ifdefined\@@chemicalletter
 %      \dosetsubscripts
 %      \mathematics{\@@chemicalletter{#1}}%
 %      \doresetsubscripts
+%    \else
+%      \mathematics{\rm#1}%
 %    \fi}
 
 %D \macros
diff --git a/tex/context/base/math-ini.mkii b/tex/context/base/math-ini.mkii
index 7d87fb365..6713987f7 100644
--- a/tex/context/base/math-ini.mkii
+++ b/tex/context/base/math-ini.mkii
@@ -386,7 +386,7 @@
    \else
      \edef\mathclass{#1}%
    \fi
-   \doinputonce{\truefilename{\f!mathprefix\mathclass}}%
+   \doinputonce{\truefilename{\f!mathprefix\mathclass}.mkii}%
    \doifsomething\fontclass{\setevalue{\@mc@\fontclass\@mc@}{\mathclass}}%
    \popmacro\mathclass
    \popmacro\fontclass}
@@ -410,7 +410,7 @@
 
 \def\resetmathcollection[#1]%
   {\def\mathcollection{#1}%
-   \forgetdoingonce{\f!mathprefix\mathcollection}%
+   \forgetdoingonce{\f!mathprefix\mathcollection.mkii}%
    \setmathtoks
    \ifx\mathtoks\relax\else\mathtoks\emptytoks\fi}
 
diff --git a/tex/context/base/math-inl.mkiv b/tex/context/base/math-inl.mkiv
index acbf02de7..93168b885 100644
--- a/tex/context/base/math-inl.mkiv
+++ b/tex/context/base/math-inl.mkiv
@@ -94,8 +94,7 @@
      \setbox\nextbox\hbox{$#2$}%
      \iftracegridsnapping
        \setbox\nextbox\ruledhbox
-         {\incolortrue\localcolortrue
-          \backgroundline[gray]{\showstruts\strut\flushnextbox}}%
+         {\backgroundline[gray]{\showstruts\strut\flushnextbox}}%
      \fi
      \def\docommand##1%
        {\doif{##1}-{\settrue \halfcrazymathlines}%
@@ -187,9 +186,7 @@
               \forgetall
               \crazymathindent
               \iftracegridsnapping
-                \setbox\scratchbox\hbox
-                  {\incolortrue\localcolortrue\green
-                   \ruledhbox{\box\scratchbox}}%
+                \setbox\scratchbox\hbox{\green\ruledhbox{\box\scratchbox}}%
               \fi
               \box\scratchbox
               \endgraf
@@ -240,8 +237,7 @@
            {\forgetall
             \crazymathindent
             \iftracegridsnapping
-              \setbox\scratchbox\hbox
-                {\incolortrue\localcolortrue\color[blue]{\ruledhbox{\box\scratchbox}}}%
+              \setbox\scratchbox\hbox{\blue\ruledhbox{\box\scratchbox}}%
             \fi
             \box\scratchbox
             \endgraf
diff --git a/tex/context/base/math-lbr.mkii b/tex/context/base/math-lbr.mkii
new file mode 100644
index 000000000..7ac7c3aff
--- /dev/null
+++ b/tex/context/base/math-lbr.mkii
@@ -0,0 +1,450 @@
+%D \module
+%D   [       file=math-lbr,
+%D        version=2001.04.12,
+%D          title=\CONTEXT\ Math Macros,
+%D       subtitle=Lucida Specials,
+%D         author={Hans Hagen \& Taco Hoekwater},
+%D           date=\currentdate,
+%D      copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\definefamilysynonym [lbr] [calligrapahy] [sy]
+\definefamilysynonym [lbr] [oldstyle]     [mi]
+
+\definefamilysynonym [lbr] [blackboard]   [ma]
+\definefamilysynonym [lbr] [ucgreek]      [mb]
+\definefamilysynonym [lbr] [vargreek]     [mi]
+
+\startmathcollection[lbr]
+
+\definemathsymbol [boxdot]              [bin]   [sy] ["ED]
+\definemathsymbol [boxplus]             [bin]   [sy] ["EA]
+\definemathsymbol [boxtimes]            [bin]   [sy] ["EC]
+\definemathsymbol [square]              [ord]   [ma] ["02]
+\definemathsymbol [Box]                 [ord]   [ma] ["02] % square
+\definemathsymbol [blacksquare]         [ord]   [ma] ["03]
+\definemathsymbol [centerdot]           [bin]   [ma] ["E1] % [sy] ["01]
+\definemathsymbol [Diamond]             [ord]   [sy] ["05]
+\definemathsymbol [lozenge]             [ord]   [sy] ["05] % Diamond
+\definemathsymbol [blacklozenge]        [ord]   [ma] ["09]
+\definemathsymbol [circlearrowright]    [rel]   [ma] ["8C]
+\definemathsymbol [circlearrowleft]     [rel]   [ma] ["8B]
+\definemathsymbol [rightleftharpoons]   [rel]   [sy] ["8E]
+\definemathsymbol [leftrightharpoons]   [rel]   [sy] ["8D]
+\definemathsymbol [boxminus]            [bin]   [sy] ["EB]
+\definemathsymbol [Vdash]               [rel]   [sy] ["F0]
+\definemathsymbol [Vvdash]              [rel]   [mb] ["D3]
+\definemathsymbol [vDash]               [rel]   [mb] ["D6]
+\definemathsymbol [twoheadrightarrow]   [rel]   [ma] ["25]
+\definemathsymbol [twoheadleftarrow]    [rel]   [ma] ["23]
+\definemathsymbol [leftleftarrows]      [rel]   [ma] ["71]
+\definemathsymbol [rightrightarrows]    [rel]   [ma] ["73]
+\definemathsymbol [upuparrows]          [rel]   [ma] ["72]
+\definemathsymbol [downdownarrows]      [rel]   [ma] ["74]
+\definemathsymbol [upharpoonright]      [rel]   [ma] ["75]
+\definemathsymbol [restriction]         [rel]   [ma] ["77]
+\definemathsymbol [downharpoonright]    [rel]   [ma] ["77]
+\definemathsymbol [upharpoonleft]       [rel]   [ma] ["76]
+\definemathsymbol [downharpoonleft]     [rel]   [ma] ["78]
+\definemathsymbol [rightarrowtail]      [rel]   [ma] ["29]
+\definemathsymbol [leftarrowtail]       [rel]   [ma] ["28]
+\definemathsymbol [leftrightarrows]     [rel]   [ma] ["6E]
+\definemathsymbol [rightleftarrows]     [rel]   [ma] ["6D]
+\definemathsymbol [Lsh]                 [rel]   [ma] ["7B]
+\definemathsymbol [Rsh]                 [rel]   [ma] ["7D]
+\definemathsymbol [rightsquigarrow]     [rel]   [ma] ["8E]
+\definemathsymbol [leadsto]             [rel]   [ma] ["8E] % rightsquigarrow
+\definemathsymbol [leftrightsquigarrow] [rel]   [ma] ["91]
+\definemathsymbol [looparrowleft]       [rel]   [ma] ["3F]
+\definemathsymbol [looparrowright]      [rel]   [ma] ["40]
+\definemathsymbol [circeq]              [rel]   [sy] ["D0]
+\definemathsymbol [succsim]             [rel]   [sy] ["E1]
+\definemathsymbol [gtrsim]              [rel]   [sy] ["DD]
+\definemathsymbol [gtrapprox]           [rel]   [mb] ["DB]
+\definemathsymbol [multimap]            [rel]   [mb] ["C7]
+\definemathsymbol [therefore]           [rel]   [sy] ["90]
+\definemathsymbol [because]             [rel]   [sy] ["91]
+\definemathsymbol [doteqdot]            [rel]   [sy] ["CA]
+\definemathsymbol [Doteq]               [rel]   [sy] ["CA] % doteqdot
+\definemathsymbol [triangleq]           [rel]   [sy] ["D5]
+\definemathsymbol [precsim]             [rel]   [sy] ["E0]
+\definemathsymbol [lesssim]             [rel]   [sy] ["DC]
+\definemathsymbol [lessapprox]          [rel]   [mb] ["DA]
+\definemathsymbol [eqslantless]         [rel]   [mb] ["E2]
+\definemathsymbol [eqslantgtr]          [rel]   [mb] ["E3]
+\definemathsymbol [curlyeqprec]         [rel]   [mb] ["E6]
+\definemathsymbol [curlyeqsucc]         [rel]   [mb] ["E7]
+\definemathsymbol [preccurlyeq]         [rel]   [mb] ["E4]
+\definemathsymbol [leqq]                [rel]   [sy] ["DA]
+\definemathsymbol [leqslant]            [rel]   [mb] ["E0]
+\definemathsymbol [lessgtr]             [rel]   [sy] ["DE]
+\definemathsymbol [backprime]           [ord]   [mb] ["C8]
+\definemathsymbol [dabar@]              [ord]   [ma] ["03] % !! @
+\definemathsymbol [risingdotseq]        [rel]   [sy] ["CC]
+\definemathsymbol [fallingdotseq]       [rel]   [sy] ["CB]
+\definemathsymbol [succcurlyeq]         [rel]   [mb] ["E5]
+\definemathsymbol [geqq]                [rel]   [sy] ["DB]
+\definemathsymbol [geqslant]            [rel]   [mb] ["E1]
+\definemathsymbol [gtrless]             [rel]   [sy] ["DF]
+\definemathsymbol [sqsubset]            [rel]   [sy] ["E4]
+\definemathsymbol [sqsupset]            [rel]   [sy] ["E5]
+\definemathsymbol [vartriangleright]    [rel]   [mb] ["2E]
+\definemathsymbol [rhd]                 [bin]   [mb] ["2E]
+\definemathsymbol [lhd]                 [bin]   [mb] ["2F]
+\definemathsymbol [vartriangleleft]     [rel]   [mb] ["2F]
+\definemathsymbol [trianglerighteq]     [rel]   [sy] ["F5]
+\definemathsymbol [unrhd]               [bin]   [sy] ["F5] % trianglerighteq
+\definemathsymbol [trianglelefteq]      [rel]   [sy] ["F4]
+\definemathsymbol [unlhd]               [bin]   [sy] ["F4] % trianglelefteq
+\definemathsymbol [bigstar]             [ord]   [ma] ["AB]
+\definemathsymbol [between]             [rel]   [mb] ["F2]
+\definemathsymbol [blacktriangledown]   [ord]   [ma] ["07]
+\definemathsymbol [blacktriangleright]  [rel]   [mb] ["F1]
+\definemathsymbol [blacktriangleleft]   [rel]   [mb] ["F0]
+\definemathsymbol [vartriangle]         [rel]   [ma] ["04]
+\definemathsymbol [triangleup]          [ord]   [ma] ["04] % vartriangle
+\definemathsymbol [blacktriangle]       [ord]   [ma] ["05]
+\definemathsymbol [triangledown]        [ord]   [ma] ["06]
+\definemathsymbol [eqcirc]              [rel]   [sy] ["CF]
+\definemathsymbol [lesseqgtr]           [rel]   [mb] ["E8]
+\definemathsymbol [gtreqless]           [rel]   [mb] ["E9]
+\definemathsymbol [lesseqqgtr]          [rel]   [mb] ["EA]
+\definemathsymbol [gtreqqless]          [rel]   [mb] ["EB]
+\definemathsymbol [Rrightarrow]         [rel]   [ma] ["6C]
+\definemathsymbol [Lleftarrow]          [rel]   [ma] ["6A]
+\definemathsymbol [veebar]              [bin]   [mb] ["D2]
+\definemathsymbol [barwedge]            [bin]   [sy] ["F6]
+\definemathsymbol [doublebarwedge]      [bin]   [sy] ["D4]
+\definemathsymbol [angle]               [ord]   [sy] ["8B]
+\definemathsymbol [measuredangle]       [ord]   [sy] ["8C]
+\definemathsymbol [sphericalangle]      [ord]   [sy] ["8D]
+\definemathsymbol [varpropto]           [rel]   [sy] ["2F]
+\definemathsymbol [smallsmile]          [rel]   [mb] ["5E]
+\definemathsymbol [smallfrown]          [rel]   [mb] ["5F]
+\definemathsymbol [Subset]              [rel]   [sy] ["F8]
+\definemathsymbol [Supset]              [rel]   [sy] ["F9]
+\definemathsymbol [Cup]                 [bin]   [sy] ["FA]
+\definemathsymbol [doublecup]           [bin]   [sy] ["FA] % Cup
+\definemathsymbol [Cap]                 [bin]   [sy] ["FB]
+\definemathsymbol [doublecap]           [bin]   [sy] ["FB]
+\definemathsymbol [curlywedge]          [bin]   [sy] ["84]
+\definemathsymbol [curlyvee]            [bin]   [sy] ["85]
+\definemathsymbol [leftthreetimes]      [bin]   [mb] ["D0]
+\definemathsymbol [rightthreetimes]     [bin]   [mb] ["D1]
+\definemathsymbol [subseteqq]           [rel]   [mb] ["EE]
+\definemathsymbol [supseteqq]           [rel]   [mb] ["EF]
+\definemathsymbol [bumpeq]              [rel]   [sy] ["C8]
+\definemathsymbol [Bumpeq]              [rel]   [sy] ["C7]
+\definemathsymbol [llless]              [rel]   [mb] ["DE]
+\definemathsymbol [lll]                 [rel]   [mb] ["DE] % llless
+\definemathsymbol [gggtr]               [rel]   [mb] ["DF]
+\definemathsymbol [ggg]                 [rel]   [mb] ["DF] % gggtr
+\definemathsymbol [ulcorner]            [open]  [ma] ["5B] [ma] ["5B]
+\definemathsymbol [urcorner]            [close] [ma] ["5C] [ma] ["5C]
+\definemathsymbol [circledS]            [ord]   [mb] ["CA]
+\definemathsymbol [pitchfork]           [rel]   [ma] ["F3]
+\definemathsymbol [dotplus]             [bin]   [sy] ["89]
+\definemathsymbol [backsim]             [rel]   [sy] ["24]
+\definemathsymbol [backsimeq]           [rel]   [sy] ["27]
+\definemathsymbol [llcorner]            [open]  [ma] ["5D] [ma] ["5D]
+\definemathsymbol [lrcorner]            [close] [ma] ["5E] [ma] ["5E]
+\definemathsymbol [complement]          [ord]   [mb] ["94]
+\definemathsymbol [intercal]            [bin]   [ma] ["03] % !!
+\definemathsymbol [circledcirc]         [bin]   [sy] ["E6]
+\definemathsymbol [circledast]          [bin]   [sy] ["E7]
+\definemathsymbol [circleddash]         [bin]   [mb] ["CC]
+
+\stopmathcollection
+
+\startmathcollection [lbr]
+
+\definemathsymbol [lvertneqq]           [rel]   [ma] ["DE]
+\definemathsymbol [gvertneqq]           [rel]   [ma] ["DE]
+\definemathsymbol [nleq]                [rel]   [ma] ["9C]
+\definemathsymbol [ngeq]                [rel]   [ma] ["9D]
+\definemathsymbol [nless]               [rel]   [ma] ["9A]
+\definemathsymbol [ngtr]                [rel]   [ma] ["9B]
+\definemathsymbol [nprec]               [rel]   [ma] ["E5]
+\definemathsymbol [nsucc]               [rel]   [ma] ["E6]
+\definemathsymbol [lneqq]               [rel]   [ma] ["DC]
+\definemathsymbol [gneqq]               [rel]   [ma] ["DE]
+\definemathsymbol [nleqslant]           [rel]   [ma] ["D6]
+\definemathsymbol [ngeqslant]           [rel]   [ma] ["D7]
+\definemathsymbol [lneq]                [rel]   [ma] ["DA]
+\definemathsymbol [gneq]                [rel]   [ma] ["DB]
+\definemathsymbol [npreceq]             [rel]   [ma] ["E7]
+\definemathsymbol [nsucceq]             [rel]   [ma] ["E8]
+\definemathsymbol [precnsim]            [rel]   [ma] ["EB]
+\definemathsymbol [succnsim]            [rel]   [ma] ["EC]
+\definemathsymbol [lnsim]               [rel]   [ma] ["E0]
+\definemathsymbol [gnsim]               [rel]   [ma] ["E2]
+\definemathsymbol [nleqq]               [rel]   [ma] ["D8]
+\definemathsymbol [ngeqq]               [rel]   [ma] ["D9]
+\definemathsymbol [precneqq]            [rel]   [ma] ["E9]
+\definemathsymbol [succneqq]            [rel]   [ma] ["EA]
+\definemathsymbol [precnapprox]         [rel]   [ma] ["ED]
+\definemathsymbol [succnapprox]         [rel]   [ma] ["EE]
+\definemathsymbol [lnapprox]            [rel]   [ma] ["E4]
+\definemathsymbol [gnapprox]            [rel]   [ma] ["E3]
+\definemathsymbol [nsim]                [rel]   [ma] ["96]
+\definemathsymbol [ncong]               [rel]   [ma] ["99]
+\definemathsymbol [diagup]              [ord]   [mb] ["CD]
+\definemathsymbol [diagdown]            [ord]   [mb] ["D8]
+\definemathsymbol [varsubsetneq]        [rel]   [ma] ["D0]
+\definemathsymbol [varsupsetneq]        [rel]   [ma] ["D1]
+\definemathsymbol [nsubseteqq]          [rel]   [ma] ["CA]
+\definemathsymbol [nsupseteqq]          [rel]   [ma] ["CB]
+\definemathsymbol [subsetneqq]          [rel]   [ma] ["CE]
+\definemathsymbol [supsetneqq]          [rel]   [ma] ["CF]
+\definemathsymbol [varsubsetneqq]       [rel]   [ma] ["D2]
+\definemathsymbol [varsupsetneqq]       [rel]   [ma] ["D3]
+\definemathsymbol [subsetneq]           [rel]   [ma] ["CC]
+\definemathsymbol [supsetneq]           [rel]   [ma] ["CD]
+\definemathsymbol [nsubseteq]           [rel]   [ma] ["C8]
+\definemathsymbol [nsupseteq]           [rel]   [ma] ["C9]
+\definemathsymbol [nparallel]           [rel]   [ma] ["F7]
+\definemathsymbol [nmid]                [rel]   [ma] ["F6]
+\definemathsymbol [nshortmid]           [rel]   [ma] ["F4]
+\definemathsymbol [nshortparallel]      [rel]   [ma] ["F5]
+\definemathsymbol [nvdash]              [rel]   [ma] ["F8]
+\definemathsymbol [nVdash]              [rel]   [ma] ["F9]
+\definemathsymbol [nvDash]              [rel]   [ma] ["FA]
+\definemathsymbol [nVDash]              [rel]   [ma] ["FB]
+\definemathsymbol [ntrianglerighteq]    [rel]   [ma] ["F2]
+\definemathsymbol [ntrianglelefteq]     [rel]   [ma] ["F1]
+\definemathsymbol [ntriangleleft]       [rel]   [ma] ["EF]
+\definemathsymbol [ntriangleright]      [rel]   [ma] ["F0]
+\definemathsymbol [nleftarrow]          [rel]   [ma] ["32]
+\definemathsymbol [nrightarrow]         [rel]   [ma] ["33]
+\definemathsymbol [nLeftarrow]          [rel]   [ma] ["66]
+\definemathsymbol [nRightarrow]         [rel]   [ma] ["68]
+\definemathsymbol [nLeftrightarrow]     [rel]   [ma] ["67]
+\definemathsymbol [nleftrightarrow]     [rel]   [ma] ["34]
+\definemathsymbol [divideontimes]       [bin]   [mb] ["F7]
+\definemathsymbol [varnothing]          [ord]   [sy] ["53]
+\definemathsymbol [nexists]             [ord]   [ma] ["20]
+\definemathsymbol [Finv]                [ord]   [mb] ["90]
+\definemathsymbol [Game]                [ord]   [mb] ["91]
+\definemathsymbol [mho]                 [ord]   [mb] ["92]
+\definemathsymbol [eth]                 [ord]   [ma] ["03] % !!
+\definemathsymbol [eqsim]               [rel]   [sy] ["99]
+\definemathsymbol [beth]                [ord]   [mb] ["95]
+\definemathsymbol [gimel]               [ord]   [mb] ["96]
+\definemathsymbol [daleth]              [ord]   [mb] ["97]
+\definemathsymbol [lessdot]             [bin]   [mb] ["DC]
+\definemathsymbol [gtrdot]              [bin]   [mb] ["DD]
+\definemathsymbol [ltimes]              [bin]   [mb] ["CF]
+\definemathsymbol [rtimes]              [bin]   [mb] ["CE]
+\definemathsymbol [shortmid]            [rel]   [mb] ["F4]
+\definemathsymbol [shortparallel]       [rel]   [mb] ["F5]
+\definemathsymbol [smallsetminus]       [bin]   [mb] ["D8]
+\definemathsymbol [thicksim]            [rel]   [sy] ["18] % not that thick
+\definemathsymbol [thickapprox]         [rel]   [sy] ["19] % not that thick
+\definemathsymbol [approxeq]            [rel]   [sy] ["9D]
+\definemathsymbol [succapprox]          [rel]   [mb] ["ED]
+\definemathsymbol [precapprox]          [rel]   [mb] ["EC]
+\definemathsymbol [curvearrowleft]      [rel]   [ma] ["87]
+\definemathsymbol [curvearrowright]     [rel]   [ma] ["88]
+\definemathsymbol [digamma]             [ord]   [ma] ["03] % !!
+\definemathsymbol [varkappa]            [ord]   [mb] ["9B]
+\definemathsymbol [Bbbk]                [ord]   [ma] ["6B]
+\definemathsymbol [hslash]              [ord]   [mb] ["9D]
+\definemathsymbol [hbar]                [ord]   [ma] ["1B]
+\definemathsymbol [backepsilon]         [rel]   [ma] ["03] % !!
+
+\stopmathcollection
+
+\startmathcollection [lbr]
+
+\definemathsymbol [yen]               [nothing] [ma] ["03] % !!
+\definemathsymbol [checkmark]         [nothing] [ma] ["AC]
+\definemathsymbol [circledR]          [nothing] [mb] ["C9]
+\definemathsymbol [maltese]           [nothing] [mb] ["CB]
+
+\stopmathcollection
+
+\startmathcollection [lbr]
+
+\definemathsymbol  [dashrightarrow] [rel] [ma] ["3A]
+\definemathsymbol  [dashleftarrow]  [rel] [ma] ["38]
+\definemathcommand [dasharrow]      [rel] {\dashleftarrow\mkern-15.8mu\dashrightarrow}
+%definemathcommand [Join]           [rel] {\mathchar"0D6F\mkern-15.8mu\mathchar"0D6E} % !!
+
+\stopmathcollection
+
+\startmathcollection[lbr]
+
+\definemathcharacter [91] [open]    [mi] ["86]
+\definemathcharacter [93] [close]   [mi] ["87]
+\definemathcharacter [(]  [open]    [mi] ["84]
+\definemathcharacter [)]  [close]   [mi] ["85]
+\definemathcharacter [/]  [nothing] [mi] ["3D]
+\definemathcharacter [=]  [rel]     [sy] ["83]
+\definemathcharacter [+]  [bin]     [sy] ["82]
+
+\definemathcharacter [91] [nothing] [mi] ["86] [ex] ["02]
+\definemathcharacter [93] [nothing] [mi] ["87] [ex] ["03]
+\definemathcharacter [(]  [nothing] [mi] ["84] [ex] ["00]
+\definemathcharacter [)]  [nothing] [mi] ["85] [ex] ["01]
+\definemathcharacter [/]  [nothing] [mi] ["3D] [ex] ["0E]
+
+\stopmathcollection
+
+% \startmathcollection[lbr]
+%
+% \definemathcharacter [:]  [punct] [tf] ["3A] % unbelievable
+% \definemathcharacter [;]  [punct] [tf] ["3B] % unbelievable
+%
+% \stopmathcollection
+
+\startmathcollection[lbr]
+
+\definemathsymbol [ldbrack]      [open]  [mi] ["82] [ex] ["82]
+\definemathsymbol [rdbrack]      [close] [mi] ["83] [ex] ["83]
+\definemathsymbol [surfintop]    [op]    [ex] ["90]
+\definemathsymbol [midintop]     [op]    [ex] ["92]
+\definemathsymbol [midointop]    [op]    [ex] ["93]
+\definemathsymbol [midsurfintop] [op]    [ex] ["94]
+\definemathsymbol [largeint]     [op]    [ex] ["5A] [ex] ["95]
+
+% \definemathcommand [surfint]    [nolop] {\surfintop}
+% \definemathcommand [midint]     [nolop] {\midintop}
+% \definemathcommand [midoint]    [nolop] {\midointop}
+% \definemathcommand [midsurfint] [nolop] {\midsurfintop}
+
+\definemathsymbol [surfint]    [nolop] [ex] ["90]
+\definemathsymbol [midint]     [nolop] [ex] ["92]
+\definemathsymbol [midoint]    [nolop] [ex] ["93]
+\definemathsymbol [midsurfint] [nolop] [ex] ["94]
+
+\definemathsymbol [dblint]            [ord] [mi] ["88]
+\definemathsymbol [trplint]           [ord] [mi] ["89]
+\definemathsymbol [contint]           [ord] [mi] ["8A]
+\definemathsymbol [surfint]           [ord] [mi] ["8B]
+\definemathsymbol [volint]            [ord] [mi] ["8C]
+\definemathsymbol [clwint]            [ord] [mi] ["8D]
+\definemathsymbol [cclwcint]          [ord] [mi] ["8E]
+\definemathsymbol [clwcint]           [ord] [mi] ["8F]
+\definemathsymbol [bowtie]            [rel] [mi] ["F6]
+\definemathsymbol [models]            [rel] [sy] ["EE]
+\definemathsymbol [doteq]             [rel] [sy] ["C9]
+\definemathsymbol [cong]              [rel] [sy] ["9B]
+\definemathsymbol [hbar]              [ord] [mi] ["9D]
+\definemathsymbol [neq]               [rel] [ma] ["94]
+\definemathsymbol [rightleftharpoons] [rel] [ma] ["7A]
+\definemathsymbol [leftrightharpoons] [rel] [ma] ["79]
+\definemathsymbol [hookleftarrow]     [rel] [ma] ["3C]
+\definemathsymbol [hookrightarrow]    [rel] [ma] ["3E]
+\definemathsymbol [mapsto]            [rel] [ma] ["2C]
+
+\definemathcommand [longmapsto] {\mapstochar\longrightarrow}
+
+\stopmathcollection
+
+\startmathcollection[lbr]
+
+\definemathsymbol [Gamma]   [alpha] [ucgreek] ["00]
+\definemathsymbol [Delta]   [alpha] [ucgreek] ["01]
+\definemathsymbol [Theta]   [alpha] [ucgreek] ["02]
+\definemathsymbol [Lambda]  [alpha] [ucgreek] ["03]
+\definemathsymbol [Xi]      [alpha] [ucgreek] ["04]
+\definemathsymbol [Pi]      [alpha] [ucgreek] ["05]
+\definemathsymbol [Sigma]   [alpha] [ucgreek] ["06]
+\definemathsymbol [Upsilon] [alpha] [ucgreek] ["07]
+\definemathsymbol [Phi]     [alpha] [ucgreek] ["08]
+\definemathsymbol [Psi]     [alpha] [ucgreek] ["09]
+\definemathsymbol [Omega]   [alpha] [ucgreek] ["0A]
+
+\definemathsymbol [varGamma]   [ord] [vargreek] ["00]
+\definemathsymbol [varDelta]   [ord] [vargreek] ["01]
+\definemathsymbol [varTheta]   [ord] [vargreek] ["02]
+\definemathsymbol [varLambda]  [ord] [vargreek] ["03]
+\definemathsymbol [varXi]      [ord] [vargreek] ["04]
+\definemathsymbol [varPi]      [ord] [vargreek] ["05]
+\definemathsymbol [varSigma]   [ord] [vargreek] ["06]
+\definemathsymbol [varUpsilon] [ord] [vargreek] ["07]
+\definemathsymbol [varPhi]     [ord] [vargreek] ["08]
+\definemathsymbol [varPsi]     [ord] [vargreek] ["09]
+\definemathsymbol [varOmega]   [ord] [vargreek] ["0A]
+
+\stopmathcollection
+
+% we define the whole lot, although only a few differ (esp dot)
+
+\startmathcollection[lbr]
+
+\definemathsymbol [acute]     [accent] [tf] ["13] % mr -> tf
+\definemathsymbol [grave]     [accent] [tf] ["12] % mr -> tf
+\definemathsymbol [ddot]      [accent] [tf] ["7F] % mr -> tf
+\definemathsymbol [tilde]     [accent] [tf] ["7E] % mr -> tf
+\definemathsymbol [bar]       [accent] [tf] ["16] % mr -> tf
+\definemathsymbol [breve]     [accent] [tf] ["15] % mr -> tf
+\definemathsymbol [check]     [accent] [tf] ["14] % mr -> tf
+\definemathsymbol [hat]       [accent] [tf] ["5E] % mr -> tf
+\definemathsymbol [vec]       [accent] [mi] ["7E] % [ord]
+\definemathsymbol [dot]       [accent] [tf] ["05] % mr -> tf, 5F -> 05
+\definemathsymbol [widetilde] [accent] [ex] ["65] % [ord]
+\definemathsymbol [widehat]   [accent] [ex] ["62] % [ord]
+
+\stopmathcollection
+
+\def\LBRroot#1#2%
+  {\setbox\zerocount\hbox{$\mathsurround\zeropoint#1\sqrt{#2}$}
+   \dimen@\ht\zerocount \advance\dimen@-\dp\zerocount
+   \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-7.5mu \box\zerocount}
+
+\def\LBRmatrix#1%
+  {\null\,\vcenter{\normalbaselines\mathsurround\zeropoint
+   \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+   \mathstrut\crcr\noalign{\kern-0.9\baselineskip}
+   #1\crcr\mathstrut\crcr\noalign{\kern-0.9\baselineskip}}}\,}
+
+\startrawmathcollection[lbr]
+
+\definemathcommand [mathstrut] {\vphantom{f}}
+\definemathcommand [joinrel]   {\mathrel{\mkern-4mu}}
+\definemathcommand [r@@t]      {\LBRroot}
+\definemathcommand [matrix]    {\LBRmatrix}
+
+\stoprawmathcollection
+
+\def\LBRbig  {\@@dobig{8.20}}
+\def\LBRBig  {\@@dobig{10.80}}
+\def\LBRbigg {\@@dobig{13.42}}
+\def\LBRBigg {\@@dobig{16.03}}
+\def\LBRbiggg{\@@dobig{17.72}}
+\def\LBRBiggg{\@@dobig{21.25}}
+
+% \def\LBRbig  {\@@dobig{0.820}}
+% \def\LBRBig  {\@@dobig{1.080}}
+% \def\LBRbigg {\@@dobig{1.342}}
+% \def\LBRBigg {\@@dobig{1.603}}
+% \def\LBRbiggg{\@@dobig{1.772}}
+% \def\LBRBiggg{\@@dobig{2.125}}
+
+\startrawmathcollection[lbr]
+
+\definemathcommand [big]   {\LBRbig}
+\definemathcommand [Big]   {\LBRBig}
+\definemathcommand [bigg]  {\LBRbigg}
+\definemathcommand [Bigg]  {\LBRBigg}
+\definemathcommand [biggg] {\LBRbiggg}
+\definemathcommand [Biggg] {\LBRBiggg}
+
+\stoprawmathcollection
+
+\startrawmathcollection[lbr]
+
+\definemathcommand [bigggl] [open]  {\biggg}
+\definemathcommand [bigggr] [close] {\biggg}
+\definemathcommand [Bigggl] [open]  {\Biggg}
+\definemathcommand [Bigggr] [close] {\Biggg}
+
+\stoprawmathcollection
+
+\protect \endinput
diff --git a/tex/context/base/math-lbr.tex b/tex/context/base/math-lbr.tex
deleted file mode 100644
index 7ac7c3aff..000000000
--- a/tex/context/base/math-lbr.tex
+++ /dev/null
@@ -1,450 +0,0 @@
-%D \module
-%D   [       file=math-lbr,
-%D        version=2001.04.12,
-%D          title=\CONTEXT\ Math Macros,
-%D       subtitle=Lucida Specials,
-%D         author={Hans Hagen \& Taco Hoekwater},
-%D           date=\currentdate,
-%D      copyright=\PRAGMA]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\unprotect
-
-\definefamilysynonym [lbr] [calligrapahy] [sy]
-\definefamilysynonym [lbr] [oldstyle]     [mi]
-
-\definefamilysynonym [lbr] [blackboard]   [ma]
-\definefamilysynonym [lbr] [ucgreek]      [mb]
-\definefamilysynonym [lbr] [vargreek]     [mi]
-
-\startmathcollection[lbr]
-
-\definemathsymbol [boxdot]              [bin]   [sy] ["ED]
-\definemathsymbol [boxplus]             [bin]   [sy] ["EA]
-\definemathsymbol [boxtimes]            [bin]   [sy] ["EC]
-\definemathsymbol [square]              [ord]   [ma] ["02]
-\definemathsymbol [Box]                 [ord]   [ma] ["02] % square
-\definemathsymbol [blacksquare]         [ord]   [ma] ["03]
-\definemathsymbol [centerdot]           [bin]   [ma] ["E1] % [sy] ["01]
-\definemathsymbol [Diamond]             [ord]   [sy] ["05]
-\definemathsymbol [lozenge]             [ord]   [sy] ["05] % Diamond
-\definemathsymbol [blacklozenge]        [ord]   [ma] ["09]
-\definemathsymbol [circlearrowright]    [rel]   [ma] ["8C]
-\definemathsymbol [circlearrowleft]     [rel]   [ma] ["8B]
-\definemathsymbol [rightleftharpoons]   [rel]   [sy] ["8E]
-\definemathsymbol [leftrightharpoons]   [rel]   [sy] ["8D]
-\definemathsymbol [boxminus]            [bin]   [sy] ["EB]
-\definemathsymbol [Vdash]               [rel]   [sy] ["F0]
-\definemathsymbol [Vvdash]              [rel]   [mb] ["D3]
-\definemathsymbol [vDash]               [rel]   [mb] ["D6]
-\definemathsymbol [twoheadrightarrow]   [rel]   [ma] ["25]
-\definemathsymbol [twoheadleftarrow]    [rel]   [ma] ["23]
-\definemathsymbol [leftleftarrows]      [rel]   [ma] ["71]
-\definemathsymbol [rightrightarrows]    [rel]   [ma] ["73]
-\definemathsymbol [upuparrows]          [rel]   [ma] ["72]
-\definemathsymbol [downdownarrows]      [rel]   [ma] ["74]
-\definemathsymbol [upharpoonright]      [rel]   [ma] ["75]
-\definemathsymbol [restriction]         [rel]   [ma] ["77]
-\definemathsymbol [downharpoonright]    [rel]   [ma] ["77]
-\definemathsymbol [upharpoonleft]       [rel]   [ma] ["76]
-\definemathsymbol [downharpoonleft]     [rel]   [ma] ["78]
-\definemathsymbol [rightarrowtail]      [rel]   [ma] ["29]
-\definemathsymbol [leftarrowtail]       [rel]   [ma] ["28]
-\definemathsymbol [leftrightarrows]     [rel]   [ma] ["6E]
-\definemathsymbol [rightleftarrows]     [rel]   [ma] ["6D]
-\definemathsymbol [Lsh]                 [rel]   [ma] ["7B]
-\definemathsymbol [Rsh]                 [rel]   [ma] ["7D]
-\definemathsymbol [rightsquigarrow]     [rel]   [ma] ["8E]
-\definemathsymbol [leadsto]             [rel]   [ma] ["8E] % rightsquigarrow
-\definemathsymbol [leftrightsquigarrow] [rel]   [ma] ["91]
-\definemathsymbol [looparrowleft]       [rel]   [ma] ["3F]
-\definemathsymbol [looparrowright]      [rel]   [ma] ["40]
-\definemathsymbol [circeq]              [rel]   [sy] ["D0]
-\definemathsymbol [succsim]             [rel]   [sy] ["E1]
-\definemathsymbol [gtrsim]              [rel]   [sy] ["DD]
-\definemathsymbol [gtrapprox]           [rel]   [mb] ["DB]
-\definemathsymbol [multimap]            [rel]   [mb] ["C7]
-\definemathsymbol [therefore]           [rel]   [sy] ["90]
-\definemathsymbol [because]             [rel]   [sy] ["91]
-\definemathsymbol [doteqdot]            [rel]   [sy] ["CA]
-\definemathsymbol [Doteq]               [rel]   [sy] ["CA] % doteqdot
-\definemathsymbol [triangleq]           [rel]   [sy] ["D5]
-\definemathsymbol [precsim]             [rel]   [sy] ["E0]
-\definemathsymbol [lesssim]             [rel]   [sy] ["DC]
-\definemathsymbol [lessapprox]          [rel]   [mb] ["DA]
-\definemathsymbol [eqslantless]         [rel]   [mb] ["E2]
-\definemathsymbol [eqslantgtr]          [rel]   [mb] ["E3]
-\definemathsymbol [curlyeqprec]         [rel]   [mb] ["E6]
-\definemathsymbol [curlyeqsucc]         [rel]   [mb] ["E7]
-\definemathsymbol [preccurlyeq]         [rel]   [mb] ["E4]
-\definemathsymbol [leqq]                [rel]   [sy] ["DA]
-\definemathsymbol [leqslant]            [rel]   [mb] ["E0]
-\definemathsymbol [lessgtr]             [rel]   [sy] ["DE]
-\definemathsymbol [backprime]           [ord]   [mb] ["C8]
-\definemathsymbol [dabar@]              [ord]   [ma] ["03] % !! @
-\definemathsymbol [risingdotseq]        [rel]   [sy] ["CC]
-\definemathsymbol [fallingdotseq]       [rel]   [sy] ["CB]
-\definemathsymbol [succcurlyeq]         [rel]   [mb] ["E5]
-\definemathsymbol [geqq]                [rel]   [sy] ["DB]
-\definemathsymbol [geqslant]            [rel]   [mb] ["E1]
-\definemathsymbol [gtrless]             [rel]   [sy] ["DF]
-\definemathsymbol [sqsubset]            [rel]   [sy] ["E4]
-\definemathsymbol [sqsupset]            [rel]   [sy] ["E5]
-\definemathsymbol [vartriangleright]    [rel]   [mb] ["2E]
-\definemathsymbol [rhd]                 [bin]   [mb] ["2E]
-\definemathsymbol [lhd]                 [bin]   [mb] ["2F]
-\definemathsymbol [vartriangleleft]     [rel]   [mb] ["2F]
-\definemathsymbol [trianglerighteq]     [rel]   [sy] ["F5]
-\definemathsymbol [unrhd]               [bin]   [sy] ["F5] % trianglerighteq
-\definemathsymbol [trianglelefteq]      [rel]   [sy] ["F4]
-\definemathsymbol [unlhd]               [bin]   [sy] ["F4] % trianglelefteq
-\definemathsymbol [bigstar]             [ord]   [ma] ["AB]
-\definemathsymbol [between]             [rel]   [mb] ["F2]
-\definemathsymbol [blacktriangledown]   [ord]   [ma] ["07]
-\definemathsymbol [blacktriangleright]  [rel]   [mb] ["F1]
-\definemathsymbol [blacktriangleleft]   [rel]   [mb] ["F0]
-\definemathsymbol [vartriangle]         [rel]   [ma] ["04]
-\definemathsymbol [triangleup]          [ord]   [ma] ["04] % vartriangle
-\definemathsymbol [blacktriangle]       [ord]   [ma] ["05]
-\definemathsymbol [triangledown]        [ord]   [ma] ["06]
-\definemathsymbol [eqcirc]              [rel]   [sy] ["CF]
-\definemathsymbol [lesseqgtr]           [rel]   [mb] ["E8]
-\definemathsymbol [gtreqless]           [rel]   [mb] ["E9]
-\definemathsymbol [lesseqqgtr]          [rel]   [mb] ["EA]
-\definemathsymbol [gtreqqless]          [rel]   [mb] ["EB]
-\definemathsymbol [Rrightarrow]         [rel]   [ma] ["6C]
-\definemathsymbol [Lleftarrow]          [rel]   [ma] ["6A]
-\definemathsymbol [veebar]              [bin]   [mb] ["D2]
-\definemathsymbol [barwedge]            [bin]   [sy] ["F6]
-\definemathsymbol [doublebarwedge]      [bin]   [sy] ["D4]
-\definemathsymbol [angle]               [ord]   [sy] ["8B]
-\definemathsymbol [measuredangle]       [ord]   [sy] ["8C]
-\definemathsymbol [sphericalangle]      [ord]   [sy] ["8D]
-\definemathsymbol [varpropto]           [rel]   [sy] ["2F]
-\definemathsymbol [smallsmile]          [rel]   [mb] ["5E]
-\definemathsymbol [smallfrown]          [rel]   [mb] ["5F]
-\definemathsymbol [Subset]              [rel]   [sy] ["F8]
-\definemathsymbol [Supset]              [rel]   [sy] ["F9]
-\definemathsymbol [Cup]                 [bin]   [sy] ["FA]
-\definemathsymbol [doublecup]           [bin]   [sy] ["FA] % Cup
-\definemathsymbol [Cap]                 [bin]   [sy] ["FB]
-\definemathsymbol [doublecap]           [bin]   [sy] ["FB]
-\definemathsymbol [curlywedge]          [bin]   [sy] ["84]
-\definemathsymbol [curlyvee]            [bin]   [sy] ["85]
-\definemathsymbol [leftthreetimes]      [bin]   [mb] ["D0]
-\definemathsymbol [rightthreetimes]     [bin]   [mb] ["D1]
-\definemathsymbol [subseteqq]           [rel]   [mb] ["EE]
-\definemathsymbol [supseteqq]           [rel]   [mb] ["EF]
-\definemathsymbol [bumpeq]              [rel]   [sy] ["C8]
-\definemathsymbol [Bumpeq]              [rel]   [sy] ["C7]
-\definemathsymbol [llless]              [rel]   [mb] ["DE]
-\definemathsymbol [lll]                 [rel]   [mb] ["DE] % llless
-\definemathsymbol [gggtr]               [rel]   [mb] ["DF]
-\definemathsymbol [ggg]                 [rel]   [mb] ["DF] % gggtr
-\definemathsymbol [ulcorner]            [open]  [ma] ["5B] [ma] ["5B]
-\definemathsymbol [urcorner]            [close] [ma] ["5C] [ma] ["5C]
-\definemathsymbol [circledS]            [ord]   [mb] ["CA]
-\definemathsymbol [pitchfork]           [rel]   [ma] ["F3]
-\definemathsymbol [dotplus]             [bin]   [sy] ["89]
-\definemathsymbol [backsim]             [rel]   [sy] ["24]
-\definemathsymbol [backsimeq]           [rel]   [sy] ["27]
-\definemathsymbol [llcorner]            [open]  [ma] ["5D] [ma] ["5D]
-\definemathsymbol [lrcorner]            [close] [ma] ["5E] [ma] ["5E]
-\definemathsymbol [complement]          [ord]   [mb] ["94]
-\definemathsymbol [intercal]            [bin]   [ma] ["03] % !!
-\definemathsymbol [circledcirc]         [bin]   [sy] ["E6]
-\definemathsymbol [circledast]          [bin]   [sy] ["E7]
-\definemathsymbol [circleddash]         [bin]   [mb] ["CC]
-
-\stopmathcollection
-
-\startmathcollection [lbr]
-
-\definemathsymbol [lvertneqq]           [rel]   [ma] ["DE]
-\definemathsymbol [gvertneqq]           [rel]   [ma] ["DE]
-\definemathsymbol [nleq]                [rel]   [ma] ["9C]
-\definemathsymbol [ngeq]                [rel]   [ma] ["9D]
-\definemathsymbol [nless]               [rel]   [ma] ["9A]
-\definemathsymbol [ngtr]                [rel]   [ma] ["9B]
-\definemathsymbol [nprec]               [rel]   [ma] ["E5]
-\definemathsymbol [nsucc]               [rel]   [ma] ["E6]
-\definemathsymbol [lneqq]               [rel]   [ma] ["DC]
-\definemathsymbol [gneqq]               [rel]   [ma] ["DE]
-\definemathsymbol [nleqslant]           [rel]   [ma] ["D6]
-\definemathsymbol [ngeqslant]           [rel]   [ma] ["D7]
-\definemathsymbol [lneq]                [rel]   [ma] ["DA]
-\definemathsymbol [gneq]                [rel]   [ma] ["DB]
-\definemathsymbol [npreceq]             [rel]   [ma] ["E7]
-\definemathsymbol [nsucceq]             [rel]   [ma] ["E8]
-\definemathsymbol [precnsim]            [rel]   [ma] ["EB]
-\definemathsymbol [succnsim]            [rel]   [ma] ["EC]
-\definemathsymbol [lnsim]               [rel]   [ma] ["E0]
-\definemathsymbol [gnsim]               [rel]   [ma] ["E2]
-\definemathsymbol [nleqq]               [rel]   [ma] ["D8]
-\definemathsymbol [ngeqq]               [rel]   [ma] ["D9]
-\definemathsymbol [precneqq]            [rel]   [ma] ["E9]
-\definemathsymbol [succneqq]            [rel]   [ma] ["EA]
-\definemathsymbol [precnapprox]         [rel]   [ma] ["ED]
-\definemathsymbol [succnapprox]         [rel]   [ma] ["EE]
-\definemathsymbol [lnapprox]            [rel]   [ma] ["E4]
-\definemathsymbol [gnapprox]            [rel]   [ma] ["E3]
-\definemathsymbol [nsim]                [rel]   [ma] ["96]
-\definemathsymbol [ncong]               [rel]   [ma] ["99]
-\definemathsymbol [diagup]              [ord]   [mb] ["CD]
-\definemathsymbol [diagdown]            [ord]   [mb] ["D8]
-\definemathsymbol [varsubsetneq]        [rel]   [ma] ["D0]
-\definemathsymbol [varsupsetneq]        [rel]   [ma] ["D1]
-\definemathsymbol [nsubseteqq]          [rel]   [ma] ["CA]
-\definemathsymbol [nsupseteqq]          [rel]   [ma] ["CB]
-\definemathsymbol [subsetneqq]          [rel]   [ma] ["CE]
-\definemathsymbol [supsetneqq]          [rel]   [ma] ["CF]
-\definemathsymbol [varsubsetneqq]       [rel]   [ma] ["D2]
-\definemathsymbol [varsupsetneqq]       [rel]   [ma] ["D3]
-\definemathsymbol [subsetneq]           [rel]   [ma] ["CC]
-\definemathsymbol [supsetneq]           [rel]   [ma] ["CD]
-\definemathsymbol [nsubseteq]           [rel]   [ma] ["C8]
-\definemathsymbol [nsupseteq]           [rel]   [ma] ["C9]
-\definemathsymbol [nparallel]           [rel]   [ma] ["F7]
-\definemathsymbol [nmid]                [rel]   [ma] ["F6]
-\definemathsymbol [nshortmid]           [rel]   [ma] ["F4]
-\definemathsymbol [nshortparallel]      [rel]   [ma] ["F5]
-\definemathsymbol [nvdash]              [rel]   [ma] ["F8]
-\definemathsymbol [nVdash]              [rel]   [ma] ["F9]
-\definemathsymbol [nvDash]              [rel]   [ma] ["FA]
-\definemathsymbol [nVDash]              [rel]   [ma] ["FB]
-\definemathsymbol [ntrianglerighteq]    [rel]   [ma] ["F2]
-\definemathsymbol [ntrianglelefteq]     [rel]   [ma] ["F1]
-\definemathsymbol [ntriangleleft]       [rel]   [ma] ["EF]
-\definemathsymbol [ntriangleright]      [rel]   [ma] ["F0]
-\definemathsymbol [nleftarrow]          [rel]   [ma] ["32]
-\definemathsymbol [nrightarrow]         [rel]   [ma] ["33]
-\definemathsymbol [nLeftarrow]          [rel]   [ma] ["66]
-\definemathsymbol [nRightarrow]         [rel]   [ma] ["68]
-\definemathsymbol [nLeftrightarrow]     [rel]   [ma] ["67]
-\definemathsymbol [nleftrightarrow]     [rel]   [ma] ["34]
-\definemathsymbol [divideontimes]       [bin]   [mb] ["F7]
-\definemathsymbol [varnothing]          [ord]   [sy] ["53]
-\definemathsymbol [nexists]             [ord]   [ma] ["20]
-\definemathsymbol [Finv]                [ord]   [mb] ["90]
-\definemathsymbol [Game]                [ord]   [mb] ["91]
-\definemathsymbol [mho]                 [ord]   [mb] ["92]
-\definemathsymbol [eth]                 [ord]   [ma] ["03] % !!
-\definemathsymbol [eqsim]               [rel]   [sy] ["99]
-\definemathsymbol [beth]                [ord]   [mb] ["95]
-\definemathsymbol [gimel]               [ord]   [mb] ["96]
-\definemathsymbol [daleth]              [ord]   [mb] ["97]
-\definemathsymbol [lessdot]             [bin]   [mb] ["DC]
-\definemathsymbol [gtrdot]              [bin]   [mb] ["DD]
-\definemathsymbol [ltimes]              [bin]   [mb] ["CF]
-\definemathsymbol [rtimes]              [bin]   [mb] ["CE]
-\definemathsymbol [shortmid]            [rel]   [mb] ["F4]
-\definemathsymbol [shortparallel]       [rel]   [mb] ["F5]
-\definemathsymbol [smallsetminus]       [bin]   [mb] ["D8]
-\definemathsymbol [thicksim]            [rel]   [sy] ["18] % not that thick
-\definemathsymbol [thickapprox]         [rel]   [sy] ["19] % not that thick
-\definemathsymbol [approxeq]            [rel]   [sy] ["9D]
-\definemathsymbol [succapprox]          [rel]   [mb] ["ED]
-\definemathsymbol [precapprox]          [rel]   [mb] ["EC]
-\definemathsymbol [curvearrowleft]      [rel]   [ma] ["87]
-\definemathsymbol [curvearrowright]     [rel]   [ma] ["88]
-\definemathsymbol [digamma]             [ord]   [ma] ["03] % !!
-\definemathsymbol [varkappa]            [ord]   [mb] ["9B]
-\definemathsymbol [Bbbk]                [ord]   [ma] ["6B]
-\definemathsymbol [hslash]              [ord]   [mb] ["9D]
-\definemathsymbol [hbar]                [ord]   [ma] ["1B]
-\definemathsymbol [backepsilon]         [rel]   [ma] ["03] % !!
-
-\stopmathcollection
-
-\startmathcollection [lbr]
-
-\definemathsymbol [yen]               [nothing] [ma] ["03] % !!
-\definemathsymbol [checkmark]         [nothing] [ma] ["AC]
-\definemathsymbol [circledR]          [nothing] [mb] ["C9]
-\definemathsymbol [maltese]           [nothing] [mb] ["CB]
-
-\stopmathcollection
-
-\startmathcollection [lbr]
-
-\definemathsymbol  [dashrightarrow] [rel] [ma] ["3A]
-\definemathsymbol  [dashleftarrow]  [rel] [ma] ["38]
-\definemathcommand [dasharrow]      [rel] {\dashleftarrow\mkern-15.8mu\dashrightarrow}
-%definemathcommand [Join]           [rel] {\mathchar"0D6F\mkern-15.8mu\mathchar"0D6E} % !!
-
-\stopmathcollection
-
-\startmathcollection[lbr]
-
-\definemathcharacter [91] [open]    [mi] ["86]
-\definemathcharacter [93] [close]   [mi] ["87]
-\definemathcharacter [(]  [open]    [mi] ["84]
-\definemathcharacter [)]  [close]   [mi] ["85]
-\definemathcharacter [/]  [nothing] [mi] ["3D]
-\definemathcharacter [=]  [rel]     [sy] ["83]
-\definemathcharacter [+]  [bin]     [sy] ["82]
-
-\definemathcharacter [91] [nothing] [mi] ["86] [ex] ["02]
-\definemathcharacter [93] [nothing] [mi] ["87] [ex] ["03]
-\definemathcharacter [(]  [nothing] [mi] ["84] [ex] ["00]
-\definemathcharacter [)]  [nothing] [mi] ["85] [ex] ["01]
-\definemathcharacter [/]  [nothing] [mi] ["3D] [ex] ["0E]
-
-\stopmathcollection
-
-% \startmathcollection[lbr]
-%
-% \definemathcharacter [:]  [punct] [tf] ["3A] % unbelievable
-% \definemathcharacter [;]  [punct] [tf] ["3B] % unbelievable
-%
-% \stopmathcollection
-
-\startmathcollection[lbr]
-
-\definemathsymbol [ldbrack]      [open]  [mi] ["82] [ex] ["82]
-\definemathsymbol [rdbrack]      [close] [mi] ["83] [ex] ["83]
-\definemathsymbol [surfintop]    [op]    [ex] ["90]
-\definemathsymbol [midintop]     [op]    [ex] ["92]
-\definemathsymbol [midointop]    [op]    [ex] ["93]
-\definemathsymbol [midsurfintop] [op]    [ex] ["94]
-\definemathsymbol [largeint]     [op]    [ex] ["5A] [ex] ["95]
-
-% \definemathcommand [surfint]    [nolop] {\surfintop}
-% \definemathcommand [midint]     [nolop] {\midintop}
-% \definemathcommand [midoint]    [nolop] {\midointop}
-% \definemathcommand [midsurfint] [nolop] {\midsurfintop}
-
-\definemathsymbol [surfint]    [nolop] [ex] ["90]
-\definemathsymbol [midint]     [nolop] [ex] ["92]
-\definemathsymbol [midoint]    [nolop] [ex] ["93]
-\definemathsymbol [midsurfint] [nolop] [ex] ["94]
-
-\definemathsymbol [dblint]            [ord] [mi] ["88]
-\definemathsymbol [trplint]           [ord] [mi] ["89]
-\definemathsymbol [contint]           [ord] [mi] ["8A]
-\definemathsymbol [surfint]           [ord] [mi] ["8B]
-\definemathsymbol [volint]            [ord] [mi] ["8C]
-\definemathsymbol [clwint]            [ord] [mi] ["8D]
-\definemathsymbol [cclwcint]          [ord] [mi] ["8E]
-\definemathsymbol [clwcint]           [ord] [mi] ["8F]
-\definemathsymbol [bowtie]            [rel] [mi] ["F6]
-\definemathsymbol [models]            [rel] [sy] ["EE]
-\definemathsymbol [doteq]             [rel] [sy] ["C9]
-\definemathsymbol [cong]              [rel] [sy] ["9B]
-\definemathsymbol [hbar]              [ord] [mi] ["9D]
-\definemathsymbol [neq]               [rel] [ma] ["94]
-\definemathsymbol [rightleftharpoons] [rel] [ma] ["7A]
-\definemathsymbol [leftrightharpoons] [rel] [ma] ["79]
-\definemathsymbol [hookleftarrow]     [rel] [ma] ["3C]
-\definemathsymbol [hookrightarrow]    [rel] [ma] ["3E]
-\definemathsymbol [mapsto]            [rel] [ma] ["2C]
-
-\definemathcommand [longmapsto] {\mapstochar\longrightarrow}
-
-\stopmathcollection
-
-\startmathcollection[lbr]
-
-\definemathsymbol [Gamma]   [alpha] [ucgreek] ["00]
-\definemathsymbol [Delta]   [alpha] [ucgreek] ["01]
-\definemathsymbol [Theta]   [alpha] [ucgreek] ["02]
-\definemathsymbol [Lambda]  [alpha] [ucgreek] ["03]
-\definemathsymbol [Xi]      [alpha] [ucgreek] ["04]
-\definemathsymbol [Pi]      [alpha] [ucgreek] ["05]
-\definemathsymbol [Sigma]   [alpha] [ucgreek] ["06]
-\definemathsymbol [Upsilon] [alpha] [ucgreek] ["07]
-\definemathsymbol [Phi]     [alpha] [ucgreek] ["08]
-\definemathsymbol [Psi]     [alpha] [ucgreek] ["09]
-\definemathsymbol [Omega]   [alpha] [ucgreek] ["0A]
-
-\definemathsymbol [varGamma]   [ord] [vargreek] ["00]
-\definemathsymbol [varDelta]   [ord] [vargreek] ["01]
-\definemathsymbol [varTheta]   [ord] [vargreek] ["02]
-\definemathsymbol [varLambda]  [ord] [vargreek] ["03]
-\definemathsymbol [varXi]      [ord] [vargreek] ["04]
-\definemathsymbol [varPi]      [ord] [vargreek] ["05]
-\definemathsymbol [varSigma]   [ord] [vargreek] ["06]
-\definemathsymbol [varUpsilon] [ord] [vargreek] ["07]
-\definemathsymbol [varPhi]     [ord] [vargreek] ["08]
-\definemathsymbol [varPsi]     [ord] [vargreek] ["09]
-\definemathsymbol [varOmega]   [ord] [vargreek] ["0A]
-
-\stopmathcollection
-
-% we define the whole lot, although only a few differ (esp dot)
-
-\startmathcollection[lbr]
-
-\definemathsymbol [acute]     [accent] [tf] ["13] % mr -> tf
-\definemathsymbol [grave]     [accent] [tf] ["12] % mr -> tf
-\definemathsymbol [ddot]      [accent] [tf] ["7F] % mr -> tf
-\definemathsymbol [tilde]     [accent] [tf] ["7E] % mr -> tf
-\definemathsymbol [bar]       [accent] [tf] ["16] % mr -> tf
-\definemathsymbol [breve]     [accent] [tf] ["15] % mr -> tf
-\definemathsymbol [check]     [accent] [tf] ["14] % mr -> tf
-\definemathsymbol [hat]       [accent] [tf] ["5E] % mr -> tf
-\definemathsymbol [vec]       [accent] [mi] ["7E] % [ord]
-\definemathsymbol [dot]       [accent] [tf] ["05] % mr -> tf, 5F -> 05
-\definemathsymbol [widetilde] [accent] [ex] ["65] % [ord]
-\definemathsymbol [widehat]   [accent] [ex] ["62] % [ord]
-
-\stopmathcollection
-
-\def\LBRroot#1#2%
-  {\setbox\zerocount\hbox{$\mathsurround\zeropoint#1\sqrt{#2}$}
-   \dimen@\ht\zerocount \advance\dimen@-\dp\zerocount
-   \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-7.5mu \box\zerocount}
-
-\def\LBRmatrix#1%
-  {\null\,\vcenter{\normalbaselines\mathsurround\zeropoint
-   \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
-   \mathstrut\crcr\noalign{\kern-0.9\baselineskip}
-   #1\crcr\mathstrut\crcr\noalign{\kern-0.9\baselineskip}}}\,}
-
-\startrawmathcollection[lbr]
-
-\definemathcommand [mathstrut] {\vphantom{f}}
-\definemathcommand [joinrel]   {\mathrel{\mkern-4mu}}
-\definemathcommand [r@@t]      {\LBRroot}
-\definemathcommand [matrix]    {\LBRmatrix}
-
-\stoprawmathcollection
-
-\def\LBRbig  {\@@dobig{8.20}}
-\def\LBRBig  {\@@dobig{10.80}}
-\def\LBRbigg {\@@dobig{13.42}}
-\def\LBRBigg {\@@dobig{16.03}}
-\def\LBRbiggg{\@@dobig{17.72}}
-\def\LBRBiggg{\@@dobig{21.25}}
-
-% \def\LBRbig  {\@@dobig{0.820}}
-% \def\LBRBig  {\@@dobig{1.080}}
-% \def\LBRbigg {\@@dobig{1.342}}
-% \def\LBRBigg {\@@dobig{1.603}}
-% \def\LBRbiggg{\@@dobig{1.772}}
-% \def\LBRBiggg{\@@dobig{2.125}}
-
-\startrawmathcollection[lbr]
-
-\definemathcommand [big]   {\LBRbig}
-\definemathcommand [Big]   {\LBRBig}
-\definemathcommand [bigg]  {\LBRbigg}
-\definemathcommand [Bigg]  {\LBRBigg}
-\definemathcommand [biggg] {\LBRbiggg}
-\definemathcommand [Biggg] {\LBRBiggg}
-
-\stoprawmathcollection
-
-\startrawmathcollection[lbr]
-
-\definemathcommand [bigggl] [open]  {\biggg}
-\definemathcommand [bigggr] [close] {\biggg}
-\definemathcommand [Bigggl] [open]  {\Biggg}
-\definemathcommand [Bigggr] [close] {\Biggg}
-
-\stoprawmathcollection
-
-\protect \endinput
diff --git a/tex/context/base/math-noa.lua b/tex/context/base/math-noa.lua
index bbbd5285e..7985834f2 100644
--- a/tex/context/base/math-noa.lua
+++ b/tex/context/base/math-noa.lua
@@ -192,7 +192,7 @@ noads.processors.relocate[math_delim] = function(pointer)
     end
 end
 
-function noads.relocate_characters(head,tail,style,penalties)
+function noads.relocate_characters(head,style,penalties)
     process(head,noads.processors.relocate)
     return true
 end
@@ -227,7 +227,7 @@ noads.processors.resize[math_fence] = function(pointer)
     end
 end
 
-function noads.resize_characters(head,tail,style,penalties)
+function noads.resize_characters(head,style,penalties)
     process(head,noads.processors.resize)
     return true
 end
@@ -290,14 +290,14 @@ noads.processors.respace[math_noad] = function(pointer)
 end
 
 
-function noads.respace_characters(head,tail,style,penalties)
+function noads.respace_characters(head,style,penalties)
     noads.process(head,noads.processors.respace)
     return true
 end
 
 -- the normal builder
 
-function noads.mlist_to_hlist(head,tail,style,penalties)
+function noads.mlist_to_hlist(head,style,penalties)
     return mlist_to_hlist(head,style,penalties), true
 end
 
@@ -309,12 +309,7 @@ tasks.new (
     }
 )
 
---~ tasks.appendaction("math", "normalizers", "noads.relocate_characters", nil, "nohead")
---~ tasks.appendaction("math", "normalizers", "noads.resize_characters",   nil, "nohead")
---~ tasks.appendaction("math", "normalizers", "noads.respace_characters",  nil, "nohead")
---~ tasks.appendaction("math", "builders",    "noads.mlist_to_hlist",      nil, "notail")
-
-local actions = tasks.actions("math",2) -- head, tail, style, penalties
+local actions = tasks.actions("math",2) -- head, style, penalties
 
 local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
 
diff --git a/tex/context/base/math-tex.mkii b/tex/context/base/math-tex.mkii
new file mode 100644
index 000000000..c833db956
--- /dev/null
+++ b/tex/context/base/math-tex.mkii
@@ -0,0 +1,718 @@
+%D \module
+%D   [       file=math-tex,
+%D        version=2001.04.12,
+%D       subtitle=Plain Specials,
+%D         author={Hans Hagen, Taco Hoekwater \& Aditya Mahajan},
+%D           date=\currentdate,
+%D      copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% beware: in mkiv we will do it differently
+
+\unprotect
+
+\mathcode`\ ="8000 \mathcode`\_="8000 \mathcode`\'="8000
+
+\definefamilysynonym [default] [calligraphic] [sy]
+\definefamilysynonym [default] [oldstyle]     [mi]
+\definefamilysynonym [default] [blackboard]   [mr]
+\definefamilysynonym [default] [gothic]       [mr]
+\definefamilysynonym [default] [fraktur]      [mr]
+
+\definefamilysynonym [default] [lcgreek]      [mi]
+\definefamilysynonym [default] [ucgreek]      [mr]
+\definefamilysynonym [default] [vargreek]     [mi]
+
+
+%D \macros
+%D   {\setupmathematics}
+%D
+%D Configuration for integrals. (If needed we can speed this up and make it
+%D installable; no processaction is needed then).
+
+\chardef\intlimitcode\zerocount  % 0 nolimits 1 displaylimits 2 limits
+
+\def\intlimits
+  {\ifcase\intlimitcode \nolimits \or \displaylimits \or \limits \fi}
+
+\def\setupmathematics
+  {\dosingleargument\dosetupmathematics}
+
+\def\dosetupmathematics[#1]%
+  {\getparameters[\??mo][#1]
+   \processaction[\@@mointegral]
+      [ nolimits=>\chardef\intlimitcode\zerocount,
+   displaylimits=>\chardef\intlimitcode\plusone,
+          limits=>\chardef\intlimitcode\plustwo]}
+
+%D \startbuffer
+%D   $\int_a^b f(x) dx$ and also
+%D   $\iint_a^b f(x,y) dxdy$, $\iiint_a^b f(x,y) dxdy$,
+%D   $\iiiint_a^b f(x) dx$
+%D   \startformula
+%D     \int_a^b f(x) dx \quad
+%D     \iint_a^b f(x) dx \quad
+%D     \iiint_a^b f(x) dx \quad
+%D     \iiiint_a^b f(x) dx \quad
+%D   \stopformula
+%D \stopbuffer
+%D
+%D Default: \getbuffer
+%D
+%D Displaylimits: \setupmathematics[integral=displaylimits] \getbuffer
+%D
+%D Limits: \setupmathematics[integral=limits] \getbuffer
+
+\startmathcollection [default]
+
+\definemathsymbol [alpha]   [nothing] [lcgreek] ["0B]
+\definemathsymbol [beta]    [nothing] [lcgreek] ["0C]
+\definemathsymbol [gamma]   [nothing] [lcgreek] ["0D]
+\definemathsymbol [delta]   [nothing] [lcgreek] ["0E]
+\definemathsymbol [epsilon] [nothing] [lcgreek] ["0F]
+\definemathsymbol [zeta]    [nothing] [lcgreek] ["10]
+\definemathsymbol [eta]     [nothing] [lcgreek] ["11]
+\definemathsymbol [theta]   [nothing] [lcgreek] ["12]
+\definemathsymbol [iota]    [nothing] [lcgreek] ["13]
+\definemathsymbol [kappa]   [nothing] [lcgreek] ["14]
+\definemathsymbol [lambda]  [nothing] [lcgreek] ["15]
+\definemathsymbol [mu]      [nothing] [lcgreek] ["16]
+\definemathsymbol [nu]      [nothing] [lcgreek] ["17]
+\definemathsymbol [xi]      [nothing] [lcgreek] ["18]
+\definemathsymbol [omicron] [nothing] [lcgreek] ["6F]
+\definemathsymbol [pi]      [nothing] [lcgreek] ["19]
+\definemathsymbol [rho]     [nothing] [lcgreek] ["1A]
+\definemathsymbol [sigma]   [nothing] [lcgreek] ["1B]
+\definemathsymbol [tau]     [nothing] [lcgreek] ["1C]
+\definemathsymbol [upsilon] [nothing] [lcgreek] ["1D]
+\definemathsymbol [phi]     [nothing] [lcgreek] ["1E]
+\definemathsymbol [chi]     [nothing] [lcgreek] ["1F]
+\definemathsymbol [psi]     [nothing] [lcgreek] ["20]
+\definemathsymbol [omega]   [nothing] [lcgreek] ["21]
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathsymbol [varepsilon] [nothing] [vargreek] ["22]
+\definemathsymbol [vartheta]   [nothing] [vargreek] ["23]
+\definemathsymbol [varpi]      [nothing] [vargreek] ["24]
+\definemathsymbol [varrho]     [nothing] [vargreek] ["25]
+\definemathsymbol [varsigma]   [nothing] [vargreek] ["26]
+\definemathsymbol [varphi]     [nothing] [vargreek] ["27]
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathsymbol [Alpha]   [alpha] [ucgreek] ["41] % A
+\definemathsymbol [Beta]    [alpha] [ucgreek] ["42] % B
+\definemathsymbol [Gamma]   [alpha] [ucgreek] ["00]
+\definemathsymbol [Delta]   [alpha] [ucgreek] ["01]
+\definemathsymbol [Epsilon] [alpha] [ucgreek] ["45] % E
+\definemathsymbol [Zeta]    [alpha] [ucgreek] ["5A] % Z
+\definemathsymbol [Eta]     [alpha] [ucgreek] ["48] % H
+\definemathsymbol [Theta]   [alpha] [ucgreek] ["02]
+\definemathsymbol [Iota]    [alpha] [ucgreek] ["49] % I
+\definemathsymbol [Kappa]   [alpha] [ucgreek] ["4B] % K
+\definemathsymbol [Lambda]  [alpha] [ucgreek] ["03]
+\definemathsymbol [Mu]      [alpha] [ucgreek] ["4D] % M
+\definemathsymbol [Nu]      [alpha] [ucgreek] ["4E] % N
+\definemathsymbol [Xi]      [alpha] [ucgreek] ["04]
+\definemathsymbol [Omicron] [alpha] [ucgreek] ["4F] % O
+\definemathsymbol [Pi]      [alpha] [ucgreek] ["05]
+\definemathsymbol [Rho]     [alpha] [ucgreek] ["52] % R
+\definemathsymbol [Sigma]   [alpha] [ucgreek] ["06]
+\definemathsymbol [Tau]     [alpha] [ucgreek] ["54] % T
+\definemathsymbol [Upsilon] [alpha] [ucgreek] ["07]
+\definemathsymbol [Phi]     [alpha] [ucgreek] ["08]
+\definemathsymbol [Chi]     [alpha] [ucgreek] ["58] % X
+\definemathsymbol [Psi]     [alpha] [ucgreek] ["09]
+\definemathsymbol [Omega]   [alpha] [ucgreek] ["0A]
+
+\stopmathcollection
+
+% The \mfunction macro is an alternative for \hbox with a
+% controlable font switch.
+
+\startmathcollection[default]
+
+\definemathcommand [arccos]  [nolop] {\mfunction{arccos}}
+\definemathcommand [arcsin]  [nolop] {\mfunction{arcsin}}
+\definemathcommand [arctan]  [nolop] {\mfunction{arctan}}
+\definemathcommand [arg]     [nolop] {\mfunction{arg}}
+\definemathcommand [cosh]    [nolop] {\mfunction{cosh}}
+\definemathcommand [cos]     [nolop] {\mfunction{cos}}
+\definemathcommand [coth]    [nolop] {\mfunction{coth}}
+\definemathcommand [cot]     [nolop] {\mfunction{cot}}
+\definemathcommand [csc]     [nolop] {\mfunction{csc}}
+\definemathcommand [deg]     [nolop] {\mfunction{deg}}
+\definemathcommand [det]     [limop] {\mfunction{det}}
+\definemathcommand [dim]     [nolop] {\mfunction{dim}}
+\definemathcommand [exp]     [nolop] {\mfunction{exp}}
+\definemathcommand [gcd]     [limop] {\mfunction{gcd}}
+\definemathcommand [hom]     [nolop] {\mfunction{hom}}
+\definemathcommand [inf]     [limop] {\mfunction{inf}}
+\definemathcommand [injlim]  [limop] {\mfunction{inj\,lim}}
+\definemathcommand [ker]     [nolop] {\mfunction{ker}}
+\definemathcommand [lg]      [nolop] {\mfunction{lg}}
+\definemathcommand [liminf]  [limop] {\mfunction{lim\,inf}}
+\definemathcommand [limsup]  [limop] {\mfunction{lim\,sup}}
+\definemathcommand [lim]     [limop] {\mfunction{lim}}
+\definemathcommand [ln]      [nolop] {\mfunction{ln}}
+\definemathcommand [log]     [nolop] {\mfunction{log}}
+\definemathcommand [median]  [limop] {\mfunction{median}}
+\definemathcommand [max]     [limop] {\mfunction{max}}
+\definemathcommand [min]     [limop] {\mfunction{min}}
+\definemathcommand [mod]     [limop] {\mfunction{mod}}
+\definemathcommand [div]     [limop] {\mfunction{div}}
+\definemathcommand [projlim] [limop] {\mfunction{proj\,lim}}
+\definemathcommand [Pr]      [limop] {\mfunction{Pr}}
+\definemathcommand [sec]     [nolop] {\mfunction{sec}}
+\definemathcommand [sinh]    [nolop] {\mfunction{sinh}}
+\definemathcommand [sin]     [nolop] {\mfunction{sin}}
+\definemathcommand [sup]     [limop] {\mfunction{sup}}
+\definemathcommand [tanh]    [nolop] {\mfunction{tanh}}
+\definemathcommand [tan]     [nolop] {\mfunction{tan}}
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathcommand [integers]       {\mfunction{Z}}
+\definemathcommand [reals]          {\mfunction{R}}
+\definemathcommand [rationals]      {\mfunction{Q}}
+\definemathcommand [naturalnumbers] {\mfunction{N}}
+\definemathcommand [complexes]      {\mfunction{C}}
+\definemathcommand [primes]         {\mfunction{P}}
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathcharacter [!]   [close] [mr] ["21]
+\definemathcharacter [(]   [open]  [mr] ["28]
+\definemathcharacter [)]   [close] [mr] ["29]
+\definemathcharacter [*]   [bin]   [sy] ["03]
+\definemathcharacter [+]   [bin]   [mr] ["2B]
+\definemathcharacter [,]   [punct] [mi] ["3B]
+\definemathcharacter [-]   [bin]   [sy] ["00]
+\definemathcharacter [.]   [ord]   [mi] ["3A]
+\definemathcharacter [/]   [ord]   [mi] ["3D]
+\definemathcharacter [:]   [rel]   [mr] ["3A]
+\definemathcharacter [;]   [punct] [mr] ["3B]
+\definemathcharacter [<]   [rel]   [mi] ["3C]
+\definemathcharacter [=]   [rel]   [mr] ["3D]
+\definemathcharacter [>]   [rel]   [mi] ["3E]
+\definemathcharacter [?]   [close] [mr] ["3F]
+\definemathcharacter [91]  [open]  [mr] ["5B] % [
+\definemathcharacter [92]  [ord]   [sy] ["6E] % \
+\definemathcharacter [93]  [close] [mr] ["5D] % ]
+\definemathcharacter [123] [open]  [sy] ["66] % {
+\definemathcharacter [124] [ord]   [sy] ["6A] % |
+\definemathcharacter [125] [close] [sy] ["67] % }
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathcharacter [(]   [nothing] [mr] ["28] [ex] ["00]
+\definemathcharacter [)]   [nothing] [mr] ["29] [ex] ["01]
+\definemathcharacter [91]  [nothing] [mr] ["5B] [ex] ["02] % [
+\definemathcharacter [93]  [nothing] [mr] ["5D] [ex] ["03] % ]
+\definemathcharacter [<]   [nothing] [sy] ["68] [ex] ["0A]
+\definemathcharacter [>]   [nothing] [sy] ["69] [ex] ["0B]
+\definemathcharacter [/]   [nothing] [mr] ["2F] [ex] ["0E]
+\definemathcharacter [124] [nothing] [sy] ["6A] [ex] ["0C] % |
+\definemathcharacter [92]  [nothing] [sy] ["6E] [ex] ["0F] % \
+
+\stopmathcollection
+
+\def\PLAINangle
+  {{\vbox{\ialign{$\mathsurround\zeropoint\scriptstyle##$\crcr
+    \not\mathrel{\mkern14mu}\crcr
+    \noalign{\nointerlineskip}
+    \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}}
+
+\startmathcollection[default]
+
+\definemathsymbol [aleph]    [nothing] [sy] ["40]
+\definemathsymbol [imath]    [nothing] [mi] ["7B]
+\definemathsymbol [jmath]    [nothing] [mi] ["7C]
+\definemathsymbol [ell]      [nothing] [mi] ["60]
+\definemathsymbol [wp]       [nothing] [mi] ["7D]
+\definemathsymbol [Re]       [nothing] [sy] ["3C]
+\definemathsymbol [Im]       [nothing] [sy] ["3D]
+\definemathsymbol [partial]  [nothing] [mi] ["40]
+\definemathsymbol [infty]    [nothing] [sy] ["31]
+\definemathsymbol [prime]    [nothing] [sy] ["30]
+\definemathsymbol [emptyset] [nothing] [sy] ["3B]
+\definemathsymbol [nabla]    [nothing] [sy] ["72]
+\definemathsymbol [top]      [nothing] [sy] ["3E]
+\definemathsymbol [bot]      [nothing] [sy] ["3F]
+
+\definemathcommand [hbar]  {{\mathchar'26\mkern-9muh}}
+\definemathcommand [surd]  {{\mathchar"1270}}          % ?
+\definemathcommand [angle] {\PLAINangle}
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [triangle]    [ord] [sy] ["34]
+\definemathsymbol [forall]      [ord] [sy] ["38]
+\definemathsymbol [exists]      [ord] [sy] ["39]
+\definemathsymbol [neg]         [ord] [sy] ["3A]
+\definemathsymbol [flat]        [ord] [mi] ["5B]
+\definemathsymbol [natural]     [ord] [mi] ["5C]
+\definemathsymbol [sharp]       [ord] [mi] ["5D]
+\definemathsymbol [clubsuit]    [ord] [sy] ["7C]
+\definemathsymbol [diamondsuit] [ord] [sy] ["7D]
+\definemathsymbol [heartsuit]   [ord] [sy] ["7E]
+\definemathsymbol [spadesuit]   [ord] [sy] ["7F]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathcommand [square] {\hbox{\hsmash{$\sqcup$}$\sqcap$}}
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [coprod]    [op]  [ex] ["60]
+\definemathsymbol [bigvee]    [op]  [ex] ["57]
+\definemathsymbol [bigwedge]  [op]  [ex] ["56]
+\definemathsymbol [biguplus]  [op]  [ex] ["55]
+\definemathsymbol [bigcap]    [op]  [ex] ["54]
+\definemathsymbol [bigcup]    [op]  [ex] ["53]
+\definemathsymbol [intop]     [op]  [ex] ["52]
+\definemathsymbol [prod]      [op]  [ex] ["51]
+\definemathsymbol [sum]       [op]  [ex] ["50]
+\definemathsymbol [bigotimes] [op]  [ex] ["4E]
+\definemathsymbol [bigoplus]  [op]  [ex] ["4C]
+\definemathsymbol [bigodot]   [op]  [ex] ["4A]
+\definemathsymbol [ointop]    [op]  [ex] ["48]
+\definemathsymbol [bigsqcup]  [op]  [ex] ["46]
+\definemathsymbol [smallint]  [op]  [sy] ["73]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [triangleleft]    [bin] [mi] ["2F]
+\definemathsymbol [triangleright]   [bin] [mi] ["2E]
+\definemathsymbol [bigtriangleup]   [bin] [sy] ["34]
+\definemathsymbol [bigtriangledown] [bin] [sy] ["35]
+\definemathsymbol [wedge]           [bin] [sy] ["5E]
+\definemathsymbol [vee]             [bin] [sy] ["5F]
+\definemathsymbol [cap]             [bin] [sy] ["5C]
+\definemathsymbol [cup]             [bin] [sy] ["5B]
+\definemathsymbol [ddagger]         [bin] [sy] ["7A]
+\definemathsymbol [dagger]          [bin] [sy] ["79]
+\definemathsymbol [sqcap]           [bin] [sy] ["75]
+\definemathsymbol [sqcup]           [bin] [sy] ["74]
+\definemathsymbol [uplus]           [bin] [sy] ["5D]
+\definemathsymbol [amalg]           [bin] [sy] ["71]
+\definemathsymbol [diamond]         [bin] [sy] ["05]
+\definemathsymbol [bullet]          [bin] [sy] ["0F]
+\definemathsymbol [wr]              [bin] [sy] ["6F]
+\definemathsymbol [div]             [bin] [sy] ["04]
+\definemathsymbol [odot]            [bin] [sy] ["0C]
+\definemathsymbol [oslash]          [bin] [sy] ["0B]
+\definemathsymbol [otimes]          [bin] [sy] ["0A]
+\definemathsymbol [ominus]          [bin] [sy] ["09]
+\definemathsymbol [oplus]           [bin] [sy] ["08]
+\definemathsymbol [mp]              [bin] [sy] ["07]
+\definemathsymbol [pm]              [bin] [sy] ["06]
+\definemathsymbol [circ]            [bin] [sy] ["0E]
+\definemathsymbol [bigcirc]         [bin] [sy] ["0D]
+\definemathsymbol [setminus]        [bin] [sy] ["6E]
+\definemathsymbol [cdot]            [bin] [sy] ["01]
+\definemathsymbol [ast]             [bin] [sy] ["03]
+\definemathsymbol [times]           [bin] [sy] ["02]
+\definemathsymbol [star]            [bin] [mi] ["3F]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [propto]         [rel] [sy] ["2F]
+\definemathsymbol [sqsubseteq]     [rel] [sy] ["76]
+\definemathsymbol [sqsupseteq]     [rel] [sy] ["77]
+\definemathsymbol [parallel]       [rel] [sy] ["6B]
+\definemathsymbol [mid]            [rel] [sy] ["6A]
+\definemathsymbol [dashv]          [rel] [sy] ["61]
+\definemathsymbol [vdash]          [rel] [sy] ["60]
+\definemathsymbol [nearrow]        [rel] [sy] ["25]
+\definemathsymbol [searrow]        [rel] [sy] ["26]
+\definemathsymbol [nwarrow]        [rel] [sy] ["2D]
+\definemathsymbol [swarrow]        [rel] [sy] ["2E]
+\definemathsymbol [Leftrightarrow] [rel] [sy] ["2C]
+\definemathsymbol [Leftarrow]      [rel] [sy] ["28]
+\definemathsymbol [Rightarrow]     [rel] [sy] ["29]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathcommand [lnot]   {\neg}
+\definemathcommand [int]    {\intop \intlimits}
+\definemathcommand [oint]   {\ointop\intlimits}
+\definemathcommand [land]   {\wedge}
+\definemathcommand [lor]    {\vee}
+\definemathcommand [neq]    {\not=}
+\definemathcommand [ne]     {\neq}
+\definemathcommand [le]     {\leq}
+\definemathcommand [ge]     {\geq}
+\definemathcommand [eq]     {=}
+\definemathcommand [gt]     {>}
+\definemathcommand [lt]     {<}
+\definemathcommand [gets]   {\leftarrow}
+\definemathcommand [owns]   {\ni}
+\definemathcommand [to]     {\rightarrow}
+\definemathcommand [mapsto] {\mapstochar\rightarrow}
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [leq]              [rel] [sy] ["14]
+\definemathsymbol [geq]              [rel] [sy] ["15]
+\definemathsymbol [succ]             [rel] [sy] ["1F]
+\definemathsymbol [prec]             [rel] [sy] ["1E]
+\definemathsymbol [approx]           [rel] [sy] ["19]
+\definemathsymbol [succeq]           [rel] [sy] ["17]
+\definemathsymbol [preceq]           [rel] [sy] ["16]
+\definemathsymbol [supset]           [rel] [sy] ["1B]
+\definemathsymbol [subset]           [rel] [sy] ["1A]
+\definemathsymbol [supseteq]         [rel] [sy] ["13]
+\definemathsymbol [subseteq]         [rel] [sy] ["12]
+\definemathsymbol [in]               [rel] [sy] ["32]
+\definemathsymbol [ni]               [rel] [sy] ["33]
+\definemathsymbol [gg]               [rel] [sy] ["1D]
+\definemathsymbol [ll]               [rel] [sy] ["1C]
+\definemathsymbol [not]              [rel] [sy] ["36]
+\definemathsymbol [leftrightarrow]   [rel] [sy] ["24]
+\definemathsymbol [leftarrow]        [rel] [sy] ["20]
+\definemathsymbol [rightarrow]       [rel] [sy] ["21]
+\definemathsymbol [mapstochar]       [rel] [sy] ["37]
+\definemathsymbol [sim]              [rel] [sy] ["18]
+\definemathsymbol [simeq]            [rel] [sy] ["27]
+\definemathsymbol [perp]             [rel] [sy] ["3F]
+\definemathsymbol [equiv]            [rel] [sy] ["11]
+\definemathsymbol [asymp]            [rel] [sy] ["10]
+\definemathsymbol [smile]            [rel] [mi] ["5E]
+\definemathsymbol [frown]            [rel] [mi] ["5F]
+\definemathsymbol [leftharpoonup]    [rel] [mi] ["28]
+\definemathsymbol [leftharpoondown]  [rel] [mi] ["29]
+\definemathsymbol [rightharpoonup]   [rel] [mi] ["2A]
+\definemathsymbol [rightharpoondown] [rel] [mi] ["2B]
+\definemathsymbol [lhook]            [rel] [mi] ["2C]
+\definemathsymbol [rhook]            [rel] [mi] ["2D]
+
+\stopmathcollection
+
+\def\PLAINldots
+  {\ldotp\ldotp\ldotp}
+
+\def\PLAINcdots
+  {\cdotp\cdotp\cdotp}
+
+\def\PLAINvdots
+  {\vbox{\baselineskip.4\bodyfontsize\lineskiplimit\zeropoint
+   \kern.6\bodyfontsize\hbox{.}\hbox{.}\hbox{.}}}
+
+\def\PLAINddots
+   {\mkern1mu\raise.7\bodyfontsize\vbox{\kern.7\bodyfontsize\hbox{.}}\mkern2mu
+    \raise.4\bodyfontsize\hbox{.}\mkern2mu\raise.1\bodyfontsize\hbox{.}\mkern1mu}
+
+\startmathcollection[default]
+
+\definemathcommand [hookrightarrow] {\lhook\joinrel\rightarrow}
+\definemathcommand [hookleftarrow]  {\leftarrow\joinrel\rhook}
+\definemathcommand [bowtie]         {\mathrel\triangleright\joinrel\mathrel\triangleleft}
+\definemathcommand [models]         {\mathrel|\joinrel=}
+\definemathcommand [iff]            {\;\Longleftrightarrow\;}
+
+\definemathsymbol [ldotp] [punct] [mi] ["3A]
+\definemathsymbol [cdotp] [punct] [sy] ["01]
+\definemathsymbol [colon] [punct] [mr] ["3A]
+
+\definemathcommand [ldots] [inner]   {\PLAINldots}
+\definemathcommand [cdots] [inner]   {\PLAINcdots}
+\definemathcommand [vdots] [nothing] {\PLAINvdots}
+\definemathcommand [ddots] [inner]   {\PLAINddots}
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [acute]     [accent] [mr] ["13]
+\definemathsymbol [grave]     [accent] [mr] ["12]
+\definemathsymbol [ddot]      [accent] [mr] ["7F]
+\definemathsymbol [tilde]     [accent] [mr] ["7E]
+\definemathsymbol [mathring]  [accent] [mr] ["17]
+\definemathsymbol [bar]       [accent] [mr] ["16]
+\definemathsymbol [breve]     [accent] [mr] ["15]
+\definemathsymbol [check]     [accent] [mr] ["14]
+\definemathsymbol [hat]       [accent] [mr] ["5E]
+\definemathsymbol [vec]       [accent] [mi] ["7E] % [ord]
+\definemathsymbol [dot]       [accent] [mr] ["5F]
+\definemathsymbol [widetilde] [accent] [ex] ["65] % [ord]
+\definemathsymbol [widehat]   [accent] [ex] ["62] % [ord]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [lmoustache]  [open]    [ex] ["7A] [ex] ["40]
+\definemathsymbol [rmoustache]  [close]   [ex] ["7B] [ex] ["41]
+\definemathsymbol [lgroup]      [open]    [mr] ["28] [ex] ["3A] % ?
+\definemathsymbol [rgroup]      [close]   [mr] ["29] [ex] ["3B] % ?
+\definemathsymbol [arrowvert]   [nothing] [sy] ["6A] [ex] ["3C]
+\definemathsymbol [Arrowvert]   [nothing] [sy] ["6B] [ex] ["3D]
+\definemathsymbol [bracevert]   [nothing] [ex] ["3E] % ?
+\definemathsymbol [Vert]        [nothing] [sy] ["6B] [ex] ["0D]
+\definemathsymbol [vert]        [nothing] [sy] ["6A] [ex] ["0C]
+\definemathsymbol [uparrow]     [rel]     [sy] ["22] [ex] ["78]
+\definemathsymbol [downarrow]   [rel]     [sy] ["23] [ex] ["79]
+\definemathsymbol [updownarrow] [rel]     [sy] ["6C] [ex] ["3F]
+\definemathsymbol [Uparrow]     [rel]     [sy] ["2A] [ex] ["7E]
+\definemathsymbol [Downarrow]   [rel]     [sy] ["2B] [ex] ["7F]
+\definemathsymbol [Updownarrow] [rel]     [sy] ["6D] [ex] ["77]
+\definemathsymbol [backslash]   [nothing] [sy] ["6E] [ex] ["0F]
+\definemathsymbol [langle]      [open]    [sy] ["68] [ex] ["0A]
+\definemathsymbol [rangle]      [close]   [sy] ["69] [ex] ["0B]
+\definemathsymbol [lbrace]      [open]    [sy] ["66] [ex] ["08]
+\definemathsymbol [rbrace]      [close]   [sy] ["67] [ex] ["09]
+\definemathsymbol [lceil]       [open]    [sy] ["64] [ex] ["06]
+\definemathsymbol [rceil]       [close]   [sy] ["65] [ex] ["07]
+\definemathsymbol [lfloor]      [open]    [sy] ["62] [ex] ["04]
+\definemathsymbol [rfloor]      [close]   [sy] ["63] [ex] ["05]
+
+\definemathsymbol [sqrt]        [radical] [sy] ["70] [ex] ["70]
+
+\stopmathcollection
+
+%D By request:
+
+\startmathcollection[default]
+
+\definemathsymbol [lvert] [open]  [sy] ["6A] [ex] ["0C]
+\definemathsymbol [rvert] [close] [sy] ["6A] [ex] ["0C]
+
+\definemathsymbol [lVert] [open]  [sy] ["6B] [ex] ["0D]
+\definemathsymbol [rVert] [close] [sy] ["6B] [ex] ["0D]
+
+\stopmathcollection
+
+%D For brooks:
+%D
+%D \starttyping
+%D $\sqrt[3]{10}$
+%D \stoptyping
+
+\ifx\normalsqrt\undefined  \let\normalsqrt\sqrt \fi      % just set to: \dohandlemathtoken {sqrt}
+
+\def\notsosqrt[#1]{\root#1\of}
+
+\unexpanded\def\sqrt{\doifnextoptionalelse\notsosqrt\normalsqrt}
+
+\def\PLAINbig {\@@dobig{0.85}}
+\def\PLAINBig {\@@dobig{1.15}}
+\def\PLAINbigg{\@@dobig{1.45}}
+\def\PLAINBigg{\@@dobig{1.75}}
+
+\startrawmathcollection [default]
+
+\definemathcommand [bigl]  [open]  [one] {\big}
+\definemathcommand [bigm]  [rel]   [one] {\big}
+\definemathcommand [bigr]  [close] [one] {\big}
+\definemathcommand [Bigl]  [open]  [one] {\Big}
+\definemathcommand [Bigm]  [rel]   [one] {\Big}
+\definemathcommand [Bigr]  [close] [one] {\Big}
+\definemathcommand [biggl] [open]  [one] {\bigg}
+\definemathcommand [biggm] [rel]   [one] {\bigg}
+\definemathcommand [biggr] [close] [one] {\bigg}
+\definemathcommand [Biggl] [open]  [one] {\Bigg}
+\definemathcommand [Biggm] [rel]   [one] {\Bigg}
+\definemathcommand [Biggr] [close] [one] {\Bigg}
+
+\definemathcommand [big]  {\PLAINbig}
+\definemathcommand [Big]  {\PLAINBig}
+\definemathcommand [bigg] {\PLAINbigg}
+\definemathcommand [Bigg] {\PLAINBigg}
+
+\stoprawmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [dag]  [box] [sy] ["79]
+\definemathsymbol [ddag] [box] [sy] ["7A]
+\definemathsymbol [S]    [box] [sy] ["78]
+\definemathsymbol [P]    [box] [sy] ["7B]
+\definemathsymbol [Orb]  [box] [sy] ["0D]
+
+\stopmathcollection
+
+\def\PLAINroot#1#2%
+  {\setbox\zerocount\hbox{$\mathsurround\zeropoint#1\sqrt{#2}$}\dimen@\ht\zerocount
+   \advance\dimen@-\dp\zerocount
+   \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu\box\zerocount}
+
+\def\PLAINmatrix#1%
+  {\null\,\vcenter{\normalbaselines\mathsurround\zeropoint
+   \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+   \mathstrut\crcr\noalign{\kern-\baselineskip}
+   #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
+
+\startrawmathcollection[default]
+
+\definemathcommand [mathstrut] {\vphantom{(}}
+\definemathcommand [joinrel]   {\mathrel{\mkern-3mu}}
+\definemathcommand [r@@t]      {\PLAINroot}
+\definemathcommand [matrix]    {\PLAINmatrix}
+
+\definemathcommand [over]      {\normalover} % hack, to do
+
+\stoprawmathcollection
+
+\def\{{\lbrace}
+\def\}{\rbrace}
+
+%def\bbd{\fam\purefamily{blackboard}}
+%def\cal{\fam\purefamily{calfamily}}
+
+\def\mit{\fam\purefamily{mitfamily}}
+
+\def\Bbb{\blackboard} % conforming amstex
+
+\startmathcollection[default]
+
+  \definemathsymbol [mathperiod] [ord]   [mi] ["3A]
+  \definemathsymbol [textperiod] [punct] [mi] ["3A]
+
+  \definemathsymbol [mathcomma]  [ord]   [mi] ["3B]
+  \definemathsymbol [textcomma]  [punct] [mi] ["3B]
+
+\stopmathcollection
+
+\definemathpunctuation . mathperiod textperiod
+\definemathpunctuation , mathcomma  textcomma
+
+%D The following colon related definitions are provided by Aditya
+%D Mahajan who derived them from \type {mathtools.sty} and \type
+%D {colonequals.sty}.
+
+%D \macros
+%D   {centercolon, colonminus, minuscolon, colonequals, equalscolon,
+%D    colonapprox, approxcolon, colonsim, simcolon, coloncolon,
+%D    coloncolonminus, minuscoloncolon, coloncolonequals,
+%D    equalscoloncolon, coloncolonapprox, approxcoloncolon,
+%D    colonsim, simcoloncolon}
+%D
+%D In $a := b$ the colon is not vertically centered with the equal
+%D to. Also the distance between colon and equal to is a bit large.
+%D So, we define a vertically centered colon \tex {centercolon} and
+%D a few macros for colon and double colon relation symbols.
+%D
+%D \startlines
+%D \formula {A \centercolon       B}
+%D \formula {A \colonminus        B}
+%D \formula {A \minuscolon        B}
+%D \formula {A \colonequals       B}
+%D \formula {A \equalscolon       B}
+%D \formula {A \colonapprox       B}
+%D \formula {A \approxcolon       B}
+%D \formula {A \colonsim          B}
+%D \formula {A \simcolon          B}
+%D \formula {A \coloncolon        B}
+%D \formula {A \coloncolonminus   B}
+%D \formula {A \minuscoloncolon   B}
+%D \formula {A \coloncolonequals  B}
+%D \formula {A \equalscoloncolon  B}
+%D \formula {A \coloncolonapprox  B}
+%D \formula {A \approxcoloncolon  B}
+%D \formula {A \colonsim          B}
+%D \formula {A \simcoloncolon     B}
+%D \stoplines
+
+%D The next macros take care of the space between the colon and the
+%D relation symbol.
+
+\definemathcommand  [colonsep]        {\mkern-1.2mu}
+\definemathcommand  [doublecolonsep]  {\mkern-0.9mu}
+
+%D The next macro vertically centeres its contents.
+
+\def\@center@math#1%
+  {\vcenter{\hbox{$\mathsurround\zeropoint#1$}}}
+
+\def\@center@colon
+  {\mathpalette\@center@math{\colon}}
+
+%D Now we define all the colon relations.
+
+\definemathcommand [centercolon]      [rel] {\@center@colon}
+\definemathcommand [colonminus]       [rel] {\centercolon\colonsep\mathrel{-}}
+\definemathcommand [minuscolon]       [rel] {\mathrel{-}\colonsep\centercolon}
+\definemathcommand [colonequals]      [rel] {\centercolon\colonsep=}
+\definemathcommand [equalscolon]      [rel] {=\centercolon\colonsep}
+\definemathcommand [colonapprox]      [rel] {\centercolon\colonsep\approx}
+\definemathcommand [approxcolon]      [rel] {\approx\centercolon\colonsep}
+\definemathcommand [colonsim]         [rel] {\centercolon\colonsep\sim}
+\definemathcommand [simcolon]         [rel] {\sim\centercolon\colonsep}
+
+\definemathcommand [coloncolon]       [rel] {\centercolon\doublecolonsep\centercolon}
+\definemathcommand [coloncolonminus]  [rel] {\coloncolon\colonsep\mathrel{-}}
+\definemathcommand [minuscoloncolon]  [rel] {\mathrel{-}\colonsep\coloncolon}
+\definemathcommand [coloncolonequals] [rel] {\coloncolon\colonsep=}
+\definemathcommand [equalscoloncolon] [rel] {=\coloncolon\colonsep}
+\definemathcommand [coloncolonapprox] [rel] {\coloncolon\colonsep\approx}
+\definemathcommand [approxcoloncolon] [rel] {\approx\coloncolon\colonsep}
+\definemathcommand [colonsim]         [rel] {\coloncolon\colonsep\sim}
+\definemathcommand [simcoloncolon]    [rel] {\sim\coloncolon\colonsep}
+
+%D More integrals (AM):
+
+\def\dointkern{\mkern-6mu\mathchoice{\mkern-3mu}{}{}{}}
+
+\definemathcommand [iint]   {\repeatintegral\plusone  }
+\definemathcommand [iiint]  {\repeatintegral\plustwo  }
+\definemathcommand [iiiint] {\repeatintegral\plusthree}
+
+\def\repeatintegral#1%
+  {\scratchtoks\emptytoks
+   \let\dointlimits\donothing
+   \let\dodointlimits\intlimits
+   \dorecurse{#1}{\appendtoks \intop \dointkern \to \scratchtoks}
+   \appendtoks \intop \dointlimits \dodointlimits \to \scratchtoks
+   \edef\dodorepeatintegral{\the\scratchtoks}%
+   \futurelet\next\dorepeatintegral}
+
+%D If the \type{\limits} option is used after \type{\iint}, use
+%D \type{\mathop} and fudge the left hand space a bit to make the
+%D subscript visually centered.
+
+\def\dorepeatintegral
+   {\ifx\next\limits          \dointlimitcorrection \else
+    \ifx\next\displaylimits   \dointlimitcorrection \else
+    \ifx\next\nolimits        \donothing            \else
+    \ifcase\intlimitcode\else \dointlimitcorrection \fi\fi\fi\fi
+    \dodorepeatintegral}
+
+\def\dointlimitcorrection
+  {\mkern-7mu\mathchoice{\mkern-2mu}{}{}{}%
+   \mathop\bgroup
+     \mkern7mu\mathchoice{\mkern2mu}{}{}{}%
+     \let\dointlimits\egroup}
+
+\setupmathematics
+  [integral=nolimits]
+
+\protect \endinput
diff --git a/tex/context/base/math-tex.tex b/tex/context/base/math-tex.tex
deleted file mode 100644
index c833db956..000000000
--- a/tex/context/base/math-tex.tex
+++ /dev/null
@@ -1,718 +0,0 @@
-%D \module
-%D   [       file=math-tex,
-%D        version=2001.04.12,
-%D       subtitle=Plain Specials,
-%D         author={Hans Hagen, Taco Hoekwater \& Aditya Mahajan},
-%D           date=\currentdate,
-%D      copyright=\PRAGMA]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% beware: in mkiv we will do it differently
-
-\unprotect
-
-\mathcode`\ ="8000 \mathcode`\_="8000 \mathcode`\'="8000
-
-\definefamilysynonym [default] [calligraphic] [sy]
-\definefamilysynonym [default] [oldstyle]     [mi]
-\definefamilysynonym [default] [blackboard]   [mr]
-\definefamilysynonym [default] [gothic]       [mr]
-\definefamilysynonym [default] [fraktur]      [mr]
-
-\definefamilysynonym [default] [lcgreek]      [mi]
-\definefamilysynonym [default] [ucgreek]      [mr]
-\definefamilysynonym [default] [vargreek]     [mi]
-
-
-%D \macros
-%D   {\setupmathematics}
-%D
-%D Configuration for integrals. (If needed we can speed this up and make it
-%D installable; no processaction is needed then).
-
-\chardef\intlimitcode\zerocount  % 0 nolimits 1 displaylimits 2 limits
-
-\def\intlimits
-  {\ifcase\intlimitcode \nolimits \or \displaylimits \or \limits \fi}
-
-\def\setupmathematics
-  {\dosingleargument\dosetupmathematics}
-
-\def\dosetupmathematics[#1]%
-  {\getparameters[\??mo][#1]
-   \processaction[\@@mointegral]
-      [ nolimits=>\chardef\intlimitcode\zerocount,
-   displaylimits=>\chardef\intlimitcode\plusone,
-          limits=>\chardef\intlimitcode\plustwo]}
-
-%D \startbuffer
-%D   $\int_a^b f(x) dx$ and also
-%D   $\iint_a^b f(x,y) dxdy$, $\iiint_a^b f(x,y) dxdy$,
-%D   $\iiiint_a^b f(x) dx$
-%D   \startformula
-%D     \int_a^b f(x) dx \quad
-%D     \iint_a^b f(x) dx \quad
-%D     \iiint_a^b f(x) dx \quad
-%D     \iiiint_a^b f(x) dx \quad
-%D   \stopformula
-%D \stopbuffer
-%D
-%D Default: \getbuffer
-%D
-%D Displaylimits: \setupmathematics[integral=displaylimits] \getbuffer
-%D
-%D Limits: \setupmathematics[integral=limits] \getbuffer
-
-\startmathcollection [default]
-
-\definemathsymbol [alpha]   [nothing] [lcgreek] ["0B]
-\definemathsymbol [beta]    [nothing] [lcgreek] ["0C]
-\definemathsymbol [gamma]   [nothing] [lcgreek] ["0D]
-\definemathsymbol [delta]   [nothing] [lcgreek] ["0E]
-\definemathsymbol [epsilon] [nothing] [lcgreek] ["0F]
-\definemathsymbol [zeta]    [nothing] [lcgreek] ["10]
-\definemathsymbol [eta]     [nothing] [lcgreek] ["11]
-\definemathsymbol [theta]   [nothing] [lcgreek] ["12]
-\definemathsymbol [iota]    [nothing] [lcgreek] ["13]
-\definemathsymbol [kappa]   [nothing] [lcgreek] ["14]
-\definemathsymbol [lambda]  [nothing] [lcgreek] ["15]
-\definemathsymbol [mu]      [nothing] [lcgreek] ["16]
-\definemathsymbol [nu]      [nothing] [lcgreek] ["17]
-\definemathsymbol [xi]      [nothing] [lcgreek] ["18]
-\definemathsymbol [omicron] [nothing] [lcgreek] ["6F]
-\definemathsymbol [pi]      [nothing] [lcgreek] ["19]
-\definemathsymbol [rho]     [nothing] [lcgreek] ["1A]
-\definemathsymbol [sigma]   [nothing] [lcgreek] ["1B]
-\definemathsymbol [tau]     [nothing] [lcgreek] ["1C]
-\definemathsymbol [upsilon] [nothing] [lcgreek] ["1D]
-\definemathsymbol [phi]     [nothing] [lcgreek] ["1E]
-\definemathsymbol [chi]     [nothing] [lcgreek] ["1F]
-\definemathsymbol [psi]     [nothing] [lcgreek] ["20]
-\definemathsymbol [omega]   [nothing] [lcgreek] ["21]
-
-\stopmathcollection
-
-\startmathcollection [default]
-
-\definemathsymbol [varepsilon] [nothing] [vargreek] ["22]
-\definemathsymbol [vartheta]   [nothing] [vargreek] ["23]
-\definemathsymbol [varpi]      [nothing] [vargreek] ["24]
-\definemathsymbol [varrho]     [nothing] [vargreek] ["25]
-\definemathsymbol [varsigma]   [nothing] [vargreek] ["26]
-\definemathsymbol [varphi]     [nothing] [vargreek] ["27]
-
-\stopmathcollection
-
-\startmathcollection [default]
-
-\definemathsymbol [Alpha]   [alpha] [ucgreek] ["41] % A
-\definemathsymbol [Beta]    [alpha] [ucgreek] ["42] % B
-\definemathsymbol [Gamma]   [alpha] [ucgreek] ["00]
-\definemathsymbol [Delta]   [alpha] [ucgreek] ["01]
-\definemathsymbol [Epsilon] [alpha] [ucgreek] ["45] % E
-\definemathsymbol [Zeta]    [alpha] [ucgreek] ["5A] % Z
-\definemathsymbol [Eta]     [alpha] [ucgreek] ["48] % H
-\definemathsymbol [Theta]   [alpha] [ucgreek] ["02]
-\definemathsymbol [Iota]    [alpha] [ucgreek] ["49] % I
-\definemathsymbol [Kappa]   [alpha] [ucgreek] ["4B] % K
-\definemathsymbol [Lambda]  [alpha] [ucgreek] ["03]
-\definemathsymbol [Mu]      [alpha] [ucgreek] ["4D] % M
-\definemathsymbol [Nu]      [alpha] [ucgreek] ["4E] % N
-\definemathsymbol [Xi]      [alpha] [ucgreek] ["04]
-\definemathsymbol [Omicron] [alpha] [ucgreek] ["4F] % O
-\definemathsymbol [Pi]      [alpha] [ucgreek] ["05]
-\definemathsymbol [Rho]     [alpha] [ucgreek] ["52] % R
-\definemathsymbol [Sigma]   [alpha] [ucgreek] ["06]
-\definemathsymbol [Tau]     [alpha] [ucgreek] ["54] % T
-\definemathsymbol [Upsilon] [alpha] [ucgreek] ["07]
-\definemathsymbol [Phi]     [alpha] [ucgreek] ["08]
-\definemathsymbol [Chi]     [alpha] [ucgreek] ["58] % X
-\definemathsymbol [Psi]     [alpha] [ucgreek] ["09]
-\definemathsymbol [Omega]   [alpha] [ucgreek] ["0A]
-
-\stopmathcollection
-
-% The \mfunction macro is an alternative for \hbox with a
-% controlable font switch.
-
-\startmathcollection[default]
-
-\definemathcommand [arccos]  [nolop] {\mfunction{arccos}}
-\definemathcommand [arcsin]  [nolop] {\mfunction{arcsin}}
-\definemathcommand [arctan]  [nolop] {\mfunction{arctan}}
-\definemathcommand [arg]     [nolop] {\mfunction{arg}}
-\definemathcommand [cosh]    [nolop] {\mfunction{cosh}}
-\definemathcommand [cos]     [nolop] {\mfunction{cos}}
-\definemathcommand [coth]    [nolop] {\mfunction{coth}}
-\definemathcommand [cot]     [nolop] {\mfunction{cot}}
-\definemathcommand [csc]     [nolop] {\mfunction{csc}}
-\definemathcommand [deg]     [nolop] {\mfunction{deg}}
-\definemathcommand [det]     [limop] {\mfunction{det}}
-\definemathcommand [dim]     [nolop] {\mfunction{dim}}
-\definemathcommand [exp]     [nolop] {\mfunction{exp}}
-\definemathcommand [gcd]     [limop] {\mfunction{gcd}}
-\definemathcommand [hom]     [nolop] {\mfunction{hom}}
-\definemathcommand [inf]     [limop] {\mfunction{inf}}
-\definemathcommand [injlim]  [limop] {\mfunction{inj\,lim}}
-\definemathcommand [ker]     [nolop] {\mfunction{ker}}
-\definemathcommand [lg]      [nolop] {\mfunction{lg}}
-\definemathcommand [liminf]  [limop] {\mfunction{lim\,inf}}
-\definemathcommand [limsup]  [limop] {\mfunction{lim\,sup}}
-\definemathcommand [lim]     [limop] {\mfunction{lim}}
-\definemathcommand [ln]      [nolop] {\mfunction{ln}}
-\definemathcommand [log]     [nolop] {\mfunction{log}}
-\definemathcommand [median]  [limop] {\mfunction{median}}
-\definemathcommand [max]     [limop] {\mfunction{max}}
-\definemathcommand [min]     [limop] {\mfunction{min}}
-\definemathcommand [mod]     [limop] {\mfunction{mod}}
-\definemathcommand [div]     [limop] {\mfunction{div}}
-\definemathcommand [projlim] [limop] {\mfunction{proj\,lim}}
-\definemathcommand [Pr]      [limop] {\mfunction{Pr}}
-\definemathcommand [sec]     [nolop] {\mfunction{sec}}
-\definemathcommand [sinh]    [nolop] {\mfunction{sinh}}
-\definemathcommand [sin]     [nolop] {\mfunction{sin}}
-\definemathcommand [sup]     [limop] {\mfunction{sup}}
-\definemathcommand [tanh]    [nolop] {\mfunction{tanh}}
-\definemathcommand [tan]     [nolop] {\mfunction{tan}}
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathcommand [integers]       {\mfunction{Z}}
-\definemathcommand [reals]          {\mfunction{R}}
-\definemathcommand [rationals]      {\mfunction{Q}}
-\definemathcommand [naturalnumbers] {\mfunction{N}}
-\definemathcommand [complexes]      {\mfunction{C}}
-\definemathcommand [primes]         {\mfunction{P}}
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathcharacter [!]   [close] [mr] ["21]
-\definemathcharacter [(]   [open]  [mr] ["28]
-\definemathcharacter [)]   [close] [mr] ["29]
-\definemathcharacter [*]   [bin]   [sy] ["03]
-\definemathcharacter [+]   [bin]   [mr] ["2B]
-\definemathcharacter [,]   [punct] [mi] ["3B]
-\definemathcharacter [-]   [bin]   [sy] ["00]
-\definemathcharacter [.]   [ord]   [mi] ["3A]
-\definemathcharacter [/]   [ord]   [mi] ["3D]
-\definemathcharacter [:]   [rel]   [mr] ["3A]
-\definemathcharacter [;]   [punct] [mr] ["3B]
-\definemathcharacter [<]   [rel]   [mi] ["3C]
-\definemathcharacter [=]   [rel]   [mr] ["3D]
-\definemathcharacter [>]   [rel]   [mi] ["3E]
-\definemathcharacter [?]   [close] [mr] ["3F]
-\definemathcharacter [91]  [open]  [mr] ["5B] % [
-\definemathcharacter [92]  [ord]   [sy] ["6E] % \
-\definemathcharacter [93]  [close] [mr] ["5D] % ]
-\definemathcharacter [123] [open]  [sy] ["66] % {
-\definemathcharacter [124] [ord]   [sy] ["6A] % |
-\definemathcharacter [125] [close] [sy] ["67] % }
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathcharacter [(]   [nothing] [mr] ["28] [ex] ["00]
-\definemathcharacter [)]   [nothing] [mr] ["29] [ex] ["01]
-\definemathcharacter [91]  [nothing] [mr] ["5B] [ex] ["02] % [
-\definemathcharacter [93]  [nothing] [mr] ["5D] [ex] ["03] % ]
-\definemathcharacter [<]   [nothing] [sy] ["68] [ex] ["0A]
-\definemathcharacter [>]   [nothing] [sy] ["69] [ex] ["0B]
-\definemathcharacter [/]   [nothing] [mr] ["2F] [ex] ["0E]
-\definemathcharacter [124] [nothing] [sy] ["6A] [ex] ["0C] % |
-\definemathcharacter [92]  [nothing] [sy] ["6E] [ex] ["0F] % \
-
-\stopmathcollection
-
-\def\PLAINangle
-  {{\vbox{\ialign{$\mathsurround\zeropoint\scriptstyle##$\crcr
-    \not\mathrel{\mkern14mu}\crcr
-    \noalign{\nointerlineskip}
-    \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}}
-
-\startmathcollection[default]
-
-\definemathsymbol [aleph]    [nothing] [sy] ["40]
-\definemathsymbol [imath]    [nothing] [mi] ["7B]
-\definemathsymbol [jmath]    [nothing] [mi] ["7C]
-\definemathsymbol [ell]      [nothing] [mi] ["60]
-\definemathsymbol [wp]       [nothing] [mi] ["7D]
-\definemathsymbol [Re]       [nothing] [sy] ["3C]
-\definemathsymbol [Im]       [nothing] [sy] ["3D]
-\definemathsymbol [partial]  [nothing] [mi] ["40]
-\definemathsymbol [infty]    [nothing] [sy] ["31]
-\definemathsymbol [prime]    [nothing] [sy] ["30]
-\definemathsymbol [emptyset] [nothing] [sy] ["3B]
-\definemathsymbol [nabla]    [nothing] [sy] ["72]
-\definemathsymbol [top]      [nothing] [sy] ["3E]
-\definemathsymbol [bot]      [nothing] [sy] ["3F]
-
-\definemathcommand [hbar]  {{\mathchar'26\mkern-9muh}}
-\definemathcommand [surd]  {{\mathchar"1270}}          % ?
-\definemathcommand [angle] {\PLAINangle}
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathsymbol [triangle]    [ord] [sy] ["34]
-\definemathsymbol [forall]      [ord] [sy] ["38]
-\definemathsymbol [exists]      [ord] [sy] ["39]
-\definemathsymbol [neg]         [ord] [sy] ["3A]
-\definemathsymbol [flat]        [ord] [mi] ["5B]
-\definemathsymbol [natural]     [ord] [mi] ["5C]
-\definemathsymbol [sharp]       [ord] [mi] ["5D]
-\definemathsymbol [clubsuit]    [ord] [sy] ["7C]
-\definemathsymbol [diamondsuit] [ord] [sy] ["7D]
-\definemathsymbol [heartsuit]   [ord] [sy] ["7E]
-\definemathsymbol [spadesuit]   [ord] [sy] ["7F]
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathcommand [square] {\hbox{\hsmash{$\sqcup$}$\sqcap$}}
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathsymbol [coprod]    [op]  [ex] ["60]
-\definemathsymbol [bigvee]    [op]  [ex] ["57]
-\definemathsymbol [bigwedge]  [op]  [ex] ["56]
-\definemathsymbol [biguplus]  [op]  [ex] ["55]
-\definemathsymbol [bigcap]    [op]  [ex] ["54]
-\definemathsymbol [bigcup]    [op]  [ex] ["53]
-\definemathsymbol [intop]     [op]  [ex] ["52]
-\definemathsymbol [prod]      [op]  [ex] ["51]
-\definemathsymbol [sum]       [op]  [ex] ["50]
-\definemathsymbol [bigotimes] [op]  [ex] ["4E]
-\definemathsymbol [bigoplus]  [op]  [ex] ["4C]
-\definemathsymbol [bigodot]   [op]  [ex] ["4A]
-\definemathsymbol [ointop]    [op]  [ex] ["48]
-\definemathsymbol [bigsqcup]  [op]  [ex] ["46]
-\definemathsymbol [smallint]  [op]  [sy] ["73]
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathsymbol [triangleleft]    [bin] [mi] ["2F]
-\definemathsymbol [triangleright]   [bin] [mi] ["2E]
-\definemathsymbol [bigtriangleup]   [bin] [sy] ["34]
-\definemathsymbol [bigtriangledown] [bin] [sy] ["35]
-\definemathsymbol [wedge]           [bin] [sy] ["5E]
-\definemathsymbol [vee]             [bin] [sy] ["5F]
-\definemathsymbol [cap]             [bin] [sy] ["5C]
-\definemathsymbol [cup]             [bin] [sy] ["5B]
-\definemathsymbol [ddagger]         [bin] [sy] ["7A]
-\definemathsymbol [dagger]          [bin] [sy] ["79]
-\definemathsymbol [sqcap]           [bin] [sy] ["75]
-\definemathsymbol [sqcup]           [bin] [sy] ["74]
-\definemathsymbol [uplus]           [bin] [sy] ["5D]
-\definemathsymbol [amalg]           [bin] [sy] ["71]
-\definemathsymbol [diamond]         [bin] [sy] ["05]
-\definemathsymbol [bullet]          [bin] [sy] ["0F]
-\definemathsymbol [wr]              [bin] [sy] ["6F]
-\definemathsymbol [div]             [bin] [sy] ["04]
-\definemathsymbol [odot]            [bin] [sy] ["0C]
-\definemathsymbol [oslash]          [bin] [sy] ["0B]
-\definemathsymbol [otimes]          [bin] [sy] ["0A]
-\definemathsymbol [ominus]          [bin] [sy] ["09]
-\definemathsymbol [oplus]           [bin] [sy] ["08]
-\definemathsymbol [mp]              [bin] [sy] ["07]
-\definemathsymbol [pm]              [bin] [sy] ["06]
-\definemathsymbol [circ]            [bin] [sy] ["0E]
-\definemathsymbol [bigcirc]         [bin] [sy] ["0D]
-\definemathsymbol [setminus]        [bin] [sy] ["6E]
-\definemathsymbol [cdot]            [bin] [sy] ["01]
-\definemathsymbol [ast]             [bin] [sy] ["03]
-\definemathsymbol [times]           [bin] [sy] ["02]
-\definemathsymbol [star]            [bin] [mi] ["3F]
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathsymbol [propto]         [rel] [sy] ["2F]
-\definemathsymbol [sqsubseteq]     [rel] [sy] ["76]
-\definemathsymbol [sqsupseteq]     [rel] [sy] ["77]
-\definemathsymbol [parallel]       [rel] [sy] ["6B]
-\definemathsymbol [mid]            [rel] [sy] ["6A]
-\definemathsymbol [dashv]          [rel] [sy] ["61]
-\definemathsymbol [vdash]          [rel] [sy] ["60]
-\definemathsymbol [nearrow]        [rel] [sy] ["25]
-\definemathsymbol [searrow]        [rel] [sy] ["26]
-\definemathsymbol [nwarrow]        [rel] [sy] ["2D]
-\definemathsymbol [swarrow]        [rel] [sy] ["2E]
-\definemathsymbol [Leftrightarrow] [rel] [sy] ["2C]
-\definemathsymbol [Leftarrow]      [rel] [sy] ["28]
-\definemathsymbol [Rightarrow]     [rel] [sy] ["29]
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathcommand [lnot]   {\neg}
-\definemathcommand [int]    {\intop \intlimits}
-\definemathcommand [oint]   {\ointop\intlimits}
-\definemathcommand [land]   {\wedge}
-\definemathcommand [lor]    {\vee}
-\definemathcommand [neq]    {\not=}
-\definemathcommand [ne]     {\neq}
-\definemathcommand [le]     {\leq}
-\definemathcommand [ge]     {\geq}
-\definemathcommand [eq]     {=}
-\definemathcommand [gt]     {>}
-\definemathcommand [lt]     {<}
-\definemathcommand [gets]   {\leftarrow}
-\definemathcommand [owns]   {\ni}
-\definemathcommand [to]     {\rightarrow}
-\definemathcommand [mapsto] {\mapstochar\rightarrow}
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathsymbol [leq]              [rel] [sy] ["14]
-\definemathsymbol [geq]              [rel] [sy] ["15]
-\definemathsymbol [succ]             [rel] [sy] ["1F]
-\definemathsymbol [prec]             [rel] [sy] ["1E]
-\definemathsymbol [approx]           [rel] [sy] ["19]
-\definemathsymbol [succeq]           [rel] [sy] ["17]
-\definemathsymbol [preceq]           [rel] [sy] ["16]
-\definemathsymbol [supset]           [rel] [sy] ["1B]
-\definemathsymbol [subset]           [rel] [sy] ["1A]
-\definemathsymbol [supseteq]         [rel] [sy] ["13]
-\definemathsymbol [subseteq]         [rel] [sy] ["12]
-\definemathsymbol [in]               [rel] [sy] ["32]
-\definemathsymbol [ni]               [rel] [sy] ["33]
-\definemathsymbol [gg]               [rel] [sy] ["1D]
-\definemathsymbol [ll]               [rel] [sy] ["1C]
-\definemathsymbol [not]              [rel] [sy] ["36]
-\definemathsymbol [leftrightarrow]   [rel] [sy] ["24]
-\definemathsymbol [leftarrow]        [rel] [sy] ["20]
-\definemathsymbol [rightarrow]       [rel] [sy] ["21]
-\definemathsymbol [mapstochar]       [rel] [sy] ["37]
-\definemathsymbol [sim]              [rel] [sy] ["18]
-\definemathsymbol [simeq]            [rel] [sy] ["27]
-\definemathsymbol [perp]             [rel] [sy] ["3F]
-\definemathsymbol [equiv]            [rel] [sy] ["11]
-\definemathsymbol [asymp]            [rel] [sy] ["10]
-\definemathsymbol [smile]            [rel] [mi] ["5E]
-\definemathsymbol [frown]            [rel] [mi] ["5F]
-\definemathsymbol [leftharpoonup]    [rel] [mi] ["28]
-\definemathsymbol [leftharpoondown]  [rel] [mi] ["29]
-\definemathsymbol [rightharpoonup]   [rel] [mi] ["2A]
-\definemathsymbol [rightharpoondown] [rel] [mi] ["2B]
-\definemathsymbol [lhook]            [rel] [mi] ["2C]
-\definemathsymbol [rhook]            [rel] [mi] ["2D]
-
-\stopmathcollection
-
-\def\PLAINldots
-  {\ldotp\ldotp\ldotp}
-
-\def\PLAINcdots
-  {\cdotp\cdotp\cdotp}
-
-\def\PLAINvdots
-  {\vbox{\baselineskip.4\bodyfontsize\lineskiplimit\zeropoint
-   \kern.6\bodyfontsize\hbox{.}\hbox{.}\hbox{.}}}
-
-\def\PLAINddots
-   {\mkern1mu\raise.7\bodyfontsize\vbox{\kern.7\bodyfontsize\hbox{.}}\mkern2mu
-    \raise.4\bodyfontsize\hbox{.}\mkern2mu\raise.1\bodyfontsize\hbox{.}\mkern1mu}
-
-\startmathcollection[default]
-
-\definemathcommand [hookrightarrow] {\lhook\joinrel\rightarrow}
-\definemathcommand [hookleftarrow]  {\leftarrow\joinrel\rhook}
-\definemathcommand [bowtie]         {\mathrel\triangleright\joinrel\mathrel\triangleleft}
-\definemathcommand [models]         {\mathrel|\joinrel=}
-\definemathcommand [iff]            {\;\Longleftrightarrow\;}
-
-\definemathsymbol [ldotp] [punct] [mi] ["3A]
-\definemathsymbol [cdotp] [punct] [sy] ["01]
-\definemathsymbol [colon] [punct] [mr] ["3A]
-
-\definemathcommand [ldots] [inner]   {\PLAINldots}
-\definemathcommand [cdots] [inner]   {\PLAINcdots}
-\definemathcommand [vdots] [nothing] {\PLAINvdots}
-\definemathcommand [ddots] [inner]   {\PLAINddots}
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathsymbol [acute]     [accent] [mr] ["13]
-\definemathsymbol [grave]     [accent] [mr] ["12]
-\definemathsymbol [ddot]      [accent] [mr] ["7F]
-\definemathsymbol [tilde]     [accent] [mr] ["7E]
-\definemathsymbol [mathring]  [accent] [mr] ["17]
-\definemathsymbol [bar]       [accent] [mr] ["16]
-\definemathsymbol [breve]     [accent] [mr] ["15]
-\definemathsymbol [check]     [accent] [mr] ["14]
-\definemathsymbol [hat]       [accent] [mr] ["5E]
-\definemathsymbol [vec]       [accent] [mi] ["7E] % [ord]
-\definemathsymbol [dot]       [accent] [mr] ["5F]
-\definemathsymbol [widetilde] [accent] [ex] ["65] % [ord]
-\definemathsymbol [widehat]   [accent] [ex] ["62] % [ord]
-
-\stopmathcollection
-
-\startmathcollection[default]
-
-\definemathsymbol [lmoustache]  [open]    [ex] ["7A] [ex] ["40]
-\definemathsymbol [rmoustache]  [close]   [ex] ["7B] [ex] ["41]
-\definemathsymbol [lgroup]      [open]    [mr] ["28] [ex] ["3A] % ?
-\definemathsymbol [rgroup]      [close]   [mr] ["29] [ex] ["3B] % ?
-\definemathsymbol [arrowvert]   [nothing] [sy] ["6A] [ex] ["3C]
-\definemathsymbol [Arrowvert]   [nothing] [sy] ["6B] [ex] ["3D]
-\definemathsymbol [bracevert]   [nothing] [ex] ["3E] % ?
-\definemathsymbol [Vert]        [nothing] [sy] ["6B] [ex] ["0D]
-\definemathsymbol [vert]        [nothing] [sy] ["6A] [ex] ["0C]
-\definemathsymbol [uparrow]     [rel]     [sy] ["22] [ex] ["78]
-\definemathsymbol [downarrow]   [rel]     [sy] ["23] [ex] ["79]
-\definemathsymbol [updownarrow] [rel]     [sy] ["6C] [ex] ["3F]
-\definemathsymbol [Uparrow]     [rel]     [sy] ["2A] [ex] ["7E]
-\definemathsymbol [Downarrow]   [rel]     [sy] ["2B] [ex] ["7F]
-\definemathsymbol [Updownarrow] [rel]     [sy] ["6D] [ex] ["77]
-\definemathsymbol [backslash]   [nothing] [sy] ["6E] [ex] ["0F]
-\definemathsymbol [langle]      [open]    [sy] ["68] [ex] ["0A]
-\definemathsymbol [rangle]      [close]   [sy] ["69] [ex] ["0B]
-\definemathsymbol [lbrace]      [open]    [sy] ["66] [ex] ["08]
-\definemathsymbol [rbrace]      [close]   [sy] ["67] [ex] ["09]
-\definemathsymbol [lceil]       [open]    [sy] ["64] [ex] ["06]
-\definemathsymbol [rceil]       [close]   [sy] ["65] [ex] ["07]
-\definemathsymbol [lfloor]      [open]    [sy] ["62] [ex] ["04]
-\definemathsymbol [rfloor]      [close]   [sy] ["63] [ex] ["05]
-
-\definemathsymbol [sqrt]        [radical] [sy] ["70] [ex] ["70]
-
-\stopmathcollection
-
-%D By request:
-
-\startmathcollection[default]
-
-\definemathsymbol [lvert] [open]  [sy] ["6A] [ex] ["0C]
-\definemathsymbol [rvert] [close] [sy] ["6A] [ex] ["0C]
-
-\definemathsymbol [lVert] [open]  [sy] ["6B] [ex] ["0D]
-\definemathsymbol [rVert] [close] [sy] ["6B] [ex] ["0D]
-
-\stopmathcollection
-
-%D For brooks:
-%D
-%D \starttyping
-%D $\sqrt[3]{10}$
-%D \stoptyping
-
-\ifx\normalsqrt\undefined  \let\normalsqrt\sqrt \fi      % just set to: \dohandlemathtoken {sqrt}
-
-\def\notsosqrt[#1]{\root#1\of}
-
-\unexpanded\def\sqrt{\doifnextoptionalelse\notsosqrt\normalsqrt}
-
-\def\PLAINbig {\@@dobig{0.85}}
-\def\PLAINBig {\@@dobig{1.15}}
-\def\PLAINbigg{\@@dobig{1.45}}
-\def\PLAINBigg{\@@dobig{1.75}}
-
-\startrawmathcollection [default]
-
-\definemathcommand [bigl]  [open]  [one] {\big}
-\definemathcommand [bigm]  [rel]   [one] {\big}
-\definemathcommand [bigr]  [close] [one] {\big}
-\definemathcommand [Bigl]  [open]  [one] {\Big}
-\definemathcommand [Bigm]  [rel]   [one] {\Big}
-\definemathcommand [Bigr]  [close] [one] {\Big}
-\definemathcommand [biggl] [open]  [one] {\bigg}
-\definemathcommand [biggm] [rel]   [one] {\bigg}
-\definemathcommand [biggr] [close] [one] {\bigg}
-\definemathcommand [Biggl] [open]  [one] {\Bigg}
-\definemathcommand [Biggm] [rel]   [one] {\Bigg}
-\definemathcommand [Biggr] [close] [one] {\Bigg}
-
-\definemathcommand [big]  {\PLAINbig}
-\definemathcommand [Big]  {\PLAINBig}
-\definemathcommand [bigg] {\PLAINbigg}
-\definemathcommand [Bigg] {\PLAINBigg}
-
-\stoprawmathcollection
-
-\startmathcollection[default]
-
-\definemathsymbol [dag]  [box] [sy] ["79]
-\definemathsymbol [ddag] [box] [sy] ["7A]
-\definemathsymbol [S]    [box] [sy] ["78]
-\definemathsymbol [P]    [box] [sy] ["7B]
-\definemathsymbol [Orb]  [box] [sy] ["0D]
-
-\stopmathcollection
-
-\def\PLAINroot#1#2%
-  {\setbox\zerocount\hbox{$\mathsurround\zeropoint#1\sqrt{#2}$}\dimen@\ht\zerocount
-   \advance\dimen@-\dp\zerocount
-   \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu\box\zerocount}
-
-\def\PLAINmatrix#1%
-  {\null\,\vcenter{\normalbaselines\mathsurround\zeropoint
-   \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
-   \mathstrut\crcr\noalign{\kern-\baselineskip}
-   #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
-
-\startrawmathcollection[default]
-
-\definemathcommand [mathstrut] {\vphantom{(}}
-\definemathcommand [joinrel]   {\mathrel{\mkern-3mu}}
-\definemathcommand [r@@t]      {\PLAINroot}
-\definemathcommand [matrix]    {\PLAINmatrix}
-
-\definemathcommand [over]      {\normalover} % hack, to do
-
-\stoprawmathcollection
-
-\def\{{\lbrace}
-\def\}{\rbrace}
-
-%def\bbd{\fam\purefamily{blackboard}}
-%def\cal{\fam\purefamily{calfamily}}
-
-\def\mit{\fam\purefamily{mitfamily}}
-
-\def\Bbb{\blackboard} % conforming amstex
-
-\startmathcollection[default]
-
-  \definemathsymbol [mathperiod] [ord]   [mi] ["3A]
-  \definemathsymbol [textperiod] [punct] [mi] ["3A]
-
-  \definemathsymbol [mathcomma]  [ord]   [mi] ["3B]
-  \definemathsymbol [textcomma]  [punct] [mi] ["3B]
-
-\stopmathcollection
-
-\definemathpunctuation . mathperiod textperiod
-\definemathpunctuation , mathcomma  textcomma
-
-%D The following colon related definitions are provided by Aditya
-%D Mahajan who derived them from \type {mathtools.sty} and \type
-%D {colonequals.sty}.
-
-%D \macros
-%D   {centercolon, colonminus, minuscolon, colonequals, equalscolon,
-%D    colonapprox, approxcolon, colonsim, simcolon, coloncolon,
-%D    coloncolonminus, minuscoloncolon, coloncolonequals,
-%D    equalscoloncolon, coloncolonapprox, approxcoloncolon,
-%D    colonsim, simcoloncolon}
-%D
-%D In $a := b$ the colon is not vertically centered with the equal
-%D to. Also the distance between colon and equal to is a bit large.
-%D So, we define a vertically centered colon \tex {centercolon} and
-%D a few macros for colon and double colon relation symbols.
-%D
-%D \startlines
-%D \formula {A \centercolon       B}
-%D \formula {A \colonminus        B}
-%D \formula {A \minuscolon        B}
-%D \formula {A \colonequals       B}
-%D \formula {A \equalscolon       B}
-%D \formula {A \colonapprox       B}
-%D \formula {A \approxcolon       B}
-%D \formula {A \colonsim          B}
-%D \formula {A \simcolon          B}
-%D \formula {A \coloncolon        B}
-%D \formula {A \coloncolonminus   B}
-%D \formula {A \minuscoloncolon   B}
-%D \formula {A \coloncolonequals  B}
-%D \formula {A \equalscoloncolon  B}
-%D \formula {A \coloncolonapprox  B}
-%D \formula {A \approxcoloncolon  B}
-%D \formula {A \colonsim          B}
-%D \formula {A \simcoloncolon     B}
-%D \stoplines
-
-%D The next macros take care of the space between the colon and the
-%D relation symbol.
-
-\definemathcommand  [colonsep]        {\mkern-1.2mu}
-\definemathcommand  [doublecolonsep]  {\mkern-0.9mu}
-
-%D The next macro vertically centeres its contents.
-
-\def\@center@math#1%
-  {\vcenter{\hbox{$\mathsurround\zeropoint#1$}}}
-
-\def\@center@colon
-  {\mathpalette\@center@math{\colon}}
-
-%D Now we define all the colon relations.
-
-\definemathcommand [centercolon]      [rel] {\@center@colon}
-\definemathcommand [colonminus]       [rel] {\centercolon\colonsep\mathrel{-}}
-\definemathcommand [minuscolon]       [rel] {\mathrel{-}\colonsep\centercolon}
-\definemathcommand [colonequals]      [rel] {\centercolon\colonsep=}
-\definemathcommand [equalscolon]      [rel] {=\centercolon\colonsep}
-\definemathcommand [colonapprox]      [rel] {\centercolon\colonsep\approx}
-\definemathcommand [approxcolon]      [rel] {\approx\centercolon\colonsep}
-\definemathcommand [colonsim]         [rel] {\centercolon\colonsep\sim}
-\definemathcommand [simcolon]         [rel] {\sim\centercolon\colonsep}
-
-\definemathcommand [coloncolon]       [rel] {\centercolon\doublecolonsep\centercolon}
-\definemathcommand [coloncolonminus]  [rel] {\coloncolon\colonsep\mathrel{-}}
-\definemathcommand [minuscoloncolon]  [rel] {\mathrel{-}\colonsep\coloncolon}
-\definemathcommand [coloncolonequals] [rel] {\coloncolon\colonsep=}
-\definemathcommand [equalscoloncolon] [rel] {=\coloncolon\colonsep}
-\definemathcommand [coloncolonapprox] [rel] {\coloncolon\colonsep\approx}
-\definemathcommand [approxcoloncolon] [rel] {\approx\coloncolon\colonsep}
-\definemathcommand [colonsim]         [rel] {\coloncolon\colonsep\sim}
-\definemathcommand [simcoloncolon]    [rel] {\sim\coloncolon\colonsep}
-
-%D More integrals (AM):
-
-\def\dointkern{\mkern-6mu\mathchoice{\mkern-3mu}{}{}{}}
-
-\definemathcommand [iint]   {\repeatintegral\plusone  }
-\definemathcommand [iiint]  {\repeatintegral\plustwo  }
-\definemathcommand [iiiint] {\repeatintegral\plusthree}
-
-\def\repeatintegral#1%
-  {\scratchtoks\emptytoks
-   \let\dointlimits\donothing
-   \let\dodointlimits\intlimits
-   \dorecurse{#1}{\appendtoks \intop \dointkern \to \scratchtoks}
-   \appendtoks \intop \dointlimits \dodointlimits \to \scratchtoks
-   \edef\dodorepeatintegral{\the\scratchtoks}%
-   \futurelet\next\dorepeatintegral}
-
-%D If the \type{\limits} option is used after \type{\iint}, use
-%D \type{\mathop} and fudge the left hand space a bit to make the
-%D subscript visually centered.
-
-\def\dorepeatintegral
-   {\ifx\next\limits          \dointlimitcorrection \else
-    \ifx\next\displaylimits   \dointlimitcorrection \else
-    \ifx\next\nolimits        \donothing            \else
-    \ifcase\intlimitcode\else \dointlimitcorrection \fi\fi\fi\fi
-    \dodorepeatintegral}
-
-\def\dointlimitcorrection
-  {\mkern-7mu\mathchoice{\mkern-2mu}{}{}{}%
-   \mathop\bgroup
-     \mkern7mu\mathchoice{\mkern2mu}{}{}{}%
-     \let\dointlimits\egroup}
-
-\setupmathematics
-  [integral=nolimits]
-
-\protect \endinput
diff --git a/tex/context/base/math-tim.mkii b/tex/context/base/math-tim.mkii
new file mode 100644
index 000000000..3b9aea103
--- /dev/null
+++ b/tex/context/base/math-tim.mkii
@@ -0,0 +1,371 @@
+%D \module
+%D   [       file=math-tim,
+%D        version=2001.04.12,
+%D          title=\CONTEXT\ Math Macros,
+%D       subtitle=Mathtime Specials,
+%D         author={Hans Hagen \& Taco Hoekwater},
+%D           date=\currentdate,
+%D      copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\endinput % i will clean this up after taco has gone over it
+
+%D With thanks to Berthold Horn from YandY for providing me
+%D evaluation copies of the MathTimePlus fonts.
+
+% version 0 : Michael Spivak
+% version 1 : Taco Hoekwater
+% version 2 : Hans Hagen
+% version 3 : etc etc etc
+
+\unprotect
+
+%D We use the predefined spare families \type {\mcfam} and
+%D \type {\mdfam}.
+
+\let\cafam\mcfam \let\hexcafam\hexmcfam
+\let\gbfam\mdfam \let\hexgbfam\hexmdfam
+\let\gkfam\mdfam \let\hexgkfam\hexmdfam
+
+% Why is this needed?
+
+% \font\tenmd  =mtgu at 10pt
+% \font\sevenmd=mtgu at 7.6pt
+% \font\fivemd =mtgu at 6pt
+% \font\tenmc  =mtms at 10pt
+% \font\sevenmc=mtms at 7.6pt
+% \font\fivemc =mtms at 6pt
+%
+% \textfont        \mcfam\tenmc   \textfont        \mdfam\tenmd
+% \scriptfont      \mcfam\sevenmc \scriptfont      \mdfam\sevenmd
+% \scriptscriptfont\mcfam\fivemc  \scriptscriptfont\mdfam\fivemd
+
+% \addtocommalist{gk}\familylist
+% \addtocommalist{gb}\familylist
+%
+% \defineinterfaceconstant {ca} {ca} % boohoo!
+% \defineinterfaceconstant {gk} {gk} % boohoo!
+% \defineinterfaceconstant {gb} {gb} % boohoo!
+
+% \definealternativestyle[script]   [\ca][\ca]
+% \definealternativestyle[greek]    [\gk][\gk]
+% \definealternativestyle[boldgreek][\gb][\gb]
+
+% \definebodyfont
+%   [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt] [rm]
+%   [ca=mtms  sa 1,
+%    gk=mtgu  sa 1,
+%    gb=mtgub sa 1]
+
+%D Since a font size is a rather fuzzy thing, it will be no
+%D surprise that the Math Times fonts have different specs
+%D than the Computer Modern Roman fonts.
+%D
+%D \starttabulate[|Bl|c|c|c|c|c|c|c|c|c|c|]
+%D \NC Computer Modern\NC
+%D     5  \NC6  \NC7  \NC8  \NC9  \NC10  \NC11  \NC12  \NC14  \NC18\NC\NR
+%D \NC Math Times     \NC
+%D     6.0\NC6.8\NC7.6\NC8.4\NC9.2\NC10.0\NC10.8\NC11.6\NC13.2\NC--\NC\NR
+%D \stoptabulate
+%D
+%D The following definitions presume the existence of \type
+%D {tio} and \type {tibio} font alternatives. Definitions for
+%D \type {\tf.} etc and \type {\sc} are left as they are.
+
+%D moved code
+
+%D The next lines set up coding dependant versions of math
+%D accents (for \type {texnansi} of course). These are needed
+%D in commands like \type {\bf} and \type {\it} (which use the
+%D text font encoding) a opposed to \type {_no spec_} and
+%D \type {mi} that use the math font encoding. This stuff
+%D should be made more general!
+
+% \daghex, \ddaghex and \dothex were wrong in my version of mtmacs
+
+\def\daghex  {86}  % to do
+\def\ddaghex {87}
+\def\Shex    {A7}
+\def\Phex    {B6}
+\def\barhex  {16}
+\def\gravehex{12}
+\def\acutehex{13}
+\def\checkhex{14}
+\def\brevehex{15}
+\def\hathex  {5E}
+\def\dothex  {05}
+\def\tildehex{7E}
+\def\ddothex {7F}
+
+%D The \type {mtex} fonts need a recalculation of \type
+%D {\p@renwd}, which in \CONTEXT\ is done automatically.
+
+%D The following definitions are mostly copied from the file
+%D \type {mtmacs.tex}, which banner said:
+%D
+%D \starttyping
+%D MTMACS.TEX VERSION 1.1.1 (1996 Dec 8)
+%D COPYRIGHT (C) 1992, 1993, 1996 BY THE TEXPLORATORS CORPORATION
+%D ALL RIGHTS RESERVED
+%D \stoptyping
+%D
+%D We reformatted the macros and changed a few bits and
+%D pieces. A further cleanup with regards to the scratch
+%D registers will be done later.
+
+\mathchardef\Gamma         = "0130
+\mathchardef\Delta         = "0131
+\mathchardef\Theta         = "0132
+\mathchardef\Lambda        = "0133
+\mathchardef\Xi            = "0134
+\mathchardef\Pi            = "0135
+\mathchardef\Sigma         = "0136
+\mathchardef\Upsilon       = "0137
+\mathchardef\Phi           = "0138
+\mathchardef\Psi           = "0139
+\mathchardef\Omega         = "017F
+\mathchardef\varGamma      = "0100
+\mathchardef\varDelta      = "0101
+\mathchardef\varTheta      = "0102
+\mathchardef\varLambda     = "0103
+\mathchardef\varXi         = "0104
+\mathchardef\varPi         = "0105
+\mathchardef\varSigma      = "0106
+\mathchardef\varUpsilon    = "0107
+\mathchardef\varPhi        = "0108
+\mathchardef\varPsi        = "0109
+\mathchardef\varOmega      = "010A
+\mathchardef\varkappa      = "017E
+
+\mathchardef\ldotp         = "613A
+
+\mathchardef\triangleleft  = "2247
+\mathchardef\triangleright = "2246
+\mathchardef\comp          = "2242
+
+\mathchardef\Relbar        = "3248
+\mathchardef\dagger        = "20\daghex    % to do
+\mathchardef\ddagger       = "20\ddaghex   % to do
+\mathchardef\dotacc        = "0250
+
+\mathcode`\( = "412E
+\mathcode`\) = "512F
+\mathcode`\. = "013A
+\mathcode`\, = "613B
+\mathcode`\+ = "2243
+\mathcode`\= = "3244
+\mathcode`\; = "6249
+
+\delcode `\( = "12E300
+\delcode `\) = "12F301
+
+\let\mit=\undefined % to do
+
+\def\vec{\mathaccent"0245 }
+\def\t#1{{\edef\next{\the\font}\the\textfont2\accent"41\next#1}}
+
+% fam equals -1 unless the user has said something
+% like \rm (cf. the texbook page 290)
+
+\def\ifdefaultfamelse#1#2%
+  {\ifnum\fam=\minusone\mathaccent#1\else\mathaccent#2\fi}
+
+\let\noaccents@\relax
+
+\def\grave  {\ifdefaultfamelse{"024A}{"70\gravehex}}
+\def\acute  {\ifdefaultfamelse{"024B}{"70\acutehex}}
+\def\check  {\ifdefaultfamelse{"024C}{"70\checkhex}}
+\def\breve  {\ifdefaultfamelse{"024D}{"70\brevehex}}
+\def\bar    {\ifdefaultfamelse{"024E}{"70\barhex  }}
+\def\hat    {\ifdefaultfamelse{"024F}{"70\hathex  }}
+\def\dot    {\ifdefaultfamelse{"0250}{"70\dothex  }}
+\def\tilde  {\ifdefaultfamelse{"0251}{"70\tildehex}}
+\def\ddot   {\ifdefaultfamelse{"0252}{"70\ddothex }}
+
+\def\widebar{\mathaccent"0253 }
+
+\def\mathhexbox@#1#2#3%
+  {\relax
+   \ifmmode
+     \mathpalette{}{\mathsurround\zeropoint\rm\mathchar"#1#2#3}%
+   \else
+     \leavevmode
+     \hbox{$\mathsurround\zeropoint\rm\mathchar"#1#2#3$}%
+   \fi}
+
+\def\dag {\edef\next@{0\daghex }\expandafter\mathhexbox@\next@}
+\def\ddag{\edef\next@{0\ddaghex}\expandafter\mathhexbox@\next@}
+
+\def\S{\edef\next@{0\Shex}\expandafter\mathhexbox@\next@}
+\def\P{\edef\next@{0\Phex}\expandafter\mathhexbox@\next@}
+
+\def\vdots%
+  {\vbox
+     {\baselineskip4\points
+      \lineskiplimit\zeropoint
+      \kern6\points\hbox{$\mathsurround\zeropoint.$}\hbox{$\mathsurround\zeropoint.$}\hbox{$\mathsurround\zeropoint.$}}}
+
+\def\ddots%
+  {\mathinner
+     {\mkern1mu
+      \raise7\points\vbox{\kern 7\points\hbox{$\mathsurround\zeropoint.$}}\mkern2mu
+      \raise4\points\hbox{$\mathsurround\zeropoint.$}\mkern2mu
+      \raise \points\hbox{$\mathsurround\zeropoint.$}\mkern1mu}}
+
+\def\hbar
+  {{\mathchoice
+      {\hbox{\lower.07em \hbox{$\mathchar"\barhex$}}}
+      {\hbox{\lower.07em \hbox{$\mathchar"\barhex$}}}
+      {\hbox{\lower.049em\hbox{$\scriptstyle\mathchar"\barhex$}}}
+      {\hbox{\lower.035em\hbox{$\scriptscriptstyle\mathchar"\barhex$}}}%
+  \mkern-6.3muh}}
+
+\def\angle%
+  {{\vbox{\ialign{$\mathsurround\zeropoint\scriptstyle##$\crcr
+      \not\mathrel{\mkern14mu}\crcr
+      \noalign{\nointerlineskip}
+      \mkern2.5mu\leaders\hrule height.48\points\hfill\mkern2.5mu\crcr}}}}
+
+\newdimen\amstexex
+
+\amstexex = .2326ex
+
+\def\varinjlim%
+  {\mathop{\vtop{\ialign{##\crcr
+     \hfil\the\textfont\zerocount lim\hfil\crcr
+     \noalign{\nointerlineskip}\rightarrowfill\crcr
+     \noalign{\nointerlineskip\kern-\amstexex}\crcr}}}}
+
+\def\varprojlim%
+  {\mathop{\vtop{\ialign{##\crcr
+     \hfil\the\textfont\zerocount lim\hfil\crcr
+     \noalign{\nointerlineskip}\leftarrowfill\crcr
+     \noalign{\nointerlineskip\kern-\amstexex}\crcr}}}}
+
+\def\varliminf{\mathop{\underbar  {lim}}} % context-ified
+\def\varlimsup{\mathop{\overstrike{lim}}} % context-ified
+
+\def\spdot   {^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount   .}}}}
+\def\spddot  {^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount  ..}}}}
+\def\spdddot {^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount ...}}}}
+\def\spddddot{^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount....}}}}
+
+%D Here some code is merged in order to save strings.
+
+\def\domultidot#1#2%
+  {\setbox0\hbox{$#1#2$}%
+   \setbox2\hbox{$#1\infty$}%
+   \dimen0\ht2
+   \ifdim\ht0<\dimen0 \dimen0\ht0 \fi
+   \setbox2\hbox{$#1#2\mathchar"012D$}%
+   \dimen2\wd2
+   \advance\dimen2-\wd0
+   \setbox0\hbox{$#1\rhook$}%
+   \advance\dimen2-\wd0
+   \vbox
+     {\offinterlineskip
+      \ialign{\hfil$#1##$\hfil\cr
+        \kern\dimen2\dotacc\mkern-2.5mu\dotacc\mkern-2.5mu\dotacc\thirddot\cr
+        \noalign{\vskip-\dimen0}%
+        #2\cr}}}
+
+\def\dddot%
+  {\def\thirddot{}%
+   \mathpalette\domultidot}
+
+\def\ddddot%
+  {\def\thirddot{\mkern-2.5mu\dotacc}%
+   \mathpalette\domultidot}
+
+\newcount\uproot@
+\newcount\leftroot@
+
+\def\nonmatherr#1%
+  {\errmessage{\noexpand#1allowed only in math mode}}
+
+\def\uproot#1%
+  {\relax
+   \ifmmode
+     \uproot@#1\relax
+   \else
+     \nonmatherr\uproot
+   \fi}
+
+\def\leftroot#1%
+  {\relax
+   \ifmmode
+     \leftroot@#1\relax
+   \else
+     \nonmatherr\leftroot
+   \fi}
+
+\def\root#1\of#2%
+  {\setbox\rootbox=\hbox{$\mathsurround\zeropoint\scriptscriptstyle{#1}$}%
+   \mathpalette\r@@t{#2}}
+
+\def\r@@t#1#2%
+  {\setbox\zerocount\hbox{$\uproot@\zerocount\leftroot\zerocount\mathsurround\zeropoint#1\sqrt{#2}$}%
+   \dimen@\ht\zerocount\advance\dimen@-\dp\zerocount
+   \dimen@ii\dimen@
+   \ifdim\dimen@>30\points \advance\dimen@ii-16\points \else
+   \ifdim\dimen@>24\points \advance\dimen@ii -8\points \else
+   \ifdim\dimen@>18\points \advance\dimen@ii -6\points \else
+   \ifdim\dimen@>12\points \advance\dimen@ii -4\points \else
+   \ifdim\dimen@>10\points \advance\dimen@ii -2\points \fi\fi\fi\fi\fi
+   \setbox\plustwo=\hbox{$\mathsurround\zeropoint#1\mskip\uproot@ mu$}%
+   \advance\dimen@ii by1.667\wd\plustwo
+   \mkern-\leftroot@ mu\mkern5mu\raise.6\dimen@ii\copy\rootbox
+   \mkern-8mu\mkern\leftroot@ mu\box\zerocount\leftroot\zerocount\uproot\zerocount}
+
+\def\space@.{\futurelet\space@\relax} \space@. % really needed ?
+
+\def\jadjust%
+  {\mkern-\plustwo mu}
+
+%D For the moment the following code is left unchanged. It is
+%D not used anyway.
+
+\newif\ifsubscriptcorrection \subscriptcorrectionfalse
+
+\ifsubscriptcorrection
+
+  \expandafter\let\csname subscript character \string_\endcsname_
+
+  \catcode`\_=\active
+
+  \def_%
+    {\ifmmode
+       \expandafter\sb@
+     \else
+       \expandafter\csname subscript character \string_\endcsname
+     \fi}
+
+  \let\sb_
+
+  \ifnum\catcode`\^^A=8 \catcode`\^^A\active\let^^A_\fi
+
+  \def\sb@#1%
+    {\csname subscript character \string_\endcsname
+     {\futurelet\next\sb@@#1}}
+
+  \def\sb@@%
+    {\ifx\next\space@
+       \def\next@. %
+         {\futurelet\next\sb@@}%
+     \else
+       \def\next@.%
+         {\ifx\next j%
+            \mkern-\plustwo mu\else
+          \ifx\next f%
+            \mkern-\plustwo mu\else
+          \ifx\next p%
+            \mkern-\plusone mu\fi\fi\fi}%
+     \fi
+     \next@.}
+
+\fi
+
+\protect
diff --git a/tex/context/base/math-tim.tex b/tex/context/base/math-tim.tex
deleted file mode 100644
index 3b9aea103..000000000
--- a/tex/context/base/math-tim.tex
+++ /dev/null
@@ -1,371 +0,0 @@
-%D \module
-%D   [       file=math-tim,
-%D        version=2001.04.12,
-%D          title=\CONTEXT\ Math Macros,
-%D       subtitle=Mathtime Specials,
-%D         author={Hans Hagen \& Taco Hoekwater},
-%D           date=\currentdate,
-%D      copyright=\PRAGMA]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\endinput % i will clean this up after taco has gone over it
-
-%D With thanks to Berthold Horn from YandY for providing me
-%D evaluation copies of the MathTimePlus fonts.
-
-% version 0 : Michael Spivak
-% version 1 : Taco Hoekwater
-% version 2 : Hans Hagen
-% version 3 : etc etc etc
-
-\unprotect
-
-%D We use the predefined spare families \type {\mcfam} and
-%D \type {\mdfam}.
-
-\let\cafam\mcfam \let\hexcafam\hexmcfam
-\let\gbfam\mdfam \let\hexgbfam\hexmdfam
-\let\gkfam\mdfam \let\hexgkfam\hexmdfam
-
-% Why is this needed?
-
-% \font\tenmd  =mtgu at 10pt
-% \font\sevenmd=mtgu at 7.6pt
-% \font\fivemd =mtgu at 6pt
-% \font\tenmc  =mtms at 10pt
-% \font\sevenmc=mtms at 7.6pt
-% \font\fivemc =mtms at 6pt
-%
-% \textfont        \mcfam\tenmc   \textfont        \mdfam\tenmd
-% \scriptfont      \mcfam\sevenmc \scriptfont      \mdfam\sevenmd
-% \scriptscriptfont\mcfam\fivemc  \scriptscriptfont\mdfam\fivemd
-
-% \addtocommalist{gk}\familylist
-% \addtocommalist{gb}\familylist
-%
-% \defineinterfaceconstant {ca} {ca} % boohoo!
-% \defineinterfaceconstant {gk} {gk} % boohoo!
-% \defineinterfaceconstant {gb} {gb} % boohoo!
-
-% \definealternativestyle[script]   [\ca][\ca]
-% \definealternativestyle[greek]    [\gk][\gk]
-% \definealternativestyle[boldgreek][\gb][\gb]
-
-% \definebodyfont
-%   [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt] [rm]
-%   [ca=mtms  sa 1,
-%    gk=mtgu  sa 1,
-%    gb=mtgub sa 1]
-
-%D Since a font size is a rather fuzzy thing, it will be no
-%D surprise that the Math Times fonts have different specs
-%D than the Computer Modern Roman fonts.
-%D
-%D \starttabulate[|Bl|c|c|c|c|c|c|c|c|c|c|]
-%D \NC Computer Modern\NC
-%D     5  \NC6  \NC7  \NC8  \NC9  \NC10  \NC11  \NC12  \NC14  \NC18\NC\NR
-%D \NC Math Times     \NC
-%D     6.0\NC6.8\NC7.6\NC8.4\NC9.2\NC10.0\NC10.8\NC11.6\NC13.2\NC--\NC\NR
-%D \stoptabulate
-%D
-%D The following definitions presume the existence of \type
-%D {tio} and \type {tibio} font alternatives. Definitions for
-%D \type {\tf.} etc and \type {\sc} are left as they are.
-
-%D moved code
-
-%D The next lines set up coding dependant versions of math
-%D accents (for \type {texnansi} of course). These are needed
-%D in commands like \type {\bf} and \type {\it} (which use the
-%D text font encoding) a opposed to \type {_no spec_} and
-%D \type {mi} that use the math font encoding. This stuff
-%D should be made more general!
-
-% \daghex, \ddaghex and \dothex were wrong in my version of mtmacs
-
-\def\daghex  {86}  % to do
-\def\ddaghex {87}
-\def\Shex    {A7}
-\def\Phex    {B6}
-\def\barhex  {16}
-\def\gravehex{12}
-\def\acutehex{13}
-\def\checkhex{14}
-\def\brevehex{15}
-\def\hathex  {5E}
-\def\dothex  {05}
-\def\tildehex{7E}
-\def\ddothex {7F}
-
-%D The \type {mtex} fonts need a recalculation of \type
-%D {\p@renwd}, which in \CONTEXT\ is done automatically.
-
-%D The following definitions are mostly copied from the file
-%D \type {mtmacs.tex}, which banner said:
-%D
-%D \starttyping
-%D MTMACS.TEX VERSION 1.1.1 (1996 Dec 8)
-%D COPYRIGHT (C) 1992, 1993, 1996 BY THE TEXPLORATORS CORPORATION
-%D ALL RIGHTS RESERVED
-%D \stoptyping
-%D
-%D We reformatted the macros and changed a few bits and
-%D pieces. A further cleanup with regards to the scratch
-%D registers will be done later.
-
-\mathchardef\Gamma         = "0130
-\mathchardef\Delta         = "0131
-\mathchardef\Theta         = "0132
-\mathchardef\Lambda        = "0133
-\mathchardef\Xi            = "0134
-\mathchardef\Pi            = "0135
-\mathchardef\Sigma         = "0136
-\mathchardef\Upsilon       = "0137
-\mathchardef\Phi           = "0138
-\mathchardef\Psi           = "0139
-\mathchardef\Omega         = "017F
-\mathchardef\varGamma      = "0100
-\mathchardef\varDelta      = "0101
-\mathchardef\varTheta      = "0102
-\mathchardef\varLambda     = "0103
-\mathchardef\varXi         = "0104
-\mathchardef\varPi         = "0105
-\mathchardef\varSigma      = "0106
-\mathchardef\varUpsilon    = "0107
-\mathchardef\varPhi        = "0108
-\mathchardef\varPsi        = "0109
-\mathchardef\varOmega      = "010A
-\mathchardef\varkappa      = "017E
-
-\mathchardef\ldotp         = "613A
-
-\mathchardef\triangleleft  = "2247
-\mathchardef\triangleright = "2246
-\mathchardef\comp          = "2242
-
-\mathchardef\Relbar        = "3248
-\mathchardef\dagger        = "20\daghex    % to do
-\mathchardef\ddagger       = "20\ddaghex   % to do
-\mathchardef\dotacc        = "0250
-
-\mathcode`\( = "412E
-\mathcode`\) = "512F
-\mathcode`\. = "013A
-\mathcode`\, = "613B
-\mathcode`\+ = "2243
-\mathcode`\= = "3244
-\mathcode`\; = "6249
-
-\delcode `\( = "12E300
-\delcode `\) = "12F301
-
-\let\mit=\undefined % to do
-
-\def\vec{\mathaccent"0245 }
-\def\t#1{{\edef\next{\the\font}\the\textfont2\accent"41\next#1}}
-
-% fam equals -1 unless the user has said something
-% like \rm (cf. the texbook page 290)
-
-\def\ifdefaultfamelse#1#2%
-  {\ifnum\fam=\minusone\mathaccent#1\else\mathaccent#2\fi}
-
-\let\noaccents@\relax
-
-\def\grave  {\ifdefaultfamelse{"024A}{"70\gravehex}}
-\def\acute  {\ifdefaultfamelse{"024B}{"70\acutehex}}
-\def\check  {\ifdefaultfamelse{"024C}{"70\checkhex}}
-\def\breve  {\ifdefaultfamelse{"024D}{"70\brevehex}}
-\def\bar    {\ifdefaultfamelse{"024E}{"70\barhex  }}
-\def\hat    {\ifdefaultfamelse{"024F}{"70\hathex  }}
-\def\dot    {\ifdefaultfamelse{"0250}{"70\dothex  }}
-\def\tilde  {\ifdefaultfamelse{"0251}{"70\tildehex}}
-\def\ddot   {\ifdefaultfamelse{"0252}{"70\ddothex }}
-
-\def\widebar{\mathaccent"0253 }
-
-\def\mathhexbox@#1#2#3%
-  {\relax
-   \ifmmode
-     \mathpalette{}{\mathsurround\zeropoint\rm\mathchar"#1#2#3}%
-   \else
-     \leavevmode
-     \hbox{$\mathsurround\zeropoint\rm\mathchar"#1#2#3$}%
-   \fi}
-
-\def\dag {\edef\next@{0\daghex }\expandafter\mathhexbox@\next@}
-\def\ddag{\edef\next@{0\ddaghex}\expandafter\mathhexbox@\next@}
-
-\def\S{\edef\next@{0\Shex}\expandafter\mathhexbox@\next@}
-\def\P{\edef\next@{0\Phex}\expandafter\mathhexbox@\next@}
-
-\def\vdots%
-  {\vbox
-     {\baselineskip4\points
-      \lineskiplimit\zeropoint
-      \kern6\points\hbox{$\mathsurround\zeropoint.$}\hbox{$\mathsurround\zeropoint.$}\hbox{$\mathsurround\zeropoint.$}}}
-
-\def\ddots%
-  {\mathinner
-     {\mkern1mu
-      \raise7\points\vbox{\kern 7\points\hbox{$\mathsurround\zeropoint.$}}\mkern2mu
-      \raise4\points\hbox{$\mathsurround\zeropoint.$}\mkern2mu
-      \raise \points\hbox{$\mathsurround\zeropoint.$}\mkern1mu}}
-
-\def\hbar
-  {{\mathchoice
-      {\hbox{\lower.07em \hbox{$\mathchar"\barhex$}}}
-      {\hbox{\lower.07em \hbox{$\mathchar"\barhex$}}}
-      {\hbox{\lower.049em\hbox{$\scriptstyle\mathchar"\barhex$}}}
-      {\hbox{\lower.035em\hbox{$\scriptscriptstyle\mathchar"\barhex$}}}%
-  \mkern-6.3muh}}
-
-\def\angle%
-  {{\vbox{\ialign{$\mathsurround\zeropoint\scriptstyle##$\crcr
-      \not\mathrel{\mkern14mu}\crcr
-      \noalign{\nointerlineskip}
-      \mkern2.5mu\leaders\hrule height.48\points\hfill\mkern2.5mu\crcr}}}}
-
-\newdimen\amstexex
-
-\amstexex = .2326ex
-
-\def\varinjlim%
-  {\mathop{\vtop{\ialign{##\crcr
-     \hfil\the\textfont\zerocount lim\hfil\crcr
-     \noalign{\nointerlineskip}\rightarrowfill\crcr
-     \noalign{\nointerlineskip\kern-\amstexex}\crcr}}}}
-
-\def\varprojlim%
-  {\mathop{\vtop{\ialign{##\crcr
-     \hfil\the\textfont\zerocount lim\hfil\crcr
-     \noalign{\nointerlineskip}\leftarrowfill\crcr
-     \noalign{\nointerlineskip\kern-\amstexex}\crcr}}}}
-
-\def\varliminf{\mathop{\underbar  {lim}}} % context-ified
-\def\varlimsup{\mathop{\overstrike{lim}}} % context-ified
-
-\def\spdot   {^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount   .}}}}
-\def\spddot  {^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount  ..}}}}
-\def\spdddot {^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount ...}}}}
-\def\spddddot{^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount....}}}}
-
-%D Here some code is merged in order to save strings.
-
-\def\domultidot#1#2%
-  {\setbox0\hbox{$#1#2$}%
-   \setbox2\hbox{$#1\infty$}%
-   \dimen0\ht2
-   \ifdim\ht0<\dimen0 \dimen0\ht0 \fi
-   \setbox2\hbox{$#1#2\mathchar"012D$}%
-   \dimen2\wd2
-   \advance\dimen2-\wd0
-   \setbox0\hbox{$#1\rhook$}%
-   \advance\dimen2-\wd0
-   \vbox
-     {\offinterlineskip
-      \ialign{\hfil$#1##$\hfil\cr
-        \kern\dimen2\dotacc\mkern-2.5mu\dotacc\mkern-2.5mu\dotacc\thirddot\cr
-        \noalign{\vskip-\dimen0}%
-        #2\cr}}}
-
-\def\dddot%
-  {\def\thirddot{}%
-   \mathpalette\domultidot}
-
-\def\ddddot%
-  {\def\thirddot{\mkern-2.5mu\dotacc}%
-   \mathpalette\domultidot}
-
-\newcount\uproot@
-\newcount\leftroot@
-
-\def\nonmatherr#1%
-  {\errmessage{\noexpand#1allowed only in math mode}}
-
-\def\uproot#1%
-  {\relax
-   \ifmmode
-     \uproot@#1\relax
-   \else
-     \nonmatherr\uproot
-   \fi}
-
-\def\leftroot#1%
-  {\relax
-   \ifmmode
-     \leftroot@#1\relax
-   \else
-     \nonmatherr\leftroot
-   \fi}
-
-\def\root#1\of#2%
-  {\setbox\rootbox=\hbox{$\mathsurround\zeropoint\scriptscriptstyle{#1}$}%
-   \mathpalette\r@@t{#2}}
-
-\def\r@@t#1#2%
-  {\setbox\zerocount\hbox{$\uproot@\zerocount\leftroot\zerocount\mathsurround\zeropoint#1\sqrt{#2}$}%
-   \dimen@\ht\zerocount\advance\dimen@-\dp\zerocount
-   \dimen@ii\dimen@
-   \ifdim\dimen@>30\points \advance\dimen@ii-16\points \else
-   \ifdim\dimen@>24\points \advance\dimen@ii -8\points \else
-   \ifdim\dimen@>18\points \advance\dimen@ii -6\points \else
-   \ifdim\dimen@>12\points \advance\dimen@ii -4\points \else
-   \ifdim\dimen@>10\points \advance\dimen@ii -2\points \fi\fi\fi\fi\fi
-   \setbox\plustwo=\hbox{$\mathsurround\zeropoint#1\mskip\uproot@ mu$}%
-   \advance\dimen@ii by1.667\wd\plustwo
-   \mkern-\leftroot@ mu\mkern5mu\raise.6\dimen@ii\copy\rootbox
-   \mkern-8mu\mkern\leftroot@ mu\box\zerocount\leftroot\zerocount\uproot\zerocount}
-
-\def\space@.{\futurelet\space@\relax} \space@. % really needed ?
-
-\def\jadjust%
-  {\mkern-\plustwo mu}
-
-%D For the moment the following code is left unchanged. It is
-%D not used anyway.
-
-\newif\ifsubscriptcorrection \subscriptcorrectionfalse
-
-\ifsubscriptcorrection
-
-  \expandafter\let\csname subscript character \string_\endcsname_
-
-  \catcode`\_=\active
-
-  \def_%
-    {\ifmmode
-       \expandafter\sb@
-     \else
-       \expandafter\csname subscript character \string_\endcsname
-     \fi}
-
-  \let\sb_
-
-  \ifnum\catcode`\^^A=8 \catcode`\^^A\active\let^^A_\fi
-
-  \def\sb@#1%
-    {\csname subscript character \string_\endcsname
-     {\futurelet\next\sb@@#1}}
-
-  \def\sb@@%
-    {\ifx\next\space@
-       \def\next@. %
-         {\futurelet\next\sb@@}%
-     \else
-       \def\next@.%
-         {\ifx\next j%
-            \mkern-\plustwo mu\else
-          \ifx\next f%
-            \mkern-\plustwo mu\else
-          \ifx\next p%
-            \mkern-\plusone mu\fi\fi\fi}%
-     \fi
-     \next@.}
-
-\fi
-
-\protect
diff --git a/tex/context/base/math-uni.mkii b/tex/context/base/math-uni.mkii
new file mode 100644
index 000000000..e8fd3f05d
--- /dev/null
+++ b/tex/context/base/math-uni.mkii
@@ -0,0 +1,237 @@
+%D \module
+%D   [       file=math-uni,
+%D        version=2005.06.11,
+%D          title=\CONTEXT\ Math Macros,
+%D       subtitle=unicode support,
+%D         author={Nikolai Weibull \& Taco Hoekwater},
+%D           date=\currentdate,
+%D      copyright=PRAGMA]
+
+\unprotect
+
+% needed for unic-032 % TH
+
+\startmathcollection[default]
+
+  \definemathcommand [unic@doubleverticalline]      {\mathord{\parallel}}
+  \definemathcommand [unic@doublelowline]           {\underline{\textunderscore}}
+
+  \definemathcommand [unic@doubleprime]             {''}
+  \definemathcommand [unic@tripleprime]             {'''}
+
+  \definemathcommand [unic@reverseddoubleprime]     {\mathord{\backprime\backprime}}
+  \definemathcommand [unic@reversedtripleprime]     {\mathord{\backprime\backprime\backprime}}
+
+  \definemathcommand [unic@fractionslash]           {\vulgarfraction{}{}}
+  \definemathcommand [unic@lowasterisk]             {\mathord{\lower-.2em\hbox{$\ast$}}}
+
+  \definemathcommand [unic@functionapplication]     {\mathop{}}
+  \definemathcommand [unic@invisibletimes]          {\mathbin{}}
+  \definemathcommand [unic@invisibleseparator]      {\mathpunct{}}
+
+\stopmathcollection
+
+% needed for unic-033 % TH
+
+\def\unic@vulgarfraction#1#2%
+  {\hbox
+     {\high{{\tfx\it #1}\kern -.2em}%
+      \symbol[vulgarfraction]%
+      \kern -.2em\low{{\tfx\it #2}}}}
+
+\startmathcollection[default]
+
+  \definemathcommand [unic@accountof]                 {\unic@vulgarfraction{a}{c}}
+  \definemathcommand [unic@addressedtothesubject]     {\unic@vulgarfraction{a}{s}}
+  \definemathcommand [unic@doublestruckC]             {{\Bbb C}}
+  \definemathcommand [unic@degreecelsius]             {{\textdegree \tf C}}
+  \definemathcommand [unic@centrelinesymbol]          {\unknownchar}
+  \definemathcommand [unic@careof]                    {\unic@vulgarfraction{c}{o}}
+  \definemathcommand [unic@cadauna]                   {\unic@vulgarfraction{c}{u}}
+  \definemathcommand [unic@eulerconstant]             {{\rm e}}
+  \definemathcommand [unic@scruple]                   {\unknownchar}
+  \definemathcommand [unic@degreefahrenheit]          {{\textdegree \tf F}}
+  \definemathcommand [unic@scriptg]                   {\unknownchar}
+  \definemathcommand [unic@scriptH]                   {{\cal H}}
+  \definemathcommand [unic@blackletterH]              {{\fraktur H}}
+  \definemathcommand [unic@doublestruckH]             {{\Bbb H}}
+  \definemathcommand [unic@planckconstant]            {h}
+  \definemathcommand [unic@planckconstantovertwopi]   {\hslash}
+  \definemathcommand [unic@scriptI]                   {{\cal I}}
+  \definemathcommand [unic@blackletterI]              {{\fraktur I}}
+  \definemathcommand [unic@scriptL]                   {{\cal L}}
+  \definemathcommand [unic@scriptl]                   {\ell}
+  \definemathcommand [unic@lbbarsymbol]               {\unknownchar}
+  \definemathcommand [unic@doublestruckN]             {{\Bbb N}}
+  \definemathcommand [unic@numerosign]                {\hbox{\symbol[numero]}}
+  \definemathcommand [unic@soundrecordingcopyright]   {\encircled{{\tfx P}}}
+  \definemathcommand [unic@scriptP]                   {{\cal P}}
+  \definemathcommand [unic@doublestruckP]             {{\Bbb P}}
+  \definemathcommand [unic@doublestruckQ]             {{\Bbb Q}}
+  \definemathcommand [unic@scriptR]                   {{\cal R}}
+  \definemathcommand [unic@blackletterR]              {{\fraktur R}}
+  \definemathcommand [unic@doublestruckR]             {{\Bbb R}}
+  \definemathcommand [unic@prescriptiontake]          {\unknownchar}
+  \definemathcommand [unic@response]                  {\unknownchar}
+  \definemathcommand [unic@servicemark]               {\high{\txx SM}}
+  \definemathcommand [unic@telephonesign]             {\high{\txx TEL}}
+  \definemathcommand [unic@trademarksign]             {\trademark}
+  \definemathcommand [unic@versickle]                 {\unknownchar}
+  \definemathcommand [unic@doublestruckZ]             {{\Bbb Z}}
+  \definemathcommand [unic@ouncesign]                 {\unknownchar}
+  \definemathcommand [unic@ohmsign]                   {\Omega}
+  \definemathcommand [unic@invertedohmsign]           {\rotate[\c!rotation=180]{\Omega}}
+  \definemathcommand [unic@blackletterZ]              {{\fraktur Z}}
+  \definemathcommand [unic@turnedgreekletteriota]     {\rotate[\c!rotation=180]{\iota}}
+  \definemathcommand [unic@kelvinsign]                {{\tf K}}
+  \definemathcommand [unic@angstromsign]              {\Angstrom}
+  \definemathcommand [unic@scriptB]                   {{\cal B}}
+  \definemathcommand [unic@blackletterC]              {{\fraktur C}}
+  \definemathcommand [unic@estimatedsymbol]           {\unknownchar}
+  \definemathcommand [unic@scripte]                   {\unknownchar}
+  \definemathcommand [unic@scriptE]                   {{\cal E}}
+  \definemathcommand [unic@scriptF]                   {{\cal F}}
+  \definemathcommand [unic@turnedF]                   {\rotate[\c!rotation=180]{{\tf F}}}
+  \definemathcommand [unic@scriptM]                   {{\cal M}}
+  \definemathcommand [unic@scripto]                   {\unknownchar}
+
+  \definemathcommand [unic@informationsource]         {{\bf i}}
+  \definemathcommand [unic@rotatedQ]                  {\rotate[\c!rotation=90]{{\tf Q}}}
+  \definemathcommand [unic@facsimilesign]             {\unknownchar}
+  \definemathcommand [unic@doublestruckpi]            {\pi}%{\unknownchar}
+  \definemathcommand [unic@doublestruckgamma]         {\gamma}%{\unknownchar}
+  \definemathcommand [unic@doublestruckGamma]         {\Gamma}%{\unknownchar}
+  \definemathcommand [unic@doublestruckPi]            {\Pi}%{\unknownchar}
+  \definemathcommand [unic@doublestrucknarysummation] {\unknownchar}
+  \definemathcommand [unic@turnedsansserifG]          {\rotate[\c!rotation=180]{{\ss G}}}
+  \definemathcommand [unic@turnedsansserifL]          {\rotate[\c!rotation=180]{{\ss L}}}
+  \definemathcommand [unic@reversedsansserifL]        {\mirror{{\ss L}}}
+  \definemathcommand [unic@turnedsansserifY]          {\rotate[\c!rotation=180]{{\ss Y}}}
+  \definemathcommand [unic@doublestruckitalicD]       {D}%{\unknownchar}
+  \definemathcommand [unic@doublestruckitalicd]       {d}%{\unknownchar}
+  \definemathcommand [unic@doublestruckitalice]       {e}%{\unknownchar}
+  \definemathcommand [unic@doublestruckitalici]       {i}%{\unknownchar}
+  \definemathcommand [unic@doublestruckitalicj]       {j}%{\unknownchar}
+  \definemathcommand [unic@propertyline]              {\unknownchar}
+  \definemathcommand [unic@turnedampersand]           {\rotate[\c!rotation=180]{\&}}
+  \definemathcommand [unic@persign]                   {\unknownchar}
+
+  \definemathcommand [unic@fractiononethird]          {\vulgarfraction{1}{3}}
+  \definemathcommand [unic@fractiontwothirds]         {\vulgarfraction{2}{3}}
+  \definemathcommand [unic@fractiononefifth]          {\vulgarfraction{1}{5}}
+  \definemathcommand [unic@fractiontwofifths]         {\vulgarfraction{2}{5}}
+  \definemathcommand [unic@fractionthreefifths]       {\vulgarfraction{3}{5}}
+  \definemathcommand [unic@fractionfourfifths]        {\vulgarfraction{4}{5}}
+  \definemathcommand [unic@fractiononesixth]          {\vulgarfraction{1}{6}}
+  \definemathcommand [unic@fractionfivesixths]        {\vulgarfraction{5}{6}}
+  \definemathcommand [unic@fractiononeeighth]         {\vulgarfraction{1}{8}}
+  \definemathcommand [unic@fractionthreeeighths]      {\vulgarfraction{3}{8}}
+  \definemathcommand [unic@fractionfiveeighths]       {\vulgarfraction{5}{8}}
+  \definemathcommand [unic@fractionseveneighths]      {\vulgarfraction{7}{8}}
+  \definemathcommand [unic@fractionnumeratorone]      {\vulgarfraction{1}{}}
+  \definemathcommand [unic@romannumeralOne]           {{\tf I}}
+  \definemathcommand [unic@romannumeralTwo]           {{\tf II}}
+  \definemathcommand [unic@romannumeralThree]         {{\tf III}}
+  \definemathcommand [unic@romannumeralFour]          {{\tf IV}}
+  \definemathcommand [unic@romannumeralFive]          {{\tf V}}
+  \definemathcommand [unic@romannumeralSix]           {{\tf VI}}
+  \definemathcommand [unic@romannumeralSeven]         {{\tf VII}}
+  \definemathcommand [unic@romannumeralEight]         {{\tf VIII}}
+  \definemathcommand [unic@romannumeralNine]          {{\tf IX}}
+  \definemathcommand [unic@romannumeralTen]           {{\tf X}}
+  \definemathcommand [unic@romannumeralEleven]        {{\tf XI}}
+  \definemathcommand [unic@romannumeralTwelve]        {{\tf XII}}
+  \definemathcommand [unic@romannumeralFifty]         {{\tf L}}
+  \definemathcommand [unic@romannumeralOnehundred]    {{\tf C}}
+  \definemathcommand [unic@romannumeralFivehundred]   {{\tf D}}
+  \definemathcommand [unic@romannumeralOnethousand]   {{\tf M}}
+  \definemathcommand [unic@romannumeralone]           {{\tf i}}
+  \definemathcommand [unic@romannumeraltwo]           {{\tf ii}}
+  \definemathcommand [unic@romannumeralthree]         {{\tf iii}}
+  \definemathcommand [unic@romannumeralfour]          {{\tf iv}}
+  \definemathcommand [unic@romannumeralfive]          {{\tf v}}
+  \definemathcommand [unic@romannumeralsix]           {{\tf vi}}
+  \definemathcommand [unic@romannumeralseven]         {{\tf vii}}
+  \definemathcommand [unic@romannumeraleight]         {{\tf viii}}
+  \definemathcommand [unic@romannumeralnine]          {{\tf ix}}
+  \definemathcommand [unic@romannumeralten]           {{\tf x}}
+  \definemathcommand [unic@romannumeraleleven]        {{\tf xi}}
+  \definemathcommand [unic@romannumeraltwelve]        {{\tf xii}}
+  \definemathcommand [unic@romannumeralfifty]         {{\tf l}}
+  \definemathcommand [unic@romannumeralonehundred]    {{\tf c}}
+  \definemathcommand [unic@romannumeralfivehundred]   {{\tf d}}
+  \definemathcommand [unic@romannumeralonethousand]   {{\tf m}}
+  \definemathcommand [unic@romannumeralonethousandCD] {\unknownchar}
+  \definemathcommand [unic@romannumeralfivethousand]  {\unknownchar}
+  \definemathcommand [unic@romannumeraltenthousand]   {\unknownchar}
+  \definemathcommand [unic@romannumeralreversedonehundred] {\mirror{C}}
+
+\stopmathcollection
+
+% needed for unic-033 % NW
+
+\startmathcollection[default]
+
+  \definemathcommand [unic@leftarrowtobar]            {\mapstochar\leftarrow}
+
+\stopmathcollection
+
+% needed for unic-034 % NW
+
+\startmathcollection[default]
+
+  \definemathcommand [unic@in]                    {\in}
+  \definemathcommand [unic@nin]                   {\not\in}
+  \definemathcommand [unic@nni]                   {\not\ni}
+  \definemathcommand [unic@minus]                 {-}
+  \definemathcommand [unic@divisionslash]         {/}
+  \definemathcommand [unic@sqrt]                  {\sqrt{}}
+  \definemathcommand [unic@cubesqrt]              {\root 3 \of {}}
+  \definemathcommand [unic@fourthsqrt]            {\root 4 \of {}}
+  \definemathcommand [unic@divides]       [op]    {|} % TODO
+  \definemathcommand [unic@ndivides]      [rel]   {\mathop{\not|}} % TODO: horrible
+  \definemathcommand [unic@cap]                   {\cap}
+  \definemathcommand [unic@dblint]                {\int\!\!\!\int}
+  \definemathcommand [unic@triint]                {\int\!\!\!\int\!\!\!\int}
+  \definemathcommand [unic@ratio]         [rel]   {:}
+  \definemathcommand [unic@proportion]    [rel]   {::}
+  \definemathcommand [unic@excess]        [op]    {-\!\!:}
+  \definemathcommand [unic@geomprop]      [op]    {:\!\!\!-\!\!\!:}
+  \definemathcommand [unic@homothetic]    [op]    {\sim\!\!\!:}
+  \definemathcommand [unic@nsimeq]                {\not\simeq}
+  \definemathcommand [unic@cong]                  {\cong}
+  \definemathcommand [unic@napproxeq]             {\not\approxeq}
+  \definemathcommand [unic@napprox]               {\not\approx}
+  \definemathcommand [unic@doteq]                 {\doteq}
+  \definemathcommand [unic@correspondsto]         {\buildrel \frown \over =}
+  \definemathcommand [unic@estimates]             {\buildrel \wedge \over =}
+  \definemathcommand [unic@equiangularto]         {\buildrel \vee \over =}
+  \definemathcommand [unic@stareq]                {\buildrel \star \over =}
+  \definemathcommand [unic@eqbydef]               {\buildrel \rm def \over =}
+  \definemathcommand [unic@measuredby]            {\buildrel \rm m \over =}
+  \definemathcommand [unic@questionedeq]          {\buildrel \rm ? \over =}
+  \definemathcommand [unic@nequiv]                {\not\equiv}
+  \definemathcommand [unic@nasymp]                {\not\asymp}
+  \definemathcommand [unic@nlesssim]              {\not\lesssim}
+  \definemathcommand [unic@ngtrsim]               {\not\gtrsim}
+  \definemathcommand [unic@nlessgtr]              {\not\lessgtr}
+  \definemathcommand [unic@ngtrless]              {\not\gtrless}
+  \definemathcommand [unic@nsubset]               {\not\subset}
+  \definemathcommand [unic@nsupset]               {\not\supset}
+  \definemathcommand [unic@nsqsubseteq]           {\not\sqsubseteq}
+  \definemathcommand [unic@nsqsupseteq]           {\not\sqsupseteq}
+
+\stopmathcollection
+
+% needed for unic-039 % NW
+
+\startmathcollection[default]
+
+  \definemathcommand [unic@Lbracket]  [open]  {[\![}
+  \definemathcommand [unic@Rbracket]  [close] {]\!]}
+  \definemathcommand [unic@Langle]    [open]  {\langle\!\langle}
+  \definemathcommand [unic@Rangle]    [close] {\rangle\!\rangle}
+
+\stopmathcollection
+
+\protect \endinput
diff --git a/tex/context/base/math-uni.tex b/tex/context/base/math-uni.tex
deleted file mode 100644
index e8fd3f05d..000000000
--- a/tex/context/base/math-uni.tex
+++ /dev/null
@@ -1,237 +0,0 @@
-%D \module
-%D   [       file=math-uni,
-%D        version=2005.06.11,
-%D          title=\CONTEXT\ Math Macros,
-%D       subtitle=unicode support,
-%D         author={Nikolai Weibull \& Taco Hoekwater},
-%D           date=\currentdate,
-%D      copyright=PRAGMA]
-
-\unprotect
-
-% needed for unic-032 % TH
-
-\startmathcollection[default]
-
-  \definemathcommand [unic@doubleverticalline]      {\mathord{\parallel}}
-  \definemathcommand [unic@doublelowline]           {\underline{\textunderscore}}
-
-  \definemathcommand [unic@doubleprime]             {''}
-  \definemathcommand [unic@tripleprime]             {'''}
-
-  \definemathcommand [unic@reverseddoubleprime]     {\mathord{\backprime\backprime}}
-  \definemathcommand [unic@reversedtripleprime]     {\mathord{\backprime\backprime\backprime}}
-
-  \definemathcommand [unic@fractionslash]           {\vulgarfraction{}{}}
-  \definemathcommand [unic@lowasterisk]             {\mathord{\lower-.2em\hbox{$\ast$}}}
-
-  \definemathcommand [unic@functionapplication]     {\mathop{}}
-  \definemathcommand [unic@invisibletimes]          {\mathbin{}}
-  \definemathcommand [unic@invisibleseparator]      {\mathpunct{}}
-
-\stopmathcollection
-
-% needed for unic-033 % TH
-
-\def\unic@vulgarfraction#1#2%
-  {\hbox
-     {\high{{\tfx\it #1}\kern -.2em}%
-      \symbol[vulgarfraction]%
-      \kern -.2em\low{{\tfx\it #2}}}}
-
-\startmathcollection[default]
-
-  \definemathcommand [unic@accountof]                 {\unic@vulgarfraction{a}{c}}
-  \definemathcommand [unic@addressedtothesubject]     {\unic@vulgarfraction{a}{s}}
-  \definemathcommand [unic@doublestruckC]             {{\Bbb C}}
-  \definemathcommand [unic@degreecelsius]             {{\textdegree \tf C}}
-  \definemathcommand [unic@centrelinesymbol]          {\unknownchar}
-  \definemathcommand [unic@careof]                    {\unic@vulgarfraction{c}{o}}
-  \definemathcommand [unic@cadauna]                   {\unic@vulgarfraction{c}{u}}
-  \definemathcommand [unic@eulerconstant]             {{\rm e}}
-  \definemathcommand [unic@scruple]                   {\unknownchar}
-  \definemathcommand [unic@degreefahrenheit]          {{\textdegree \tf F}}
-  \definemathcommand [unic@scriptg]                   {\unknownchar}
-  \definemathcommand [unic@scriptH]                   {{\cal H}}
-  \definemathcommand [unic@blackletterH]              {{\fraktur H}}
-  \definemathcommand [unic@doublestruckH]             {{\Bbb H}}
-  \definemathcommand [unic@planckconstant]            {h}
-  \definemathcommand [unic@planckconstantovertwopi]   {\hslash}
-  \definemathcommand [unic@scriptI]                   {{\cal I}}
-  \definemathcommand [unic@blackletterI]              {{\fraktur I}}
-  \definemathcommand [unic@scriptL]                   {{\cal L}}
-  \definemathcommand [unic@scriptl]                   {\ell}
-  \definemathcommand [unic@lbbarsymbol]               {\unknownchar}
-  \definemathcommand [unic@doublestruckN]             {{\Bbb N}}
-  \definemathcommand [unic@numerosign]                {\hbox{\symbol[numero]}}
-  \definemathcommand [unic@soundrecordingcopyright]   {\encircled{{\tfx P}}}
-  \definemathcommand [unic@scriptP]                   {{\cal P}}
-  \definemathcommand [unic@doublestruckP]             {{\Bbb P}}
-  \definemathcommand [unic@doublestruckQ]             {{\Bbb Q}}
-  \definemathcommand [unic@scriptR]                   {{\cal R}}
-  \definemathcommand [unic@blackletterR]              {{\fraktur R}}
-  \definemathcommand [unic@doublestruckR]             {{\Bbb R}}
-  \definemathcommand [unic@prescriptiontake]          {\unknownchar}
-  \definemathcommand [unic@response]                  {\unknownchar}
-  \definemathcommand [unic@servicemark]               {\high{\txx SM}}
-  \definemathcommand [unic@telephonesign]             {\high{\txx TEL}}
-  \definemathcommand [unic@trademarksign]             {\trademark}
-  \definemathcommand [unic@versickle]                 {\unknownchar}
-  \definemathcommand [unic@doublestruckZ]             {{\Bbb Z}}
-  \definemathcommand [unic@ouncesign]                 {\unknownchar}
-  \definemathcommand [unic@ohmsign]                   {\Omega}
-  \definemathcommand [unic@invertedohmsign]           {\rotate[\c!rotation=180]{\Omega}}
-  \definemathcommand [unic@blackletterZ]              {{\fraktur Z}}
-  \definemathcommand [unic@turnedgreekletteriota]     {\rotate[\c!rotation=180]{\iota}}
-  \definemathcommand [unic@kelvinsign]                {{\tf K}}
-  \definemathcommand [unic@angstromsign]              {\Angstrom}
-  \definemathcommand [unic@scriptB]                   {{\cal B}}
-  \definemathcommand [unic@blackletterC]              {{\fraktur C}}
-  \definemathcommand [unic@estimatedsymbol]           {\unknownchar}
-  \definemathcommand [unic@scripte]                   {\unknownchar}
-  \definemathcommand [unic@scriptE]                   {{\cal E}}
-  \definemathcommand [unic@scriptF]                   {{\cal F}}
-  \definemathcommand [unic@turnedF]                   {\rotate[\c!rotation=180]{{\tf F}}}
-  \definemathcommand [unic@scriptM]                   {{\cal M}}
-  \definemathcommand [unic@scripto]                   {\unknownchar}
-
-  \definemathcommand [unic@informationsource]         {{\bf i}}
-  \definemathcommand [unic@rotatedQ]                  {\rotate[\c!rotation=90]{{\tf Q}}}
-  \definemathcommand [unic@facsimilesign]             {\unknownchar}
-  \definemathcommand [unic@doublestruckpi]            {\pi}%{\unknownchar}
-  \definemathcommand [unic@doublestruckgamma]         {\gamma}%{\unknownchar}
-  \definemathcommand [unic@doublestruckGamma]         {\Gamma}%{\unknownchar}
-  \definemathcommand [unic@doublestruckPi]            {\Pi}%{\unknownchar}
-  \definemathcommand [unic@doublestrucknarysummation] {\unknownchar}
-  \definemathcommand [unic@turnedsansserifG]          {\rotate[\c!rotation=180]{{\ss G}}}
-  \definemathcommand [unic@turnedsansserifL]          {\rotate[\c!rotation=180]{{\ss L}}}
-  \definemathcommand [unic@reversedsansserifL]        {\mirror{{\ss L}}}
-  \definemathcommand [unic@turnedsansserifY]          {\rotate[\c!rotation=180]{{\ss Y}}}
-  \definemathcommand [unic@doublestruckitalicD]       {D}%{\unknownchar}
-  \definemathcommand [unic@doublestruckitalicd]       {d}%{\unknownchar}
-  \definemathcommand [unic@doublestruckitalice]       {e}%{\unknownchar}
-  \definemathcommand [unic@doublestruckitalici]       {i}%{\unknownchar}
-  \definemathcommand [unic@doublestruckitalicj]       {j}%{\unknownchar}
-  \definemathcommand [unic@propertyline]              {\unknownchar}
-  \definemathcommand [unic@turnedampersand]           {\rotate[\c!rotation=180]{\&}}
-  \definemathcommand [unic@persign]                   {\unknownchar}
-
-  \definemathcommand [unic@fractiononethird]          {\vulgarfraction{1}{3}}
-  \definemathcommand [unic@fractiontwothirds]         {\vulgarfraction{2}{3}}
-  \definemathcommand [unic@fractiononefifth]          {\vulgarfraction{1}{5}}
-  \definemathcommand [unic@fractiontwofifths]         {\vulgarfraction{2}{5}}
-  \definemathcommand [unic@fractionthreefifths]       {\vulgarfraction{3}{5}}
-  \definemathcommand [unic@fractionfourfifths]        {\vulgarfraction{4}{5}}
-  \definemathcommand [unic@fractiononesixth]          {\vulgarfraction{1}{6}}
-  \definemathcommand [unic@fractionfivesixths]        {\vulgarfraction{5}{6}}
-  \definemathcommand [unic@fractiononeeighth]         {\vulgarfraction{1}{8}}
-  \definemathcommand [unic@fractionthreeeighths]      {\vulgarfraction{3}{8}}
-  \definemathcommand [unic@fractionfiveeighths]       {\vulgarfraction{5}{8}}
-  \definemathcommand [unic@fractionseveneighths]      {\vulgarfraction{7}{8}}
-  \definemathcommand [unic@fractionnumeratorone]      {\vulgarfraction{1}{}}
-  \definemathcommand [unic@romannumeralOne]           {{\tf I}}
-  \definemathcommand [unic@romannumeralTwo]           {{\tf II}}
-  \definemathcommand [unic@romannumeralThree]         {{\tf III}}
-  \definemathcommand [unic@romannumeralFour]          {{\tf IV}}
-  \definemathcommand [unic@romannumeralFive]          {{\tf V}}
-  \definemathcommand [unic@romannumeralSix]           {{\tf VI}}
-  \definemathcommand [unic@romannumeralSeven]         {{\tf VII}}
-  \definemathcommand [unic@romannumeralEight]         {{\tf VIII}}
-  \definemathcommand [unic@romannumeralNine]          {{\tf IX}}
-  \definemathcommand [unic@romannumeralTen]           {{\tf X}}
-  \definemathcommand [unic@romannumeralEleven]        {{\tf XI}}
-  \definemathcommand [unic@romannumeralTwelve]        {{\tf XII}}
-  \definemathcommand [unic@romannumeralFifty]         {{\tf L}}
-  \definemathcommand [unic@romannumeralOnehundred]    {{\tf C}}
-  \definemathcommand [unic@romannumeralFivehundred]   {{\tf D}}
-  \definemathcommand [unic@romannumeralOnethousand]   {{\tf M}}
-  \definemathcommand [unic@romannumeralone]           {{\tf i}}
-  \definemathcommand [unic@romannumeraltwo]           {{\tf ii}}
-  \definemathcommand [unic@romannumeralthree]         {{\tf iii}}
-  \definemathcommand [unic@romannumeralfour]          {{\tf iv}}
-  \definemathcommand [unic@romannumeralfive]          {{\tf v}}
-  \definemathcommand [unic@romannumeralsix]           {{\tf vi}}
-  \definemathcommand [unic@romannumeralseven]         {{\tf vii}}
-  \definemathcommand [unic@romannumeraleight]         {{\tf viii}}
-  \definemathcommand [unic@romannumeralnine]          {{\tf ix}}
-  \definemathcommand [unic@romannumeralten]           {{\tf x}}
-  \definemathcommand [unic@romannumeraleleven]        {{\tf xi}}
-  \definemathcommand [unic@romannumeraltwelve]        {{\tf xii}}
-  \definemathcommand [unic@romannumeralfifty]         {{\tf l}}
-  \definemathcommand [unic@romannumeralonehundred]    {{\tf c}}
-  \definemathcommand [unic@romannumeralfivehundred]   {{\tf d}}
-  \definemathcommand [unic@romannumeralonethousand]   {{\tf m}}
-  \definemathcommand [unic@romannumeralonethousandCD] {\unknownchar}
-  \definemathcommand [unic@romannumeralfivethousand]  {\unknownchar}
-  \definemathcommand [unic@romannumeraltenthousand]   {\unknownchar}
-  \definemathcommand [unic@romannumeralreversedonehundred] {\mirror{C}}
-
-\stopmathcollection
-
-% needed for unic-033 % NW
-
-\startmathcollection[default]
-
-  \definemathcommand [unic@leftarrowtobar]            {\mapstochar\leftarrow}
-
-\stopmathcollection
-
-% needed for unic-034 % NW
-
-\startmathcollection[default]
-
-  \definemathcommand [unic@in]                    {\in}
-  \definemathcommand [unic@nin]                   {\not\in}
-  \definemathcommand [unic@nni]                   {\not\ni}
-  \definemathcommand [unic@minus]                 {-}
-  \definemathcommand [unic@divisionslash]         {/}
-  \definemathcommand [unic@sqrt]                  {\sqrt{}}
-  \definemathcommand [unic@cubesqrt]              {\root 3 \of {}}
-  \definemathcommand [unic@fourthsqrt]            {\root 4 \of {}}
-  \definemathcommand [unic@divides]       [op]    {|} % TODO
-  \definemathcommand [unic@ndivides]      [rel]   {\mathop{\not|}} % TODO: horrible
-  \definemathcommand [unic@cap]                   {\cap}
-  \definemathcommand [unic@dblint]                {\int\!\!\!\int}
-  \definemathcommand [unic@triint]                {\int\!\!\!\int\!\!\!\int}
-  \definemathcommand [unic@ratio]         [rel]   {:}
-  \definemathcommand [unic@proportion]    [rel]   {::}
-  \definemathcommand [unic@excess]        [op]    {-\!\!:}
-  \definemathcommand [unic@geomprop]      [op]    {:\!\!\!-\!\!\!:}
-  \definemathcommand [unic@homothetic]    [op]    {\sim\!\!\!:}
-  \definemathcommand [unic@nsimeq]                {\not\simeq}
-  \definemathcommand [unic@cong]                  {\cong}
-  \definemathcommand [unic@napproxeq]             {\not\approxeq}
-  \definemathcommand [unic@napprox]               {\not\approx}
-  \definemathcommand [unic@doteq]                 {\doteq}
-  \definemathcommand [unic@correspondsto]         {\buildrel \frown \over =}
-  \definemathcommand [unic@estimates]             {\buildrel \wedge \over =}
-  \definemathcommand [unic@equiangularto]         {\buildrel \vee \over =}
-  \definemathcommand [unic@stareq]                {\buildrel \star \over =}
-  \definemathcommand [unic@eqbydef]               {\buildrel \rm def \over =}
-  \definemathcommand [unic@measuredby]            {\buildrel \rm m \over =}
-  \definemathcommand [unic@questionedeq]          {\buildrel \rm ? \over =}
-  \definemathcommand [unic@nequiv]                {\not\equiv}
-  \definemathcommand [unic@nasymp]                {\not\asymp}
-  \definemathcommand [unic@nlesssim]              {\not\lesssim}
-  \definemathcommand [unic@ngtrsim]               {\not\gtrsim}
-  \definemathcommand [unic@nlessgtr]              {\not\lessgtr}
-  \definemathcommand [unic@ngtrless]              {\not\gtrless}
-  \definemathcommand [unic@nsubset]               {\not\subset}
-  \definemathcommand [unic@nsupset]               {\not\supset}
-  \definemathcommand [unic@nsqsubseteq]           {\not\sqsubseteq}
-  \definemathcommand [unic@nsqsupseteq]           {\not\sqsupseteq}
-
-\stopmathcollection
-
-% needed for unic-039 % NW
-
-\startmathcollection[default]
-
-  \definemathcommand [unic@Lbracket]  [open]  {[\![}
-  \definemathcommand [unic@Rbracket]  [close] {]\!]}
-  \definemathcommand [unic@Langle]    [open]  {\langle\!\langle}
-  \definemathcommand [unic@Rangle]    [close] {\rangle\!\rangle}
-
-\stopmathcollection
-
-\protect \endinput
diff --git a/tex/context/base/math-vfu.lua b/tex/context/base/math-vfu.lua
index 35d18d77a..0e06d3757 100644
--- a/tex/context/base/math-vfu.lua
+++ b/tex/context/base/math-vfu.lua
@@ -240,6 +240,8 @@ function fonts.basecopy(tfmtable)
     return t
 end
 
+local reported = { }
+
 function fonts.vf.math.define(specification,set)
     if not reverse then
         reverse = { }
@@ -335,9 +337,16 @@ function fonts.vf.math.define(specification,set)
                     for unicode, index in next, vector do
                         local fci = fc[index]
                         if not fci then
-                        -- if trace_virtual then
-                                logs.report("math virtual", "unicode point U+%04X has no index %04X in %s",unicode,index,vectorname)
-                        --  end
+                            local fontname = fs.name
+                            local rf = reported[fontname]
+                            if not rf then rf = { } reported[fontname] = rf end
+                            local rv = rf[vectorname]
+                            if not rv then rv = { } rf[vectorname] = rv end
+                            local ru = rv[unicode]
+                            if not ru then
+                                logs.report("math virtual", "unicode point U+%05X has no index %04X in vector %s for font %s",unicode,index,vectorname,fontname)
+                                rv[unicode] = true
+                            end
                         else
                             local ref = si[index]
                             if not ref then
@@ -503,6 +512,7 @@ function fonts.vf.math.define(specification,set)
     main.has_italic = true
     main.type = "virtual" -- not needed
     mathematics.scaleparameters(main,main,1)
+main.nomath = false
     return main
 end
 
@@ -1327,8 +1337,8 @@ mathematics.make_font ( "lmroman6-math", {
     { name = "lmmib5.tfm", vector = "tex-bi", skewchar=0x7F } ,
     { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true },
     { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true },
-    { name = "eufm6.tfm", vector = "tex-fraktur", optional=true },
-    { name = "eufb6.tfm", vector = "tex-fraktur-bold", optional=true },
+    { name = "eufm5.tfm", vector = "tex-fraktur", optional=true },
+    { name = "eufb5.tfm", vector = "tex-fraktur-bold", optional=true },
 } )
 
 -- rm-lmr7  : LMMathRoman7-Regular
@@ -1373,8 +1383,8 @@ mathematics.make_font ( "lmroman8-math", {
     { name = "lmmib7.tfm", vector = "tex-bi", skewchar=0x7F } ,
     { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true },
     { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true },
-    { name = "eufm8.tfm", vector = "tex-fraktur", optional=true },
-    { name = "eufb8.tfm", vector = "tex-fraktur-bold", optional=true },
+    { name = "eufm7.tfm", vector = "tex-fraktur", optional=true },
+    { name = "eufb7.tfm", vector = "tex-fraktur-bold", optional=true },
 } )
 
 -- rm-lmr9  : LMMathRoman9-Regular
@@ -1395,8 +1405,8 @@ mathematics.make_font ( "lmroman9-math", {
     { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
     { name = "lmsans9-regular.otf", vector = "tex-ss", optional=true },
     { name = "lmmono9-regular.otf", vector = "tex-tt", optional=true },
-    { name = "eufm9.tfm", vector = "tex-fraktur", optional=true },
-    { name = "eufb9.tfm", vector = "tex-fraktur-bold", optional=true },
+    { name = "eufm10.tfm", vector = "tex-fraktur", optional=true },
+    { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true },
 } )
 
 -- rm-lmr10  : LMMathRoman10-Regular
@@ -1424,6 +1434,24 @@ mathematics.make_font ( "lmroman10-math", {
     { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true },
 } )
 
+mathematics.make_font ( "lmroman10-boldmath", {
+    { name = "lmroman10-bold.otf", features = "virtualmath", main = true },
+ -- { name = "rm-lmr10.tfm", vector = "tex-mr" } ,
+    { name = "lmmib10.tfm", vector = "tex-mi", skewchar=0x7F },
+    { name = "lmbsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+    { name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
+-- copied from roman:
+    { name = "msam10.tfm", vector = "tex-ma" },
+    { name = "msbm10.tfm", vector = "tex-mb" },
+ -- { name = "rm-lmbx10.tfm", vector = "tex-bf" } ,
+    { name = "lmroman10-bold.otf", "tex-bf" } ,
+    { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
+    { name = "lmsans10-regular.otf", vector = "tex-ss", optional=true },
+    { name = "lmmono10-regular.otf", vector = "tex-tt", optional=true },
+    { name = "eufm10.tfm", vector = "tex-fraktur", optional=true },
+    { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true },
+} )
+
 -- rm-lmr12  : LMMathRoman12-Regular
 -- rm-lmbx12 : LMMathRoman12-Bold
 -- lmmi12    : LMMathItalic12-Italic
@@ -1468,8 +1496,8 @@ mathematics.make_font ( "lmroman17-math", {
 
 mathematics.make_font ( "px-math", {
     { name = "texgyrepagella-regular.otf", features = "virtualmath", main = true },
-    { name = "pxr.tfm", vector = "tex-mr" } ,
-    { name = "pxmi.tfm", vector = "tex-mi", skewchar=0x7F },
+    { name = "rpxr.tfm", vector = "tex-mr" } ,
+    { name = "rpxmi.tfm", vector = "tex-mi", skewchar=0x7F },
     { name = "pxsy.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
     { name = "pxex.tfm", vector = "tex-ex", extension = true } ,
     { name = "pxsya.tfm", vector = "tex-ma" },
@@ -1478,8 +1506,8 @@ mathematics.make_font ( "px-math", {
 
 mathematics.make_font ( "tx-math", {
     { name = "texgyretermes-regular.otf", features = "virtualmath", main = true },
-    { name = "txr.tfm", vector = "tex-mr" } ,
-    { name = "txmi.tfm", vector = "tex-mi", skewchar=0x7F },
+    { name = "rtxr.tfm", vector = "tex-mr" } ,
+    { name = "rtxmi.tfm", vector = "tex-mi", skewchar=0x7F },
     { name = "txsy.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
     { name = "txex.tfm", vector = "tex-ex", extension = true } ,
     { name = "txsya.tfm", vector = "tex-ma" },
diff --git a/tex/context/base/meta-ini.mkii b/tex/context/base/meta-ini.mkii
index ee7e8a38b..f9d097049 100644
--- a/tex/context/base/meta-ini.mkii
+++ b/tex/context/base/meta-ini.mkii
@@ -20,22 +20,6 @@
 
 \unprotect
 
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
 %D This module extends the functionality of the support module
 %D \type {supp-mps}, the module that is responsible for
 %D \METAPOST\ inclusion in \CONTEXT. Some basic macros will be
@@ -151,6 +135,19 @@
 
 \def\MPrawvar#1#2{\csname#1:#2\endcsname}
 
+\def\presetMPvariable
+  {\dodoubleargument\dopresetMPvariable}
+
+\def\dopresetMPvariable[#1][#2=#3]%
+  {\doifundefined{#1:#2}{\setvalue{#1:#2}{#3}}}
+
+\def\useMPvariables
+  {\dodoubleargument\douseMPvariables}
+
+\def\douseMPvariables[#1][#2]%
+  {\def\@@meta{#1:}%
+   \prepareMPvariables{#2}}
+
 %D \macros
 %D   {startuniqueMPgraphic, uniqueMPgraphic}
 %D
diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv
index 0e0adc54f..042f7247e 100644
--- a/tex/context/base/meta-ini.mkiv
+++ b/tex/context/base/meta-ini.mkiv
@@ -74,10 +74,6 @@
   {\doifnot{#1}{+}{\global\MPuserinclusions\emptytoks}%
    \global\MPuserinclusions\expandafter{\the\MPuserinclusions#2}}
 
-% \ifx \overlaywidth     \undefined \def \overlaywidth     {4cm} \fi
-% \ifx \overlayheight    \undefined \def \overlayheight    {3cm} \fi
-% \ifx \overlaylinewidth \undefined \def \overlaylinewidth {0pt} \fi
-
 \def\presetMPdefinitions
   {\edef\overlaywidth    {\overlaywidth    \space}%
    \edef\overlayheight   {\overlayheight   \space}%
@@ -87,53 +83,6 @@
 
 \def\currentMPformat{metafun}
 
-% todo:
-%
-% \splitMPgraphicname[a::b]      (\currentMPgraphicformat,\currentMPgraphicname)
-% \splitMPgraphicname[a]         (\currentMPgraphicformat,\currentMPgraphicname)
-% \splitMPgraphicname[a::b::c]   (\currentMPgraphicformat,\currentMPgraphicname)
-%
-% \resetMPformat[extrafun]
-%
-% MPinclusions etc only for metafun, randomseed for all
-%
-% todo: \resetMPformat[instance] -> unload and nil
-% todo: geen page stats
-% todo: textext in plain mp
-
-% \startMPdefinitions{metafun}
-%     color MyColor ; MyColor = red ;
-% \stopMPdefinitions
-% \startuseMPgraphic{test1}
-%     fill fullcircle scaled 1cm withcolor MyColor ;
-% \stopuseMPgraphic
-% \startuseMPgraphic{test2}
-%     color MyColor ; MyColor = green ;
-%     fill fullcircle scaled 1cm withcolor MyColor ;
-% \stopuseMPgraphic
-% \startuseMPgraphic{test3}
-%     fill fullcircle scaled 1cm withcolor MyColor ;
-% \stopuseMPgraphic
-% \startuseMPgraphic{test4}
-%     color MyColor ; MyColor = blue ;
-% \stopuseMPgraphic
-%
-% \useMPgraphic{metafun::test1}
-% \useMPgraphic{metafun::test2}
-% \useMPgraphic{metafun::test3}
-% \useMPgraphic{extrafun::test4}
-% \useMPgraphic{extrafun::test3}
-% \useMPgraphic{metafun::test3}
-% \useMPgraphic{nofun::test4}
-% \useMPgraphic{nofun::test3}
-%
-% \startMPcode
-%     fill fullsquare scaled 1cm ;
-% \stopMPcode
-% \startMPcode{metafun}
-%     fill fullsquare scaled 1cm withcolor MyColor ;
-% \stopMPcode
-
 \def\@@MPF{@MPF@}
 
 \def\MPinstancetoks{\csname\@@MPF::\currentMPgraphicinstance\endcsname}
@@ -180,40 +129,13 @@
 \def\endMPgraphicgroup
   {\endgroup}
 
-%
-
 \newconditional \METAFUNinitialized
 
 \def\MPaskedfigure{false}
 
-% maybe we need to force black, i.e. fake nodes
-
-\long\def\processMPgraphic#1% todo: extensions and inclusions outside beginfig
-  {\begingroup
-   \enableincludeMPgraphics
-   \the\everyMPgraphic
-   \presetMPdefinitions
-   \setMPrandomseed % this has to change
-   % we need to preexpand the token lists
-   \setbox\MPgraphicbox\hbox\bgroup
-     \ctxlua{metapost.graphic("\currentMPformat", "\currentMPformat",
-           \@EA\!!bs\the\MPinitializations;\theMPrandomseed;#1;\!!es, % code
-           \@EA\@EA\@EA\!!bs\@EA\the\@EA\MPextensions\@EA;\the\MPuserinclusions;\!!es,     % optional preamble
-           \MPaskedfigure
-     )}%
-     \global\settrue\METAFUNinitialized
-     \global\MPextensions\emptytoks
-     \global\MPuserinclusions\emptytoks
-   \egroup
-   \placeMPgraphic
-   \endgroup}
-
-% ! ! ! ! begin temporary ! ! ! !
-
-\let\normalprocessMPgraphic\processMPgraphic
-
 \long\def\processMPgraphic#1% todo: extensions and inclusions outside beginfig
   {\begingroup % needed?
+\forgetall
    \enableincludeMPgraphics
    \the\everyMPgraphic
    \presetMPdefinitions
@@ -223,7 +145,7 @@
      {\settrue\includeMPextensions\letgvalue{\@@MPF\currentMPgraphicinstance\s!extensions}\v!no}
      {\setfalse\includeMPextensions}%
    \doifelsevalue{\@@MPF\currentMPgraphicinstance\s!initializations}\v!yes
-     {\settrue\includeMPinitializations}% \letgvalue{\@@MPF\currentMPgraphicinstance\s!initializations}\v!no}
+     {\settrue\includeMPinitializations }%
      {\setfalse\includeMPinitializations}%
    \setbox\MPgraphicbox\hbox\bgroup
      \normalexpanded{\noexpand\ctxlua{metapost.graphic("\currentMPgraphicinstance", "\currentMPgraphicformat",
@@ -234,18 +156,9 @@
    \egroup
      \global\MPinstancetoks\emptytoks
      \global\settrue\METAFUNinitialized % becomes obsolete
-    %\global\MPextensions\emptytoks     % multipls instances
-    %\global\MPuserinclusions\emptytoks % multipls instances
    \placeMPgraphic
    \endgroup}
 
-\let\extendedprocessMPgraphic\processMPgraphic
-
-% \let\processMPgraphic\normalprocessMPgraphic
-\let\processMPgraphic\extendedprocessMPgraphic
-
-% ! ! ! ! end temporary ! ! ! !
-
 \newif\ifsetMPrandomseed \setMPrandomseedtrue % false by default
 
 \def\setMPrandomseed
@@ -286,25 +199,6 @@
 
 \def\getMPdrawing{\dosinglegroupempty\dogetMPdrawing}
 
-% \def\nodogetMPdrawing#1%
-%   {\ifMPdrawingdone
-%      \expandafter\processMPgraphic\expandafter{\MPdrawingdata}%
-%    \fi}
-%
-% \def\dostartMPcode
-%   {\iffirstargument
-%      \expandafter\dodogetMPdrawing
-%    \else
-%      \expandafter\nodogetMPdrawing
-%    \fi}
-%
-% \def\dodogetMPdrawing#1%
-%   {\ifMPdrawingdone
-%      \beginMPgraphicgroup{#1::\s!dummy}% name does not matter
-%      \expandafter\processMPgraphic\expandafter{\MPdrawingdata}%
-%      \endMPgraphicgroup
-%    \fi}
-
 \def\startMPdrawing
   {\dosingleempty\dostartMPdrawing}
 
@@ -395,14 +289,6 @@
     defaultfont:="rm-lmtt10";
 \stopMPinitializations
 
-%D In order to support fancy text features (like outline
-%D fonts), we set:
-
-% \startMPextensions
-%     graphictextformat:="context";
-%     graphictextdirective "\the\everyMPTEXgraphic";
-% \stopMPextensions
-
 %D A signal that we're in combines \CONTEXT||\METAFUN mode:
 
 \startMPextensions
@@ -423,16 +309,6 @@
 \prependtoks \MPstaticgraphictrue \to \everyoverlay
 \prependtoks \MPstaticgraphictrue \to \everypagebody
 
-% %D We save the number of graphics for the sake of \TEXEXEC.
-%
-% \newcounter\totalnofMPgraphics
-%
-% \def\thenofMPgraphics{\the\nofMPgraphics} % from supp-mps
-%
-% \appendtoks
-%   \savecurrentvalue\totalnofMPgraphics\thenofMPgraphics
-% \to \everybye
-
 %D \macros
 %D   {setupMPvariables}
 %D
@@ -472,6 +348,19 @@
 
 \def\MPrawvar#1#2{\csname#1:#2\endcsname}
 
+\def\presetMPvariable
+  {\dodoubleargument\dopresetMPvariable}
+
+\def\dopresetMPvariable[#1][#2=#3]%
+  {\ifcsname#1:#2\endcsname\else\setvalue{#1:#2}{#3}\fi}
+
+\def\useMPvariables
+  {\dodoubleargument\douseMPvariables}
+
+\def\douseMPvariables[#1][#2]%
+  {\def\@@meta{#1:}%
+   \prepareMPvariables{#2}}
+
 %D \macros
 %D   {startuniqueMPgraphic, uniqueMPgraphic}
 %D
@@ -510,7 +399,6 @@
 
 \newcount\MPobjectcounter
 \newbox  \MPgraphicbox
-%newif   \ifMPshiftdrawing \MPshiftdrawingfalse
 
 \chardef\MPboxmode\zerocount
 
@@ -555,7 +443,7 @@
    \extendMPoverlaystamp{#2}% incl prepare
    \ifcsname\@@MPG\overlaystamp:#1\endcsname\else
      \enableincludeMPgraphics
-     \forgetall
+%      \forgetall
      \global\advance\MPobjectcounter\plusone
      \setobject{MP}{\number\MPobjectcounter}\hbox{\processMPgraphic{#3}}% was vbox, graphic must end up as hbox
      \setxvalue{\@@MPG\overlaystamp:#1}{\noexpand\reuseMPbox{\number\MPobjectcounter}{\MPllx}{\MPlly}{\MPurx}{\MPury}}%
@@ -582,7 +470,7 @@
 
 \long\def\handleuseMPgraphic#1#2#3%
   {\begingroup
-   \forgetall % check this
+%    \forgetall % check this
    \def\@@meta{#1:}%
    \prepareMPvariables{#2}%
    \enableincludeMPgraphics
@@ -810,25 +698,6 @@
 
 %D A more general way of passing environments is:
 
-% \def\startMPenvironment % second arg gobbles spaces, so that reset gives \emptytoks
-%   {\bgroup
-%    \catcode`\^^M=\@@space
-%    \dodoubleempty\dostartMPenvironment}
-
-% \long\def\dostartMPenvironment[#1][#2]#3\stopMPenvironment
-%   {\egroup
-%    \doif{#1}\s!reset\resetMPenvironment % reset mp toks
-%    \doif{#1}\v!global{#3}%              % use in main doc too
-%    \doif{#1}+{#3}%                      % use in main doc too
-%    \defconvertedargument\ascii{#3}%
-%    \expandafter\appendtoks\ascii\to\everyMPTEXgraphic}
-
-% \def\resetMPenvironment
-%   {\everyMPTEXgraphic\emptytoks % = is really needed !
-%    \startMPenvironment
-%      \global\loadfontfileoncetrue
-%    \stopMPenvironment}
-
 \def\startMPenvironment % second arg gobbles spaces, so that reset gives \emptytoks
   {\dodoubleempty\dostartMPenvironment}
 
@@ -846,8 +715,6 @@
 \def\useMPenvironmentbuffer[#1]%
   {\ctxlua{metapost.tex.set(buffers.content("#1"))}}
 
-% \useMPenvironmentbuffer[mp] % hm, what is this?
-
 %D This command takes \type {[reset]} as optional
 %D argument.
 %D
@@ -892,20 +759,6 @@
 
 \let\MPruninstance\defaultMPgraphicinstance
 
-% \def\useMPrun#1#2% name n
-%   {\begingroup
-%    \def\MPaskedfigure{#2}%
-%    \doifelsenothing{#1}
-%      {\useMPgraphic{\MPruninstance::mprun}}%
-%      {\useMPgraphic{\MPruninstance::#1}}%
-%    \endgroup}
-% \def\startMPrun
-%   {\dosinglegroupempty\dostartMPrun}
-% \long\def\dostartMPrun#1#2\stopMPrun
-%   {\edef\MPruninstance{\iffirstargument#1\else\defaultMPgraphicinstance\fi}%
-%    \startuseMPgraphic{mprun}#2\stopuseMPgraphic}
-
-
 \def\useMPrun#1#2% name n
   {\begingroup
    \def\MPaskedfigure{#2}%
@@ -1087,22 +940,11 @@
     \let \} \letterclosebrace
 \to \everyMPgraphic
 
-%D Alas, the prologue settings differ per driver.
-
-\ifx\undefined\MPprologues \def\MPprologues{0} \fi
-
-% hm, not needed more than once so can be extensions
-
 \startMPinitializations
-    prologues:=\MPprologues;
+    prologues:=0;
     mpprocset:=1;
 \stopMPinitializations
 
-\appendtoks
-    \def\MPprologues{0}%
-    \def\MPOSTdriver{dvips}%
-\to \everyresetspecials
-
 %D \macros
 %D   {PDFMPformoffset}
 %D
@@ -1112,63 +954,68 @@
 
 \def\PDFMPformoffset{\objectoffset}
 
-%D \macros
-%D   {insertMPfile}
-%D
-%D Bypassing the special driver and figure mechanism is not
-%D that nice but saves upto 5\% time in embedding \METAPOST\
-%D graphics by using the low level \PDF\ converter directly,
-%D given of course that we use \PDFTEX. As a result we need to
-%D fool around with the object trigger.
+% %D \macros
+% %D   {insertMPfile}
+% %D
+% %D Bypassing the special driver and figure mechanism is not
+% %D that nice but saves upto 5\% time in embedding \METAPOST\
+% %D graphics by using the low level \PDF\ converter directly,
+% %D given of course that we use \PDFTEX. As a result we need to
+% %D fool around with the object trigger.
 
 \newtoks\everyinsertMPfile
 
-\let\insertMPfileARG\insertMPfile
-
-\def\insertMPfile#1#2% in context #2 is empty
-  {\doifelsenothing{#2}{\doinsertMPfile{#1}}{\insertMPfileARG{#1}{#2}}}
-
-\def\includeMPasEPS#1% untested !!
-  {\bgroup
-   \message{[MP as EPS #1]}%
-   \the\everyinsertMPfile
-   \dogetEPSboundingbox{#1}\!!widtha\!!heighta\!!widthb\!!heightb
-   \setbox\scratchbox\vbox to \!!heightb
-     {\vfill
-      \let \@@DriverImageType  \c!mps
-      \def \@@DriverImageFile  {#1}%
-      \edef\@@DriverImageWidth {\the\!!widthb }%
-      \edef\@@DriverImageHeight{\the\!!heightb}%
-      \doinsertfile}%
-   \wd\scratchbox\!!widthb
-   \dp\scratchbox\zeropoint
-   \box\scratchbox
-   \egroup}
-
-\def\includeMPasPDF#1%
-  {\bgroup
-   \the\everyinsertMPfile
-   \ifinobject \else \chardef\makeMPintoPDFobject\plustwo \fi % when needed
-   \convertMPtoPDF{#1}{1}{1}% no \plusone !
-   \egroup}
-
-%D So, using a low level approach (thereby avoiding the slower
-%D figure analysis macros) pays off. This kind of
-%D optimizations are a bit tricky since we must make sure that
-%D special resources end up in the (PDF) files. Because the
-%D \METAPOST\ to \PDF\ can handle objects itself, it is not
-%D that complicated.
-
-%D We hook a couple of initializations into the graphic
-%D macros.
-
-\appendtoks
-    \let\figuretypes\c!mps
-    \runutilityfilefalse
-    \consultutilityfilefalse
-\to \everyinsertMPfile
-
-%D One more: (still needed?)
+% removed in backend:
+%
+% \def\doinsertMPfile#1%
+%   {\doiffileelse{./#1}{\includeMPasPDF{./#1}}{\message{[MP #1]}}}
+%
+% \let\insertMPfileARG\insertMPfile
+%
+% \def\insertMPfile#1#2% in context #2 is empty
+%   {\doifelsenothing{#2}{\doinsertMPfile{#1}}{\insertMPfileARG{#1}{#2}}}
+%
+% \def\includeMPasEPS#1% untested !!
+%   {\bgroup
+%    \message{[MP as EPS #1]}%
+%    \the\everyinsertMPfile
+%    \dogetEPSboundingbox{#1}\!!widtha\!!heighta\!!widthb\!!heightb
+%    \setbox\scratchbox\vbox to \!!heightb
+%      {\vfill
+%       \let \@@DriverImageType  \c!mps
+%       \def \@@DriverImageFile  {#1}%
+%       \edef\@@DriverImageWidth {\the\!!widthb }%
+%       \edef\@@DriverImageHeight{\the\!!heightb}%
+%       \doinsertfile}%
+%    \wd\scratchbox\!!widthb
+%    \dp\scratchbox\zeropoint
+%    \box\scratchbox
+%    \egroup}
+%
+% \def\includeMPasPDF#1%
+%   {\bgroup
+%    \the\everyinsertMPfile
+%    \ifinobject \else \chardef\makeMPintoPDFobject\plustwo \fi % when needed
+%    \convertMPtoPDF{#1}{1}{1}% no \plusone !
+%    \egroup}
+%
+% %D So, using a low level approach (thereby avoiding the slower
+% %D figure analysis macros) pays off. This kind of
+% %D optimizations are a bit tricky since we must make sure that
+% %D special resources end up in the (PDF) files. Because the
+% %D \METAPOST\ to \PDF\ can handle objects itself, it is not
+% %D that complicated.
+%
+% %D We hook a couple of initializations into the graphic
+% %D macros.
+%
+% \appendtoks
+%     \let\figuretypes\c!mps
+%     \runutilityfilefalse
+%     \consultutilityfilefalse
+% \to \everyinsertMPfile
+%
+% %D One more: (still needed?)
 
 \startMPextensions
     def initialize_form_numbers =
@@ -1343,12 +1190,6 @@
   _special_div_ := 1000\ifconditional\manyMPspecials0\fi ;
 \to \MPextensions
 
-%D Needed (will become default):
-
-\prependtoks
-  \resetlanguagespecifics
-\to \everyMPgraphic
-
 %D Needed too.
 
 \let\initializeMPgraphics\relax
@@ -1395,8 +1236,11 @@
 
 \chardef\MPcolormethod\zerocount
 
+% can be faster, just
+
 \appendtoks
-    \ctxlua{metapost.set_outer_color(\number\MPcolormethod,"\PDFcolor{\currentcolorname}","")}%
+%     \ctxlua{metapost.set_outer_color(\number\MPcolormethod,"\PDFcolor{\currentcolorname}","")}%
+    \ctxlua{metapost.set_outer_color(\number\MPcolormethod,\number\currentcolormodel,\number\dogetattribute{color},\number\dogetattribute{transparency})}%
 \to \everyMPgraphic
 
 \startMPinitializations
diff --git a/tex/context/base/meta-pag.mkii b/tex/context/base/meta-pag.mkii
new file mode 100644
index 000000000..000e56a2e
--- /dev/null
+++ b/tex/context/base/meta-pag.mkii
@@ -0,0 +1,226 @@
+%D \module
+%D   [       file=meta-pag,
+%D        version=1999.07.10,
+%D          title=\METAPOST\ Graphics,
+%D       subtitle=Initialization,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 These definitions used to be part of the old \type
+%D {core-mps} file, later changed into \type {meta-ini}, but
+%D keeping them separate is cleaner.
+
+\writestatus{loading}{MetaPost Graphics / Page Data Management}
+
+\unprotect
+
+\startMPextensions
+  if unknown context_page: input mp-page; fi;
+\stopMPextensions
+
+%D The next few macros tell \METAPOST\ how the \CONTEXT\
+%D pagebody looks.
+
+\startMPextensions
+  boolean PageStateAvailable,OnRightPage,InPageBody;
+  PageStateAvailable:=true;
+\stopMPextensions
+
+\startMPinitializations
+  OnRightPage:=true;
+  InPageBody:=\ifinpagebody true \else false \fi;
+\stopMPinitializations
+
+\startMPinitializations
+  def LoadPageState =
+    OnRightPage:=\MPonrightpage;
+    OnOddPage:=\MPonoddpage;
+    RealPageNumber:=\the\realpageno;
+    PageNumber:=\the\pageno;
+    NOfPages:=\lastpage;
+    PaperHeight:=\the\paperheight;
+    PaperWidth:=\the\paperwidth;
+    PrintPaperHeight:=\the\printpaperheight;
+    PrintPaperWidth:=\the\printpaperwidth;
+    TopSpace:=\the\topspace;
+    BottomSpace:=\the\bottomspace;
+    BackSpace:=\the\backspace;
+    CutSpace:=\the\cutspace;
+    MakeupHeight:=\the\makeupheight;
+    MakeupWidth:=\the\makeupwidth;
+    TopHeight:=\the\topheight;
+    TopDistance:=\the\topdistance;
+    HeaderHeight:=\the\headerheight;
+    HeaderDistance:=\the\headerdistance;
+    TextHeight:=\the\textheight;
+    FooterDistance:=\the\footerdistance;
+    FooterHeight:=\the\footerheight;
+    BottomDistance:=\the\bottomdistance;
+    BottomHeight:=\the\bottomheight;
+    LeftEdgeWidth:=\the\leftedgewidth;
+    LeftEdgeDistance:=\the\leftedgedistance;
+    LeftMarginWidth:=\the\leftmarginwidth;
+    LeftMarginDistance:=\the\leftmargindistance;
+    TextWidth:=\the\textwidth ;
+    RightMarginDistance:=\the\rightmargindistance;
+    RightMarginWidth:=\the\rightmarginwidth;
+    RightEdgeDistance:=\the\rightedgedistance;
+    RightEdgeWidth:=\the\rightedgewidth;
+    InnerMarginDistance:=\the\innermargindistance;
+    InnerMarginWidth:=\the\innermarginwidth;
+    OuterMarginDistance:=\the\outermargindistance;
+    OuterMarginWidth:=\the\outermarginwidth;
+    InnerEdgeDistance:=\the\inneredgedistance;
+    InnerEdgeWidth:=\the\inneredgewidth;
+    OuterEdgeDistance:=\the\outeredgedistance;
+    OuterEdgeWidth:=\the\outeredgewidth;
+    PageOffset:=\the\pageoffset;
+    PageDepth:=\the\pagedepth;
+    LayoutColumns:=\the\layoutcolumns;
+    LayoutColumnDistance:=\the\layoutcolumndistance;
+    LayoutColumnWidth:=\the\layoutcolumnwidth;
+  enddef;
+\stopMPinitializations
+
+\def\MPonrightpage{true}
+\def\MPonoddpage  {true}
+
+\def\freezeMPpagelayout
+  {\doifbothsides
+     {\def\MPonrightpage{true}}
+     {\def\MPonrightpage{true}}
+     {\def\MPonrightpage{false}}%
+   \edef\MPonoddpage{\doifoddpageelse{true}{false}}}
+
+\let\freezeMPlayout\relax % obsolete
+
+%D We need to freeze the pagelayout before the backgrounds
+%D are build, because the overlay will temporarily become
+%D zero (overlay).
+
+\appendtoks
+  \freezeMPpagelayout
+\to \everybeforepagebody
+
+%D By freezing these value every graphic, we can use layout
+%D variables that change halfways a page, whatever use that
+%D has.
+
+\prependtoks
+  \calculatereducedvsizes % this is really needed
+  \freezeMPpagelayout
+  \freezeMPlayout % to be used grouped
+\to \everyMPgraphic
+
+%D The next feature provides information about for instance
+%D column positions. This is an experimental feature,
+%D introduced when we needed backgrounds in columns (fill||in
+%D questions as implemented in a private module).
+%D
+%D See \type {mp-page.mp} for the definition of the macros:
+%D
+%D \starttabulate[|tl|l|p|]
+%D \NC ResetTextAreas        \NC no arguments \NC
+%D     reset areas on page                    \NC \NR
+%D \NC RegisterTextArea      \NC x, y, w, h   \NC
+%D     adds area to the list                  \NC \NR
+%D \NC TextAreaX,Y,W,H,XY,WH \NC x and/or y   \NC
+%D     reports offsets and dimensions         \NC \NR
+%D \stoptabulate
+%D
+%D The \type {TextArea*} macros can be used to determine
+%D overlap.
+
+\newcount\currentMPtextareadata
+
+\newtoks\MPsavedtextareadata
+\newtoks\MPtextareadata
+\newtoks\MPlocaltextareadata
+
+% optimaliseren voor herhaling
+
+\def\registerMPtextarea#1%
+  {\ifpositioning
+     \bgroup
+     \global\advance\currentMPtextareadata\plusone
+    %\hpos{gbd:\the\currentMPtextareadata}{#1}%
+     \hpos{gbd:\the\currentMPtextareadata}%
+       {\iftracetextareas\boxrulewidth1.5pt\ruledhbox\fi{#1}}%
+     \edef\!!stringa{gbd:\the\currentMPtextareadata}%
+     \edef\!!stringa{RegisterTextArea(%
+       \MPx\!!stringa,\MPy\!!stringa,%
+       \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
+     \@EA \doglobal \@EA \appendtoks \!!stringa \to \MPtextareadata
+     \egroup
+   \else
+     \hbox{#1}%
+   \fi}
+
+\def\registerMPlocaltextarea#1%
+  {\ifpositioning
+     \bgroup
+     \global\advance\currentMPtextareadata\plusone
+    %\hpos{gbd:\the\currentMPtextareadata}{#1}%
+     \hpos{gbd:\the\currentMPtextareadata}%
+       {\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
+     \edef\!!stringa{gbd:\the\currentMPtextareadata}%
+     \edef\!!stringa{RegisterLocalTextArea(%
+       \MPx\!!stringa,\MPy\!!stringa,%
+       \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
+     \global\MPlocaltextareadata\@EA{\!!stringa}%
+     \egroup
+   \else
+     \hbox{#1}%
+   \fi}
+
+% better, so that we can force a key and share with e.g. renumbering
+%
+% \let\namedtextarea\empty
+%
+% \def\registerMPlocaltextarea#1%
+%   {\ifpositioning
+%      \bgroup
+%      \ifx\namedtextarea\empty
+%        \global\advance\currentMPtextareadata\plusone
+%        \edef\namedtextarea{gbd:\the\currentMPtextareadata}%
+%      \fi
+%      \hpos\namedtextarea{\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
+%      \edef\ascii{RegisterLocalTextArea(%
+%        \MPx\namedtextarea,\MPy\namedtextarea,%
+%        \MPw\namedtextarea,\MPh\namedtextarea,\MPd\namedtextarea);}%
+%      \global\MPlocaltextareadata\@EA{\ascii}%
+%      \egroup
+%    \else
+%      \hbox{#1}%
+%    \fi}
+
+\def\resetMPlocaltextarea
+  {\global\MPlocaltextareadata\emptytoks}
+
+\startMPextensions
+   path PlainTextArea;
+\stopMPextensions
+
+\startMPinitializations
+  ResetTextAreas;
+  \the\MPsavedtextareadata;
+  SaveTextAreas;
+  ResetTextAreas;
+  \the\MPtextareadata;
+  \the\MPlocaltextareadata;
+  PlainTextArea:=boundingbox(\MPxy{text:\realfolio}--\MPxy{text:\realfolio}
+    shifted (\MPw{text:\realfolio},\MPh{text:\realfolio}));
+\stopMPinitializations
+
+\appendtoks
+  \global\MPsavedtextareadata\MPtextareadata
+  \global\MPtextareadata     \emptytoks
+  \global\MPlocaltextareadata\emptytoks
+\to \everyshipout
+
+\protect \endinput
diff --git a/tex/context/base/meta-pag.mkiv b/tex/context/base/meta-pag.mkiv
new file mode 100644
index 000000000..ef3817721
--- /dev/null
+++ b/tex/context/base/meta-pag.mkiv
@@ -0,0 +1,223 @@
+%D \module
+%D   [       file=meta-pag,
+%D        version=1999.07.10,
+%D          title=\METAPOST\ Graphics,
+%D       subtitle=Initialization,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 These definitions used to be part of the old \type
+%D {core-mps} file, later changed into \type {meta-ini}, but
+%D keeping them separate is cleaner.
+
+\writestatus{loading}{MetaPost Graphics / Page Data Management}
+
+\unprotect
+
+\startMPextensions
+  if unknown context_page: input mp-page; fi;
+\stopMPextensions
+
+%D The next few macros tell \METAPOST\ how the \CONTEXT\
+%D pagebody looks.
+
+\startMPextensions
+  boolean PageStateAvailable,OnRightPage,InPageBody;
+  PageStateAvailable:=true;
+\stopMPextensions
+
+\startMPinitializations
+  OnRightPage:=true;
+  InPageBody:=\ifinpagebody true \else false \fi;
+\stopMPinitializations
+
+\startMPinitializations
+  def LoadPageState =
+    OnRightPage:=\MPonrightpage;
+    OnOddPage:=\MPonoddpage;
+    RealPageNumber:=\the\realpageno;
+    PageNumber:=\the\pageno;
+    NOfPages:=\lastpage;
+    PaperHeight:=\the\paperheight;
+    PaperWidth:=\the\paperwidth;
+    PrintPaperHeight:=\the\printpaperheight;
+    PrintPaperWidth:=\the\printpaperwidth;
+    TopSpace:=\the\topspace;
+    BottomSpace:=\the\bottomspace;
+    BackSpace:=\the\backspace;
+    CutSpace:=\the\cutspace;
+    MakeupHeight:=\the\makeupheight;
+    MakeupWidth:=\the\makeupwidth;
+    TopHeight:=\the\topheight;
+    TopDistance:=\the\topdistance;
+    HeaderHeight:=\the\headerheight;
+    HeaderDistance:=\the\headerdistance;
+    TextHeight:=\the\textheight;
+    FooterDistance:=\the\footerdistance;
+    FooterHeight:=\the\footerheight;
+    BottomDistance:=\the\bottomdistance;
+    BottomHeight:=\the\bottomheight;
+    LeftEdgeWidth:=\the\leftedgewidth;
+    LeftEdgeDistance:=\the\leftedgedistance;
+    LeftMarginWidth:=\the\leftmarginwidth;
+    LeftMarginDistance:=\the\leftmargindistance;
+    TextWidth:=\the\textwidth ;
+    RightMarginDistance:=\the\rightmargindistance;
+    RightMarginWidth:=\the\rightmarginwidth;
+    RightEdgeDistance:=\the\rightedgedistance;
+    RightEdgeWidth:=\the\rightedgewidth;
+    InnerMarginDistance:=\the\innermargindistance;
+    InnerMarginWidth:=\the\innermarginwidth;
+    OuterMarginDistance:=\the\outermargindistance;
+    OuterMarginWidth:=\the\outermarginwidth;
+    InnerEdgeDistance:=\the\inneredgedistance;
+    InnerEdgeWidth:=\the\inneredgewidth;
+    OuterEdgeDistance:=\the\outeredgedistance;
+    OuterEdgeWidth:=\the\outeredgewidth;
+    PageOffset:=\the\pageoffset;
+    PageDepth:=\the\pagedepth;
+    LayoutColumns:=\the\layoutcolumns;
+    LayoutColumnDistance:=\the\layoutcolumndistance;
+    LayoutColumnWidth:=\the\layoutcolumnwidth;
+  enddef;
+\stopMPinitializations
+
+\def\MPonrightpage{true}
+\def\MPonoddpage  {true}
+
+\def\freezeMPpagelayout
+  {\edef\MPonrightpage{\doifbothsides  {tru}{tru}{fals}e}%
+   \edef\MPonoddpage  {\doifoddpageelse     {tru}{fals}e}}
+
+\let\freezeMPlayout\relax % obsolete
+
+%D We need to freeze the pagelayout before the backgrounds
+%D are build, because the overlay will temporarily become
+%D zero (overlay).
+
+\appendtoks
+  \freezeMPpagelayout
+\to \everybeforepagebody
+
+%D By freezing these value every graphic, we can use layout
+%D variables that change halfways a page, whatever use that
+%D has.
+
+\prependtoks
+  \calculatereducedvsizes % this is really needed
+  \freezeMPpagelayout
+  \freezeMPlayout % to be used grouped
+\to \everyMPgraphic
+
+%D The next feature provides information about for instance
+%D column positions. This is an experimental feature,
+%D introduced when we needed backgrounds in columns (fill||in
+%D questions as implemented in a private module).
+%D
+%D See \type {mp-page.mp} for the definition of the macros:
+%D
+%D \starttabulate[|tl|l|p|]
+%D \NC ResetTextAreas        \NC no arguments \NC
+%D     reset areas on page                    \NC \NR
+%D \NC RegisterTextArea      \NC x, y, w, h   \NC
+%D     adds area to the list                  \NC \NR
+%D \NC TextAreaX,Y,W,H,XY,WH \NC x and/or y   \NC
+%D     reports offsets and dimensions         \NC \NR
+%D \stoptabulate
+%D
+%D The \type {TextArea*} macros can be used to determine
+%D overlap.
+
+\newcount\currentMPtextareadata
+
+\newtoks\MPsavedtextareadata
+\newtoks\MPtextareadata
+\newtoks\MPlocaltextareadata
+
+% optimaliseren voor herhaling
+
+\def\registerMPtextarea#1%
+  {\ifpositioning
+     \bgroup
+     \global\advance\currentMPtextareadata\plusone
+    %\hpos{gbd:\the\currentMPtextareadata}{#1}%
+     \hpos{gbd:\the\currentMPtextareadata}%
+       {\iftracetextareas\boxrulewidth1.5pt\ruledhbox\fi{#1}}%
+     \edef\!!stringa{gbd:\the\currentMPtextareadata}%
+     \edef\!!stringa{RegisterTextArea(%
+       \MPx\!!stringa,\MPy\!!stringa,%
+       \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
+     \@EA \doglobal \@EA \appendtoks \!!stringa \to \MPtextareadata
+     \egroup
+   \else
+     \hbox{#1}%
+   \fi}
+
+\def\registerMPlocaltextarea#1%
+  {\ifpositioning
+     \bgroup
+     \global\advance\currentMPtextareadata\plusone
+    %\hpos{gbd:\the\currentMPtextareadata}{#1}%
+     \hpos{gbd:\the\currentMPtextareadata}%
+       {\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
+     \edef\!!stringa{gbd:\the\currentMPtextareadata}%
+     \edef\!!stringa{RegisterLocalTextArea(%
+       \MPx\!!stringa,\MPy\!!stringa,%
+       \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
+     \global\MPlocaltextareadata\@EA{\!!stringa}%
+     \egroup
+   \else
+     \hbox{#1}%
+   \fi}
+
+% better, so that we can force a key and share with e.g. renumbering
+%
+% \let\namedtextarea\empty
+%
+% \def\registerMPlocaltextarea#1%
+%   {\ifpositioning
+%      \bgroup
+%      \ifx\namedtextarea\empty
+%        \global\advance\currentMPtextareadata\plusone
+%        \edef\namedtextarea{gbd:\the\currentMPtextareadata}%
+%      \fi
+%      \hpos\namedtextarea{\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
+%      \edef\ascii{RegisterLocalTextArea(%
+%        \MPx\namedtextarea,\MPy\namedtextarea,%
+%        \MPw\namedtextarea,\MPh\namedtextarea,\MPd\namedtextarea);}%
+%      \global\MPlocaltextareadata\@EA{\ascii}%
+%      \egroup
+%    \else
+%      \hbox{#1}%
+%    \fi}
+
+\def\resetMPlocaltextarea
+  {\global\MPlocaltextareadata\emptytoks}
+
+\startMPextensions
+   path PlainTextArea;
+\stopMPextensions
+
+\startMPinitializations
+  ResetTextAreas;
+  \the\MPsavedtextareadata;
+  SaveTextAreas;
+  ResetTextAreas;
+  \the\MPtextareadata;
+  \the\MPlocaltextareadata;
+  PlainTextArea:=boundingbox(\MPxy{text:\realfolio}--\MPxy{text:\realfolio}
+    shifted (\MPw{text:\realfolio},\MPh{text:\realfolio}));
+\stopMPinitializations
+
+\appendtoks
+  \global\MPsavedtextareadata\MPtextareadata
+  \global\MPtextareadata     \emptytoks
+  \global\MPlocaltextareadata\emptytoks
+\to \everyshipout
+
+\protect \endinput
diff --git a/tex/context/base/meta-pag.tex b/tex/context/base/meta-pag.tex
deleted file mode 100644
index 000e56a2e..000000000
--- a/tex/context/base/meta-pag.tex
+++ /dev/null
@@ -1,226 +0,0 @@
-%D \module
-%D   [       file=meta-pag,
-%D        version=1999.07.10,
-%D          title=\METAPOST\ Graphics,
-%D       subtitle=Initialization,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 These definitions used to be part of the old \type
-%D {core-mps} file, later changed into \type {meta-ini}, but
-%D keeping them separate is cleaner.
-
-\writestatus{loading}{MetaPost Graphics / Page Data Management}
-
-\unprotect
-
-\startMPextensions
-  if unknown context_page: input mp-page; fi;
-\stopMPextensions
-
-%D The next few macros tell \METAPOST\ how the \CONTEXT\
-%D pagebody looks.
-
-\startMPextensions
-  boolean PageStateAvailable,OnRightPage,InPageBody;
-  PageStateAvailable:=true;
-\stopMPextensions
-
-\startMPinitializations
-  OnRightPage:=true;
-  InPageBody:=\ifinpagebody true \else false \fi;
-\stopMPinitializations
-
-\startMPinitializations
-  def LoadPageState =
-    OnRightPage:=\MPonrightpage;
-    OnOddPage:=\MPonoddpage;
-    RealPageNumber:=\the\realpageno;
-    PageNumber:=\the\pageno;
-    NOfPages:=\lastpage;
-    PaperHeight:=\the\paperheight;
-    PaperWidth:=\the\paperwidth;
-    PrintPaperHeight:=\the\printpaperheight;
-    PrintPaperWidth:=\the\printpaperwidth;
-    TopSpace:=\the\topspace;
-    BottomSpace:=\the\bottomspace;
-    BackSpace:=\the\backspace;
-    CutSpace:=\the\cutspace;
-    MakeupHeight:=\the\makeupheight;
-    MakeupWidth:=\the\makeupwidth;
-    TopHeight:=\the\topheight;
-    TopDistance:=\the\topdistance;
-    HeaderHeight:=\the\headerheight;
-    HeaderDistance:=\the\headerdistance;
-    TextHeight:=\the\textheight;
-    FooterDistance:=\the\footerdistance;
-    FooterHeight:=\the\footerheight;
-    BottomDistance:=\the\bottomdistance;
-    BottomHeight:=\the\bottomheight;
-    LeftEdgeWidth:=\the\leftedgewidth;
-    LeftEdgeDistance:=\the\leftedgedistance;
-    LeftMarginWidth:=\the\leftmarginwidth;
-    LeftMarginDistance:=\the\leftmargindistance;
-    TextWidth:=\the\textwidth ;
-    RightMarginDistance:=\the\rightmargindistance;
-    RightMarginWidth:=\the\rightmarginwidth;
-    RightEdgeDistance:=\the\rightedgedistance;
-    RightEdgeWidth:=\the\rightedgewidth;
-    InnerMarginDistance:=\the\innermargindistance;
-    InnerMarginWidth:=\the\innermarginwidth;
-    OuterMarginDistance:=\the\outermargindistance;
-    OuterMarginWidth:=\the\outermarginwidth;
-    InnerEdgeDistance:=\the\inneredgedistance;
-    InnerEdgeWidth:=\the\inneredgewidth;
-    OuterEdgeDistance:=\the\outeredgedistance;
-    OuterEdgeWidth:=\the\outeredgewidth;
-    PageOffset:=\the\pageoffset;
-    PageDepth:=\the\pagedepth;
-    LayoutColumns:=\the\layoutcolumns;
-    LayoutColumnDistance:=\the\layoutcolumndistance;
-    LayoutColumnWidth:=\the\layoutcolumnwidth;
-  enddef;
-\stopMPinitializations
-
-\def\MPonrightpage{true}
-\def\MPonoddpage  {true}
-
-\def\freezeMPpagelayout
-  {\doifbothsides
-     {\def\MPonrightpage{true}}
-     {\def\MPonrightpage{true}}
-     {\def\MPonrightpage{false}}%
-   \edef\MPonoddpage{\doifoddpageelse{true}{false}}}
-
-\let\freezeMPlayout\relax % obsolete
-
-%D We need to freeze the pagelayout before the backgrounds
-%D are build, because the overlay will temporarily become
-%D zero (overlay).
-
-\appendtoks
-  \freezeMPpagelayout
-\to \everybeforepagebody
-
-%D By freezing these value every graphic, we can use layout
-%D variables that change halfways a page, whatever use that
-%D has.
-
-\prependtoks
-  \calculatereducedvsizes % this is really needed
-  \freezeMPpagelayout
-  \freezeMPlayout % to be used grouped
-\to \everyMPgraphic
-
-%D The next feature provides information about for instance
-%D column positions. This is an experimental feature,
-%D introduced when we needed backgrounds in columns (fill||in
-%D questions as implemented in a private module).
-%D
-%D See \type {mp-page.mp} for the definition of the macros:
-%D
-%D \starttabulate[|tl|l|p|]
-%D \NC ResetTextAreas        \NC no arguments \NC
-%D     reset areas on page                    \NC \NR
-%D \NC RegisterTextArea      \NC x, y, w, h   \NC
-%D     adds area to the list                  \NC \NR
-%D \NC TextAreaX,Y,W,H,XY,WH \NC x and/or y   \NC
-%D     reports offsets and dimensions         \NC \NR
-%D \stoptabulate
-%D
-%D The \type {TextArea*} macros can be used to determine
-%D overlap.
-
-\newcount\currentMPtextareadata
-
-\newtoks\MPsavedtextareadata
-\newtoks\MPtextareadata
-\newtoks\MPlocaltextareadata
-
-% optimaliseren voor herhaling
-
-\def\registerMPtextarea#1%
-  {\ifpositioning
-     \bgroup
-     \global\advance\currentMPtextareadata\plusone
-    %\hpos{gbd:\the\currentMPtextareadata}{#1}%
-     \hpos{gbd:\the\currentMPtextareadata}%
-       {\iftracetextareas\boxrulewidth1.5pt\ruledhbox\fi{#1}}%
-     \edef\!!stringa{gbd:\the\currentMPtextareadata}%
-     \edef\!!stringa{RegisterTextArea(%
-       \MPx\!!stringa,\MPy\!!stringa,%
-       \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
-     \@EA \doglobal \@EA \appendtoks \!!stringa \to \MPtextareadata
-     \egroup
-   \else
-     \hbox{#1}%
-   \fi}
-
-\def\registerMPlocaltextarea#1%
-  {\ifpositioning
-     \bgroup
-     \global\advance\currentMPtextareadata\plusone
-    %\hpos{gbd:\the\currentMPtextareadata}{#1}%
-     \hpos{gbd:\the\currentMPtextareadata}%
-       {\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
-     \edef\!!stringa{gbd:\the\currentMPtextareadata}%
-     \edef\!!stringa{RegisterLocalTextArea(%
-       \MPx\!!stringa,\MPy\!!stringa,%
-       \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
-     \global\MPlocaltextareadata\@EA{\!!stringa}%
-     \egroup
-   \else
-     \hbox{#1}%
-   \fi}
-
-% better, so that we can force a key and share with e.g. renumbering
-%
-% \let\namedtextarea\empty
-%
-% \def\registerMPlocaltextarea#1%
-%   {\ifpositioning
-%      \bgroup
-%      \ifx\namedtextarea\empty
-%        \global\advance\currentMPtextareadata\plusone
-%        \edef\namedtextarea{gbd:\the\currentMPtextareadata}%
-%      \fi
-%      \hpos\namedtextarea{\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
-%      \edef\ascii{RegisterLocalTextArea(%
-%        \MPx\namedtextarea,\MPy\namedtextarea,%
-%        \MPw\namedtextarea,\MPh\namedtextarea,\MPd\namedtextarea);}%
-%      \global\MPlocaltextareadata\@EA{\ascii}%
-%      \egroup
-%    \else
-%      \hbox{#1}%
-%    \fi}
-
-\def\resetMPlocaltextarea
-  {\global\MPlocaltextareadata\emptytoks}
-
-\startMPextensions
-   path PlainTextArea;
-\stopMPextensions
-
-\startMPinitializations
-  ResetTextAreas;
-  \the\MPsavedtextareadata;
-  SaveTextAreas;
-  ResetTextAreas;
-  \the\MPtextareadata;
-  \the\MPlocaltextareadata;
-  PlainTextArea:=boundingbox(\MPxy{text:\realfolio}--\MPxy{text:\realfolio}
-    shifted (\MPw{text:\realfolio},\MPh{text:\realfolio}));
-\stopMPinitializations
-
-\appendtoks
-  \global\MPsavedtextareadata\MPtextareadata
-  \global\MPtextareadata     \emptytoks
-  \global\MPlocaltextareadata\emptytoks
-\to \everyshipout
-
-\protect \endinput
diff --git a/tex/context/base/meta-pdf.lua b/tex/context/base/meta-pdf.lua
index 240778bfa..056d1052f 100644
--- a/tex/context/base/meta-pdf.lua
+++ b/tex/context/base/meta-pdf.lua
@@ -7,55 +7,77 @@ if not modules then modules = { } end modules ['meta-pdf'] = {
 }
 
 -- Finally we used an optimized version. The test code can be found in
--- meta-pdh.lua but since we no longer want to overload functione we
--- use more locals now.
+-- meta-pdh.lua but since we no longer want to overload functione we use
+-- more locals now. This module keeps changing as it is also a testbed.
 
 local concat, format, gsub, find = table.concat, string.format, string.gsub, string.find
-local byte = string.byte
+local byte, round = string.byte, math.round
 local texsprint = tex.sprint
-
 local ctxcatcodes = tex.ctxcatcodes
 
+local pdfrgbcode                = lpdf.rgbcode
+local pdfcmykcode               = lpdf.cmykcode
+local pdfgraycode               = lpdf.graycode
+local pdfspotcode               = lpdf.spotcode
+local pdftransparencycode       = lpdf.transparencycode
+local pdffinishtransparencycode = lpdf.finishtransparencycode
+
 mptopdf   = { }
 mptopdf.n = 0
 
 local m_path, m_stack, m_texts, m_version, m_date, m_shortcuts = { }, { }, { }, 0, 0, false
 
 local m_stack_close, m_stack_path, m_stack_concat = false, { }, nil
+local extra_path_code, ignore_path = nil, false
+local specials = { }
 
 local function resetpath()
-    m_stack_close   = false
-    m_stack_path    = { }
-    m_stack_concat  = nil
+    m_stack_close, m_stack_path, m_stack_concat = false, { }, nil
 end
 
 local function resetall()
     m_path, m_stack, m_texts, m_version, m_shortcuts = { }, { }, { }, 0, false
+    extra_path_code, ignore_path = nil, false
+    specials = { }
     resetpath()
 end
 
 resetall()
 
--- code injection, todo: collect and flush packed using node injection
+-- todo: collect and flush packed using pdfliteral node injection but we're
+-- in no hurry as this kind of conversion does not happen that often in mkiv
 
-local function pdfcode(str) -- not used
-    texsprint(ctxcatcodes,"\\MPScode{",str,"}")
+local function pdfcode(str)
+    texsprint(ctxcatcodes,"\\pdfliteral{" .. str .. "}")
 end
+
 local function texcode(str)
     texsprint(ctxcatcodes,str)
 end
 
+function mpscode(str)
+    if ignore_path then
+        pdfcode("h W n")
+        if extra_path_code then
+            pdfcode(extra_path_code)
+            extra_path_code = nil
+        end
+        ignore_path = false
+    else
+        pdfcode(str)
+    end
+end
+
 -- auxiliary functions
 
 local function flushconcat()
     if m_stack_concat then
-        texsprint(ctxcatcodes,"\\MPScode{",concat(m_stack_concat," ")," cm}")
+        mpscode(concat(m_stack_concat," ") .. " cm")
         m_stack_concat = nil
     end
 end
 
 local function flushpath(cmd)
-    -- faster: no local function
     if #m_stack_path > 0 then
         local path = { }
         if m_stack_concat then
@@ -63,9 +85,6 @@ local function flushpath(cmd)
             local rx, ry = m_stack_concat[2], m_stack_concat[3]
             local tx, ty = m_stack_concat[5], m_stack_concat[6]
             local d = (sx*sy) - (rx*ry)
-        --  local function mpconcat(px, py) -- move this inline
-        --      return (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d
-        --  end
             for k=1,#m_stack_path do
                 local v = m_stack_path[k]
                 local px, py = v[1], v[2] ; v[1], v[2] = (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d -- mpconcat(v[1],v[2])
@@ -81,11 +100,11 @@ local function flushpath(cmd)
             end
         end
         flushconcat()
-        texcode("\\MPSpath{" .. concat(path," ") .. "}")
+        pdfcode(concat(path," "))
         if m_stack_close then
-            texcode("\\MPScode{h " .. cmd .. "}")
+            mpscode("h " .. cmd)
         else
-            texcode("\\MPScode{" .. cmd .."}")
+            mpscode(cmd)
         end
     end
     resetpath()
@@ -132,7 +151,7 @@ function mps.rlineto(x,y)
 end
 
 function mps.translate(tx,ty)
-    texsprint(ctxcatcodes,"\\MPScode{1 0 0 0 1 ",tx," ",ty," cm}")
+    mpscode("1 0 0 0 1 " .. tx .. " " .. ty .. " cm")
 end
 
 function mps.scale(sx,sy)
@@ -144,36 +163,36 @@ function mps.concat(sx, rx, ry, sy, tx, ty)
 end
 
 function mps.setlinejoin(d)
-    texsprint(ctxcatcodes,"\\MPScode{",d," j}")
+    mpscode(d .. " j")
 end
 
 function mps.setlinecap(d)
-    texsprint(ctxcatcodes,"\\MPScode{",d," J}")
+    mpscode(d .. " J")
 end
 
 function mps.setmiterlimit(d)
-    texsprint(ctxcatcodes,"\\MPScode{",d," M}")
+    mpscode(d .. " M")
 end
 
 function mps.gsave()
-    texsprint(ctxcatcodes,"\\MPScode{q}")
+    mpscode("q")
 end
 
 function mps.grestore()
-    texsprint(ctxcatcodes,"\\MPScode{Q}")
+    mpscode("Q")
 end
 
 function mps.setdash(...) -- can be made faster, operate on t = { ... }
     local n = select("#",...)
-    texsprint(ctxcatcodes,"\\MPScode{","[",concat({...}," ",1,n-1),"] ",select(n,...)," d}")
+    mpscode("[" .. concat({...}," ",1,n-1) .. "] " .. select(n,...) .. " d")
 end
 
 function mps.resetdash()
-    texsprint(ctxcatcodes,"\\MPScode{[ ] 0 d}")
+    mpscode("[ ] 0 d")
 end
 
 function mps.setlinewidth(d)
-    texsprint(ctxcatcodes,"\\MPScode{",d," w}")
+    mpscode(d .. " w")
 end
 
 function mps.closepath()
@@ -206,31 +225,136 @@ function mps.textext(font, scale, str) -- old parser
     resetpath()
 end
 
+local handlers = { }
+
+handlers[1] = function(s)
+    pdfcode(pdffinishtransparencycode())
+    pdfcode(pdfcmykcode(mps.colormodel,s[3],s[4],s[5],s[6]))
+end
+handlers[2] = function(s)
+    pdfcode(pdffinishtransparencycode())
+    pdfcode(pdfspotcode(mps.colormodel,s[3],s[4],s[5],s[6]))
+end
+handlers[3] = function(s)
+    pdfcode(pdfrgbcode(mps.colormodel,s[4],s[5],s[6]))
+    pdfcode(pdftransparencycode(s[2],s[3]))
+end
+handlers[4] = function(s)
+    pdfcode(pdfcmykcode(mps.colormodel,s[4],s[5],s[6],s[7]))
+    pdfcode(pdftransparencycode(s[2],s[3]))
+end
+handlers[5] = function(s)
+    pdfcode(pdfspotcode(mps.colormodel,s[4],s[5],s[6],s[7]))
+    pdfcode(pdftransparencycode(s[2],s[3]))
+end
+
+-- todo: color conversion
+
+local nofshades, tn = 0, tonumber
+
+local function linearshade(colorspace,domain,ca,cb,coordinates)
+    pdfcode(pdffinishtransparencycode())
+    nofshades = nofshades + 1
+    local name = format("MpsSh%s",nofshades)
+    lpdf.linearshade(name,domain,ca,cb,1,colorspace,coordinates)
+    extra_path_code, ignore_path = format("/%s sh Q",name), true
+    pdfcode("q /Pattern cs")
+end
+
+local function circularshade(colorspace,domain,ca,cb,coordinates)
+    pdfcode(pdffinishtransparencycode())
+    nofshades = nofshades + 1
+    local name = format("MpsSh%s",nofshades)
+    lpdf.circularshade(name,domain,ca,cb,1,colorspace,coordinates)
+    extra_path_code, ignore_path = format("/%s sh Q",name), true
+    pdfcode("q /Pattern cs")
+end
+
+handlers[30] = function(s)
+    linearshade("DeviceRGB", { tn(s[ 2]), tn(s[ 3]) },
+        { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]) }, { tn(s[10]), tn(s[11]), tn(s[12]) },
+        { tn(s[ 8]), tn(s[ 9]), tn(s[13]), tn(s[14]) } )
+end
+
+handlers[31] = function(s)
+    circularshade("DeviceRGB", { tn(s[ 2]), tn(s[ 3]) },
+        { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]) }, { tn(s[11]), tn(s[12]), tn(s[13]) },
+        { tn(s[ 8]), tn(s[ 9]), tn(s[10]), tn(s[14]), tn(s[15]), tn(s[16]) } )
+end
+
+handlers[32] = function(s)
+    linearshade("DeviceCMYK", { tn(s[ 2]), tn(s[ 3]) },
+        { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]), tn(s[ 8]) }, { tn(s[11]), tn(s[12]), tn(s[13]), tn(s[14]) },
+        { tn(s[ 9]), tn(s[10]), tn(s[15]), tn(s[16]) } )
+end
+
+handlers[33] = function(s)
+    circularshade("DeviceCMYK", { tn(s[ 2]), tn(s[ 3]) },
+        { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]), tn(s[ 8]) }, { tn(s[12]), tn(s[13]), tn(s[14]), tn(s[15]) },
+        { tn(s[ 9]), tn(s[10]), tn(s[11]), tn(s[16]), tn(s[17]), tn(s[18]) } )
+end
+
+handlers[34] = function(s) -- todo (after further cleanup)
+    linearshade("DeviceGray", { tn(s[ 2]), tn(s[ 3]) }, { 0 }, { 1 }, { tn(s[9]), tn(s[10]), tn(s[15]), tn(s[16]) } )
+end
+
+handlers[35] = function(s) -- todo (after further cleanup)
+    circularshade("DeviceGray",  { tn(s[ 2]), tn(s[ 3]) }, { 0 }, { 1 }, { tn(s[9]), tn(s[10]), tn(s[15]), tn(s[16]) } )
+end
+
+-- not supported in mkiv , use mplib instead
+
+handlers[10] = function() logs.report("mptopdf","skipping special %s",10) end
+handlers[20] = function() logs.report("mptopdf","skipping special %s",20) end
+handlers[50] = function() logs.report("mptopdf","skipping special %s",50) end
+
+--end of not supported
+
 function mps.setrgbcolor(r,g,b) -- extra check
     r, g = tonumber(r), tonumber(g) -- needed when we use lpeg
     if r == 0.0123 and g < 0.1 then
-        texcode("\\MPSspecial{" .. g*10000 .. "}{" .. b*10000 .. "}")
+        g, b = round(g*10000), round(b*10000)
+        local s = specials[b]
+        local h = round(s[#s])
+        local handler = handlers[h]
+        if handler then
+            handler(s)
+        else
+            logs.report("mptopdf","unknown special handler %s (1)",h)
+        end
     elseif r == 0.123 and g < 0.1 then
-        texcode("\\MPSspecial{" .. g* 1000 .. "}{" .. b* 1000 .. "}")
+        g, b = round(g*1000), round(b*1000)
+        local s = specials[b]
+        local h = round(s[#s])
+        local handler = handlers[h]
+        if handler then
+            handler(s)
+        else
+            logs.report("mptopdf","unknown special handler %s (2)",h)
+        end
     else
-        texcode("\\MPSrgb{" .. r .. "}{" .. g .. "}{" .. b .. "}")
+        pdfcode(pdffinishtransparencycode())
+        pdfcode(pdfrgbcode(mps.colormodel,r,g,b))
     end
 end
 
 function mps.setcmykcolor(c,m,y,k)
-    texcode("\\MPScmyk{" .. c .. "}{" .. m .. "}{" .. y .. "}{" .. k .. "}")
+    pdfcode(pdffinishtransparencycode())
+    pdfcode(pdfcmykcode(mps.colormodel,c,m,y,k))
 end
 
 function mps.setgray(s)
-    texcode("\\MPSgray{" .. s .. "}")
+    pdfcode(pdffinishtransparencycode())
+    pdfcode(pdfgrayliteral(mps.colormodel,s))
 end
 
 function mps.specials(version,signal,factor) -- 2.0 123 1000
 end
 
 function mps.special(...) -- 7 1 0.5 1 0 0 1 3
-    local n = select("#",...)
-    texcode("\\MPSbegin\\MPSset{" .. concat({...},"}\\MPSset{",2,n) .. "}\\MPSend")
+    local t = { ... }
+    local n = tonumber(t[#t-1])
+    specials[n] = t
 end
 
 function mps.begindata()
@@ -242,10 +366,6 @@ end
 function mps.showpage()
 end
 
-function mps.attribute(id,value)
-    texcode("\\attribute " .. id .. "=" .. value .. " ")
-end
-
 -- lpeg parser
 
 -- The lpeg based parser is rather optimized for the kind of output
@@ -350,9 +470,6 @@ local t   = (lpegP("[") * (cnumber * sp^0)^6 * lpegP("]") * sp * lpegP("t") ) /
 
 -- experimental
 
-local attribute = ((cnumber * sp)^2 * lpegP("attribute")) / mps.attribute
-local A         = ((cnumber * sp)^2 * lpegP("A"))         / mps.attribute
-
 local preamble = (
     prolog + setup +
     boundingbox + highresboundingbox + specials + special +
@@ -362,7 +479,6 @@ local preamble = (
 local procset = (
     lj + ml + lc +
     c + l + m + n + p + r +
-    A +
     R + C + G +
     S + F + B + W +
     vlw + hlw +
@@ -376,7 +492,6 @@ local procset = (
 local verbose = (
     curveto + lineto + moveto + newpath + closepath + rlineto +
     setrgbcolor + setcmykcolor + setgray +
-    attribute +
     setlinejoin + setmiterlimit + setlinecap +
     stroke + fill + clip + both +
     setlinewidth_x + setlinewidth_y +
@@ -390,7 +505,8 @@ local verbose = (
 -- order matters in terms of speed / we could check for procset first
 
 local captures_old = ( space + verbose + preamble           )^0
-local captures_new = ( space + procset + preamble + verbose )^0
+--~ local captures_new = ( space + procset + preamble + verbose )^0
+local captures_new = ( space + verbose + procset + preamble )^0
 
 local function parse(m_data)
     if find(m_data,"%%%%BeginResource: procset mpost") then
@@ -402,17 +518,25 @@ end
 
 -- main converter
 
+local a_colorspace = attributes.private('colormodel')
+
 function mptopdf.convertmpstopdf(name)
     resetall()
     local ok, m_data, n = resolvers.loadbinfile(name, 'tex') -- we need a binary load !
     if ok then
+        mps.colormodel = tex.attribute[a_colorspace]
         statistics.starttiming(mptopdf)
         mptopdf.n = mptopdf.n + 1
+        pdfcode(format("\\letterpercent\\space mptopdf begin: n=%s, file=%s",mptopdf.n,file.basename(name)))
+        pdfcode("q 1 0 0 1 0 0 cm")
         parse(m_data)
+        pdfcode(pdffinishtransparencycode())
+        pdfcode("Q")
+        pdfcode("\\letterpercent\\space mptopdf end")
         resetall()
         statistics.stoptiming(mptopdf)
     else
-        tex.print("file " .. name .. " not found")
+        commands.writestatus("mptopdf","file '%s' not found",name)
     end
 end
 
diff --git a/tex/context/base/meta-pdf.mkiv b/tex/context/base/meta-pdf.mkiv
index 906633802..fa9627fbe 100644
--- a/tex/context/base/meta-pdf.mkiv
+++ b/tex/context/base/meta-pdf.mkiv
@@ -11,17 +11,6 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-%D Formerly known as supp-pdf.tex and supp-mpe.tex.
-
-% \useMPgraphic{1}
-% \testfeatureonce{250}{\setbox0\hbox{\convertMPtoPDF{test-mps-mpgraph.1}{1}{1}}}
-%
-%  8.4 : mkii, direct parsing by tex
-% 11.8 : mkiv, dirty conversion (10.8 with dirty tricks)
-% 14.5 : mkiv, clean conversion
-%  7.4 : mkiv, simulated clean direct lua from mp
-%  0.3 : time taken by tex to handle converted code
-
 \registerctxluafile{meta-pdf}{1.003}
 
 %D We will clean up the color mess later.
@@ -30,13 +19,6 @@
 
 \unprotect
 
-\ifx\PDFcode   \undefined \let\PDFcode      \gobbleoneargument                \fi
-\ifx\PDFcomment\undefined \def\PDFcomment#1{\PDFcode{\letterpercent\space#1}} \fi
-
-%D First we define a handy constant:
-
-\bgroup \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup
-
 %D \macros
 %D   {convertMPtoPDF}
 %D
@@ -57,67 +39,25 @@
 %D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5}
 %D \stoptyping
 
-%D \macros
-%D   {makeMPintoPDFobject,lastPDFMPobject}
-%D
-%D For experts there are a few more options. When attributes
-%D are to be added, the code must be embedded in an object
-%D accompanied with the appropriate directives. One can
-%D influence this process with \type {\makeMPintoPDFobject}.
-%D
-%D This option defaults to~0, because \CONTEXT\ takes care
-%D of objects at another level, which saves some bytes.
-%D
-%D \starttabulate[|l|l|p|]
-%D \NC 0 \NC never    \NC don't use an object    \NC\NR
-%D \NC 1 \NC always   \NC always use an object   \NC\NR
-%D \NC 2 \NC optional \NC use object when needed \NC\NR
-%D \stoptabulate
-%D
-%D The last object number used is avaliable in the macro
-%D \type {\lastPDFMPobject}.
-
-\ifx\makeMPintoPDFobject   \undefined \chardef\makeMPintoPDFobject   \zerocount \fi
-\ifx\blackoutMPgraphic     \undefined \chardef\blackoutMPgraphic     \plusone   \fi
-\ifx\everyMPtoPDFconversion\undefined \newtoks\everyMPtoPDFconversion           \fi
-
-\let\lastPDFMPobject    \!!zerocount
-\let\currentPDFresources\empty
-\let\setMPextensions    \relax
-
 \def\PDFMPformoffset
-  {\ifx\objectoffset\undefined\zeropoint\else\objectoffset\fi}
-
-\def\resetMPvariables#1#2#3%
-  {\global\let\MPwidth \!!zeropoint
-   \global\let\MPheight\!!zeropoint
-   \global\let\MPllx   \!!zerocount
-   \global\let\MPlly   \!!zerocount
-   \global\let\MPurx   \!!zerocount
-   \global\let\MPury   \!!zerocount
-   \xdef\MPxscale      {#2}\ifx\MPxscale\empty\let\MPxscale\!!plusone\fi
-   \xdef\MPyscale      {#3}\ifx\MPyscale\empty\let\MPyscale\!!plusone\fi
-   \xdef\MPfilename    {#1}}
+  {\ifdefined\objectoffset\objectoffset\else\zeropoint\fi}
 
 %D The main macro:
 
-\def\convertMPtoPDF#1#2#3% watch the transparency reset
-  {\resetMPvariables{#1}{#2}{#3}%
-   \vbox\bgroup
+\def\convertMPtoPDF#1#2#3% scaling no longer supported at this level (so #2 & #3 ignored)
+  {\vbox\bgroup
+     \message{[MP to PDF]}%
+     \xdef\MPfilename{#1}%
+     \glet\MPwidth \!!zeropoint
+     \glet\MPheight\!!zeropoint
+     \glet\MPllx   \!!zerocount
+     \glet\MPlly   \!!zerocount
+     \glet\MPurx   \!!zerocount
+     \glet\MPury   \!!zerocount
      \forgetall
      \offinterlineskip
-    %\ifcase\blackoutMPgraphic\or\PDFcode{0 g 0 G}\fi % fixed in mp
      \setbox\scratchbox\vbox\bgroup
-        \setnormalcatcodes % we can be in verbatim or so
-        \message{[MP to PDF]}%
-        \startMPresources
-        \PDFcomment{mps begin}%
-        \PDFcode{q 1 0 0 1 0 0 cm}%
-        \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces
-        \dohandleMPresettransparency % a bit messy here, should be a toks
-        \PDFcode{Q}%
-        \PDFcomment{mps end}%
-        \stopMPresources
+       \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces
      \egroup
      \setbox\scratchbox\hbox\bgroup
         \hskip-\MPllx\onebasepoint
@@ -135,53 +75,33 @@
      \dopackageMPgraphic\scratchbox
    \egroup}
 
-\let\processMPtoPDFfile\convertMPtoPDF
-
-%D A common hook.
-
-\let\MPfshowcommand\empty
-
-%D Objects.
-
-\def\dopackageMPgraphic#1% #1 = boxregister
-  {\ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else
-     % an existing value of 2 signals object support (set elsewhere)
-     \chardef\makeMPintoPDFobject\plusone
-   \fi\fi
-   \ifcase\makeMPintoPDFobject
-     \box#1%
-   \or
-     \scratchdimen\PDFMPformoffset\relax
-     \ifdim\scratchdimen>\zeropoint % compensate for error
-       \setbox#1\vbox spread 2\scratchdimen
-         {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}%
-     \fi
-     \setMPPDFobject{\currentPDFresources}{#1}%
-     \ifdim\scratchdimen>\zeropoint % compensate for error
-       \vbox to \MPheight
-         {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}%
-     \else
-       \getMPPDFobject
-     \fi
-     \global\let\currentPDFresources\empty
-   \else
-     \box#1%
-   \fi}
+%D Objects (move all to backend)
+
+% \def\dopackageMPgraphic#1% #1 = boxregister
+%   {\scratchdimen\PDFMPformoffset\relax
+%    \ifdim\scratchdimen>\zeropoint % compensate for error
+%      \setbox#1\vbox spread 2\scratchdimen
+%        {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}%
+%    \fi
+%    \setMPPDFobject{#1}%
+%    \ifdim\scratchdimen>\zeropoint % compensate for error
+%      \vbox to \MPheight
+%        {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}%
+%    \else
+%      \getMPPDFobject
+%    \fi}
+%
+% \def\setMPPDFobject#1% boxnumber
+%   {\the\pdfbackendeveryxform
+%    \finalizeobjectbox{#1}%
+%    \immediate\pdfxform resources{\pdfcurrentresources}#1%
+%    \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}}
+%
+% \let\getMPPDFobject\relax
 
-\def\setMPPDFobject#1#2% resources boxnumber
-  {\ifx\pdfxform\undefined
-     \def\getMPPDFobject{\box#2}%
-   \else\ifx\pdftexversion\undefined
-     \def\getMPPDFobject{\box#2}%
-   \else\ifnum\pdftexversion<14
-     \def\getMPPDFobject{\box#2}%
-   \else
-     \ifx\everyPDFxform\undefined\else\the\everyPDFxform\fi
-     \immediate\pdfxform resources{#1}#2%
-     \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}%
-   \fi\fi\fi}
+% we don't need to package as each page has all resources anyway
 
-\let\getMPPDFobject\relax
+\let\dopackageMPgraphic\box
 
 %D \macros
 %D   {deleteMPgraphic,
@@ -243,32 +163,6 @@
 
 \newconditional\manyMPspecials \settrue\manyMPspecials
 
-%D In case of \PDF, we need to prepare resourcs.
-
-\newtoks\MPstartresources
-\newtoks\MPstopresources
-
-\def\startMPresources
-  {\the\MPstartresources}
-
-\def\stopMPresources
-  {\the\MPstopresources}
-
-%D Some day we may consider collecting local resources.
-
-\appendtoks
-  \global\let\currentPDFresources\empty % kind of redundant
-\to \MPstartresources
-
-% \appendtoks
-%    \collectPDFresources
-%    \global\let\currentPDFresources\collectedPDFresources
-% \to \MPstopresources
-
-\appendtoksonce
-   \the\everyPDFxform
-\to \MPstopresources
-
 %D Since colors are not subjected to transformations, we can
 %D only use colors as signal. In our case, we use a dummy colored
 %D path with a red color component of \type {0.n}, so \type
@@ -278,25 +172,11 @@
 \newif\ifMPcmykcolors
 \newif\ifMPspotcolors
 
-\def\dohandleMPrgb   #1#2#3{\revokeMPtransparencyspecial\execcolorR   #1:#2:#3:0:0\od}
-\def\dohandleMPcmyk#1#2#3#4{\revokeMPtransparencyspecial\execcolorC#1:#2:#3:#4:0:0\od}
-\def\dohandleMPgray      #1{\revokeMPtransparencyspecial\execcolorS         #1:0:0\od}
-\def\dohandleMPspot#1#2#3#4{\revokeMPtransparencyspecial\execcolorP#1:#2:#3:#4:0:0\od}
-
-%D Specials:
-
-\settrue \manyMPspecials \newcount\nofMParguments \let\extraMPpathcode\empty
-
-\def\@@MP  {@@MP}
-\def\@@MPSK{@MPSK@}
-
-\def\MPspecial{\@@MPSK\@@MPSK\gMPs\nofMParguments}
-
-\def\defineMPspecial#1#2%
-  {\setvalue{\@@MPSK\@@MPSK#1}{#2}}
-
-%D Special number~1 is dedicated to \CMYK\ support. If you
-%D want to know why: look at this:
+%D We support specials but assume that the files are somewhat simple
+%D ones wo we have dropped a few. The reason is that runtime \METAPOST\
+%D processing now uses \MPLIB\ so we only need to deal with the
+%D conversion here. See meta-pdh.mkiv (and older files) for more
+%D details. Here we just give a few examples.
 %D
 %D \startbuffer[mp]
 %D   fill fullcircle xyscaled (3cm,1cm) withcolor \MPcolor{test} ;
@@ -326,38 +206,11 @@
 %D    no conversion to \RGB,
 %D    support in \METAPOST}
 %D   {\setupcolors[cmyk=ja,state=start]\getbuffer[cmyk]}
-
-\defineMPspecial{1}
-  {\ifMPcmykcolors
-     \setxvalue{\@@MPSK\gMPs6}{\noexpand\dohandleMPcmykcolor{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}}%
-   \fi}
-
-\defineMPspecial{2}
-  {\ifMPspotcolors
-     \setxvalue{\@@MPSK\gMPs6}{\noexpand\dohandleMPspotcolor{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}}%
-%      \checkMPspot{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}%
-   \fi}
-
-% \def\checkMPspot#1#2#3#4%
-%   {\normalexpanded{\noexpand\resolveMPspotcolor#1 #2 #3 #4}\end
-%    \ifx\MPspotspace\MPresolvedspace
-%      \edef\MPspotspacespec{/\MPspotspace\space}%
-%      \doifinstringelse\MPspotspacespec\currentMPcolorspaces
-%        \donothing\registerMPcolorspace
-%    \fi}
-
-\let\revokeMPtransparencyspecial\relax
-
-\def\dohandleMPrgbcolor   #1#2#3{\revokeMPtransparencyspecial\execcolorR   #1:#2:#3:0:0\od}
-\def\dohandleMPcmykcolor#1#2#3#4{\revokeMPtransparencyspecial\execcolorC#1:#2:#3:#4:0:0\od}
-\def\dohandleMPgraycolor      #1{\revokeMPtransparencyspecial\execcolorS         #1:0:0\od}
-\def\dohandleMPspotcolor#1#2#3#4{\revokeMPtransparencyspecial\execcolorP#1:#2:#3:#4:0:0\od}
-
+%D
 %D Transparency support used specials 60 (rgb) and 61
 %D (cmyk).
 %D
-%D \startbufferFshade
-
+%D \startbuffer
 %D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
 %D
 %D fill p rotated  90 withcolor transparent(1,.5,yellow) ;
@@ -390,28 +243,6 @@
 %D
 %D \startlinecorrection \processMPbuffer \stoplinecorrection
 %D
-%D We save all the three components needed in one macro,
-%D just to save hash space.
-
-\def\dohandleMPrgbtransparency   #1#2#3#4#5{\execcolorR   #1:#2:#3:#4:#5\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial}
-\def\dohandleMPcmyktransparency#1#2#3#4#5#6{\execcolorC#1:#2:#3:#4:#5:#6\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial}
-\def\dohandleMPgraytransparency      #1#2#3{\execcolorS         #1:#2:#3\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial}
-\def\dohandleMPspottransparency#1#2#3#4#5#6{\execcolorP#1:#2:#3:#4:#5:#6\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial}
-
-\def\dorevokeMPtransparencyspecial
-  {\PDFcode{\PDFtransparencyresetidentifier\space gs}%
-   \let\revokeMPtransparencyspecial\relax}
-
-\defineMPspecial{3} % rgb
-  {\setxvalue{\@@MPSK\gMPs6}{\noexpand\dohandleMPrgbtransparency{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs1}{\gMPs2}}}
-
-\defineMPspecial{4} % cmyk
-  {\setxvalue{\@@MPSK\gMPs7}{\noexpand\dohandleMPcmyktransparency{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs1}{\gMPs2}}}
-
-\defineMPspecial{5} % spot
-  {\setxvalue{\@@MPSK\gMPs7}{\noexpand\dohandleMPspottransparency{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs1}{\gMPs2}}%
-   }%\checkMPspot{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}}
-
 %D Shading is an example of a more advanced graphic feature,
 %D but users will seldom encounter those complications. Here
 %D we only show a few simple examples, but many other
@@ -448,9 +279,7 @@
 %D \stopuniqueMPgraphic
 %D \stopbuffer
 %D
-%D \typebuffer
-%D
-%D \getbuffer
+%D \typebuffer \getbuffer
 %D
 %D These graphics can be hooked into the overlay mechanism,
 %D which is available in many commands.
@@ -461,9 +290,7 @@
 %D \defineoverlay[demo 3][\uniqueMPgraphic {DuotoneShade}]
 %D \stopbuffer
 %D
-%D \typebuffer
-%D
-%D \getbuffer
+%D \typebuffer \getbuffer
 %D
 %D These backgrounds can for instance be applied to \type
 %D {\framed}:
@@ -506,8 +333,6 @@
 %D \stopcombination
 %D \stoplinecorrection
 %D
-%D \blank
-%D
 %D \startlinecorrection
 %D \startcombination[5*1]
 %D   {\SomeShade{20}{circular}{0}{.9green}{.3green}} {circular 0}
@@ -518,8 +343,6 @@
 %D \stopcombination
 %D \stoplinecorrection
 %D
-%D \blank
-%D
 %D \startlinecorrection
 %D \startcombination[4*1]
 %D   {\SomeShade{30}{linear}{0}{.3red}{.9red}} {linear 0}
@@ -545,96 +368,7 @@
 %D \NC /C1     \NC outer shade \NC \NR
 %D \NC /N      \NC smaller values, bigger inner circles \NC \NR
 %D \stoptabulate
-
-\newcount\currentPDFshade  % 0  % global (document wide) counter
-
-\def\dosetMPsomePDFshade#1#2%
-  {\immediate\pdfobj
-     {<>}%
-   \immediate\pdfobj
-     {<>}%
-   \global\advance\currentPDFshade \plusone
-   \appendtoPDFdocumentshades{/Sh\the\currentPDFshade\space\the\pdflastobj\space0 R }%
-   \setxvalue{\@@MPSK#2}{\noexpand\dohandleMPshade{\the\currentPDFshade}}}
-
-\def\dosetMPlinearshade  {\dosetMPsomePDFshade2}% #1
-\def\dosetMPcircularshade{\dosetMPsomePDFshade3}% #1
-
-\defineMPspecial{30}
-  {\normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA
-   \normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs{9}}{\gMPs{10}}{\gMPs{11}}}\to\MPshadeB
-   \edef\MPshadeC{\gMPs7 \gMPs8 \gMPs{12} \gMPs{13}}%
-   \dosetMPlinearshade{\gMPs{14}}}
-
-\defineMPspecial{31}
-  {\normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA
-   \normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}}\to\MPshadeB
-   \edef\MPshadeC{\gMPs7 \gMPs8 \gMPs9 \gMPs{13} \gMPs{14} \gMPs{15}}%
-   \dosetMPcircularshade{\gMPs{16}}}
-
-\defineMPspecial{32}
-  {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
-   \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB
-   \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}%
-   \dosetMPlinearshade{\gMPs{16}}}
-
-\defineMPspecial{33}
-  {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
-   \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}{\gMPs{14}}}\to\MPshadeB
-   \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{10} \gMPs{15} \gMPs{16} \gMPs{17}}%
-   \dosetMPcircularshade{\gMPs{18}}}
-
-\defineMPspecial{34}
-  {\normalexpanded{\noexpand\resolveMPspotcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
-   \normalexpanded{\noexpand\resolveMPspotcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB
-   \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}%
-   \dosetMPlinearshade{\gMPs{16}}}
-
-\defineMPspecial{35}
-  {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
-   \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}{\gMPs{14}}}\to\MPshadeB
-   \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{10} \gMPs{15} \gMPs{16} \gMPs{17}}%
-   \dosetMPcircularshade{\gMPs{18}}}
-
-\newconditional\ignoreMPpath
-
-\def\dohandleMPshade#1%
-  {\revokeMPtransparencyspecial
-   \settrue\ignoreMPpath
-   \def\extraMPpathcode{/Sh#1 sh Q}%
-   \chardef\finiMPpath\zerocount
-   \PDFcode{q /Pattern cs}}
-
-\defineMPspecial{10}
-  {\setxvalue{\@@MPSK\gMPs8}%
-     {\noexpand\handleMPfigurespecial{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}{\gMPs8}}}
-
-\def\handleMPfigurespecial#1#2#3#4#5#6#7#8% todo : combine with ext fig
-  {\global\letvalue{\@@MPSK#8}\empty
-   \vbox to \zeropoint
-     {\vss
-      \hbox to \zeropoint
-        {\ifcase\pdfoutput\or % will be hooked into the special driver
-           \doiffileelse{#7}
-             {\doifundefinedelse{mps:x:#7}
-                {\immediate\pdfximage\!!width\onebasepoint\!!height\onebasepoint{#7}%
-                 \setxvalue{mps:x:#7}{\pdfrefximage\the\pdflastximage}}%
-                {\message{[reusing figure #7]}}%
-              \PDFcode{q #1 #2 #3 #4 #5 #6 cm}%
-              \rlap{\getvalue{mps:x:#7}}%
-              \PDFcode{Q}}
-             {\message{[unknown figure #7]}}%
-         \fi
-         \hss}}}
-
+%D
 %D An example of using both special features is the
 %D following.
 %D
@@ -653,294 +387,88 @@
 %D \stopMPpage
 %D \stoptyping
 
-\defineMPspecial{20}
-  {\setxvalue{\@@MPSK\gMPs6}%
-     {\noexpand\handleMPhyperlink{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}}}
-
-\def\handleMPhyperlink#1#2#3#4#5#6%
-  {\global\letvalue{\@@MPSK#6}\empty
-   \setbox\scratchbox\hbox
-     {\setbox\scratchbox\null
-      \wd\scratchbox\dimexpr-#1\onebasepoint+#3\onebasepoint\relax
-      \ht\scratchbox\dimexpr-#2\onebasepoint+#4\onebasepoint\relax
-      \incolorfalse
-      \gotobox{\box\scratchbox}[#5]}%
-   \setbox\scratchbox\hbox
-     {\hskip\dimexpr\MPxoffset\onebasepoint+#1\onebasepoint\relax
-      \raise\dimexpr\MPyoffset\onebasepoint+#2\onebasepoint\relax
-      \box\scratchbox}%
-   \smashbox\scratchbox
-   \box\scratchbox}
-
-%D This special (number 50) passes positions to a tex file.
-%D This method uses a two||pass approach an (mis|)|used the
-%D context positioning macros. In \type {core-pos} we will
-%D implement the low level submacro needed.
-%D
-%D \startbuffer
-%D \definelayer[test]
-%D
-%D \setlayer
-%D   [test]
-%D   [x=\MPx{somepos-1},y=\MPy{somepos-1}]
-%D   {Whatever we want here!}
-%D
-%D \setlayer
-%D   [test]
-%D   [x=\MPx{somepos-2},y=\MPy{somepos-2}]
-%D   {Whatever we need there!}
-%D
-%D \startuseMPgraphic{oeps}
-%D   draw fullcircle scaled 6cm withcolor red ;
-%D   register ("somepos-1",1cm,2cm,center currentpicture) ;
-%D   register ("somepos-2",4cm,3cm,(-1cm,-2cm)) ;
-%D \stopuseMPgraphic
-%D
-%D \framed[background=test,offset=overlay]{\useMPgraphic{oeps}}
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D Here the width and height are not realy used, but one can
-%D imagine situations where tex has to work with values
-%D calculated by \METAPOST.
-%D
-%D \startlinecorrection
-%D \getbuffer
-%D \stoplinecorrection
-%D
-%D Later we will implement a more convenient macro:
-%D
-%D \starttyping
-%D \setMPlayer [test] [somepos-1] {Whatever we want here!}
-%D \setMPlayer [test] [somepos-2] {Whatever we need there!}
-%D \stoptyping
-
-\defineMPspecial{50} % x y width height label
-  {\dosavepositionwhd
-     {\gMPs5}%
-     {0}%
-     {\the\dimexpr-\MPllx\onebasepoint+\gMPs1\onebasepoint\relax}
-     {\the\dimexpr\gMPs2\onebasepoint-\scratchdimen+\MPury\onebasepoint\relax}% scratchdimen ?
-     {\the\dimexpr\gMPs3\onebasepoint\relax}%
-     {\the\dimexpr\gMPs4\onebasepoint\relax}%
-     {0pt}}
-
-%D A few auxiliary macros. This will move to colo-ini.
-
-\def\MPgrayspace{DeviceGray}
-\def\MPrgbspace {DeviceRGB}
-\def\MPcmykspace{DeviceCMYK}
-\let\MPspotspace\MPgrayspace
-
-\def\MPcmykBlack{0 0 0 0}
-\def\MPcmykWhite{0 0 0 1}
-
-\def\startMPcolorresolve
-  {\bgroup
-   \def\dostartgraycolormode##1%
-     {\global\let\MPresolvedspace\MPgrayspace
-      \xdef\MPresolvedcolor{##1}}%
-   \def\dostartrgbcolormode ##1##2##3%
-     {\global\let\MPresolvedspace\MPrgbspace
-      \xdef\MPresolvedcolor{##1 ##2 ##3}}%
-   \def\dostartcmykcolormode##1##2##3##4%
-     {\global\let\MPresolvedspace\MPcmykspace
-      \xdef\MPresolvedcolor{##1 ##2 ##3 ##4}}%
-   \def\dostartspotcolormode##1##2%
-     {\global\let\MPspotspace\empty % left over ?
-      \xdef\MPresolvedspace{##1}%
-      \xdef\MPresolvedcolor{##2}%
-      \global\let\MPspotspace\MPresolvedspace}% signal
-   \dostartgraycolormode\!!zerocount} % kind of hackery initialization
-
-\let\stopMPcolorresolve\egroup
-
-\def\resolveMPrgbcolor#1#2#3\to#4%
-  {\startMPcolorresolve
-   \execcolorR#1:#2:#3:0:0\od
-   \stopMPcolorresolve
-   \let#4\MPresolvedcolor}
-
-\def\resolveMPcmykcolor#1#2#3#4\to#5%
-  {\startMPcolorresolve
-   \execcolorC#1:#2:#3:#4:0:0\od
-   \stopMPcolorresolve
-   \let#5\MPresolvedcolor}
-
-\def\resolveMPgraycolor#1\end\to#2%
-  {\startMPcolorresolve
-   \execcolorS#1:0:0\od
-   \stopMPcolorresolve
-   \let#2\MPresolvedcolor}
-
-\def\resolveMPspotcolor#1#2#3#4\end\to#5%
-  {\startMPcolorresolve
-   \ifnum#2>\plusone
-     \checkmultitonecolor{#1}%
-   \fi
-   \execcolorP#1:#2:#3:#4:0:0\od
-   \stopMPcolorresolve
-   \let#5\MPresolvedcolor}
-
 \startMPinitializations
   mp_shade_version := 2 ;
 \stopMPinitializations
 
-% will be done better
-
-\def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can
-  {\def\MPtextdata{#3}%  % delegate the splitter to lua + redesign
-   \def\MPtextsize{#2}%
-   \def\lastMPmoveX{#4}%
-   \def\lastMPmoveY{#5}%
-   \defconvertedcommand\MPtextdata\MPtextdata % no edef
-   \splitstring\MPtextdata\at::::\to\MPtexttag\and\MPtextnumber
-   \executeifdefined{handleMPtext\MPtexttag}
-     {\setbox\scratchbox\hbox
-        {\font\temp=#1\space at #2\onebasepoint
-         \let\c\char
-         \temp
-         \MPfshowcommand{#3}}%
-      \setbox\scratchbox\hbox
-        {\hskip#4\onebasepoint
-         \raise#5\onebasepoint
-         \box\scratchbox}%
-      \smashbox\scratchbox
-      \box\scratchbox}}
-
-%D We save the special variables on a stack. It's not that
-%D fast, but it make implementing the special more convenient.
-
-\def\MPSbegin
-  {\nofMParguments\zerocount}
-
-\def\MPSend
-  {\csname\MPspecial\endcsname}
-
-\def\MPSset
-  {\advance\nofMParguments\plusone
-   \expandafter\def\csname\@@MP\number\nofMParguments\endcsname}
+%D This is done much cleaner in \MPLIB.
 
-\def\gMPs#1{\csname\@@MP\number#1\endcsname}
+% %D A common hook.
+%
+% \let\MPfshowcommand\empty
+%
+% \def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can
+%   {\def\MPtextdata{#3}%  % delegate the splitter to lua + redesign
+%    \def\MPtextsize{#2}%
+%    \def\lastMPmoveX{#4}%
+%    \def\lastMPmoveY{#5}%
+%    \defconvertedcommand\MPtextdata\MPtextdata % no edef
+%    \splitstring\MPtextdata\at::::\to\MPtexttag\and\MPtextnumber
+%    \executeifdefined{handleMPtext\MPtexttag}
+%      {\setbox\scratchbox\hbox
+%         {\font\temp=#1\space at #2\onebasepoint
+%          \let\c\char
+%          \temp
+%          \MPfshowcommand{#3}}%
+%       \setbox\scratchbox\hbox
+%         {\hskip#4\onebasepoint
+%          \raise#5\onebasepoint
+%          \box\scratchbox}%
+%       \smashbox\scratchbox
+%       \box\scratchbox}}
+
+\unexpanded\def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can
+  {\setbox\scratchbox\hbox
+     {\font\temp=#1\space at #2\onebasepoint \let\c\char \temp #3}%
+   \setbox\scratchbox\hbox
+     {\hskip#4\onebasepoint \raise#5\onebasepoint \box\scratchbox}%
+   \smashbox\scratchbox
+   \box\scratchbox}
 
 %D The boundingbox.
 
 \def\MPSboundingbox#1#2#3#4%
-  {\xdef\MPllx{#1}%
-   \xdef\MPlly{#2}%
-   \xdef\MPurx{#3}%
-   \xdef\MPury{#4}%
+  {\xdef\MPllx{#1}\xdef\MPlly{#2}\xdef\MPurx{#3}\xdef\MPury{#4}%
    \xdef\MPwidth {\the\dimexpr#3\onebasepoint-#1\onebasepoint\relax}%
    \xdef\MPheight{\the\dimexpr#4\onebasepoint-#2\onebasepoint\relax}}
 
 \MPSboundingbox0000
 
-\def\MPSspecial#1#2%
-  {\csname\@@MPSK#2\endcsname}
-
-%D A path is (in most cases) just a sequence of \PDF\ commands.
-
-% \newcontitional\ignoreMPpath
-
-\def\MPSpath
-  {\PDFcode}
-
-\def\MPScode % hack, will be improved
-  {\ifconditional\ignoreMPpath
-     \PDFcode{h W n}%
-     \ifx\extraMPpathcode\empty\else
-       \PDFcode{\extraMPpathcode}%
-       \let\extraMPpathcode\empty
-     \fi
-     \setfalse\ignoreMPpath
-     \expandafter\gobbleoneargument
-   \else
-     \expandafter\PDFcode
-   \fi}
-
-\let\MPSrgb \dohandleMPrgb
-\let\MPScmyk\dohandleMPcmyk
-\let\MPSgray\dohandleMPgray
-\let\MPSspot\dohandleMPspot
-
 %D Test code:
-
-% \startMPcode
-%     fill fullcircle scaled 3cm withcolor red ;
-%     fill fullcircle scaled 2cm withcolor green ;
-%     fill fullcircle scaled 1cm withcolor blue ;
-%     currentpicture := currentpicture shifted (-4cm,0) ;
-%     fill fullcircle scaled 3cm withcolor cmyk(0,0,1,0) ;
-%     fill fullcircle scaled 2cm withcolor cmyk(0,1,0,0) ;
-%     fill fullcircle scaled 1cm withcolor cmyk(0,0,1,0) ;
-%     currentpicture := currentpicture shifted (-4cm,0) ;
-%     draw fullcircle scaled 3cm dashed evenly ;
-%     draw fullcircle scaled 2cm dashed withdots  ;
-%     draw origin withpen pencircle scaled 3mm;
-%     currentpicture := currentpicture shifted (-4cm,0) ;
-%     fill fullcircle scaled 2cm shifted (-.5cm,+.5cm) withcolor transparent(1,.5,red);
-%     fill fullcircle scaled 2cm shifted (-.5cm,-.5cm) withcolor transparent(1,.5,red);
-%     fill fullcircle scaled 2cm shifted (+.5cm,+.5cm) withcolor transparent(1,.5,green);
-%     fill fullcircle scaled 2cm shifted (+.5cm,-.5cm) withcolor transparent(1,.5,cmyk(1,0,1,.5));
-%     currentpicture := currentpicture shifted (12cm,-4cm) ;
-%     draw "o e p s" infont defaultfont scaled 2 shifted (-1cm,0) ;
-%     currentpicture := currentpicture shifted (-4cm,0) ;
-%     % bug: shift
-%     draw fullcircle scaled 3cm withpen pencircle yscaled 3mm xscaled 2mm rotated 30  ;
-%     draw fullcircle scaled 2cm withpen pencircle yscaled 3mm xscaled 2mm rotated 20 withcolor red ;
-%     filldraw fullcircle scaled 1cm withpen pencircle yscaled 3mm xscaled 2mm rotated 10 withcolor green ;
-%     currentpicture := currentpicture shifted (-4cm,0) ;
-%     % shade cannot handle shift
-%     circular_shade(fullcircle scaled 3cm,0,.2red,.9green) ;
-%     circular_shade(fullcircle scaled 3cm shifted(+4cm,0),0,cmyk(1,0,0,0),cmyk(0,1,0,0)) ;
-%     filldraw boundingbox currentpicture enlarged -3cm withpen pencircle scaled 1pt withcolor .5white ;
-% \stopMPcode
-
-% We cannot use attributes for switching colors in mp literals because
-% grouping (qQ) interferes.
-
-\ifx\colorversion\undefined \else \ifnum\colorversion>\plusone
-
-    \def\dohandleMPgraycolor      #1{\ctxlua{ctx.pdffinishtransparency()
-                                             ctx.pdfgrayliteral(\the\currentcolormodel,#1)}}
-    \def\dohandleMPrgbcolor   #1#2#3{\ctxlua{ctx.pdffinishtransparency()
-                                             ctx.pdfrgbliteral (\the\currentcolormodel,#1,#2,#3)}}
-    \def\dohandleMPcmykcolor#1#2#3#4{\ctxlua{ctx.pdffinishtransparency()
-                                             ctx.pdfcmykliteral(\the\currentcolormodel,#1,#2,#3,#4)}}
-    \def\dohandleMPspotcolor#1#2#3#4{\ctxlua{ctx.pdffinishtransparency()
-                                             ctx.pdfspotliteral(\the\currentcolormodel,"#1",#2,"#3","#4")}}
-
-    % we can combine the next calls
-
-    \def\dohandleMPgraytransparency      #1#2#3{\ctxlua{ctx.pdfgrayliteral(\the\currentcolormodel,#1)
-                                                        ctx.pdftransparencyliteral(#2,#3)}}
-    \def\dohandleMPrgbtransparency   #1#2#3#4#5{\ctxlua{ctx.pdfrgbliteral (\the\currentcolormodel,#1,#2,#3)
-                                                        ctx.pdftransparencyliteral(#4,#5)}}
-    \def\dohandleMPcmyktransparency#1#2#3#4#5#6{\ctxlua{ctx.pdfcmykliteral(\the\currentcolormodel,#1,#2,#3,#4)
-                                                        ctx.pdftransparencyliteral(#5,#6)}}
-    \def\dohandleMPspottransparency#1#2#3#4#5#6{\ctxlua{ctx.pdfspotliteral(\the\currentcolormodel,"#1",#2,"#3","#4")
-                                                        ctx.pdftransparencyliteral(#5,#6)}}
-
-    \def\dohandleMPresettransparency           {\ctxlua{ctx.pdffinishtransparency()}}
-
-    \def\resolveMPgraycolor      #1\to#2{\ctxlua{ctx.resolvempgraycolor("\strippedcsname#2","MPresolvedspace",\number\currentcolormodel,#1)}}
-    \def\resolveMPrgbcolor   #1#2#3\to#4{\ctxlua{ctx.resolvemprgbcolor ("\strippedcsname#4","MPresolvedspace",\number\currentcolormodel,#1,#2,#3)}}
-    \def\resolveMPcmykcolor#1#2#3#4\to#5{\ctxlua{ctx.resolvempcmykcolor("\strippedcsname#5","MPresolvedspace",\number\currentcolormodel,#1,#2,#3,#4)}}
-
-    \def\resolveMPspotcolor#1#2#3#4\to#5% unchecked
-      {\ctxlua{ctx.resolvempspotcolor("\strippedcsname#5","MPresolvedspace",\number\currentcolormodel,"#1",#2,"#3","#4")}%
-       \xdef\MPresolvedspace{#1}%
-       \xdef\MPresolvedcolor{#4}%
-       \global\let\MPspotspace\MPresolvedspace}
-
-    % used as callers
-
-    \let\MPSgray\dohandleMPgraycolor
-    \let\MPSrgb \dohandleMPrgbcolor
-    \let\MPScmyk\dohandleMPcmykcolor
-    \let\MPspot \dohandleMPspotcolor
-
-\fi \fi
+%D
+%D \startbuffer
+%D \startMPcode
+%D     fill fullcircle scaled 3cm withcolor red ;
+%D     fill fullcircle scaled 2cm withcolor green ;
+%D     fill fullcircle scaled 1cm withcolor blue ;
+%D     currentpicture := currentpicture shifted (-4cm,0) ;
+%D     fill fullcircle scaled 3cm withcolor cmyk(0,0,1,0) ;
+%D     fill fullcircle scaled 2cm withcolor cmyk(0,1,0,0) ;
+%D     fill fullcircle scaled 1cm withcolor cmyk(0,0,1,0) ;
+%D     currentpicture := currentpicture shifted (-4cm,0) ;
+%D     draw fullcircle scaled 3cm dashed evenly ;
+%D     draw fullcircle scaled 2cm dashed withdots  ;
+%D     draw origin withpen pencircle scaled 3mm;
+%D     currentpicture := currentpicture shifted (-4cm,0) ;
+%D     fill fullcircle scaled 2cm shifted (-.5cm,+.5cm) withcolor transparent(1,.5,red);
+%D     fill fullcircle scaled 2cm shifted (-.5cm,-.5cm) withcolor transparent(1,.5,red);
+%D     fill fullcircle scaled 2cm shifted (+.5cm,+.5cm) withcolor transparent(1,.5,green);
+%D     fill fullcircle scaled 2cm shifted (+.5cm,-.5cm) withcolor transparent(1,.5,cmyk(1,0,1,.5));
+%D     currentpicture := currentpicture shifted (12cm,-4cm) ;
+%D     draw "o e p s" infont defaultfont scaled 2 shifted (-1cm,0) ;
+%D     currentpicture := currentpicture shifted (-4cm,0) ;
+%D     % bug: shift
+%D     draw fullcircle scaled 3cm withpen pencircle yscaled 3mm xscaled 2mm rotated 30  ;
+%D     draw fullcircle scaled 2cm withpen pencircle yscaled 3mm xscaled 2mm rotated 20 withcolor red ;
+%D     filldraw fullcircle scaled 1cm withpen pencircle yscaled 3mm xscaled 2mm rotated 10 withcolor green ;
+%D     currentpicture := currentpicture shifted (-4cm,0) ;
+%D     % shade cannot handle shift
+%D     circular_shade(fullcircle scaled 3cm,0,.2red,.9green) ;
+%D     circular_shade(fullcircle scaled 3cm shifted(+4cm,0),0,cmyk(1,0,0,0),cmyk(0,1,0,0)) ;
+%D     filldraw boundingbox currentpicture enlarged -3cm withpen pencircle scaled 1pt withcolor .5white ;
+%D \stopMPcode
+%D \stopbuffer
+%D
+%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
 
 \protect \endinput
diff --git a/tex/context/base/meta-pdh.lua b/tex/context/base/meta-pdh.lua
index e05529cc8..ef15c6a11 100644
--- a/tex/context/base/meta-pdh.lua
+++ b/tex/context/base/meta-pdh.lua
@@ -24,6 +24,7 @@ if not modules then modules = { } end modules ['meta-pdf'] = {
 
 local concat, format = table.concat, string.format
 
+local texsprint = tex.sprint
 local ctxcatcodes = tex.ctxcatcodes
 
 mptopdf         = { }
@@ -148,11 +149,11 @@ end
 -- from lua to tex
 
 function mptopdf.pdfcode(str)
-    tex.sprint(ctxcatcodes,"\\PDFcode{" .. str .. "}") -- \\MPScode
+    texsprint(ctxcatcodes,"\\pdfliteral{" .. str .. "}") -- \\MPScode
 end
 
 function mptopdf.texcode(str)
-    tex.sprint(ctxcatcodes,str)
+    texsprint(ctxcatcodes,str)
 end
 
 -- auxiliary functions
@@ -350,52 +351,23 @@ end
 --~     end
 --~ end
 
-if false and ctx and ctx.aux and ctx.aux.definecolor then
-
-    logs.report("mptopdf", "using attribute based mps colors")
-
-    -- does not work due to Q-q mess-up
-
-    function mps.setrgbcolor(r,g,b) -- extra check
-        r, g, b = tonumber(r), tonumber(g), tonumber(b) -- needed when we use lpeg
-        if r == 0.0123 and g < 0.1 then -- g is extra check
-            mptopdf.texcode("\\doresetattribute{transparency}\\MPSspecial{" .. g*10000 .. "}{" .. b*10000 .. "}")
-        elseif r == 0.123 and g < 0.1 then -- g is extra check
-            mptopdf.texcode("\\doresetattribute{transparency}\\MPSspecial{" .. g* 1000 .. "}{" .. b* 1000 .. "}")
-        else
-            mptopdf.texcode("\\doresetattribute{transparency}\\dosetattribute{color}{" .. colors.register('color',nil,'rgb',r,g,b) .. "}")
-        end
-    end
-
-    function mps.setcmykcolor(c,m,y,k)
-        mptopdf.texcode("\\doresetattribute{transparency}\\dosetattribute{color}{" .. colors.register('color',nil,'cmyk',tonumber(c),tonumber(m),tonumber(y),tonumber(k)) .. "}")
-    end
-
-    function mps.setgray(s)
-        mptopdf.texcode("\\doresetattribute{transparency}\\dosetattribute{color}{" .. colors.register('color',nil,'gray',tonumber(s)) .. "}")
-    end
-
-else
-
-    function mps.setrgbcolor(r,g,b) -- extra check
-        r, g = tonumber(r), tonumber(g) -- needed when we use lpeg
-        if r == 0.0123 and g < 0.1 then
-            mptopdf.texcode("\\MPSspecial{" .. g*10000 .. "}{" .. b*10000 .. "}")
-        elseif r == 0.123 and g < 0.1 then
-            mptopdf.texcode("\\MPSspecial{" .. g* 1000 .. "}{" .. b* 1000 .. "}")
-        else
-            mptopdf.texcode("\\MPSrgb{" .. r .. "}{" .. g .. "}{" .. b .. "}")
-        end
-    end
-
-    function mps.setcmykcolor(c,m,y,k)
-        mptopdf.texcode("\\MPScmyk{" .. c .. "}{" .. m .. "}{" .. y .. "}{" .. k .. "}")
+function mps.setrgbcolor(r,g,b) -- extra check
+    r, g = tonumber(r), tonumber(g) -- needed when we use lpeg
+    if r == 0.0123 and g < 0.1 then
+        mptopdf.texcode("\\MPSspecial{" .. g*10000 .. "}{" .. b*10000 .. "}")
+    elseif r == 0.123 and g < 0.1 then
+        mptopdf.texcode("\\MPSspecial{" .. g* 1000 .. "}{" .. b* 1000 .. "}")
+    else
+        mptopdf.texcode("\\MPSrgb{" .. r .. "}{" .. g .. "}{" .. b .. "}")
     end
+end
 
-    function mps.setgray(s)
-        mptopdf.texcode("\\MPSgray{" .. s .. "}")
-    end
+function mps.setcmykcolor(c,m,y,k)
+    mptopdf.texcode("\\MPScmyk{" .. c .. "}{" .. m .. "}{" .. y .. "}{" .. k .. "}")
+end
 
+function mps.setgray(s)
+    mptopdf.texcode("\\MPSgray{" .. s .. "}")
 end
 
 function mps.specials(version,signal,factor) -- 2.0 123 1000
diff --git a/tex/context/base/meta-pdh.mkiv b/tex/context/base/meta-pdh.mkiv
new file mode 100644
index 000000000..0736598cf
--- /dev/null
+++ b/tex/context/base/meta-pdh.mkiv
@@ -0,0 +1,780 @@
+%D \module
+%D   [       file=meta-pdf,
+%D        version=2006.06.07,
+%D          title=\METAPOST\ Graphics,
+%D       subtitle=Conversion to \PDF,
+%D         author=Hans Hagen \& others (see text),
+%D           date=\currentdate,
+%D      copyright=\PRAGMA]
+%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 Formerly known as supp-pdf.tex and supp-mpe.tex and meta-pdf.mkiv.
+%D
+%D Beware: this file is not used but kept for historic purposed!
+
+% \useMPgraphic{1}
+% \testfeatureonce{250}{\setbox0\hbox{\convertMPtoPDF{test-mps-mpgraph.1}{1}{1}}}
+%
+%  8.4 : mkii, direct parsing by tex
+% 11.8 : mkiv, dirty conversion (10.8 with dirty tricks)
+% 14.5 : mkiv, clean conversion
+%  7.4 : mkiv, simulated clean direct lua from mp
+%  0.3 : time taken by tex to handle converted code
+%
+% timings may differ now that we revamped the backend
+
+\registerctxluafile{meta-pdf}{1.003}
+
+%D We will clean up the color mess later.
+
+\writestatus{loading}{MetaPost Graphics / MPS to PDF}
+
+\unprotect
+
+%D First we define a handy constant:
+
+\bgroup \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup
+
+%D \macros
+%D   {convertMPtoPDF}
+%D
+%D The next set of macros implements \METAPOST\ to \PDF\
+%D conversion. The traditional method is in the MkII file.
+%D
+%D The main conversion command is:
+%D
+%D \starttyping
+%D \convertMPtoPDF {filename} {x scale} {y scale}
+%D \stoptyping
+%D
+%D The dimensions are derived from the bounding box. So we
+%D only have to say:
+%D
+%D \starttyping
+%D \convertMPtoPDF{mp-pra-1.eps}{1}{1}
+%D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5}
+%D \stoptyping
+
+%D \macros
+%D   {makeMPintoPDFobject,lastPDFMPobject}
+%D
+%D For experts there are a few more options. When attributes
+%D are to be added, the code must be embedded in an object
+%D accompanied with the appropriate directives. One can
+%D influence this process with \type {\makeMPintoPDFobject}.
+%D
+%D This option defaults to~0, because \CONTEXT\ takes care
+%D of objects at another level, which saves some bytes.
+%D
+%D \starttabulate[|l|l|p|]
+%D \NC 0 \NC never    \NC don't use an object    \NC\NR
+%D \NC 1 \NC always   \NC always use an object   \NC\NR
+%D \NC 2 \NC optional \NC use object when needed \NC\NR
+%D \stoptabulate
+%D
+%D The last object number used is avaliable in the macro
+%D \type {\lastPDFMPobject}.
+
+\ifx\makeMPintoPDFobject   \undefined \chardef\makeMPintoPDFobject   \zerocount \fi
+\ifx\everyMPtoPDFconversion\undefined \newtoks\everyMPtoPDFconversion           \fi
+
+\let\lastPDFMPobject    \!!zerocount
+\let\currentPDFresources\empty
+\let\setMPextensions    \relax
+
+\def\PDFMPformoffset
+  {\ifx\objectoffset\undefined\zeropoint\else\objectoffset\fi}
+
+\def\resetMPvariables#1#2#3%
+  {\global\let\MPwidth \!!zeropoint
+   \global\let\MPheight\!!zeropoint
+   \global\let\MPllx   \!!zerocount
+   \global\let\MPlly   \!!zerocount
+   \global\let\MPurx   \!!zerocount
+   \global\let\MPury   \!!zerocount
+   \xdef\MPxscale      {#2}\ifx\MPxscale\empty\let\MPxscale\!!plusone\fi
+   \xdef\MPyscale      {#3}\ifx\MPyscale\empty\let\MPyscale\!!plusone\fi
+   \xdef\MPfilename    {#1}}
+
+%D The main macro:
+
+\def\convertMPtoPDF#1#2#3% watch the transparency reset
+  {\resetMPvariables{#1}{#2}{#3}%
+   \vbox\bgroup
+     \forgetall
+     \offinterlineskip
+     \setbox\scratchbox\vbox\bgroup
+        \setnormalcatcodes % we can be in verbatim or so
+        \message{[MP to PDF]}%
+        \startMPresources
+        \pdfliteral{\letterpercent\space mps begin}%
+        \pdfliteral{q 1 0 0 1 0 0 cm}%
+        \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces
+        \pdfliteral{Q}%
+        \pdfliteral{\letterpercent\space mps end}%
+        \stopMPresources
+     \egroup
+     \setbox\scratchbox\hbox\bgroup
+        \hskip-\MPllx\onebasepoint
+        \raise-\MPlly\onebasepoint
+        \box\scratchbox
+     \egroup
+     \setbox\scratchbox\vbox to \MPheight\bgroup
+       \vfill
+       \hsize\MPwidth
+       \smashbox\scratchbox
+       \box\scratchbox
+     \egroup
+     \wd\scratchbox\MPwidth
+     \ht\scratchbox\MPheight
+     \dopackageMPgraphic\scratchbox
+   \egroup}
+
+\let\processMPtoPDFfile\convertMPtoPDF
+
+%D A common hook.
+
+\let\MPfshowcommand\empty
+
+%D Objects.
+
+\def\dopackageMPgraphic#1% #1 = boxregister
+  {\ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else
+     % an existing value of 2 signals object support (set elsewhere)
+     \chardef\makeMPintoPDFobject\plusone
+   \fi\fi
+   \ifcase\makeMPintoPDFobject
+     \box#1%
+   \or
+     \scratchdimen\PDFMPformoffset\relax
+     \ifdim\scratchdimen>\zeropoint % compensate for error
+       \setbox#1\vbox spread 2\scratchdimen
+         {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}%
+     \fi
+     \setMPPDFobject{\currentPDFresources}{#1}%
+     \ifdim\scratchdimen>\zeropoint % compensate for error
+       \vbox to \MPheight
+         {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}%
+     \else
+       \getMPPDFobject
+     \fi
+     \global\let\currentPDFresources\empty
+   \else
+     \box#1%
+   \fi}
+
+\def\setMPPDFobject#1#2% resources boxnumber
+  {\ifx\everyPDFxform\undefined\else\the\everyPDFxform\fi
+   \immediate\pdfxform resources{#1}#2%
+   \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}}
+
+\let\getMPPDFobject\relax
+
+%D \macros
+%D   {deleteMPgraphic,
+%D    startMPresources,
+%D    stopMPresources}
+
+\ifx\deleteMPgraphic\undefined
+  \def\deleteMPgraphic#1{}
+\fi
+
+\ifx\startMPresources\undefined
+  \let\startMPresources\relax
+  \let\stopMPresources\relax
+\fi
+
+%D We implement extensions by using the \METAPOST\ special
+%D mechanism. Opposite to \TEX's specials, the \METAPOST\ ones
+%D are flushed before or after the graphic data, but thereby
+%D are no longer connected to a position.
+%D
+%D We implement specials by overloading the \type {fill}
+%D operator. By counting the fills, we can let the converter
+%D treat the appropriate fill in a special way. The
+%D specification of the speciality can have two forms,
+%D determined by the setting of a boolean variable:
+%D
+%D \starttyping
+%D _inline_specials_ := false ; % comment like code (default)
+%D _inline_specials_ := true  ; % command like code
+%D \stoptyping
+%D
+%D When the specification is embedded as comment, it looks
+%D like:
+%D
+%D \starttyping
+%D %%MetaPostSpecial    
+%D \stoptyping
+%D
+%D The in||line alternative is more tuned for \POSTSCRIPT,
+%D since it permits us to define a macro \type {special}.
+%D
+%D \starttyping
+%D inline  :     special
+%D \stoptyping
+%D
+%D The \type {identifier} determines what to do, and the data
+%D can be used to accomplish this. A type~2 shading function
+%D has identifier~2. Alltogether, the number of parameters is
+%D specified in \type {size}. The \type {number} is the number
+%D of the fill that needs the special treatment. For a type~2
+%D and~3 shaded fill, the datablock contains the following
+
+%D data:
+%D
+%D \starttyping
+%D from to n inner_r g b x y        outer_r g b x y
+%D from to n inner_r g b x y radius outer_r g b x y radius
+%D \stoptyping
+
+\newconditional\manyMPspecials \settrue\manyMPspecials
+
+%D In case of \PDF, we need to prepare resourcs.
+
+\newtoks\MPstartresources
+\newtoks\MPstopresources
+
+\def\startMPresources
+  {\the\MPstartresources}
+
+\def\stopMPresources
+  {\the\MPstopresources}
+
+%D Some day we may consider collecting local resources.
+
+\appendtoks
+  \global\let\currentPDFresources\empty % kind of redundant
+\to \MPstartresources
+
+% \appendtoks
+%    \collectPDFresources
+%    \global\let\currentPDFresources\collectedPDFresources
+% \to \MPstopresources
+
+\appendtoksonce
+   \the\everyPDFxform
+\to \MPstopresources
+
+%D Since colors are not subjected to transformations, we can
+%D only use colors as signal. In our case, we use a dummy colored
+%D path with a red color component of \type {0.n}, so \type
+%D {0.001} is the first path and \type {0.010} the tenth. Since
+%D \METAPOST strips trailing zeros, we have to padd the string.
+
+\newif\ifMPcmykcolors
+\newif\ifMPspotcolors
+
+%D Specials:
+
+% \settrue \manyMPspecials \newcount\nofMParguments \let\extraMPpathcode\empty
+%
+% \def\@@MP  {@@MP}
+% \def\@@MPSK{@MPSK@}
+%
+% \def\MPspecial{\@@MPSK\@@MPSK\gMPs\nofMParguments}
+%
+% \def\defineMPspecial#1#2%
+%   {\setvalue{\@@MPSK\@@MPSK#1}{#2}}
+
+%D Special number~1 is dedicated to \CMYK\ support. If you
+%D want to know why: look at this:
+%D
+%D \startbuffer[mp]
+%D   fill fullcircle xyscaled (3cm,1cm) withcolor \MPcolor{test} ;
+%D \stopbuffer
+%D
+%D \startbuffer[cmyk]
+%D \startcombination[4*1]
+%D   {\definecolor[test][c=1,y=.3,k=.3] \processMPbuffer[mp]} {c=1 y=.3 k=.3}
+%D   {\definecolor[test][c=.9,y=.15]    \processMPbuffer[mp]} {c=.9 y=.15}
+%D   {\definecolor[test][c=.25,y=.8]    \processMPbuffer[mp]} {c=.25 y=.8}
+%D   {\definecolor[test][c=.45,y=.1]    \processMPbuffer[mp]} {c=.45 y=.1}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \placefigure
+%D   {\CMYK\ support disabled,
+%D    conversion to \RGB.}
+%D   {\setupcolors[cmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D   {\CMYK\ support enabled,
+%D    no support in \METAPOST.}
+%D   {\setupcolors[cmyk=ja,mpcmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D   {\CMYK\ support enabled,
+%D    no conversion to \RGB,
+%D    support in \METAPOST}
+%D   {\setupcolors[cmyk=ja,state=start]\getbuffer[cmyk]}
+
+% \let\revokeMPtransparencyspecial\relax
+
+%D Transparency support used specials 60 (rgb) and 61
+%D (cmyk).
+%D
+%D \startbuffer
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated  90 withcolor transparent(1,.5,yellow) ;
+%D fill p rotated 210 withcolor transparent(1,.5,green) ;
+%D fill p rotated 330 withcolor transparent(1,.5,blue) ;
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+%D
+%D One can also communicate colors between \CONTEXT\ and
+%D \METAPOST:
+%D
+%D \startbuffer
+%D \definecolor[tcyan]   [c=1,k=.2,t=.5]
+%D \definecolor[tmagenta][m=1,k=.2,t=.5]
+%D \definecolor[tyellow] [y=1,k=.2,t=.5]
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated  90 withcolor \MPcolor{tcyan} ;
+%D fill p rotated 210 withcolor \MPcolor{tmagenta} ;
+%D fill p rotated 330 withcolor \MPcolor{tyellow} ;
+%D \stopbuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+
+%D Shading is an example of a more advanced graphic feature,
+%D but users will seldom encounter those complications. Here
+%D we only show a few simple examples, but many other
+%D alternatives are possible by setting up the functions built
+%D in \PDF\ in the appropriate way.
+%D
+%D Shading has to do with interpolation between two or more
+%D points or user supplied ranges. In \PDF, the specifications
+%D of a shade has to be encapsulated in objects and passed on
+%D as resources. This is a \PDF\ level 1.3. feature. One can
+%D simulate three dimensional shades as well and define simple
+%D functions using a limited set of \POSTSCRIPT\ primitives.
+%D Given the power of \METAPOST\ and these \PDF\ features, we
+%D can achieve superb graphic effects.
+%D
+%D Since everything is hidden in \TEX\ and \METAPOST\ graphics,
+%D we can stick to high level \CONTEXT\ command, as shown in
+%D the following exmples.
+%D
+%D \startbuffer
+%D \startuniqueMPgraphic{CircularShade}
+%D   path  p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D   circular_shade(p,0,.2red,.9red) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{LinearShade}
+%D   path  p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D   linear_shade(p,0,.2blue,.9blue) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{DuotoneShade}
+%D   path  p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D   linear_shade(p,2,.5green,.5red) ;
+%D \stopuniqueMPgraphic
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D These graphics can be hooked into the overlay mechanism,
+%D which is available in many commands.
+%D
+%D \startbuffer
+%D \defineoverlay[demo 1][\uniqueMPgraphic{CircularShade}]
+%D \defineoverlay[demo 2][\uniqueMPgraphic  {LinearShade}]
+%D \defineoverlay[demo 3][\uniqueMPgraphic {DuotoneShade}]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D These backgrounds can for instance be applied to \type
+%D {\framed}:
+%D
+%D \startbuffer
+%D \setupframed[width=3cm,height=2cm,frame=off]
+%D \startcombination[3*1]
+%D   {\framed[backgroundachtergrond=demo 1]{\bfd \white Demo 1}} {}
+%D   {\framed[backgroundachtergrond=demo 2]{\bfd \white Demo 2}} {}
+%D   {\framed[backgroundachtergrond=demo 3]{\bfd \white Demo 3}} {}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D There are a few more alternatives, determined by the second
+%D parameter passed to \type {circular_shade} and alike.
+%D
+%D \def\SomeShade#1#2#3#4#5%
+%D   {\startuniqueMPgraphic{Shade-#1}
+%D      width := \overlaywidth ;
+%D      height := \overlayheight ;
+%D      path p ; p := unitsquare xscaled width yscaled height ;
+%D      #2_shade(p,#3,#4,#5) ;
+%D    \stopuniqueMPgraphic
+%D    \defineoverlay[Shade-#1][\uniqueMPgraphic{Shade-#1}]%
+%D    \framed[backgroundachtergrond=Shade-#1,width=2cm,height=2cm,frame=off]{}}
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D   {\SomeShade{10}{circular}{0}{.3blue}{.9blue}} {circular 0}
+%D   {\SomeShade{11}{circular}{1}{.3blue}{.9blue}} {circular 1}
+%D   {\SomeShade{12}{circular}{2}{.3blue}{.9blue}} {circular 2}
+%D   {\SomeShade{13}{circular}{3}{.3blue}{.9blue}} {circular 3}
+%D   {\SomeShade{14}{circular}{4}{.3blue}{.9blue}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D   {\SomeShade{20}{circular}{0}{.9green}{.3green}} {circular 0}
+%D   {\SomeShade{21}{circular}{1}{.9green}{.3green}} {circular 1}
+%D   {\SomeShade{22}{circular}{2}{.9green}{.3green}} {circular 2}
+%D   {\SomeShade{23}{circular}{3}{.9green}{.3green}} {circular 3}
+%D   {\SomeShade{24}{circular}{4}{.9green}{.3green}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \startcombination[4*1]
+%D   {\SomeShade{30}{linear}{0}{.3red}{.9red}} {linear 0}
+%D   {\SomeShade{31}{linear}{1}{.3red}{.9red}} {linear 1}
+%D   {\SomeShade{32}{linear}{2}{.3red}{.9red}} {linear 2}
+%D   {\SomeShade{33}{linear}{3}{.3red}{.9red}} {linear 3}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D These macros closely cooperate with the \METAPOST\ module
+%D \type {mp-spec.mp}, which is part of the \CONTEXT\
+%D distribution.
+%D
+%D The low level (\PDF) implementation is based on the \TEX\
+%D based \METAPOST\ to \PDF\ converter. Shading is supported
+%D by overloading the \type {fill} operator as implemented
+%D earlier. In \PDF\ type~2 and~3 shading functions are
+%D specified in terms of:
+%D
+%D \starttabulate[|Tl|l|]
+%D \NC /Domain \NC sort of meeting range \NC \NR
+%D \NC /C0     \NC inner shade \NC \NR
+%D \NC /C1     \NC outer shade \NC \NR
+%D \NC /N      \NC smaller values, bigger inner circles \NC \NR
+%D \stoptabulate
+
+% \newcount\currentPDFshade  % 0  % global (document wide) counter
+%
+% \def\dosetMPsomePDFshade#1#2%
+%   {\immediate\pdfobj
+%      {<>}%
+%    \immediate\pdfobj
+%      {<>}%
+%    \global\advance\currentPDFshade \plusone
+%    \ctxlua{lpdf.adddocumentshade("Sh\the\currentPDFshade",lpdf.reference(\the\pdflastobj))}%
+%    \setxvalue{\@@MPSK#2}{\noexpand\dohandleMPshade{\the\currentPDFshade}}}
+%
+% \def\dosetMPlinearshade  {\dosetMPsomePDFshade2}% #1
+% \def\dosetMPcircularshade{\dosetMPsomePDFshade3}% #1
+%
+% \defineMPspecial{30}
+%   {\normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA
+%    \normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs{9}}{\gMPs{10}}{\gMPs{11}}}\to\MPshadeB
+%    \edef\MPshadeC{\gMPs7 \gMPs8 \gMPs{12} \gMPs{13}}%
+%    \dosetMPlinearshade{\gMPs{14}}}
+%
+% \defineMPspecial{31}
+%   {\normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA
+%    \normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}}\to\MPshadeB
+%    \edef\MPshadeC{\gMPs7 \gMPs8 \gMPs9 \gMPs{13} \gMPs{14} \gMPs{15}}%
+%    \dosetMPcircularshade{\gMPs{16}}}
+%
+% \defineMPspecial{32}
+%   {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
+%    \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB
+%    \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}%
+%    \dosetMPlinearshade{\gMPs{16}}}
+%
+% \defineMPspecial{33}
+%   {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
+%    \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}{\gMPs{14}}}\to\MPshadeB
+%    \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{10} \gMPs{15} \gMPs{16} \gMPs{17}}%
+%    \dosetMPcircularshade{\gMPs{18}}}
+%
+% \defineMPspecial{34}
+%   {\normalexpanded{\noexpand\resolveMPspotcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
+%    \normalexpanded{\noexpand\resolveMPspotcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB
+%    \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}%
+%    \dosetMPlinearshade{\gMPs{16}}}
+%
+% \defineMPspecial{35}
+%   {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
+%    \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}{\gMPs{14}}}\to\MPshadeB
+%    \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{10} \gMPs{15} \gMPs{16} \gMPs{17}}%
+%    \dosetMPcircularshade{\gMPs{18}}}
+%
+% \newconditional\ignoreMPpath
+%
+% \def\dohandleMPshade#1%
+%   {\revokeMPtransparencyspecial
+%    \settrue\ignoreMPpath
+%    \def\extraMPpathcode{/Sh#1 sh Q}%
+%    \pdfliteral{q /Pattern cs}}
+%
+% \defineMPspecial{10}
+%   {\setxvalue{\@@MPSK\gMPs8}%
+%      {\noexpand\handleMPfigurespecial{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}{\gMPs8}}}
+%
+% \def\handleMPfigurespecial#1#2#3#4#5#6#7#8% todo : combine with ext fig
+%   {\global\letvalue{\@@MPSK#8}\empty
+%    \vbox to \zeropoint
+%      {\vss
+%       \hbox to \zeropoint
+%         {\ifcase\pdfoutput\or % will be hooked into the special driver
+%            \doiffileelse{#7}
+%              {\doifundefinedelse{mps:x:#7}
+%                 {\immediate\pdfximage\!!width\onebasepoint\!!height\onebasepoint{#7}%
+%                  \setxvalue{mps:x:#7}{\pdfrefximage\the\pdflastximage}}%
+%                 {\message{[reusing figure #7]}}%
+%               \pdfliteral{q #1 #2 #3 #4 #5 #6 cm}%
+%               \rlap{\getvalue{mps:x:#7}}%
+%               \pdfliteral{Q}}
+%              {\message{[unknown figure #7]}}%
+%          \fi
+%          \hss}}}
+
+%D An example of using both special features is the
+%D following.
+%D
+%D \starttyping
+%D \startMPpage
+%D   externalfigure "hakker1b.png" scaled 22cm rotated  10 shifted (-2cm,0cm);
+%D   externalfigure "hakker1b.png" scaled 10cm rotated -10 ;
+%D   externalfigure "hakker1b.png" scaled  7cm rotated  45 shifted (8cm,12cm) ;
+%D   path p ; p := unitcircle xscaled 15cm yscaled 20cm;
+%D   path q ; q := p rotatedaround(center p,90) ;
+%D   path r ; r := buildcycle(p,q) ; clip currentpicture to r ;
+%D   path s ; s := boundingbox currentpicture enlarged 5mm ;
+%D   picture c ; c := currentpicture ; currentpicture := nullpicture ;
+%D   circular_shade(s,0,.2red,.9red) ;
+%D   addto currentpicture also c ;
+%D \stopMPpage
+%D \stoptyping
+
+% \defineMPspecial{20}
+%   {\setxvalue{\@@MPSK\gMPs6}%
+%      {\noexpand\handleMPhyperlink{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}}}
+%
+% \def\handleMPhyperlink#1#2#3#4#5#6%
+%   {\global\letvalue{\@@MPSK#6}\empty
+%    \setbox\scratchbox\hbox
+%      {\setbox\scratchbox\null
+%       \wd\scratchbox\dimexpr-#1\onebasepoint+#3\onebasepoint\relax
+%       \ht\scratchbox\dimexpr-#2\onebasepoint+#4\onebasepoint\relax
+%       \gotobox{\box\scratchbox}[#5]}%
+%    \setbox\scratchbox\hbox
+%      {\hskip\dimexpr\MPxoffset\onebasepoint+#1\onebasepoint\relax
+%       \raise\dimexpr\MPyoffset\onebasepoint+#2\onebasepoint\relax
+%       \box\scratchbox}%
+%    \smashbox\scratchbox
+%    \box\scratchbox}
+
+%D This special (number 50) passes positions to a tex file.
+%D This method uses a two||pass approach an (mis|)|used the
+%D context positioning macros. In \type {core-pos} we will
+%D implement the low level submacro needed.
+%D
+%D \startbuffer
+%D \definelayer[test]
+%D
+%D \setlayer
+%D   [test]
+%D   [x=\MPx{somepos-1},y=\MPy{somepos-1}]
+%D   {Whatever we want here!}
+%D
+%D \setlayer
+%D   [test]
+%D   [x=\MPx{somepos-2},y=\MPy{somepos-2}]
+%D   {Whatever we need there!}
+%D
+%D \startuseMPgraphic{oeps}
+%D   draw fullcircle scaled 6cm withcolor red ;
+%D   register ("somepos-1",1cm,2cm,center currentpicture) ;
+%D   register ("somepos-2",4cm,3cm,(-1cm,-2cm)) ;
+%D \stopuseMPgraphic
+%D
+%D \framed[background=test,offset=overlay]{\useMPgraphic{oeps}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here the width and height are not realy used, but one can
+%D imagine situations where tex has to work with values
+%D calculated by \METAPOST.
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D Later we will implement a more convenient macro:
+%D
+%D \starttyping
+%D \setMPlayer [test] [somepos-1] {Whatever we want here!}
+%D \setMPlayer [test] [somepos-2] {Whatever we need there!}
+%D \stoptyping
+
+% \defineMPspecial{50} % x y width height label
+%   {\dosavepositionwhd
+%      {\gMPs5}%
+%      {0}%
+%      {\the\dimexpr-\MPllx\onebasepoint+\gMPs1\onebasepoint\relax}
+%      {\the\dimexpr\gMPs2\onebasepoint-\scratchdimen+\MPury\onebasepoint\relax}% scratchdimen ?
+%      {\the\dimexpr\gMPs3\onebasepoint\relax}%
+%      {\the\dimexpr\gMPs4\onebasepoint\relax}%
+%      {0pt}}
+
+\startMPinitializations
+  mp_shade_version := 2 ;
+\stopMPinitializations
+
+%D This is done much cleaner in \MPLIB.
+
+\def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can
+  {\def\MPtextdata{#3}%  % delegate the splitter to lua + redesign
+   \def\MPtextsize{#2}%
+   \def\lastMPmoveX{#4}%
+   \def\lastMPmoveY{#5}%
+   \defconvertedcommand\MPtextdata\MPtextdata % no edef
+   \splitstring\MPtextdata\at::::\to\MPtexttag\and\MPtextnumber
+   \executeifdefined{handleMPtext\MPtexttag}
+     {\setbox\scratchbox\hbox
+        {\font\temp=#1\space at #2\onebasepoint
+         \let\c\char
+         \temp
+         \MPfshowcommand{#3}}%
+      \setbox\scratchbox\hbox
+        {\hskip#4\onebasepoint
+         \raise#5\onebasepoint
+         \box\scratchbox}%
+      \smashbox\scratchbox
+      \box\scratchbox}}
+
+%D We save the special variables on a stack. It's not that
+%D fast, but it make implementing the special more convenient.
+
+% \def\MPSbegin
+%   {\nofMParguments\zerocount}
+%
+% \def\MPSend
+%   {\csname\MPspecial\endcsname}
+%
+% \def\MPSset
+%   {\advance\nofMParguments\plusone
+%    \expandafter\def\csname\@@MP\number\nofMParguments\endcsname}
+%
+% \def\gMPs#1{\csname\@@MP\number#1\endcsname}
+
+%D The boundingbox.
+
+\def\MPSboundingbox#1#2#3#4%
+  {\xdef\MPllx{#1}\xdef\MPlly{#2}\xdef\MPurx{#3}\xdef\MPury{#4}%
+   \xdef\MPwidth {\the\dimexpr#3\onebasepoint-#1\onebasepoint\relax}%
+   \xdef\MPheight{\the\dimexpr#4\onebasepoint-#2\onebasepoint\relax}}
+
+\MPSboundingbox0000
+
+% \def\MPSspecial#1#2%
+%   {\csname\@@MPSK#2\endcsname}
+
+%D A path is (in most cases) just a sequence of \PDF\ commands.
+
+% \newconditional\ignoreMPpath
+
+% \def\MPSpath
+%   {\pdfliteral}
+
+% \def\MPScode % hack, will be improved
+%   {\ifconditional\ignoreMPpath
+%      \pdfliteral{h W n}%
+%      \ifx\extraMPpathcode\empty\else
+%        \pdfliteral{\extraMPpathcode}%
+%        \let\extraMPpathcode\empty
+%      \fi
+%      \setfalse\ignoreMPpath
+%      \expandafter\gobbleoneargument
+%    \else
+%      \expandafter\pdfliteral
+%    \fi}
+
+%D Test code:
+
+% \startMPcode
+%     fill fullcircle scaled 3cm withcolor red ;
+%     fill fullcircle scaled 2cm withcolor green ;
+%     fill fullcircle scaled 1cm withcolor blue ;
+%     currentpicture := currentpicture shifted (-4cm,0) ;
+%     fill fullcircle scaled 3cm withcolor cmyk(0,0,1,0) ;
+%     fill fullcircle scaled 2cm withcolor cmyk(0,1,0,0) ;
+%     fill fullcircle scaled 1cm withcolor cmyk(0,0,1,0) ;
+%     currentpicture := currentpicture shifted (-4cm,0) ;
+%     draw fullcircle scaled 3cm dashed evenly ;
+%     draw fullcircle scaled 2cm dashed withdots  ;
+%     draw origin withpen pencircle scaled 3mm;
+%     currentpicture := currentpicture shifted (-4cm,0) ;
+%     fill fullcircle scaled 2cm shifted (-.5cm,+.5cm) withcolor transparent(1,.5,red);
+%     fill fullcircle scaled 2cm shifted (-.5cm,-.5cm) withcolor transparent(1,.5,red);
+%     fill fullcircle scaled 2cm shifted (+.5cm,+.5cm) withcolor transparent(1,.5,green);
+%     fill fullcircle scaled 2cm shifted (+.5cm,-.5cm) withcolor transparent(1,.5,cmyk(1,0,1,.5));
+%     currentpicture := currentpicture shifted (12cm,-4cm) ;
+%     draw "o e p s" infont defaultfont scaled 2 shifted (-1cm,0) ;
+%     currentpicture := currentpicture shifted (-4cm,0) ;
+%     % bug: shift
+%     draw fullcircle scaled 3cm withpen pencircle yscaled 3mm xscaled 2mm rotated 30  ;
+%     draw fullcircle scaled 2cm withpen pencircle yscaled 3mm xscaled 2mm rotated 20 withcolor red ;
+%     filldraw fullcircle scaled 1cm withpen pencircle yscaled 3mm xscaled 2mm rotated 10 withcolor green ;
+%     currentpicture := currentpicture shifted (-4cm,0) ;
+%     % shade cannot handle shift
+%     circular_shade(fullcircle scaled 3cm,0,.2red,.9green) ;
+%     circular_shade(fullcircle scaled 3cm shifted(+4cm,0),0,cmyk(1,0,0,0),cmyk(0,1,0,0)) ;
+%     filldraw boundingbox currentpicture enlarged -3cm withpen pencircle scaled 1pt withcolor .5white ;
+% \stopMPcode
+
+% We cannot use attributes for switching colors in mp literals because
+% grouping (qQ) interferes.
+
+% \def\dohandleMPshade#1%
+%   {\revokeMPtransparencyspecial
+%    \settrue\ignoreMPpath
+%    \def\extraMPpathcode{/#1 sh Q}%
+%    \pdfliteral{q /Pattern cs}}
+
+\protect \endinput
diff --git a/tex/context/base/metatex.tex b/tex/context/base/metatex.tex
index c7ceb005d..df674c11a 100644
--- a/tex/context/base/metatex.tex
+++ b/tex/context/base/metatex.tex
@@ -37,12 +37,12 @@
 
 \def\loadcorefile#1{\normalinput#1\relax}
 
-\loadcorefile{syst-ini.tex}  % some basic commands and allocations that are expected down the line
-\loadcorefile{syst-pln.tex}  % plain tex initializations of internal registers (no further code)
+\loadcorefile{syst-ini}      % some basic commands and allocations that are expected down the line
+\loadcorefile{syst-pln}      % plain tex initializations of internal registers (no further code)
 
-\loadcorefile{luat-cod.tex}  %
-\loadcorefile{luat-bas.tex}  %
-\loadcorefile{luat-lib.tex}  %
+\loadmarkfile{luat-cod}      %
+\loadmarkfile{luat-bas}      %
+\loadmarkfile{luat-lib}      %
 
 % needs stripping:
 
@@ -54,12 +54,12 @@
 
 % helpers, maybe less
 
-\loadcorefile{syst-aux.tex}  % a whole lot of auxiliary macros
-%loadcorefile{syst-lua.tex}  % some helpers using lua instead
-%loadcorefile{syst-con.mkiv} % some rather basic conversions
-%loadcorefile{syst-fnt.mkiv}
-%loadcorefile{syst-str.mkiv}
-%loadcorefile{syst-rtp.mkiv}
+\loadmarkfile{syst-aux}      % a whole lot of auxiliary macros
+%loadmarkfile{syst-lua}      % some helpers using lua instead
+%loadmarkfile{syst-con}      % some rather basic conversions
+%loadmarkfile{syst-fnt}
+%loadmarkfile{syst-str}
+%loadmarkfile{syst-rtp}
 
 % not needed
 
@@ -68,24 +68,24 @@
 
 % characters
 
-\loadcorefile{char-utf.tex}
-\loadcorefile{char-ini.tex}
-\loadcorefile{char-enc.tex} % \registerctxluafile{char-enc}{1.001}
+\loadmarkfile{char-utf}
+\loadmarkfile{char-ini}
+\loadmarkfile{char-enc}      % \registerctxluafile{char-enc}{1.001}
 
 % nodes
 
-\loadcorefile{node-ini.tex}
-%loadcorefile{node-fin.tex}
-%loadcorefile{node-par.tex}
+\loadmarkfile{node-ini}
+%loadmarkfile{node-fin}
+%loadmarkfile{node-par}
 
 % attributes, not needed:
 
-%loadcorefile{attr-ini.tex}
+%loadmarkfile{attr-ini}
 
 % regimes
 
-% \loadcorefile{regi-ini.mkiv}
-% \loadcorefile{regi-syn.tex}
+% \loadmarkfile{regi-ini}
+% \loadcorefile{regi-syn}
 
 % languages
 
@@ -132,10 +132,6 @@
 
 %registerctxluafile{l-xml}{1.001} % needed for font database
 
-% plain
-
-%loadcorefile{syst-stp.tex} % stripped plain
-
 % why not ...
 
 \pdfoutput\plusone
diff --git a/tex/context/base/mlib-ctx.lua b/tex/context/base/mlib-ctx.lua
index 4d4e25a3d..2b16af28e 100644
--- a/tex/context/base/mlib-ctx.lua
+++ b/tex/context/base/mlib-ctx.lua
@@ -41,8 +41,15 @@ end
 statistics.register("metapost processing time", function()
     local n =  metapost.n
     if n > 0 then
-        return format("%s seconds, loading: %s seconds, execution: %s seconds, n: %s",
-            statistics.elapsedtime(metapost), statistics.elapsedtime(mplib), statistics.elapsedtime(metapost.exectime),n)
+        local e = metapost.externals.n
+        local str = format("%s seconds, loading: %s seconds, execution: %s seconds, n: %s",
+            statistics.elapsedtime(metapost), statistics.elapsedtime(mplib),
+            statistics.elapsedtime(metapost.exectime), n)
+        if e > 0 then
+            return format("%s, external: %s seconds (%s calls)", str, statistics.elapsedtime(metapost.externals), e)
+        else
+            return str
+        end
     else
         return nil
     end
diff --git a/tex/context/base/mlib-pdf.lua b/tex/context/base/mlib-pdf.lua
index 8dfa5e552..b0b4bfe4f 100644
--- a/tex/context/base/mlib-pdf.lua
+++ b/tex/context/base/mlib-pdf.lua
@@ -293,7 +293,6 @@ function metapost.flush(result,flusher,askedfig) -- pdf flusher, table en dan co
                                         prescript = object.prescript,
                                         postscript = object.postscript,
                                     }
-    --~ print(table.serialize(currentobject))
                                     --
                                     local before, inbetween, after = nil, nil, nil
                                     --
@@ -457,34 +456,32 @@ function metapost.parse(result,askedfig)
     end
 end
 
-do
+-- tracing:
 
-    -- just tracing
+local t = { }
 
-    local t = { }
-
-    local flusher = {
-        startfigure = function()
-            t = { }
-            texsprint(ctxcatcodes,"\\startnointerference")
-        end,
-        flushfigure = function(literals)
-            for i=1, #literals do
-                t[#t+1] = literals[i]
-            end
-        end,
-        stopfigure = function()
-            texsprint(ctxcatcodes,"\\stopnointerference")
+local flusher = {
+    startfigure = function()
+        t = { }
+        texsprint(ctxcatcodes,"\\startnointerference")
+    end,
+    flushfigure = function(literals)
+        for i=1, #literals do
+            t[#t+1] = literals[i]
         end
-    }
-
-    function metapost.pdfliterals(result)
-        metapost.flush(result,flusher)
-        return t
+    end,
+    stopfigure = function()
+        texsprint(ctxcatcodes,"\\stopnointerference")
     end
+}
 
+function metapost.pdfliterals(result)
+    metapost.flush(result,flusher)
+    return t
 end
 
+-- so far
+
 function metapost.totable(result)
     local figure = result and result.fig and result.fig[1]
     if figure then
@@ -510,6 +507,8 @@ function metapost.totable(result)
     end
 end
 
+-- will be overloaded later
+
 function metapost.colorconverter()
     return function(cr)
         local n = #cr
diff --git a/tex/context/base/mlib-pdf.mkiv b/tex/context/base/mlib-pdf.mkiv
index 92fcb28ae..2681b0810 100644
--- a/tex/context/base/mlib-pdf.mkiv
+++ b/tex/context/base/mlib-pdf.mkiv
@@ -15,8 +15,6 @@
 
 \registerctxluafile{mlib-pdf}{1.001}
 
-% \let\MPLIBtoPDF\pdfliteral
-
 \def\MPLIBtoPDF#1{\ctxlua{metapost.flush_literal(#1)}}
 
 \def\MPLIBboundingbox#1#2#3#4%
@@ -31,7 +29,7 @@
   {\naturalhbox\bgroup
    \doactivatecolor\s!black\forcecolorhack
    \MPLIBboundingbox{#1}{#2}{#3}{#4}%
-   \forgetall
+  %\forgetall % done already elsewhere
    \setbox\scratchbox\vbox\bgroup
    \noindent % this is really needed in order to force tex into proper cm's
    \startMPresources}
@@ -81,7 +79,7 @@
      {\font\temp=#1\space at #2\onebasepoint
       \let\c\char
       \temp
-      \MPfshowcommand{#3}}%
+      #3}%
    \setbox\scratchbox\hbox
      {\hskip#4\onebasepoint
       \raise#5\onebasepoint
diff --git a/tex/context/base/mlib-pps.lua b/tex/context/base/mlib-pps.lua
index 04a9ba230..d5ce9e869 100644
--- a/tex/context/base/mlib-pps.lua
+++ b/tex/context/base/mlib-pps.lua
@@ -27,6 +27,7 @@ local cmyktogray = colors.cmyktogray  or function() return 0       end
 metapost               = metapost or { }
 metapost.specials      = metapost.specials or { }
 metapost.specials.data = metapost.specials.data or { }
+metapost.externals     = metapost.externals or { n = 0 }
 
 local data = metapost.specials.data
 
@@ -40,21 +41,25 @@ local colordata = { {}, {}, {}, {}, {} }
 --~         => rest             : r=123 g=n>10 b=whatever
 
 local nooutercolor        = "0 g 0 G"
-local nooutertransparency = "/Tr0 gs"
+local nooutertransparency = "/Tr0 gs" -- only when set
 local outercolormode      = 0
 local outercolor          = nooutercolor
 local outertransparency   = nooutertransparency
 local innercolor          = nooutercolor
 local innertransparency   = nooutertransparency
 
-function metapost.set_outer_color(mode,color,transparency)
+local pdfcolor, pdftransparency = lpdf.color, lpdf.transparency
+local registercolor, registerspotcolor = colors.register, colors.registerspotcolor
+local registertransparencies = transparencies.register
+
+function metapost.set_outer_color(mode,colormodel,colorattribute,transparencyattribute)
     -- has always to be called before conversion
     -- todo: transparency (not in the mood now)
     outercolormode = mode
     if mode == 1 or mode == 3 then
-        -- inherit from outer
-        outercolor        = color        or nooutercolor
-        outertransparency = transparency or nooutertransparency
+        -- inherit from outer (registered color)
+        outercolor        = pdfcolor(colormodel,colorattribute)    or nooutercolor
+        outertransparency = pdftransparency(transparencyattribute) or nooutertransparency
     elseif mode == 2 then
         -- stand alone
         outercolor        = ""
@@ -63,8 +68,8 @@ function metapost.set_outer_color(mode,color,transparency)
         outercolor        = nooutercolor
         outertransparency = nooutertransparency
     end
-    innercolor = outercolor
-    innertransparency = outertransparency
+    innercolor        = outercolor
+    innertransparency = outertransparency -- not yet used
 end
 
 local function checked_color_pair(color)
@@ -117,7 +122,12 @@ function metapost.specials.register(str) -- only colors
 --~     end
 end
 
-function metapost.colorhandler(cs, object, result, colorconverter)
+local function spotcolorconverter(parent, n, d, p)
+    registerspotcolor(parent)
+    return pdfcolor(colors.model,registercolor('color',nil,'spot',parent,n,d,p))
+end
+
+function metapost.colorhandler(cs, object, result, colorconverter) -- handles specials
     local cr = outercolor
     local what = round(cs[2]*10000)
     local data = colordata[what]
@@ -129,16 +139,14 @@ function metapost.colorhandler(cs, object, result, colorconverter)
     elseif what == 1 then
         result[#result+1], cr = colorconverter({ data[2], data[3], data[4], data[5] })
     elseif what == 2 then
-        ctx.registerspotcolor(data[2])
-        result[#result+1] = ctx.pdfcolor(colors.model,colors.register('color',nil,'spot',data[2],data[3],data[4],data[5]))
+        result[#result+1] = spotcolorconverter(data[2],data[3],data[4],data[5])
     else
         if what == 3 then
             result[#result+1], cr = colorconverter({ data[3], data[4], data[5]})
         elseif what == 4 then
             result[#result+1], cr = colorconverter({ data[3], data[4], data[5], data[6]})
         elseif what == 5 then
-            ctx.registerspotcolor(data[3])
-            result[#result+1] = ctx.pdfcolor(colors.model,colors.register('color',nil,'spot',data[3],data[4],data[5],data[6]))
+            result[#result+1] = spotcolorconverter(data[3],data[4],data[5],data[6])
         end
         object.prescript = "tr"
         object.postscript = data[1] .. "," .. data[2]
@@ -147,30 +155,28 @@ function metapost.colorhandler(cs, object, result, colorconverter)
     return object, cr
 end
 
-function metapost.colorspec(cs)
+function metapost.colorspec(cs) -- used for shades ... returns table (for checking) or string (spot)
     local what = round(cs[2]*10000)
     local data = colordata[what][round(cs[3]*10000)]
     if not data then
         return { 0 }
     elseif what == 1 then
-        return { data[2], data[3], data[4], data[5] }
+        return { tonumber(data[2]), tonumber(data[3]), tonumber(data[4]), tonumber(data[5]) }
     elseif what == 2 then
-        ctx.registerspotcolor(data[2])
-        return ctx.pdfcolor(colors.model,colors.register('color',nil,'spot',data[2],data[3],data[4],data[5]))
+        return spotcolorconverter(data[2],data[3],data[4],data[5])
     elseif what == 3 then
-        return { data[3], data[4], data[5] }
+        return { tonumber(data[3]), tonumber(data[4]), tonumber(data[5]) }
     elseif what == 4 then
-        return { data[3], data[4], data[5], data[6] }
+        return { tonumber(data[3]), tonumber(data[4]), tonumber(data[5]), tonumber(data[6]) }
     elseif what == 5 then
-        ctx.registerspotcolor(data[3])
-        return ctx.pdfcolor(colors.model,colors.register('color',nil,'spot',data[3],data[4],data[5],data[6]))
+        return spotcolorconverter(data[3],data[4],data[5],data[6])
     end
 end
 
 function metapost.specials.tr(specification,object,result)
     local a, t = match(specification,"^(.+),(.+)$")
     local before = a and t and function()
-        result[#result+1] = format("/Tr%s gs",transparencies.register('mp',a,t))
+        result[#result+1] = format("/Tr%s gs",registertransparencies('mp',a,t))
         return object, result
     end
     local after = before and function()
@@ -182,6 +188,7 @@ end
 
 local specificationsplitter = lpeg.Ct(lpeg.splitat(" "))
 local colorsplitter         = lpeg.Ct(lpeg.splitat(":"))
+local colorsplitter         = lpeg.Ct(lpeg.splitter(":",tonumber))
 
 -- Unfortunately we cannot use cmyk colors natively because there is no
 -- generic color allocation primitive ... it's just an rgbcolor color.. This
@@ -273,20 +280,12 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color
     local cb = colorsplitter:match(t[8])
     if round(ca[1]*10000) == 123 then ca = metapost.colorspec(ca) end
     if round(cb[1]*10000) == 123 then cb = metapost.colorspec(cb) end
+    local name = format("MplSh%s",nofshades)
+    local domain = { tonumber(t[1]), tonumber(t[2]) }
+    local coordinates = { tonumber(t[5]), tonumber(t[6]), tonumber(t[7]), tonumber(t[9]), tonumber(t[10]), tonumber(t[11]) }
     if type(ca) == "string" then
-        -- spot color, not supported, maybe at some point use the fallbacks
-        sprint(ctxcatcodes,format("\\MPLIBcircularshade{%s}{%s %s}{%.3f}{%.3f}{%s}{%s}{%s %s %s %s %s %s}",
-            nofshades,
-            t[1], t[2], 0, 1, 1, "DeviceGray",
-            t[5], t[6], t[7], t[9], t[10], t[11]))
--- terrible hack, somehow does not work
---~ local a = ca:match("^([^ ]+)")
---~ local b = cb:match("^([^ ]+)")
---~ sprint(ctxcatcodes,format("\\xMPLIBcircularshade{%s}{%s %s}{%s}{%s}{%s}{%s}{%s %s %s %s %s %s}",
---~     nofshades,
---~     --~ t[1], t[2], a, b, 1, "DeviceN",
---~     0, 1, a, b, 1, "DeviceN",
---~     t[5], t[6], t[7], t[9], t[10], t[11]))
+        -- backend specific (will be renamed)
+        lpdf.circularshade(name,domain,{ 0 },{ 1 },1,"DeviceGray",coordinates)
     else
         if #ca > #cb then
             normalize(ca,cb)
@@ -307,10 +306,8 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color
                 ca[1], ca[2], ca[3] = a, a, a
                 cb[1], cb[2], cb[3] = b, b, b
             end
-            sprint(ctxcatcodes,format("\\MPLIBcircularshade{%s}{%s %s}{%.3f %.3f %.3f}{%.3f %.3f %.3f}{%s}{%s}{%s %s %s %s %s %s}",
-                nofshades,
-                t[1], t[2], ca[1], ca[2], ca[3], cb[1], cb[2], cb[3], 1, "DeviceRGB",
-                t[5], t[6], t[7], t[9], t[10], t[11]))
+            -- backend specific (will be renamed)
+            lpdf.circularshade(name,domain,ca,cb,1,"DeviceRGB",coordinates)
         elseif model == "cmyk" then
             if #ca == 3 then
                 ca[1], ca[2], ca[3], ca[4] = rgbtocmyk(ca[1],ca[2],ca[3])
@@ -319,10 +316,8 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color
                 ca[1], ca[2], ca[3], ca[4] = 0, 0, 0, ca[1]
                 cb[1], cb[2], cb[3], ca[4] = 0, 0, 0, ca[1]
             end
-            sprint(ctxcatcodes,format("\\MPLIBcircularshade{%s}{%s %s}{%.3f %.3f %.3f %.3f}{%.3f %.3f %.3f %.3f}{%s}{%s}{%s %s %s %s %s %s}",
-                nofshades,
-                t[1], t[2], ca[1], ca[2], ca[3], ca[4], cb[1], cb[2], cb[3], cb[4], 1, "DeviceCMYK",
-                t[5], t[6], t[7], t[9], t[10], t[11]))
+            -- backend specific (will be renamed)
+            lpdf.circularshade(name,domain,ca,cb,1,"DeviceCMYK",coordinates)
         else
             if #ca == 4 then
                 ca[1] = cmyktogray(ca[1],ca[2],ca[3],ca[4])
@@ -331,10 +326,8 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color
                 ca[1] = rgbtogray(ca[1],ca[2],ca[3])
                 cb[1] = rgbtogray(cb[1],cb[2],cb[3])
             end
-            sprint(ctxcatcodes,format("\\MPLIBcircularshade{%s}{%s %s}{%.3f}{%.3f}{%s}{%s}{%s %s %s %s %s %s}",
-                nofshades,
-                t[1], t[2], ca[1], cb[1], 1, "DeviceGray",
-                t[5], t[6], t[7], t[9], t[10], t[11]))
+            -- backend specific (will be renamed)
+            lpdf.circularshade(name,domain,ca,cb,1,"DeviceGRAY",coordinates)
         end
     end
     local before = function()
@@ -342,7 +335,7 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color
         return object, result
     end
     local after = function()
-        result[#result+1] = format("W n /MpSh%s sh Q", nofshades)
+        result[#result+1] = format("W n /%s sh Q", name)
         return object, result
     end
     object.color, object.type = nil, nil
@@ -359,12 +352,12 @@ function metapost.specials.ls(specification,object,result,flusher)
     local cb = colorsplitter:match(t[7])
     if round(ca[1]*10000) == 123 then ca = metapost.colorspec(ca) end
     if round(cb[1]*10000) == 123 then cb = metapost.colorspec(cb) end
+    local name = format("MpSh%s",nofshades)
+    local domain = { tonumber(t[1]), tonumber(t[2]) }
+    local coordinates = { tonumber(t[5]), tonumber(t[6]), tonumber(t[7]), tonumber(t[9]) }
     if type(ca) == "string" then
-        -- spot color, not supported, maybe at some point use the fallbacks
-        sprint(ctxcatcodes,format("\\MPLIBlinearshade{%s}{%s %s}{%.3f}{%.3f}{%s}{%s}{%s %s %s %s}",
-            nofshades,
-            t[1], t[2], 0, 1, 1, "DeviceGray",
-            t[5], t[6], t[8], t[9]))
+        -- backend specific (will be renamed)
+        lpdf.linearshade(name,domain,{ 0 },{ 1 },1,"DeviceGray",coordinates)
     else
         if #ca > #cb then
             normalize(ca,cb)
@@ -384,10 +377,8 @@ function metapost.specials.ls(specification,object,result,flusher)
                 ca[1], ca[2], ca[3] = a, a, a
                 cb[1], cb[2], cb[3] = b, b, b
             end
-            sprint(ctxcatcodes,format("\\MPLIBlinearshade{%s}{%s %s}{%.3f %.3f %.3f}{%.3f %.3f %.3f}{%s}{%s}{%s %s %s %s}",
-                nofshades,
-                t[1], t[2], ca[1], ca[2], ca[3], cb[1], cb[2], cb[3], 1, "DeviceRGB",
-                t[5], t[6], t[8], t[9]))
+            -- backend specific (will be renamed)
+            lpdf.linearshade(name,domain,ca,cb,1,"DeviceRGB",coordinates)
         elseif model == "cmyk" then
             if #ca == 3 then
                 ca[1], ca[2], ca[3], ca[4] = rgbtocmyk(ca[1],ca[2],ca[3])
@@ -396,10 +387,8 @@ function metapost.specials.ls(specification,object,result,flusher)
                 ca[1], ca[2], ca[3], ca[4] = 0, 0, 0, ca[1]
                 cb[1], cb[2], cb[3], ca[4] = 0, 0, 0, ca[1]
             end
-            sprint(ctxcatcodes,format("\\MPLIBlinearshade{%s}{%s %s}{%.3f %.3f %.3f %.3f}{%.3f %.3f %.3f %.3f}{%s}{%s}{%s %s %s %s}",
-                nofshades,
-                t[1], t[2], ca[1], ca[2], ca[3], ca[4], cb[1], cb[2], cb[3], cb[4], 1, "DeviceCMYK",
-                t[5], t[6], t[8], t[9]))
+            -- backend specific (will be renamed)
+            lpdf.linearshade(name,domain,ca,cb,1,"DeviceCMYK",coordinates)
         else
             if #ca == 4 then
                 ca[1] = cmyktogray(ca[1],ca[2],ca[3],ca[4])
@@ -408,10 +397,8 @@ function metapost.specials.ls(specification,object,result,flusher)
                 ca[1] = rgbtogray(ca[1],ca[2],ca[3])
                 cb[1] = rgbtogray(cb[1],cb[2],cb[3])
             end
-            sprint(ctxcatcodes,format("\\MPLIBlinearshade{%s}{%s %s}{%.3f}{%.3f}{%s}{%s}{%s %s %s %s}",
-                nofshades,
-                t[1], t[2], ca[1], cb[1], 1, "DeviceGray",
-                t[5], t[6], t[8], t[9]))
+            -- backend specific (will be renamed)
+            lpdf.linearshade(name,domain,ca,cb,1,"DeviceGRAY",coordinates)
         end
     end
     local before = function()
@@ -419,7 +406,7 @@ function metapost.specials.ls(specification,object,result,flusher)
         return object, result
     end
     local after = function()
-        result[#result+1] = format("W n /MpSh%s sh Q", nofshades)
+        result[#result+1] = format("W n /%s sh Q", name)
         return object, result
     end
     object.color, object.type = nil, nil
@@ -500,145 +487,146 @@ function metapost.specials.ts(specification,object,result,flusher)
     end
 end
 
+-- rather generic pdf, so use this elsewhere too it no longer pays
+-- off to distinguish between outline and fill (we now have both
+-- too, e.g. in arrows)
+
 metapost.reducetogray = true
 
+local models = { }
 
-function metapost.colorconverter() -- rather generic pdf, so use this elsewhere too
-    -- it no longer pays off to distinguish between outline and fill
-    --  (we now have both too, e.g. in arrows)
-    local model = colors.model
-    local reduce = metapost.reducetogray
-    if model == "all" then
-        return function(cr)
-            local n = #cr
-            if n == 0 then
-                return checked_color_pair()
-            elseif reduce then
-                if n == 1 then
-                    local s = cr[1]
-                    return checked_color_pair(format("%.3f g %.3f G",s,s))
-                elseif n == 3 then
-                    local r, g, b = cr[1], cr[2], cr[3]
-                    if r == g and g == b then
-                        return checked_color_pair(format("%.3f g %.3f G",r,r))
-                    else
-                        return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
-                    end
-                else
-                    local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
-                    if c == m and m == y and y == 0 then
-                        k = 1 - k
-                        return checked_color_pair(format("%.3f g %.3f G",k,k))
-                    else
-                        return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
-                    end
-                end
-            elseif n == 1 then
-                local s = cr[1]
-                return checked_color_pair(format("%.3f g %.3f G",s,s))
-            elseif n == 3 then
-                local r, g, b = cr[1], cr[2], cr[3]
+function models.all(cr)
+    local n = #cr
+    if n == 0 then
+        return checked_color_pair()
+    elseif metapost.reducetogray then
+        if n == 1 then
+            local s = cr[1]
+            return checked_color_pair(format("%.3f g %.3f G",s,s))
+        elseif n == 3 then
+            local r, g, b = cr[1], cr[2], cr[3]
+            if r == g and g == b then
+                return checked_color_pair(format("%.3f g %.3f G",r,r))
+            else
                 return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
+            end
+        else
+            local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
+            if c == m and m == y and y == 0 then
+                k = 1 - k
+                return checked_color_pair(format("%.3f g %.3f G",k,k))
             else
-                local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
                 return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
             end
         end
-    elseif model == "rgb" then
-        return function(cr)
-            local n = #cr
-            if n == 0 then
-                return checked_color_pair()
-            elseif reduce then
-                if n == 1 then
-                    local s = cr[1]
-                    checked_color_pair(format("%.3f g %.3f G",s,s))
-                elseif n == 3 then
-                    local r, g, b = cr[1], cr[2], cr[3]
-                    if r == g and g == b then
-                        return checked_color_pair(format("%.3f g %.3f G",r,r))
-                    else
-                        return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
-                    end
-                else
-                    local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
-                    if c == m and m == y and y == 0 then
-                        k = 1 - k
-                        return checked_color_pair(format("%.3f g %.3f G",k,k))
-                    else
-                        local r, g, b = cmyktorgb(c,m,y,k)
-                        return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
-                    end
-                end
-            elseif n == 1 then
-                local s = cr[1]
-                return checked_color_pair(format("%.3f g %.3f G",s,s))
+    elseif n == 1 then
+        local s = cr[1]
+        return checked_color_pair(format("%.3f g %.3f G",s,s))
+    elseif n == 3 then
+        local r, g, b = cr[1], cr[2], cr[3]
+        return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
+    else
+        local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
+        return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
+    end
+end
+
+function models.rgb(cr)
+    local n = #cr
+    if n == 0 then
+        return checked_color_pair()
+    elseif metapost.reducetogray then
+        if n == 1 then
+            local s = cr[1]
+            checked_color_pair(format("%.3f g %.3f G",s,s))
+        elseif n == 3 then
+            local r, g, b = cr[1], cr[2], cr[3]
+            if r == g and g == b then
+                return checked_color_pair(format("%.3f g %.3f G",r,r))
             else
-                local r, g, b
-                if n == 3 then
-                    r, g, b = cmyktorgb(cr[1],cr[2],cr[3],cr[4])
-                else
-                    r, g, b = cr[1], cr[2], cr[3]
-                end
                 return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
             end
-        end
-    elseif model == "cmyk" then
-        return function(cr)
-            local n = #cr
-            if n == 0 then
-                return checked_color_pair()
-            elseif reduce then
-                if n == 1 then
-                    local s = cr[1]
-                    return checked_color_pair(format("%.3f g %.3f G",s,s))
-                elseif n == 3 then
-                    local r, g, b = cr[1], cr[2], cr[3]
-                    if r == g and g == b then
-                        return checked_color_pair(format("%.3f g %.3f G",r,r))
-                    else
-                        local c, m, y, k = rgbtocmyk(r,g,b)
-                        return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
-                    end
-                else
-                    local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
-                    if c == m and m == y and y == 0 then
-                        k = 1 - k
-                        return checked_color_pair(format("%.3f g %.3f G",k,k))
-                    else
-                        return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
-                    end
-                end
-            elseif n == 1 then
-                local s = cr[1]
-                return checked_color_pair(format("%.3f g %.3f G",s,s))
+        else
+            local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
+            if c == m and m == y and y == 0 then
+                k = 1 - k
+                return checked_color_pair(format("%.3f g %.3f G",k,k))
             else
-                local c, m, y, k
-                if n == 3 then
-                    c, m, y, k = rgbtocmyk(cr[1],cr[2],cr[3])
-                else
-                    c, m, y, k = cr[1], cr[2], cr[3], cr[4]
-                end
-                return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
+                local r, g, b = cmyktorgb(c,m,y,k)
+                return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
             end
         end
+    elseif n == 1 then
+        local s = cr[1]
+        return checked_color_pair(format("%.3f g %.3f G",s,s))
     else
-        return function(cr)
-            local n, s = #cr, 0
-            if n == 0 then
-                return checked_color_pair()
-            elseif n == 4 then
-                s = cmyktogray(cr[1],cr[2],cr[3],cr[4])
-            elseif n == 3 then
-                s = rgbtogray(cr[1],cr[2],cr[3])
+        local r, g, b
+        if n == 3 then
+            r, g, b = cmyktorgb(cr[1],cr[2],cr[3],cr[4])
+        else
+            r, g, b = cr[1], cr[2], cr[3]
+        end
+        return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
+    end
+end
+
+function models.cmyk(cr)
+    local n = #cr
+    if n == 0 then
+        return checked_color_pair()
+    elseif metapost.reducetogray then
+        if n == 1 then
+            local s = cr[1]
+            return checked_color_pair(format("%.3f g %.3f G",s,s))
+        elseif n == 3 then
+            local r, g, b = cr[1], cr[2], cr[3]
+            if r == g and g == b then
+                return checked_color_pair(format("%.3f g %.3f G",r,r))
             else
-                s = cr[1]
+                local c, m, y, k = rgbtocmyk(r,g,b)
+                return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
             end
-            return checked_color_pair(format("%.3f g %.3f G",s,s))
+        else
+            local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
+            if c == m and m == y and y == 0 then
+                k = 1 - k
+                return checked_color_pair(format("%.3f g %.3f G",k,k))
+            else
+                return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
+            end
+        end
+    elseif n == 1 then
+        local s = cr[1]
+        return checked_color_pair(format("%.3f g %.3f G",s,s))
+    else
+        local c, m, y, k
+        if n == 3 then
+            c, m, y, k = rgbtocmyk(cr[1],cr[2],cr[3])
+        else
+            c, m, y, k = cr[1], cr[2], cr[3], cr[4]
         end
+        return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
     end
 end
 
+function models.gray(cr)
+    local n, s = #cr, 0
+    if n == 0 then
+        return checked_color_pair()
+    elseif n == 4 then
+        s = cmyktogray(cr[1],cr[2],cr[3],cr[4])
+    elseif n == 3 then
+        s = rgbtogray(cr[1],cr[2],cr[3])
+    else
+        s = cr[1]
+    end
+    return checked_color_pair(format("%.3f g %.3f G",s,s))
+end
+
+function metapost.colorconverter()
+    return models[colors.model] or gray
+end
+
 do
 
     local P, S, V, Cs = lpeg.P, lpeg.S, lpeg.V, lpeg.Cs
@@ -829,6 +817,9 @@ end
 
 function metapost.intermediate.actions.makempy()
     if #graphics > 0 then
+        local externals = metapost.externals
+        externals.n = externals.n + 1
+        statistics.starttiming(externals)
         local mpofile = tex.jobname .. "-mpgraph"
         local mpyfile = file.replacesuffix(mpofile,"mpy")
         local pdffile = file.replacesuffix(mpofile,"pdf")
@@ -846,6 +837,7 @@ function metapost.intermediate.actions.makempy()
                 io.savedata(mpyfile,concat(result,""))
             end
         end
-        graphics = { }
+        statistics.stoptiming(externals)
+        graphics = { } -- ?
     end
 end
diff --git a/tex/context/base/mlib-pps.mkiv b/tex/context/base/mlib-pps.mkiv
index beaef044e..83880994b 100644
--- a/tex/context/base/mlib-pps.mkiv
+++ b/tex/context/base/mlib-pps.mkiv
@@ -15,15 +15,7 @@
 
 \registerctxluafile{mlib-pps}{1.001}
 
-\def\MPLIBcircularshade#1#2#3#4#5#6#7% nr domain color-a color-b ? colorspace oordinates
-  {\immediate\pdfobj{<>}%
-   \immediate\pdfobj{<>}%
-   \appendtoPDFdocumentshades{/MpSh#1 \the\pdflastobj\space0 R }}
-
-\def\MPLIBlinearshade#1#2#3#4#5#6#7% nr domain color-a color-b ? colorspace oordinates
-  {\immediate\pdfobj{<>}%
-   \immediate\pdfobj{<>}%
-   \appendtoPDFdocumentshades{/MpSh#1 \the\pdflastobj\space0 R }}
+% this will move !
 
 \def\MPLIBfigure#1#2#3#4#5#6#7% todo: move Q q to lua
   {\setbox\scratchbox\hbox{\externalfigure[#7]}%
@@ -38,13 +30,7 @@
 \def\MPLIBfreetext#1%
   {\global\setbox#1\emptybox}
 
-% \def\MPLIBgettext#1#2#3#4#5#6#7% we can also use this for the figure and pass sx/sy
-%   {\ctxlua{metapost.edefsxsy(\number\wd#7,\number\ht#7,\number\dp#7)}%
-%    \pdfliteral{q #1 #2 #3 #4 #5 #6 cm}%
-%    \vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[sx=\sx,sy=\sy]{\raise\dp#7\box#7}\hss}}%
-%    \pdfliteral{Q}}
-
-\def\MPLIBgettextscaled#1#2#3%
+\def\MPLIBgettextscaled#1#2#3%  why a copy
   {\vbox to \zeropoint{\vss\hbox to \zeropoint{\black\scale[sx=#2,sy=#3]{\raise\dp#1\copy#1}\hss}}}
 
 \def\MPLIBallocate#1%
diff --git a/tex/context/base/mlib-run.lua b/tex/context/base/mlib-run.lua
index d22e0d742..b155dd344 100644
--- a/tex/context/base/mlib-run.lua
+++ b/tex/context/base/mlib-run.lua
@@ -116,7 +116,7 @@ function metapost.load(name)
             ini_version = false,
             mem_name = file.replacesuffix(name,"mem"),
             find_file = finder,
---~             job_name = "mplib",
+         -- job_name = "mplib",
         }
     ) )
     local result
diff --git a/tex/context/base/mult-chk.lua b/tex/context/base/mult-chk.lua
index 1c74d2e38..2c1ab3c78 100644
--- a/tex/context/base/mult-chk.lua
+++ b/tex/context/base/mult-chk.lua
@@ -53,7 +53,7 @@ local function set(key,value)
     end
 end
 
-local pattern = aux.make_settings_to_hash_pattern(set,true)
+local pattern = aux.make_settings_to_hash_pattern(set,"tolerant")
 
 function commands.getcheckedparameters(k,p,s)
     if s and s ~= "" then
diff --git a/tex/context/base/mult-chk.mkii b/tex/context/base/mult-chk.mkii
index 6299d0cda..60f568a1e 100644
--- a/tex/context/base/mult-chk.mkii
+++ b/tex/context/base/mult-chk.mkii
@@ -15,6 +15,9 @@
 
 %D No checking in \MKII.
 
+\def\gobbleparameters{\doquadrupleempty\dogobbleparameters} % todo: 1,2,3,4 case
+\def\dogobbleparameters[#1][#2][#3][#4]{}
+
 \def\setvalidparameterkeys{\gobbleparameters} % forward reference, so no \let
 \def\addvalidparameterkeys{\gobbleparameters} % forward reference, so no \let
 
diff --git a/tex/context/base/mult-cld.lua b/tex/context/base/mult-cld.lua
new file mode 100644
index 000000000..c9e922afe
--- /dev/null
+++ b/tex/context/base/mult-cld.lua
@@ -0,0 +1,174 @@
+if not modules then modules = { } end modules ['mult-cld'] = {
+    version   = 1.001,
+    comment   = "companion to mult-cld.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+-- This is an experiment: generating context code at the lua end. After all
+-- it is surprisingly simple to implement due to metatables. I was wondering
+-- if there was a more natural way to deal with commands at the lua end.
+-- Of course it's a bit slower but often more readable when mixed with lua
+-- code. It can also be handy when generating documents from databases or
+-- when constructing large tables or so.
+--
+-- Todo: optional checking against interface!
+
+context = context or { }
+
+local format, concat = string.format, table.concat
+local next, type = next, type
+local texsprint, texiowrite = tex.sprint, texio.write
+
+local flush = texsprint
+local cache
+
+local function cached_flush(c,...)
+    local tt = { ... }
+    for i=1,#tt do
+        cache[#cache+1] = tt[i]
+    end
+end
+
+local function writer(k,...)
+    flush(ctxcatcodes,k)
+    local t = { ... }
+    if next(t) then
+        for i=1,#t do
+            local ti = t[i]
+            local typ, force = type(ti), nil
+            while typ == "function" do
+                local saved_flush = flush
+                cache = { }
+                flush = cached_flush
+                ti, force = ti()
+                if force then
+                    typ = false -- force special cases
+                elseif typ == "nil" then
+                    typ = "string"
+                    ti = concat(cache)
+                elseif typ == "string" then
+                    ti = concat(cache)
+                end
+                flush = saved_flush
+            end
+            if ti == nil then
+                -- next
+            elseif typ == "string" or typ == "number" then
+                flush(ctxcatcodes,"{",ti,"}")
+            elseif typ == "table" then
+                flush(ctxcatcodes,"[")
+                local c = concat(ti,",")
+                if c ~= "" then
+                    flush(ctxcatcodes,c)
+                else
+                    local done = false
+                    for k, v in next, ti do
+                        if done then
+                            flush(ctxcatcodes,",",k,'=',v)
+                        else
+                            flush(ctxcatcodes,k,'=',v)
+                            done = true
+                        end
+                    end
+                end
+                flush(ctxcatcodes,"]")
+        --  elseif typ == "boolean" then
+        --      flush(ctxcatcodes,"\n")
+            elseif ti == true then
+                flush(ctxcatcodes,"\n")
+            elseif typ == false then
+                if force == "direct" then
+                    flush(ctxcatcodes,tostring(ti))
+                end
+            else
+                logs.report("interfaces","error: %s gets a weird argument %s",k,tostring(ti))
+            end
+        end
+    end
+end
+
+local function indexer(t,k)
+    local f = function(...) return writer("\\"..k.." ",...) end -- building the cs here saves time
+    t[k] = f
+    return f
+end
+
+local function caller(t,f,...)
+    if f then
+        flush(ctxcatcodes,format(f,...))
+    else
+        flush(ctxcatcodes,"\n")
+    end
+end
+
+setmetatable(context, { __index = indexer, __call = caller } )
+
+-- the only non macro:
+
+local trace_cld = false
+
+function context.runfile(filename)
+    filename = resolvers.findtexfile(filename) or ""
+    if filename ~= "" then
+        local ok = dofile(filename)
+        if ok then
+            if trace_cld then
+                commands.writestatus("cld","begin of file '%s'",filename)
+            end
+            ok()
+            if trace_cld then
+                commands.writestatus("cld","end of file '%s'",filename)
+            end
+        else
+            commands.writestatus("cld","invalid file '%s'",filename)
+        end
+    else
+        commands.writestatus("cld","unknown file '%s'",filename)
+    end
+end
+
+-- tracking is using the regular mechanism; we need to define
+-- these 'macro' functions explictly as otherwise they are are
+-- delayed (as all commands print back to tex, so that tracing
+-- would be enabled afterwards)
+
+trackers.register("cld.print", function(v)
+    trace_cld = v
+    if v then
+        flush = function(c,...)
+            texiowrite(...)
+            texsprint(c,...)
+        end
+    else
+        flush = texsprint
+    end
+end)
+
+function context.enabletrackers (str) trackers.enable (str) end
+function context.disabletrackers(str) trackers.disable(str) end
+
+-- see demo-lud.lud for an example
+
+-- context.starttext(true)
+-- context.chapter({ "label" }, "title", true)
+-- context.chapter(function() return { "label" } end, "title", true)
+--
+-- context.startchapter({ title = "test" }, { more = "oeps" }, true)
+--
+-- context.bTABLE(true)
+-- for i=1,10 do
+--     context.bTR()
+--     for i=1,10 do
+--         context.bTD()
+--         context("%#2i",math.random(99))
+--         context.eTD()
+--     end
+--     context.eTR(true)
+-- end
+-- context.eTABLE(true)
+--
+-- context.stopchapter(true)
+--
+-- context.stoptext(true)
diff --git a/tex/context/base/mult-cld.mkiv b/tex/context/base/mult-cld.mkiv
new file mode 100644
index 000000000..050928658
--- /dev/null
+++ b/tex/context/base/mult-cld.mkiv
@@ -0,0 +1,20 @@
+%D \module
+%D   [       file=mult-ini,
+%D        version=2008.10.22, % 1996.06.01,
+%D          title=\CONTEXT\ Multilingual Macros,
+%D       subtitle=Initialization,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 is just an idea, maybe a bad one.
+
+\writestatus{loading}{ConTeXt Multilingual Macros / Lua}
+
+\registerctxluafile{mult-cld}{1.001}
+
+\endinput
diff --git a/tex/context/base/mult-de.tex b/tex/context/base/mult-de.tex
index c73223658..3213fa7de 100644
--- a/tex/context/base/mult-de.tex
+++ b/tex/context/base/mult-de.tex
@@ -233,6 +233,7 @@
 \setinterfacevariable{lastpage}{letzteseite}
 \setinterfacevariable{lastpagenumber}{lastpagenumber}
 \setinterfacevariable{lastsubpage}{letzteunterseite}
+\setinterfacevariable{layer}{layer}
 \setinterfacevariable{left}{links}
 \setinterfacevariable{leftedge}{linkekante}
 \setinterfacevariable{lefthanging}{lefthanging}
@@ -843,6 +844,7 @@
 \setinterfaceconstant{sectionconversion}{sectionconversion}
 \setinterfaceconstant{sectionconversionset}{sectionconversionset}
 \setinterfaceconstant{sectionnumber}{abschnittsnummer}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
 \setinterfaceconstant{sectionsegments}{sectionsegments}
 \setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
 \setinterfaceconstant{sectionset}{sectionset}
diff --git a/tex/context/base/mult-def.lua b/tex/context/base/mult-def.lua
index dff747db1..2fea7dfe7 100644
--- a/tex/context/base/mult-def.lua
+++ b/tex/context/base/mult-def.lua
@@ -9766,6 +9766,9 @@ return {
    ["pe"]="شمارهبخش",
    ["ro"]="numarsectiune",
   },
+  ["sectionresetset"]={
+   ["en"]="sectionresetset",
+  },
   ["sectionsegments"]={
    ["en"]="sectionsegments",
   },
@@ -13352,6 +13355,16 @@ return {
    ["pe"]="زیرصفحهآخر",
    ["ro"]="ultimasubpagina",
   },
+  ["layer"]={
+   ["cs"]="layer",
+   ["de"]="layer",
+   ["en"]="layer",
+   ["fr"]="layer",
+   ["it"]="layer",
+   ["nl"]="layer",
+   ["pe"]="layer",
+   ["ro"]="layer",
+  },
   ["left"]={
    ["cs"]="vlevo",
    ["de"]="links",
diff --git a/tex/context/base/mult-en.tex b/tex/context/base/mult-en.tex
index d9ece5dfd..50997b1d8 100644
--- a/tex/context/base/mult-en.tex
+++ b/tex/context/base/mult-en.tex
@@ -233,6 +233,7 @@
 \setinterfacevariable{lastpage}{lastpage}
 \setinterfacevariable{lastpagenumber}{lastpagenumber}
 \setinterfacevariable{lastsubpage}{lastsubpage}
+\setinterfacevariable{layer}{layer}
 \setinterfacevariable{left}{left}
 \setinterfacevariable{leftedge}{leftedge}
 \setinterfacevariable{lefthanging}{lefthanging}
@@ -843,6 +844,7 @@
 \setinterfaceconstant{sectionconversion}{sectionconversion}
 \setinterfaceconstant{sectionconversionset}{sectionconversionset}
 \setinterfaceconstant{sectionnumber}{sectionnumber}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
 \setinterfaceconstant{sectionsegments}{sectionsegments}
 \setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
 \setinterfaceconstant{sectionset}{sectionset}
diff --git a/tex/context/base/mult-fr.tex b/tex/context/base/mult-fr.tex
index cfc56cb5c..16f22ec7f 100644
--- a/tex/context/base/mult-fr.tex
+++ b/tex/context/base/mult-fr.tex
@@ -233,6 +233,7 @@
 \setinterfacevariable{lastpage}{dernierepage}
 \setinterfacevariable{lastpagenumber}{derniernumeropage}
 \setinterfacevariable{lastsubpage}{dernieresouspage}
+\setinterfacevariable{layer}{layer}
 \setinterfacevariable{left}{gauche}
 \setinterfacevariable{leftedge}{bordgauche}
 \setinterfacevariable{lefthanging}{lefthanging}
@@ -843,6 +844,7 @@
 \setinterfaceconstant{sectionconversion}{sectionconversion}
 \setinterfaceconstant{sectionconversionset}{sectionconversionset}
 \setinterfaceconstant{sectionnumber}{numerosection}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
 \setinterfaceconstant{sectionsegments}{sectionsegments}
 \setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
 \setinterfaceconstant{sectionset}{sectionset}
diff --git a/tex/context/base/mult-his.tex b/tex/context/base/mult-his.tex
deleted file mode 100644
index fe87d4bcf..000000000
--- a/tex/context/base/mult-his.tex
+++ /dev/null
@@ -1,1155 +0,0 @@
-%D \module
-%D   [       file=mult-ini,
-%D        version=1996.06.01,
-%D          title=\CONTEXT\ Multilingual Macros,
-%D       subtitle=Initialization,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 module implements the multi||lingual interface to
-%D \CONTEXT. These capabilities concern messages, commands and
-%D parameters. Currently the following interfaces are
-%D supported:
-%D
-%D \starttabulate[|l|l|c|c|]
-%D \NC\bf language\NC\bf translator         \NC\bf messages\NC \bf interface\NC\NR
-%D \NC dutch      \NC Hans Hagen            \NC yes        \NC yes \NC\NR
-%D \NC english    \NC Hans Hagen \& SPQR    \NC yes        \NC yes \NC\NR
-%D \NC german     \NC Tobias Burnus         \NC yes        \NC yes \NC\NR
-%D \NC czech      \NC Tom Hudec             \NC yes        \NC yes \NC\NR
-%D \NC italian    \NC Giuseppe Bilotta      \NC yes        \NC yes \NC\NR
-%D \NC french     \NC Renaud Aubin          \NC yes        \NC yes \NC\NR
-%D \NC romanian   \NC ....                  \NC yes        \NC yes \NC\NR
-%D \NC norwegian  \NC Hans Fredrik Nordhaug \NC yes        \NC no  \NC\NR
-%D \stoptabulate
-
-%D to be translated:
-%D
-%D message   : floatblocks/13
-%D variables : sorttype compress autohang
-
-\writestatus{loading}{ConTeXt Multilingual Macros / Initialization}
-
-\unprotect
-
-%D \macros
-%D   [constanten,variabelen,commands]
-%D   {v!,c!,k!,s!,e!,m!,l!,r!,f!,p!,x!,y!}
-%D
-%D In the system modules we introduced some prefixed constants,
-%D variables (both macros) and registers. Apart from a
-%D tremendous saving in terms of memory and a gain in speed we
-%D use from now on prefixes when possible for just another
-%D reason: consistency and multi||linguality. Systematically
-%D using prefixed macros enables us to implement a
-%D multi||lingual user interface. Redefining these next set of
-%D prefixes therefore can have desastrous results.
-%D
-%D \startlinecorrection
-%D \starttable[|c|c|c|]
-%D \HL
-%D \NC \bf prefix        \NC \bf meaning \NC \bf application     \NC\SR
-%D \HL
-%D \NC \type{\c!prefix!} \NC  c!         \NC constant (direct)   \NC\FR
-%D \NC \type{\e!prefix!} \NC  e!         \NC element             \NC\MR
-%D \NC \type{\f!prefix!} \NC  f!         \NC file                \NC\MR
-%D \NC \type{\k!prefix!} \NC  k!         \NC constant (indirect) \NC\MR
-%D \NC \type{\l!prefix!} \NC  l!         \NC language            \NC\MR
-%D \NC \type{\m!prefix!} \NC  m!         \NC message             \NC\MR
-%D \NC \type{\p!prefix!} \NC  p!         \NC procedure           \NC\MR
-%D \NC \type{\r!prefix!} \NC  r!         \NC reference           \NC\MR
-%D \NC \type{\s!prefix!} \NC  s!         \NC system              \NC\MR
-%D \NC \type{\v!prefix!} \NC  v!         \NC variable            \NC\MR
-%D \NC \type{\x!prefix!} \NC  x!         \NC setup constant      \NC\MR
-%D \NC \type{\y!prefix!} \NC  y!         \NC setup variable      \NC\LR
-%D \HL
-%D \stoptable
-%D \stoplinecorrection
-%D
-%D In the single||lingual version we used \type{!}, \type{!!},
-%D \type{!!!} and \type{!!!!}.
-
-\def\c!prefix!{c!} \def\e!prefix!{e!} \def\f!prefix!{f!}
-\def\k!prefix!{k!} \def\l!prefix!{l!} \def\m!prefix!{m!}
-\def\p!prefix!{p!} \def\r!prefix!{r!} \def\s!prefix!{s!}
-\def\v!prefix!{v!} \def\t!prefix!{t!}
-
-% \def\x!prefix!{x!} % obsolete
-% \def\y!prefix!{y!} % obsolete
-
-%D \macros
-%D   [constants,variables,commands]
-%D   {@@,??}
-%D
-%D Variables generated by the system can be recognized on their
-%D prefix \type{@@}. They are composed of a command (class)
-%D specific tag, which can be recognized on \type{??}, and a
-%D system constant, which has the prefix \type{c!}. We'll se
-%D some more of this.
-
-\def\??prefix  {??}
-\def\@@prefix  {@@}
-
-%D Just to be complete we repeat some of the already defined
-%D system constants here. Maybe their prefix \type{\s!} now
-%D falls into place.
-
-\def\s!next    {next}         \def\s!default {default}
-\def\s!dummy   {dummy}        \def\s!unknown {unknown}
-
-\def\s!do      {do}           \def\s!dodo    {dodo}
-
-\def\s!complex {complex}      \def\s!start   {start}
-\def\s!simple  {simple}       \def\s!stop    {stop}
-
-%D The word \type{height} takes 6~token memory cells. The
-%D control sequence \type{\height} on the other hand uses only
-%D one. Knowing this, we can improve the performance of \TEX,
-%D both is terms of speed and memory usage, by using control
-%D sequences instead of the words written in full.
-%D
-%D Where in the \ASCII\ file the second lines takes nine extra
-%D characters, \TEX\ saves us 13~tokens.
-%D
-%D \starttyping
-%D \hrule width 10pt height 2pt depth 1pt
-%D \hrule \!!width 10pt \!!height 2pt \!!depth 1pt
-%D \stoptyping
-%D
-%D One condition is that we have defined \type{\!!height},
-%D \type{\!!width} and \type{\!!depth} as respectively
-%D \type{height}, \type{width} and \type{depth}. Using this
-%D scheme therefore only makes sense when a token sequence is
-%D used more than once. Savings like this should of course be
-%D implemented in english, just because \TEX\ is english.
-
-\def\!!width  {width}
-\def\!!height {height}
-\def\!!depth  {depth}
-\def\!!plus   {plus}
-\def\!!minus  {minus}
-\def\!!fill   {fill}
-\def\!!to     {to}
-
-%D \macros
-%D   {defineinterfaceconstant,
-%D    defineinterfacevariable,
-%D    defineinterfaceelement,
-%D    definesystemvariable,
-%D    definesystemconstant,
-%D    definemessageconstant,
-%D    definereferenceconstant,
-%D    definefileconstant}
-%D
-%D The first part of this module is dedicated to dealing with
-%D multi||lingual constants and variables. When \CONTEXT\ grew
-%D bigger and bigger in terms of bytes and used string space,
-%D we switched to predefined constants. At the cost of more
-%D hash table entries, the macros not only becase more compact,
-%D they became much faster too. Maybe an even bigger advantage
-%D was that mispelling could no longer lead to problems. Even a
-%D multi||lingual interface became possible.
-%D
-%D Constants --- we'll introduce the concept of variables later
-%D on --- are preceded by a type specific prefix, followed by a
-%D \type{!}. To force consistency, we provide a few commands
-%D for defining such constants.
-%D
-%D \starttyping
-%D \defineinterfaceconstant {name} {meaning}
-%D \defineinterfacevariable {name} {meaning}
-%D \defineinterfaceelement  {name} {meaning}
-%D \stoptyping
-%D
-%D Which is the same as:
-%D
-%D \starttyping
-%D \def\c!name{meaning}
-%D \def\v!name{meaning}
-%D \def\e!name{meaning}
-%D \stoptyping
-
-\def\defineinterfaceconstant #1#2{\setvalue{\c!prefix!#1}{#2}}
-\def\defineinterfacevariable #1#2{\setvalue{\v!prefix!#1}{#2}}
-\def\defineinterfaceelement  #1#2{\setvalue{\e!prefix!#1}{#2}}
-
-%D Next come some interface independant constants:
-%D
-%D \starttyping
-%D \definereferenceconstant {name} {meaning}
-%D \definefileconstant      {name} {meaning}
-%D \stoptyping
-
-\def\definereferenceconstant #1#2{\setvalue{\r!prefix!#1}{#2}}
-\def\definefileconstant      #1#2{\setvalue{\f!prefix!#1}{#2}}
-
-%D A new one:
-
-\def\definetypescriptconstant#1#2{\setvalue{\t!prefix!#1}{#2}}
-
-%D And finaly we have the one argument, space saving constants
-%D
-%D \starttyping
-%D \definesystemconstant  {name}
-%D \definemessageconstant {name}
-%D \stoptyping
-
-\def\definesystemconstant  #1{\setvalue{\s!prefix!#1}{#1}}
-\def\definemessageconstant #1{\setvalue{\m!prefix!#1}{#1}}
-
-%D In a parameter driven system, some parameters are shared
-%D by more system components. In \CONTEXT\ we can distinguish
-%D parameters by a unique prefix. Such a prefix is defined
-%D with:
-%D
-%D \starttyping
-%D \definesystemvariable {name}
-%D \stoptyping
-
-\def\definesystemvariable#1{\setevalue{\??prefix#1}{\@@prefix#1}}
-
-\definesystemvariable{ms}
-
-%D \macros
-%D   {selectinterface,
-%D    defaultinterface, currentinterface, currentresponses}
-%D
-%D With \type{\selectinterface} we specify the language we are
-%D going to use. The system asks for the language wanted, and
-%D defaults to \type{\currentinterface} when we just give
-%D \type{enter}. By default the message system uses the
-%D current interface language, but \type{\currentresponses}
-%D can specify another language too.
-%D
-%D Because we want to generate formats directly too, we do
-%D not ask for interface specifications when these are already
-%D defined (like in cont-nl.tex and alike).
-
-\ifx\undefined\scratchwrite \newwrite\scratchwrite \fi
-\ifx\undefined\scratchread  \newwrite\scratchread  \fi
-
-\immediate\openin\scratchread=mult-def.tex % may overload the defaults
-
-\ifeof\scratchread % no high level commands yet
-  \immediate\closein\scratchread
-\else
-  \immediate\closein\scratchread \input mult-def.tex
-\fi
-
-\ifx\defaultinterface\undefined
-
-  \def\defaultinterface{english}
-
-  \def\selectinterface
-    {\def\docommand##1##2%
-       {\bgroup
-        \endlinechar\minusone
-        \global\read16 to ##1
-        \egroup
-        \doifnothing\currentinterface{\let##1=##2}%
-        \doifundefined{\s!prefix!##1}{\let##1=##2}}%
-     \docommand\currentinterface\defaultinterface
-     \writestatus{interface}{defining \currentinterface\space interface}%
-     \writeline
-     \docommand\currentresponses\currentinterface
-     \writestatus{interface}{using \currentresponses\space messages}%
-     \writeline
-     \let\selectinterface\relax}
-
-\else
-
-  \def\selectinterface
-    {\writestatus{interface}{defining \currentinterface\space interface}%
-     \writeline
-     \writestatus{interface}{using    \currentresponses\space messages}%
-     \writeline
-     \let\selectinterface\relax}
-
-\fi
-
-\ifx\currentinterface\undefined \let\currentinterface=\defaultinterface \fi
-\ifx\currentresponses\undefined \let\currentresponses=\defaultinterface \fi
-
-%D \macros
-%D   {startinterface}
-%D
-%D Sometimes we want to define things only for specific
-%D interface languages. This can be done by means of the
-%D selector:
-%D
-%D \starttyping
-%D \startinterface language
-%D
-%D language specific definitions & commands
-%D
-%D \stopinterface
-%D \stoptyping
-
-\def\startinterface #1
-  {\doifnotinset\currentinterface{#1}{\gobbleuntil\stopinterface}}
-
-\let\stopinterface\relax
-
-%D \macros
-%D   {startmessages,
-%D    getmessage,
-%D    showmessage,
-%D    makemessage}
-%D
-%D A package as large as \CONTEXT\ can hardly function without
-%D a decent message mechanism. Due to its multi||lingual
-%D interface, the message subsystem has to be multi||lingual
-%D too. A major drawback of this feature is that we have to
-%D code messages. As a result, the source becomes less self
-%D documented. On the other hand, consistency will improve.
-%D
-%D Because the overhead in terms of entries in the (already
-%D exhausted) hash table has to be minimal, messages are packed
-%D in libraries. We can extract a message from such a library
-%D in three ways:
-%D
-%D \starttyping
-%D \getmessage  {library} {tag}
-%D \showmessage {library} {tag} {data}
-%D \makemessage {library} {tag} {data}
-%D \stoptyping
-%D
-%D The first command gets the message \type{tag} from the
-%D \type{library} specified. The other commands take an extra
-%D argument: a list of items to be inserted in the message
-%D text. While \type{\showmessage} shows the message at the
-%D terminal, the other commands generate the message as text.
-%D Before we explain the \type{data} argument, we give an
-%D example of a library.
-%D
-%D \starttyping
-%D % messages moved
-%D \stoptyping
-%D
-%D The first message is a simple one and can be shown with:
-%D
-%D \starttyping
-%D \showmessage {alfa} {1} {}
-%D \stoptyping
-%D
-%D The second message on the other hand needs some extra data:
-%D
-%D \starttyping
-%D \showmessage {alfa} {2} {and last,to you}
-%D \stoptyping
-%D
-%D This message is shown as:
-%D
-%D \starttyping
-%D something : second (and last) message to you
-%D \stoptyping
-%D
-%D As we can see, the title entry is shown with the message.
-%D The data fields are comma separated and are specified in the
-%D message text by \type{--}.
-%D
-%D It is not required to define all messages in a library at
-%D once. We can add messages to a library in the following way:
-%D
-%D \starttyping
-%D % messages moved
-%D \stoptyping
-%D
-%D Because such definitions can take place in different
-%D modules, the system gives a warning when a tag occurs more
-%D than once. The first occurrence takes preference over later
-%D ones, so we had better use a save offset, as shown in the
-%D example. As we can see, the title field is specified only
-%D the first time!
-%D
-%D Because we want to check for duplicate tags, the macros
-%D are a bit more complicated than neccessary. The \NEWLINE\
-%D token is used as message separator.
-%D
-%D For internal purposes one can use \type {\setmessagetext},
-%D which puts the message text asked for in \type
-%D {\currentmessagetext}.
-
-\loadmarkfile{mult-ini}
-
-%D \macros
-%D   {ifshowwarnings, ifshowmessages}
-%D
-%D Sometimes displaying message can slow down processing
-%D considerably. We therefore introduce warnings. Users can
-%D turn of warnings and messages by saying:
-%D
-%D \starttyping
-%D \showwarningstrue
-%D \showmessagestrue
-%D \stoptyping
-%D
-%D Turning off messages also turns off warnings, which is
-%D quote logical because they are less important.
-
-% not yet mkiv
-
-\newif\ifshowwarnings \showwarningstrue
-\newif\ifshowmessages \showmessagestrue
-
-\let\normalshowmessage\showmessage
-
-\def\showwarning
-  {\ifshowwarnings
-     \expandafter\showmessage
-   \else
-     \expandafter\gobblethreearguments
-   \fi}
-
-\def\showmessage
-  {\ifshowmessages
-     \expandafter\normalshowmessage
-   \else
-     \expandafter\gobblethreearguments
-   \fi}
-
-%D \macros
-%D   {dosetvalue,dosetevalue,dosetgvalue,dosetxvalue,docopyvalue,doresetvalue} % dogetvalue
-%D
-%D We already defined these auxiliary macros in the system
-%D modules. Starting with this module however, we have to take
-%D multi||linguality a bit more serious.
-%D
-%D First we show a well||defined (simplified) alternative:
-%D
-%D \starttyping
-%D \def\dosetvalue#1#2#3%
-%D   {\doifdefinedelse{\c!prefix!#2}
-%D      {\setvalue{#1\getvalue{\c!prefix!#2}}{#3}}
-%D      {\setvalue{#1#2}{#3}}}
-%D
-%D \def\docopyvalue#1#2#3%
-%D   {\doifdefinedelse{\c!prefix!#3}
-%D      {\setvalue{#1\getvalue{\c!prefix!#3}}%
-%D         {\getvalue{#2\getvalue{\c!prefix!#3}}}}
-%D      {\setvalue{#1#3}%
-%D         {\getvalue{#2#3}}}}
-%D \stoptyping
-%D
-%D These macros are called upon quite often and so we optimized
-%D them a bit.
-%D
-%D \starttyping
-%D \def\dosetvalue#1#2#3%
-%D   {\let\c!internal!\c!internal!n
-%D    \p!doifundefined{\k!prefix!#2}%
-%D      \let\c!internal!\c!internal!y
-%D      \let\donottest\doprocesstest
-%D      \@EA\def\csname#1#2\endcsname{#3}%
-%D    \else
-%D      \let\c!internal!\c!internal!y
-%D      \let\donottest\doprocesstest
-%D      \@EA\def\csname#1\csname\k!prefix!#2\endcsname\endcsname{#3}%
-%D    \fi}
-%D
-%D \def\dosetevalue#1#2#3%
-%D   {\let\c!internal!\c!internal!n
-%D    \p!doifundefined{\k!prefix!#2}%
-%D      \let\c!internal!\c!internal!y
-%D      \let\donottest\doprocesstest
-%D      \@EA\edef\csname#1#2\endcsname{#3}%
-%D    \else
-%D      \let\c!internal!\c!internal!y
-%D      \let\donottest\doprocesstest
-%D      \@EA\edef\csname#1\csname\k!prefix!#2\endcsname\endcsname{#3}%
-%D    \fi}
-%D
-%D \def\dosetgvalue#1#2#3%
-%D   {\let\c!internal!\c!internal!n
-%D    \p!doifundefined{\k!prefix!#2}%
-%D      \let\c!internal!\c!internal!y
-%D      \let\donottest\doprocesstest
-%D      \@EA\gdef\csname#1#2\endcsname{#3}%
-%D    \else
-%D      \let\c!internal!\c!internal!y
-%D      \let\donottest\doprocesstest
-%D      \@EA\gdef\csname#1\csname\k!prefix!#2\endcsname\endcsname{#3}%
-%D    \fi}
-%D
-%D \def\docopyvalue#1#2#3%
-%D   {\let\c!internal!\c!internal!n
-%D    \p!doifundefined{\k!prefix!#3}%
-%D      \let\c!internal!\c!internal!y
-%D      \let\donottest\doprocesstest % still needed ?
-%D      \@EA\def\csname#1#3\endcsname%
-%D        {\csname#2#3\endcsname}%
-%D    \else
-%D      \let\c!internal!\c!internal!y
-%D      \let\donottest\doprocesstest % still needed ?
-%D      \@EA\def\csname#1\csname\k!prefix!#3\endcsname\endcsname%
-%D        {\csname#2\csname\k!prefix!#3\endcsname\endcsname}%
-%D    \fi}
-%D \stoptyping
-
-\def\doresetvalue#1#2%
-  {\dosetvalue{#1}{#2}{}}
-
-\def\doignorevalue#1#2#3%
-  {\dosetvalue{#1}{#2}{}}
-
-% \def\dogetvalue#1#2%
-%   {\csname#1\csname\k!prefix!#2\endcsname\endcsname}
-
-%D Although maybe not clearly visible, there is a
-%D considerable profit in further optimization. By expanding
-%D the embedded \type {\csname} we can reduce the format file
-%D by about 5\% (60~KB out of 1.9~MB).
-%D
-%D \starttyping
-%D \def\docopyvalue#1#2#3%  c -> k
-%D   {\p!doifundefined{\k!prefix!#3}%
-%D      \let\donottest\doprocesstest
-%D      \@EAEAEA\def\@EA
-%D        \csname\@EA#1\@EA#3\@EA
-%D        \endcsname\@EA{\csname#2#3\endcsname}%
-%D    \else
-%D      \let\donottest\doprocesstest
-%D      \@EAEAEA\def\@EA
-%D        \csname\@EA#1\@EA\csname\@EA\k!prefix!\@EA#3\@EA\endcsname\@EA
-%D        \endcsname\@EA{\csname#2\csname\k!prefix!#3\endcsname\endcsname}%
-%D    \fi}
-%D \stoptyping
-%D
-%D The next alternatives are slightly faster.
-
-\def\dosetvalue#1#2%
-  {\let\c!internal!\c!internal!n
-   \ifcsname\k!prefix!#2\endcsname
-     \let\c!internal!\c!internal!y
-     \@EA\def\csname#1\csname\k!prefix!#2\endcsname%\endcsname
-   \else
-     \let\c!internal!\c!internal!y
-     \@EA\def\csname#1#2%\endcsname
-   \fi\endcsname}
-
-\def\dosetevalue#1#2%
-  {\let\c!internal!\c!internal!n
-   \ifcsname\k!prefix!#2\endcsname
-     \let\c!internal!\c!internal!y
-     \@EA\edef\csname#1\csname\k!prefix!#2\endcsname%\endcsname
-   \else
-     \let\c!internal!\c!internal!y
-     \@EA\edef\csname#1#2%\endcsname
-   \fi\endcsname}
-
-\def\dosetgvalue#1#2%
-  {\let\c!internal!\c!internal!n
-   \ifcsname\k!prefix!#2\endcsname
-     \let\c!internal!\c!internal!y
-     \@EA\gdef\csname#1\csname\k!prefix!#2\endcsname%\endcsname
-   \else
-     \let\c!internal!\c!internal!y
-     \@EA\gdef\csname#1#2%\endcsname
-   \fi\endcsname}
-
-\def\dosetxvalue#1#2%
-  {\let\c!internal!\c!internal!n
-   \ifcsname\k!prefix!#2\endcsname
-     \let\c!internal!\c!internal!y
-     \@EA\xdef\csname#1\csname\k!prefix!#2\endcsname%\endcsname
-   \else
-     \let\c!internal!\c!internal!y
-     \@EA\xdef\csname#1#2%\endcsname
-   \fi\endcsname}
-
-\def\docopyvalue#1#2#3% real tricky expansion, quite unreadable
-  {\let\c!internal!\c!internal!n
-   \ifcsname\k!prefix!#3\endcsname
-     \let\c!internal!\c!internal!y
-     \@EA\def\csname#1\csname\k!prefix!#3\endcsname
-       \@EA\endcsname\@EA{\csname#2\csname\k!prefix!#3\endcsname\endcsname}%
-   \else
-     \let\c!internal!\c!internal!y
-     \@EA\def\csname#1#3\@EA\endcsname\@EA{\csname#2#3\endcsname}%
-   \fi}
-
-%D We can now redefine some messages that will be
-%D introduced in the multi||lingual system module.
-
-\def\showassignerror  #1#2{\showmessage\m!check1{#1,#2}\waitonfatalerror}
-\def\showargumenterror#1#2{\showmessage\m!check2{#1,#2}\waitonfatalerror}
-\def\showdefinederror #1#2{\showmessage\m!check3{#1,#2}\waitonfatalerror}
-
-%D \CONTEXT\ is a parameter driven package. This means that
-%D users instruct the system by means of variables, values and
-%D keywords. These instructions take the form:
-%D
-%D \starttyping
-%D \setupsomething[some variable=some value, another one=a keyword]
-%D \stoptyping
-%D
-%D or by keyword only:
-%D
-%D \starttyping
-%D \dosomething[this way,that way,no way]
-%D \stoptyping
-%D
-%D Because the same variables can occur in more than one setup
-%D command, we have to be able to distinguish them. This is
-%D achieved by assigning them a unique prefix.
-%D
-%D Imagine a setup command for boxed text, that enables us to
-%D specify the height and width of the box. Behide the scenes
-%D the command
-%D
-%D \starttyping
-%D \setupbox [width=12cm, height=3cm]
-%D \stoptyping
-%D
-%D results in something like
-%D
-%D \starttyping
-%D \   {12cm}
-%D \  {3cm}
-%D \stoptyping
-%D
-%D while a similar command for specifying the page dimensions
-%D of an \cap{A4} page results in:
-%D
-%D \starttyping
-%D \  {21.0cm}
-%D \ {27.9cm}
-%D \stoptyping
-%D
-%D The prefixes \type{} and \type{} are hidden from
-%D users and can therefore be language independant. Variables
-%D on the other hand, differ for each language:
-%D
-%D \starttyping
-%D \   {}
-%D \   {}
-%D \ {}
-%D \stoptyping
-%D
-%D In this example we can see that the assigned values or
-%D keywords are language dependant too. This will be a
-%D complication when defining multi||lingual setup files.
-%D
-%D A third phenomena is that variables and values can have a
-%D similar meaning.
-%D
-%D \starttyping
-%D \ {}
-%D \           {12cm}
-%D \stoptyping
-%D
-%D A (minor) complication is that where in english we use
-%D \type{}, in dutch we find both \type{} and
-%D \type{}. This means that when we use some sort of
-%D translation table, we have to distinguish between the
-%D variables at the left side and the fixed values at the
-%D right.
-%D
-%D The same goes for commands that are composed of different
-%D user supplied and/or language specific elements. In english
-%D we can use:
-%D
-%D \starttyping
-%D \
-%D \
-%D \stoptyping
-%D
-%D But in dutch we have the following:
-%D
-%D \starttyping
-%D \
-%D \
-%D \stoptyping
-%D
-%D These subtle differences automatically lead to a solution
-%D where variables, values, elements and other components have
-%D a similar logical name (used in macro's) but a different
-%D meaning (supplied by the user).
-%D
-%D Our solution is one in which the whole system is programmed
-%D in terms of identifiers with language specific meanings. In
-%D such an implementation, each fixed variable is available as:
-%D
-%D \starttyping
-%D \
-%D \stoptyping
-%D
-%D This means that for instance:
-%D
-%D \starttyping
-%D \setupbox[width=12cm]
-%D \stoptyping
-%D
-%D expands to something like:
-%D
-%D \starttyping
-%D \def\boxwidth{12cm}
-%D \stoptyping
-%D
-%D because we don't want to recode the source, a setup command
-%D in another language has to expand to this variable, so:
-%D
-%D \starttyping
-%D \setupblock[width=12cm]
-%D \stoptyping
-%D
-%D has to result in the definition of \type{\boxwidth} too.
-%D This method enables us to build compact, fast and readable
-%D code.
-%D
-%D An alternative method, which we considered using, uses a
-%D more indirect way. In this case, both calls generate a
-%D different variable:
-%D
-%D \starttyping
-%D \def\boxwidth   {12cm}
-%D \def\boxbreedte {12cm}
-%D \stoptyping
-%D
-%D And because we don't want to recode those megabytes of
-%D already developed code, this variable has to be called with
-%D something like:
-%D
-%D \starttyping
-%D \valueof\box\width
-%D \stoptyping
-%D
-%D where \type{\valueof} takes care of the translation of
-%D \type{width} or \type{breedte} to \type{width} and
-%D combining this with \type{box} to \type{\boxwidth}.
-%D
-%D One advantage of this other scheme is that, within certain
-%D limits, we can implement an interface that can be switched
-%D to another language at will, while the current approach
-%D fixes the interface at startup. There are, by the way,
-%D other reasons too for not choosing this scheme. Switching
-%D user generated commands is for instance impossible and a
-%D dual interface would therefore give a strange mix of
-%D languages.
-%D
-%D Now let's work out the first scheme. Although the left hand
-%D of the assignment is a variable from the users point of
-%D view, it is a constant in terms of the system. Both
-%D \type{width} and \type{breedte} expand to \type{width}
-%D because in the source we only encounter \type{width}. Such
-%D system constants are presented as
-%D
-%D \starttyping
-%D \c!width
-%D \stoptyping
-%D
-%D This constant is always equivalent to \type{width}. As we
-%D can see, we use \type{c!} to mark this one as constant. Its
-%D dutch counterpart is:
-%D
-%D \starttyping
-%D breedte
-%D \stoptyping
-%D
-%D When we interpret a setup command each variable is
-%D translated to it's \type{c!} counterpart. This means that
-%D \type{breedte} and \type{width} expand to \type{breedte}
-%D and \type{\c!width} which both expand to \type{width}. That
-%D way user variables become system constants.
-%D
-%D The interpretation is done by means of a general setup
-%D command \type{\getparameters} that we introduced in the
-%D system module. Let us define some simple setup command:
-%D
-%D \starttyping
-%D \def\setupbox[#1]%
-%D   {\getparameters[\??bx][#1]}
-%D \stoptyping
-%D
-%D This command can be used as:
-%D
-%D \starttyping
-%D \setupbox [width=3cm, height=1cm]
-%D \stoptyping
-%D
-%D Afterwards we have two variables \type{\@@bxwidth} and
-%D \type{\@@bxheight} which have the values \type{3cm} and
-%D \type{1cm} assigned. These variables are a combinatiom of
-%D the setup prefix \type{\??bx}, which expands to \type{@@bx}
-%D and the translated user supplied variables \type{width} and
-%D  \type{height} or \type{breedte} and \type{hoogte},
-%D depending on the actual language. In dutch we just say:
-%D
-%D \starttyping
-%D \setupblock [width=3cm, height=1cm]
-%D \stoptyping
-%D
-%D and get ourselves \type{\@@bxwidth} and \type{\@@bxheight}
-%D too. In the source of \CONTEXT, we can recognize constants
-%D and variables on their leading \type{c!}, \type{v!} etc.,
-%D prefixes on \type{??} and composed variables on \type{@@}.
-%D
-%D We already saw that user supplied keywords need some
-%D special treatment too. This time we don't translate the
-%D keyword, but instead use in the source a variable which
-%D meaning depends on the interface language.
-%D
-%D \starttyping
-%D \v!left
-%D \stoptyping
-%D
-%D Which can be used in macro's like:
-%D
-%D \starttyping
-%D \processaction
-%D   [\@@bxlocation]
-%D   [  \v!left=>\dosomethingontheleft,
-%D    \v!middle=>\dosomthinginthemiddle,
-%D     \v!right=>\dosomethingontheright]
-%D \stoptyping
-%D
-%D Because variables like \type{\@@bxlocation} can have a lot
-%D of meanings, including tricky expandable tokens, we cannot
-%D translate this meaning when we compare. This means that
-%D \type{\@@bxlocation} can be \type{left} of \type{links} of
-%D whatever meaning suits the language. But because
-%D \type{\v!left} also has a meaning that suits the language,
-%D we are able to compare.
-%D
-%D Although we know it sounds confusing we want to state two
-%D important characteristics of the interface as described:
-%D
-%D \startnarrower \em
-%D user variables become system constants
-%D \stopnarrower
-%D
-%D and
-%D
-%D \startnarrower \em
-%D user constants (keywords) become system variables
-%D \stopnarrower
-%D
-
-%D \macros
-%D   {startconstants,startvariables}
-%D
-%D It's time to introduce the macro's that are responsible for
-%D this translations process, but first we show how constants
-%D and variables are defined. We only show two languages and
-%D a few words.
-%D
-%D \starttyping
-%D \startconstants  english    dutch
-%D
-%D          width:  width      breedte
-%D         height:  height     hoogte
-%D
-%D \stopconstants
-%D \stoptyping
-%D
-%D Keep in mind that what users see as variables, are constants
-%D for the system.
-%D
-%D \starttyping
-%D \startvariables  english    dutch
-%D
-%D       location:  left       links
-%D           text:  text       tekst
-%D
-%D \stopvariables
-%D \stoptyping
-%D
-%D The macro's responsible for interpreting these setups are
-%D shared. They take care of empty lines and permit a more or
-%D less free format. All setups accept the keyword \type{all}
-%D which equals every language.
-
-%D The next few macros come into action when we generate
-%D interface log files:
-
-\newif\iflogginginterface
-
-\def\flushinterfaceelementline
-  {\iflogginginterface
-     \immediate\write\scratchwrite{\interfaceelementline}%
-     \let\interfaceelementline\empty
-   \fi}
-
-\def\saveinterfaceelementline#1%
-  {\iflogginginterface
-     \edef\interfaceelementline{\interfaceelementline#1\space}%
-   \fi}
-
-\def\startlogginginterface #1 %
-  {\logginginterfacetrue
-   \let\interfaceelementline\empty
-   \immediate\openout\scratchwrite=./#1\relax}
-
-\def\stoplogginginterface
-  {\flushinterfaceelementline
-   \immediate\closeout\scratchwrite
-   \logginginterfacefalse}
-
-%D By default we don't log at all.
-
-\def\startlogginginterface #1 {}
-\def\stoplogginginterface     {}
-
-%D These logging commands are used in the next macros.
-
-\def\nointerfaceobject{-}
-
-\def\startinterfaceobjects#1#2%
-  {\!!counta\plusone
-   \let\dogetinterfaceobject\dogetinterfacetemplate
-   \let\dowithinterfaceelement#1%
-   \def\dodogetinterfaceobjects
-      {\ifx\next#2%
-         \flushinterfaceelementline
-         \flushinterfaceelementline
-         \def\next####1{#2}% was: \let\next\gobbleoneargument
-       \else\ifx\next\par
-         \long\def\next####1{\dogetinterfaceobjects}%
-       \else\ifx\next\empty
-         \def\next####1{\dogetinterfaceobjects}%
-       \else
-         \def\next####1 {\dogetinterfaceobject[####1:\relax]\dogetinterfaceobjects}%
-       \fi\fi\fi
-       \next}%
-   \def\dogetinterfaceobjects{\futurelet\next\dodogetinterfaceobjects}%
-   \dogetinterfaceobjects}
-
-\def\dogetinterfacetemplate[#1:#2]%
-  {\saveinterfaceelementline{#1}%
-   \doifinsetelse{#1}{\currentinterface,all}
-     {\let\dogetinterfaceobject\doskipinterfaceobject}
-     {\advance\!!counta\plusone}}
-
-\def\doskipinterfaceobject[#1:#2#3]%
-  {\if#2:%
-     \let\dogetinterfaceobject\dogetinterfaceelement
-     \dogetinterfaceobject[#1:#2#3]%
-   \else
-     \saveinterfaceelementline{#1}%
-   \fi}
-
-\let\interfaceelementline\empty
-
-\def\dogetinterfaceelement[#1:#2#3]%
-  {\ifx#2:%
-     \!!countb\zerocount
-     \def\!!stringa{#1}%
-     \flushinterfaceelementline
-   \else
-     \advance\!!countb\plusone
-     \saveinterfaceelementline{#1}%
-     \ifnum\!!countb=\!!counta
-       \@EA\dowithinterfaceelement\@EA{\!!stringa}{#1}%
-       \let\dogetinterfaceobject\doskipinterfaceobject
-     \fi
-   \fi}
-
-%D The constants and variables are defined as described. When
-%D \type {\interfacetranslation} is \type{true}, we also
-%D generate a reverse translation. Because we don't want to put
-%D too big a burden on \TEX's hash table, this is no default
-%D behavior. Reverse translation is used in the commands that
-%D generate the quick reference cards. We are going to define
-%D the real \CONTEXT\ commands in an abstract way and generate
-%D those reference cards for each language without further
-%D interference. (Part of this (the translation stuff) is gone
-%D now that we've moved to \XML\ completely and have separate
-%D key mapping files.
-
-%D Anno 2003 I've forgotten why the \type {\c!internal} is
-%D still in there; it's probably a left over from an experiment.
-
-%D Once we're gone XML we can drop some of the extra mappings.
-
-\let\c!internal!y \string
-\def\c!internal!n {-}
-\let\c!internal!  \c!internal!y
-
-% temporary mkiv hack
-
-\ifx\dowithinterfaceconstant\undefined \let\dowithinterfaceconstant\gobbletwoarguments \fi
-\ifx\dowithinterfacevariable\undefined \let\dowithinterfacevariable\gobbletwoarguments \fi
-
-\def\setinterfaceconstant#1#2%
-  {\dowithinterfaceconstant{#1}{#2}%
-   \setvalue{\c!prefix!#1}{\c!internal!#1}%
-   \doifelse{#2}\nointerfaceobject % ?
-     {\debuggerinfo{constant}{#1 defined as #1 by default}}%
-     {\debuggerinfo{constant}{#1 defined as #2}%
-      \checksetvalue{\k!prefix!#2}{#1}%
-      \setvalue{\k!prefix!#2}{#1}}}
-
-\def\setinterfacevariable#1#2%
-  {\dowithinterfacevariable{#1}{#2}%
-   \doifelse{#2}\nointerfaceobject
-     {\debuggerinfo{variable}{#1 defined as #1 by default}%
-      \checksetvalue{\v!prefix!#1}{#1}%
-      \setvalue{\v!prefix!#1}{#1}}
-     {\debuggerinfo{variable}{#1 defined as #2}%
-      \checksetvalue{\v!prefix!#1}{#2}%
-      \setvalue{\v!prefix!#1}{#2}}}
-
-\def\checksetvalue#1#2%
-  {\doifdefined{#1}{\doifvaluesomething{#1}{\doifnotvalue{#1}{#2}
-     {\writestatus{problems}{set #1 to #2 overloads \getvalue{#1}}}}}}
-
-\def\startvariables{\startinterfaceobjects\setinterfacevariable\stopvariables}
-\def\startconstants{\startinterfaceobjects\setinterfaceconstant\stopconstants}
-
-\let\stopvariables\relax
-\let\stopconstants\relax
-
-%D \macros
-%D   {defineinterfaceconstant}
-%D
-%D Next we redefine a previously defined macro to take care of
-%D interface translation too. It's a bit redundant, because
-%D in these situations we could use the c||version, but for
-%D documentation purposes the x||alternative comes in handy.
-
-\def\defineinterfaceconstant#1#2%
-  {\setvalue{\c!prefix!#1}{#2}}
-
-%D \macros
-%D   {startelements}
-%D
-%D Due to the object oriented nature of \CONTEXT, we also need
-%D to define the elements that are used to build commands:
-%D
-%D \starttyping
-%D \startelements  english     dutch
-%D
-%D      beginvan:  begin       beginvan
-%D       eindvan:  end         eindvan
-%D         start:  start       start
-%D          stop:  stop        stop
-%D
-%D \stopelements
-%D \stoptyping
-%D
-%D Such elements sometimes are the same in diferent
-%D languages, but mostly they differ. Things can get even
-%D confusing when we look at for instance the setup commands.
-%D In english we say \type{\setup}, but in dutch we
-%D have: \type{\stelin}. Such split elements are no
-%D problem, because we just define two elements. When no second
-%D  part is needed, we use a \type{-}:
-%D
-%D \starttyping
-%D \startelements  english     dutch
-%D
-%D        setupa:  setup       stel
-%D        setupb:  -           in
-%D
-%D \stopelements
-%D \stoptyping
-%D
-%D Element translation is realized by means of:
-
-\def\setinterfaceelement#1#2%
-  {\doifelse{#2}\nointerfaceobject
-     {\debuggerinfo{element}{#1 defined as }%
-      \resetvalue{\e!prefix!#1}}
-     {\doifdefinedelse{\e!prefix!#1}
-       {\doifnotvalue{\e!prefix!#1}{#2}
-          {\debuggerinfo{element}{#1 redefined as #2}%
-           \setvalue{\e!prefix!#1}{#2}}}
-       {\debuggerinfo{element}{#1 defined as #2}%
-        \setvalue{\e!prefix!#1}{#2}}}}
-
-\def\startelements{\startinterfaceobjects\setinterfaceelement\stopelements}
-
-\let\stopelements\relax
-
-%D \macros
-%D   {startcommands}
-%D
-%D The last setup has to do with the commands themselve.
-%D Commands are defined as:
-%D
-%D \starttyping
-%D \startcommands  english     dutch
-%D
-%D    starttekst:  starttext   starttekst
-%D     stoptekst:  stoptext    stoptekst
-%D       omlijnd:  framed      omlijnd
-%D    margewoord:  marginword  margewoord
-%D
-%D \stopcommands
-%D \stoptyping
-
-\def\setinterfacecommand#1#2%
-  {\doifelse{#2}\nointerfaceobject
-     {\debuggerinfo{command}{no link to #1}}
-     {\doifelse{#1}{#2}
-        {\debuggerinfo{command}{#1 remains #1}}
-        {\doifdefinedelse{#2}
-           {\debuggerinfo{command}{core command #2 redefined as #1}}%
-           {\debuggerinfo{command}{#2 defined as #1}}%
-        \@EA\def\csname#2\@EA\endcsname\@EA{\csname#1\endcsname}}}}
-
-\def\startcommands{\startinterfaceobjects\setinterfacecommand\stopcommands}
-
-\let\stopcommands\relax
-
-%D \macros
-%D   {interfaced}
-%D
-%D The setup commands translate the constants automatically.
-%D When we want to translate 'by hand' we can use the simple
-%D but effective command:
-%D
-%D \starttyping
-%D \interfaced {something}
-%D \stoptyping
-%D
-%D Giving \type{\interfaced{breedte}} results in \type{width}
-%D or, when not defined, in \type{breedte} itself. This
-%D macro is used in the font switching mechanism.
-
-\def\interfaced#1%
-  {\ifcsname\k!prefix!#1\endcsname
-     \csname\k!prefix!#1\endcsname
-   \else
-     #1%
-   \fi}
-
-%D So much for the basic multi||lingual interface commands. The
-%D macro's can be enhanced with more testing facilities, but
-%D for the moment they suffice.
-
-%D Out of convenience we define the banners here.
-
-\def\contextbanner
-  {ConTeXt \space
-   ver: \contextversion \space \contextmark \space \space
-   fmt: \formatversion \space \space
-   int: \currentinterface/\currentresponses}
-
-\def\showcontextbanner
-  {\writeline\writebanner{\contextbanner}\writeline}
-
-\edef\formatversion
-  {\the\normalyear.\the\normalmonth.\the\normalday}
-
-\ifx\contextversion\undefined
-    \def\contextversion      {unknown}
-    \def\contextversionnumber{0}
-\else
-    \def\contextversionnumber#1.#2.#3 #4:#5\relax{#1\ifnum#2<10 0\fi#2\ifnum#3<10 0\fi#3 #4:#5}
-    \edef\contextversionnumber{\expandafter\contextversionnumber\contextversion\relax\space\contextmark}
-\fi
-
-\ifx\undefined\everydump
-  \newtoks\everydump
-  \def\dump{\the\everydump\normaldump}
-\fi
-
-\appendtoks \showcontextbanner \to \everydump
-
-\protect \endinput
diff --git a/tex/context/base/mult-ini.lua b/tex/context/base/mult-ini.lua
index 1eee9a656..06707adf8 100644
--- a/tex/context/base/mult-ini.lua
+++ b/tex/context/base/mult-ini.lua
@@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['mult-ini'] = {
     license   = "see context related readme files"
 }
 
-local format, gmatch = string.format, string.gmatch
+local format, gmatch, gsub = string.format, string.gmatch, string.gsub
 
 interfaces           = interfaces           or { }
 interfaces.messages  = interfaces.messages  or { }
@@ -17,32 +17,34 @@ storage.register("interfaces/messages",  interfaces.messages,  "interfaces.messa
 storage.register("interfaces/constants", interfaces.constants, "interfaces.constants")
 storage.register("interfaces/variables", interfaces.variables, "interfaces.variables")
 
+local messages, constants, variables = interfaces.messages, interfaces.constants, interfaces.variables
+
 function interfaces.setmessages(category,str)
-    local m = interfaces.messages[category] or { }
+    local m = messages[category] or { }
     for k, v in gmatch(str,"(%S+) *: *(.-) *[\n\r]") do
-        m[k] = v:gsub("%-%-","%%s")
+        m[k] = gsub(v,"%-%-","%%s")
     end
-    interfaces.messages[category] = m
+    messages[category] = m
 end
 
 function interfaces.setmessage(category,tag,message)
-    local m = interfaces.messages[category]
+    local m = messages[category]
     if not m then
         m = { }
-        interfaces.messages[category] = m
+        messages[category] = m
     end
     m[tag] = message:gsub("%-%-","%%s")
 end
 
 function interfaces.getmessage(category,tag)
-    local m = interfaces.messages[category]
+    local m = messages[category]
     return (m and m[tag]) or "unknown message"
 end
 
 local messagesplitter = lpeg.splitat(",")
 
 function interfaces.makemessage(category,tag,arguments)
-    local m = interfaces.messages[category]
+    local m = messages[category]
     m = (m and m[tag] ) or format("unknown message, category '%s', tag '%s'",category,tag)
     if not m then
         return m .. " " .. tag
@@ -54,14 +56,15 @@ function interfaces.makemessage(category,tag,arguments)
 end
 
 function interfaces.showmessage(category,tag,arguments)
-    local m = interfaces.messages[category]
+    local m = messages[category]
     commands.writestatus((m and m.title) or "unknown title",interfaces.makemessage(category,tag,arguments))
 end
 
 function interfaces.setvariable(variable,given)
-    interfaces.variables[given] = variable
+--~     variables[given] = variable
+    variables[variable] = given
 end
 
 function interfaces.setconstant(constant,given)
-    interfaces.constants[given] = constant
+    constants[given] = constant
 end
diff --git a/tex/context/base/mult-ini.mkiv b/tex/context/base/mult-ini.mkiv
index 2d1e2cc0e..5033a5233 100644
--- a/tex/context/base/mult-ini.mkiv
+++ b/tex/context/base/mult-ini.mkiv
@@ -86,6 +86,9 @@
 \def\s!complex {complex}      \def\s!start   {start}
 \def\s!simple  {simple}       \def\s!stop    {stop}
 
+\def\s!true    {true}
+\def\s!false   {false}
+
 %D The word \type{height} takes 6~token memory cells. The
 %D control sequence \type{\height} on the other hand uses only
 %D one. Knowing this, we can improve the performance of \TEX,
diff --git a/tex/context/base/mult-it.tex b/tex/context/base/mult-it.tex
index f5d009b32..530a49152 100644
--- a/tex/context/base/mult-it.tex
+++ b/tex/context/base/mult-it.tex
@@ -233,6 +233,7 @@
 \setinterfacevariable{lastpage}{ultimapagina}
 \setinterfacevariable{lastpagenumber}{lastpagenumber}
 \setinterfacevariable{lastsubpage}{ultimasottopagina}
+\setinterfacevariable{layer}{layer}
 \setinterfacevariable{left}{sinistra}
 \setinterfacevariable{leftedge}{bordosinistro}
 \setinterfacevariable{lefthanging}{lefthanging}
@@ -843,6 +844,7 @@
 \setinterfaceconstant{sectionconversion}{sectionconversion}
 \setinterfaceconstant{sectionconversionset}{sectionconversionset}
 \setinterfaceconstant{sectionnumber}{numerosezione}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
 \setinterfaceconstant{sectionsegments}{sectionsegments}
 \setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
 \setinterfaceconstant{sectionset}{sectionset}
diff --git a/tex/context/base/mult-nl.tex b/tex/context/base/mult-nl.tex
index d84512ae7..492220961 100644
--- a/tex/context/base/mult-nl.tex
+++ b/tex/context/base/mult-nl.tex
@@ -233,6 +233,7 @@
 \setinterfacevariable{lastpage}{laatstepagina}
 \setinterfacevariable{lastpagenumber}{laatstepaginanummer}
 \setinterfacevariable{lastsubpage}{laatstesubpagina}
+\setinterfacevariable{layer}{layer}
 \setinterfacevariable{left}{links}
 \setinterfacevariable{leftedge}{linkerrand}
 \setinterfacevariable{lefthanging}{linkshangend}
@@ -843,6 +844,7 @@
 \setinterfaceconstant{sectionconversion}{sectionconversion}
 \setinterfaceconstant{sectionconversionset}{sectionconversionset}
 \setinterfaceconstant{sectionnumber}{sectienummer}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
 \setinterfaceconstant{sectionsegments}{sectionsegments}
 \setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
 \setinterfaceconstant{sectionset}{sectionset}
diff --git a/tex/context/base/mult-ro.tex b/tex/context/base/mult-ro.tex
index bcb4d5256..ece67fead 100644
--- a/tex/context/base/mult-ro.tex
+++ b/tex/context/base/mult-ro.tex
@@ -233,6 +233,7 @@
 \setinterfacevariable{lastpage}{ultimapagina}
 \setinterfacevariable{lastpagenumber}{lastpagenumber}
 \setinterfacevariable{lastsubpage}{ultimasubpagina}
+\setinterfacevariable{layer}{layer}
 \setinterfacevariable{left}{stanga}
 \setinterfacevariable{leftedge}{bordurastanga}
 \setinterfacevariable{lefthanging}{lefthanging}
@@ -843,6 +844,7 @@
 \setinterfaceconstant{sectionconversion}{sectionconversion}
 \setinterfaceconstant{sectionconversionset}{sectionconversionset}
 \setinterfaceconstant{sectionnumber}{numarsectiune}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
 \setinterfaceconstant{sectionsegments}{sectionsegments}
 \setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
 \setinterfaceconstant{sectionset}{sectionset}
diff --git a/tex/context/base/mult-sys.tex b/tex/context/base/mult-sys.tex
index b24c11d58..e5f9f1c1a 100644
--- a/tex/context/base/mult-sys.tex
+++ b/tex/context/base/mult-sys.tex
@@ -99,6 +99,7 @@
 \definemessageconstant {encodings}
 \definemessageconstant {regimes}
 \definemessageconstant {figures}
+\definemessageconstant {fields}
 \definemessageconstant {files}
 \definemessageconstant {floatblocks}
 \definemessageconstant {fonts}
@@ -383,11 +384,13 @@
 % vervallen : hd hr hm vt vr vm tr tn te br bm bo on om or
 
 \definesystemvariable {ab}   % AlignedBoxes
+\definesystemvariable {ac}   % ACcent
 \definesystemvariable {ag}   % AchterGrond
 \definesystemvariable {al}   % ALinea's
 \definesystemvariable {am}   % interActieMenu
 \definesystemvariable {an}   % ANchor
 \definesystemvariable {as}   % AlignmentSwitch
+\definesystemvariable {at}   % ATtachments
 \definesystemvariable {ba}   % synchronisatieBAlk
 \definesystemvariable {be}   % startstop (BeginEnd)
 \definesystemvariable {bj}   % BlokJe
@@ -501,7 +504,9 @@
 \definesystemvariable {mb}   % MargeBlokken
 \definesystemvariable {md}   % MoDule
 \definesystemvariable {mg}   % Metapost paGe
+\definesystemvariable {mh}   % MultilingualHead
 \definesystemvariable {mk}   % MarKering
+\definesystemvariable {ml}   % MultilingualLabel
 \definesystemvariable {mt}   % inline MaTh
 \definesystemvariable {mo}   % Math Options
 \definesystemvariable {mp}   % MetaPost
@@ -686,7 +691,7 @@
 \definefileconstant {filfilename} {cont-fil}
 \definefileconstant {modfilename} {cont-mod}
 
-%D Handy for typescripts:
+%D Handy for typescripts (we could use s! instead:
 
 \definetypescriptconstant {name}    {name}
 \definetypescriptconstant {default} {default}
@@ -797,31 +802,6 @@
 
 \selectinterface
 
-%D And only after this selection is done, we can define
-%D messages, otherwise the default language is in use.
-
-% \ifinterfacetranslation \else % interfacetranslation is obsolete
-
-% messages moved
-
-% messages moved
-
-% 1: to be adapted
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% \fi
-
 %D Ok, here are some more, because we've got ouselves some
 %D extensions to \CONTEXT.
 
diff --git a/tex/context/base/node-dum.lua b/tex/context/base/node-dum.lua
index 274e0cdd6..b210d0adb 100644
--- a/tex/context/base/node-dum.lua
+++ b/tex/context/base/node-dum.lua
@@ -9,16 +9,16 @@ if not modules then modules = { } end modules ['node-dum'] = {
 nodes = nodes or { }
 
 function nodes.simple_font_dummy(head,tail)
-    return tail
+    -- ligaturing, kerning
+    return head, tail
 end
 
 function nodes.simple_font_handler(head)
-    local tail = node.slide(head)
---  lang.hyphenate(head,tail)
-    head = nodes.process_characters(head,tail)
+--  lang.hyphenate(head)
+    head = nodes.process_characters(head)
     nodes.inject_kerns(head)
     nodes.protect_glyphs(head)
-    tail = node.ligaturing(head,tail)
-    tail = node.kerning(head,tail)
+    head = node.ligaturing(head)
+    head = node.kerning(head)
     return head
 end
diff --git a/tex/context/base/node-fin.lua b/tex/context/base/node-fin.lua
index 3810b7a85..a801e9acb 100644
--- a/tex/context/base/node-fin.lua
+++ b/tex/context/base/node-fin.lua
@@ -41,31 +41,32 @@ function states.disabletriggering()
     triggering = false
 end
 
+-- the following code is no longer needed due to the new backend
+-- but we keep it around for a while as an example
 --
-
-states.collected = states.collected or { }
-
-storage.register("states/collected", states.collected, "states.collected")
-
-local collected = states.collected
-
-function states.collect(str)
-    collected[#collected+1] = str
-end
-
-function states.flush()
-    if #collected > 0 then
-        for i=1,#collected do
-            texsprint(ctxcatcodes,collected[i]) -- we're in context mode anyway
-        end
-        collected = { }
-        states.collected = collected
-    end
-end
-
-function states.check()
-    texio.write_nl(concat(collected,"\n"))
-end
+-- states.collected = states.collected or { }
+--
+-- storage.register("states/collected", states.collected, "states.collected")
+--
+-- local collected = states.collected
+--
+-- function states.collect(str)
+--     collected[#collected+1] = str
+-- end
+--
+-- function states.flush()
+--     if #collected > 0 then
+--         for i=1,#collected do
+--             texsprint(ctxcatcodes,collected[i]) -- we're in context mode anyway
+--         end
+--         collected = { }
+--         states.collected = collected
+--     end
+-- end
+--
+-- function states.check()
+--     texio.write_nl(concat(collected,"\n"))
+-- end
 
 -- we used to do the main processor loop here and call processor for each node
 -- but eventually this was too much a slow down (1 sec on 23 for 120 pages mk)
@@ -82,7 +83,7 @@ local function process_attribute(head,plugin) -- head,attribute,enabled,initiali
         if processor then
             local initializer = plugin.initializer
             local resolver    = plugin.resolver
-            local inheritance = (resolver and resolver()) or -0x7FFFFFFF -- we can best use nil and skip !
+            local inheritance = (resolver and resolver()) or nil -- -0x7FFFFFFF -- we can best use nil and skip !
             if initializer then
                 initializer(namespace,attribute,head)
             end
@@ -94,8 +95,7 @@ local function process_attribute(head,plugin) -- head,attribute,enabled,initiali
                     if used then
                         local flusher = plugin.flusher
                         if flusher then
-                            local h, d = flusher(namespace,attribute,head,used)
-                            head = h
+                            head = flusher(namespace,attribute,head,used)
                         end
                     end
                 end
@@ -115,76 +115,54 @@ function nodes.install_attribute_handler(plugin)
     end
 end
 
--- a few handlers
+-- the injectors
 
-local current, current_selector, used, done = 0, 0, { }, false
+local insert_node_before = node.insert_before
+local insert_node_after  = node.insert_after
 
-local function insert(n,stack,previous,head) -- there is a helper, we need previous because we are not slided
-    if n then
-        if type(n) == "function" then
-            n = n()
-        end
-        if n then
-            n = copy_node(n)
-            n.next = stack
-            if previous then
-                previous.next = n
-            else
-                head = n
-            end
-            previous = n -- ?
-        else
-            -- weird
-        end
-    end
-    return stack, head
-end
+local nsdata, nsdone, nsforced, nsselector, nstrigger
+local current, current_selector, done = 0, 0, false -- nb, stack has a local current !
 
-function states.initialize(what, attribute, stack)
-    current, current_selector, used, done = 0, 0, { }, false
+function states.initialize(namespace,attribute,head)
+    nsdata, nsnone = namespace.data, namespace.none
+    nsforced, nsselector = namespace.forced, namespace.selector
+    nstrigger = triggering and namespace.triggering and trigger
+    current, current_selector, done = 0, 0, false -- todo: done cleanup
 end
 
 function states.finalize(namespace,attribute,head) -- is this one ok?
-    if current > 0 then
-        local nn = namespace.none
-        if nn then
-            local id = head.id
-            if id == hlist or id == vlist then
-                local list = head.list
-                if list then
-                    local _, h = insert(nn,list,nil,list)
-                    head.list = h
-                end
-            else
-                stack, head = insert(nn,head,nil,head)
+    if current > 0 and nsnone then
+        local id = head.id
+        if id == hlist or id == vlist then
+            local list = head.list
+            if list then
+                head.list = insert_node_before(list,list,copy_node(nsnone))
             end
-            return head, true, true
+        else
+            head = insert_node_before(head,head,copy_node(nsnone))
         end
+        return head, true, true
     end
     return head, false, false
 end
 
 local function process(namespace,attribute,head,inheritance,default) -- one attribute
-    local trigger = triggering and namespace.triggering and trigger
-    local stack, previous, done = head, nil, false
-    local nsdata, nsreviver, nsnone = namespace.data, namespace.reviver, namespace.none
+    local stack, done = head, false
     while stack do
         local id = stack.id
         -- we need to deal with literals too (reset as well as oval)
---~             if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
+        -- if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
         if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
             local c = has_attribute(stack,attribute)
             if c then
                 if default and c == inheritance then
                     if current ~= default then
-                        local data = nsdata[default] or nsreviver(default)
-                        stack, head = insert(data,stack,previous,head)
-                        current, done, used[default] = default, true, true
+                        head = insert_node_before(head,stack,copy_node(nsdata[default]))
+                        current, done = default, true
                     end
                 elseif current ~= c then
-                    local data = nsdata[c] or nsreviver(c)
-                    stack, head = insert(data,stack,previous,head)
-                    current, done, used[c] = c, true, true
+                    head = insert_node_before(head,stack,copy_node(nsdata[c]))
+                    current, done = c, true
                 end
                 -- here ? compare selective
                 if id == glue then --leader
@@ -200,7 +178,7 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr
                             current = 0
                         end
                         local ok = false
-                        if trigger and has_attribute(stack,trigger) then
+                        if nstrigger and has_attribute(stack,nstrigger) then
                             local outer = has_attribute(stack,attribute)
                             if outer ~= inheritance then
                                 stack.leader, ok = process(namespace,attribute,content,inheritance,outer)
@@ -216,19 +194,18 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr
                 end
             elseif default and inheritance then
                 if current ~= default then
-                    local data = nsdata[default] or nsreviver(default)
-                    stack, head = insert(data,stack,previous,head)
-                    current, done, used[default] = default, true, true
+                    head = insert_node_before(head,stack,copy_node(nsdata[default]))
+                    current, done = default, true
                 end
             elseif current > 0 then
-                stack, head = insert(nsnone,stack,previous,head)
-                current, done, used[0] = 0, true, true
+                head = insert_node_before(head,stack,copy_node(nsnone))
+                current, done = 0, true
             end
         elseif id == hlist or id == vlist then
             local content = stack.list
             if content then
                 local ok = false
-                if trigger and has_attribute(stack,trigger) then
+                if nstrigger and has_attribute(stack,nstrigger) then
                     local outer = has_attribute(stack,attribute)
                     if outer ~= inheritance then
                         stack.list, ok = process(namespace,attribute,content,inheritance,outer)
@@ -241,15 +218,8 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr
                 done = done or ok
             end
         end
-        previous = stack
         stack = stack.next
     end
-    -- we need to play safe
--- i need a proper test set for this, maybe controlled per feature
---~         if current > 0 then
---~             stack, head = insert(nsnone,stack,previous,head)
---~             current, current_selector, done, used[0] = 0, 0, true, true
---~         end
     return head, done
 end
 
@@ -262,40 +232,37 @@ states.process = process
 -- each other with the same color but different color spaces e.g. \showcolor)
 
 local function selective(namespace,attribute,head,inheritance,default) -- two attributes
-    local trigger = triggering and namespace.triggering and trigger
-    local stack, previous, done = head, nil, false
-    local nsforced, nsselector = namespace.forced, namespace.selector
-    local nsdata, nsreviver, nsnone = namespace.data, namespace.reviver, namespace.none
+    local stack, done = head, false
     while stack do
         local id = stack.id
         -- we need to deal with literals too (reset as well as oval)
---~             if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
+        -- if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
         if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
             local c = has_attribute(stack,attribute)
             if c then
                 if default and c == inheritance then
                     if current ~= default then
-                        local data = nsdata[default] or nsreviver(default)
-                        stack, head = insert(data[nsforced or has_attribute(stack,nsselector) or nsselector],stack,previous,head)
-                        current, done, used[default] = default, true, true
+                        local data = nsdata[default]
+                        head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector]))
+                        current, done = default, true
                     end
                 else
                     local s = has_attribute(stack,nsselector)
                     if current ~= c or current_selector ~= s then
-                        local data = nsdata[c] or nsreviver(c)
-                        stack, head = insert(data[nsforced or has_attribute(stack,nsselector) or nsselector],stack,previous,head)
-                        current, current_selector, done, used[c] = c, s, true, true
+                        local data = nsdata[c]
+                        head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector]))
+                        current, current_selector, done = c, s, true
                     end
                 end
             elseif default and inheritance then
                 if current ~= default then
-                    local data = nsdata[default] or nsreviver(default)
-                    stack, head = insert(data[nsforced or has_attribute(stack,nsselector) or nsselector],stack,previous,head)
-                    current, done, used[default] = default, true, true
+                    local data = nsdata[default]
+                    head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector]))
+                    current, done = default, true
                 end
             elseif current > 0 then
-                stack, head = insert(nsnone,stack,previous,head)
-                current, current_selector, done, used[0] = 0, 0, true, true
+                head = insert_node_before(head,stack,copy_node(nsnone))
+                current, current_selector, done = 0, 0, true
             end
             if id == glue then -- leader
                 -- same as *list
@@ -310,7 +277,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at
                         current = 0
                     end
                     local ok = false
-                    if trigger and has_attribute(stack,trigger) then
+                    if nstrigger and has_attribute(stack,nstrigger) then
                         local outer = has_attribute(stack,attribute)
                         if outer ~= inheritance then
                             stack.leader, ok = selective(namespace,attribute,content,inheritance,outer)
@@ -328,7 +295,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at
             local content = stack.list
             if content then
                 local ok = false
-                if trigger and has_attribute(stack,trigger) then
+                if nstrigger and has_attribute(stack,nstrigger) then
                     local outer = has_attribute(stack,attribute)
                     if outer ~= inheritance then
                         stack.list, ok = selective(namespace,attribute,content,inheritance,outer)
@@ -341,21 +308,75 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at
                 done = done or ok
             end
         end
-        previous = stack
         stack = stack.next
     end
-    -- we need to play safe, this is subptimal since now we end each box
-    -- even if it's not needed
--- i need a proper test set for this, maybe controlled per feature
---~         if current > 0 then
---~             stack, head = insert(nsnone,stack,previous,head)
---~             current, current_selector, done, used[0] = 0, 0, true, true
---~         end
     return head, done
 end
 
 states.selective = selective
 
+-- todo: each line now gets the (e.g. layer) property, hard to avoid (and not needed too)
+
+local function stacked(namespace,attribute,head,default) -- no triggering, no inheritance, but list-wise
+    local stack, done = head, false
+--~     local current, depth = 0, 0
+local current, depth = default or 0, 0
+    while stack do
+        local id = stack.id
+        if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
+            local c = has_attribute(stack,attribute)
+            if c then
+                if current ~= c then
+                    head = insert_node_before(head,stack,copy_node(nsdata[c]))
+                    depth = depth + 1
+                    current, done = c, true
+                end
+                if id == glue then
+                    local content = stack.leader
+                    if content then -- unchecked
+                        local ok = false
+                        stack.leader, ok = stacked(namespace,attribute,content,current)
+                        done = done or ok
+                    end
+                end
+            elseif default then
+                --
+            elseif current > 0 then
+                head = insert_node_before(head,stack,copy_node(nsnone))
+                depth = depth - 1
+                current, done = 0, true
+            end
+        elseif id == hlist or id == vlist then
+            local content = stack.list
+            if content then
+                local c = has_attribute(stack,attribute)
+                if c and current ~= c then
+                    local p = current
+                    current, done = c, true
+                    head = insert_node_before(head,stack,copy_node(nsdata[c]))
+                    stack.list = stacked(namespace,attribute,content,current)
+                    head, stack = insert_node_after(head,stack,copy_node(nsnone))
+                    current = p
+                else
+                    local ok = false
+                    stack.list, ok = stacked(namespace,attribute,content,current)
+                    done = done or ok
+                end
+            end
+        end
+        stack = stack.next
+    end
+    while depth > 0 do
+        head = insert_node_after(head,stack,copy_node(nsnone))
+        depth = depth -1
+    end
+    return head, done
+end
+
+states.stacked = stacked
+
+-- -- --
+
 statistics.register("attribute processing time", function()
     if statistics.elapsedindeed(attributes) then
         return format("%s seconds",statistics.elapsedtime(attributes))
diff --git a/tex/context/base/node-fin.mkiv b/tex/context/base/node-fin.mkiv
index 787706ff2..8c15eb57d 100644
--- a/tex/context/base/node-fin.mkiv
+++ b/tex/context/base/node-fin.mkiv
@@ -22,14 +22,8 @@
 
 \definesystemattribute[trigger] % feature inheritance
 
-\newbox\finalizedshipoutbox
-
-\def\finalizeobjectbox#1{\ctxlua{nodes.process_page(tex.box[\number#1])}}
-
-\def\finalizeshipoutbox#1% % hack till we have access to pdf backend
-  {\global\setbox\finalizedshipoutbox\hbox{#1}%
-   \finalizeobjectbox\finalizedshipoutbox
-   \hbox{\ctxlua{states.flush()}\box\finalizedshipoutbox}}
+\def\finalizeobjectbox #1{\ctxlua{nodes.process_page(tex.box[\number#1])}}
+\def\finalizeshipoutbox#1{\ctxlua{nodes.process_page(tex.box[\number#1])}}
 
 % tricky stuff:
 
diff --git a/tex/context/base/node-ini.lua b/tex/context/base/node-ini.lua
index 8185e3033..3ff73c62f 100644
--- a/tex/context/base/node-ini.lua
+++ b/tex/context/base/node-ini.lua
@@ -110,7 +110,6 @@ local whatsit = node.id('whatsit')
 
 local traverse_id = node.traverse_id
 local traverse    = node.traverse
-local slide_nodes = node.slide
 local free_node   = node.free
 local remove_node = node.remove
 
@@ -132,10 +131,10 @@ function nodes.delete(head,current)
     return nodes.remove(head,current,true)
 end
 
-nodes.before = node.insert_before -- broken
+nodes.before = node.insert_before
 nodes.after  = node.insert_after
 
--- we need to test this, as it might be fixed
+-- we need to test this, as it might be fixed now
 
 function nodes.before(h,c,n)
     if c then
diff --git a/tex/context/base/node-inj.lua b/tex/context/base/node-inj.lua
index 2e8b5ae81..dc676a412 100644
--- a/tex/context/base/node-inj.lua
+++ b/tex/context/base/node-inj.lua
@@ -114,7 +114,7 @@ end
 
 function nodes.trace_injection(head)
     local function dir(n)
-        return (n<0 and "r-to-l") or (n>0 and "l-to-r") or ("unset")
+        return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or ("unset")
     end
     local function report(...)
         logs.report("nodes finisher",...)
@@ -132,9 +132,9 @@ function nodes.trace_injection(head)
             if kp then
                 local k = kerns[kp]
                 if k[3] then
-                    report("  pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2],k[3],k[4],k[5])
+                    report("  pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2] or "?",k[3] or "?",k[4] or "?",k[5] or "?")
                 else
-                    report("  kern: dir=%s, dx=%s",dir(k[1]),k[2])
+                    report("  kern: dir=%s, dx=%s",dir(k[1]),k[2] or "?")
                 end
             end
             if mb then
@@ -145,13 +145,13 @@ function nodes.trace_injection(head)
                 if mb then
                     local m = m[mb]
                     if m then
-                        report("  markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,j,m[1],m[2])
+                        report("  markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,md or "?",m[1] or "?",m[2] or "?")
                     else
                         report("  markmark: bound=%s, missing index",mm)
                     end
                 else
                     m = m[1]
-                    report("  markmark: bound=%s, dx=%s, dy=%s",mm,m[1],m[2])
+                    report("  markmark: bound=%s, dx=%s, dy=%s",mm,m[1] or "?",m[2] or "?")
                 end
             end
             if cb then
@@ -159,7 +159,7 @@ function nodes.trace_injection(head)
             end
             if cc then
                 local c = cursives[cc]
-                report("  curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2],c[3])
+                report("  curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2] or "?",c[3] or "?")
             end
         end
     end
@@ -168,18 +168,24 @@ end
 
 -- todo: reuse tables (i.e. no collection), but will be extra fields anyway
 
-function nodes.inject_kerns(head,tail,where,keep)
-    if trace_injections then
-        nodes.trace_injection(head)
-    end
+function nodes.inject_kerns(head,where,keep)
     local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns)
     if has_marks or has_cursives then
+        if trace_injections then
+            nodes.trace_injection(head)
+        end
         -- in the future variant we will not copy items but refs to tables
-        local done, ky, rl, valid, cx, wx = false, { }, { }, { }, { }, { }
+        local done, ky, rl, valid, cx, wx, mk = false, { }, { }, { }, { }, { }, { }
         if has_kerns then -- move outside loop
+            local nf, tm = nil, nil
             for n in traverse_id(glyph,head) do
                 if n.subtype < 256 then
                     valid[#valid+1] = n
+                    if n.font ~= nf then
+                        nf = n.font
+                        tm = fontdata[nf].marks
+                    end
+                    mk[n] = tm[n.char]
                     local k = has_attribute(n,kernpair)
                     if k then
                         local kk = kerns[k]
@@ -198,9 +204,15 @@ function nodes.inject_kerns(head,tail,where,keep)
                 end
             end
         else
+            local nf, tm = nil, nil
             for n in traverse_id(glyph,head) do
                 if n.subtype < 256 then
                     valid[#valid+1] = n
+                    if n.font ~= nf then
+                        nf = n.font
+                        tm = fontdata[nf].marks
+                    end
+                    mk[n] = tm[n.char]
                 end
             end
         end
@@ -214,22 +226,15 @@ function nodes.inject_kerns(head,tail,where,keep)
             end
             -- todo: reuse t and use maxt
             if has_cursives then
-                local n_cursbase, n_curscurs, p_cursbase, n, p, nf, tm = nil, nil, nil, nil, nil, nil, nil
+                local p_cursbase, p = nil, nil
                 -- since we need valid[n+1] we can also use a "while true do"
                 local t, d, maxt = { }, { }, 0
                 for i=1,#valid do -- valid == glyphs
-                    n = valid[i]
-                    if n.font ~= nf then
-                        nf = n.font
---~ print(n.font,nf,fontdata[nf])
-                        tm = fontdata[nf].marks
-                        -- maybe flush
-                        maxt = 0
-                    end
-                    if not tm[n.char] then
-                        n_cursbase = has_attribute(n,cursbase)
-                        n_curscurs = has_attribute(n,curscurs)
+                    local n = valid[i]
+                    if not mk[n] then
+                        local n_cursbase = has_attribute(n,cursbase)
                         if p_cursbase then
+                            local n_curscurs = has_attribute(n,curscurs)
                             if p_cursbase == n_curscurs then
                                 local c = cursives[n_curscurs]
                                 if c then
@@ -257,7 +262,8 @@ function nodes.inject_kerns(head,tail,where,keep)
                             local ny = n.yoffset
                             for i=maxt,1,-1 do
                                 ny = ny + d[i]
-                                t[i].yoffset = t[i].yoffset + ny
+                                local ti = t[i]
+                                ti.yoffset = ti.yoffset + ny
                             end
                             maxt = 0
                         end
@@ -265,7 +271,8 @@ function nodes.inject_kerns(head,tail,where,keep)
                             local ny = n.yoffset
                             for i=maxt,1,-1 do
                                 ny = ny + d[i]
-                                t[i].yoffset = ny
+                                local ti = t[i]
+                                ti.yoffset = ny
                             end
                             maxt = 0
                         end
@@ -276,7 +283,8 @@ function nodes.inject_kerns(head,tail,where,keep)
                     local ny = n.yoffset
                     for i=maxt,1,-1 do
                         ny = ny + d[i]
-                        t[i].yoffset = ny
+                        local ti = t[i]
+                        ti.yoffset = ny
                     end
                     maxt = 0
                 end
@@ -285,14 +293,13 @@ function nodes.inject_kerns(head,tail,where,keep)
                 end
             end
             if has_marks then
-                local p_markbase, n_markmark = nil, nil
                 for i=1,#valid do
                     local p = valid[i]
-                    p_markbase = has_attribute(p,markbase)
+                    local p_markbase = has_attribute(p,markbase)
                     if p_markbase then
                         local mrks = marks[p_markbase]
                         for n in traverse_id(glyph,p.next) do
-                            n_markmark = has_attribute(n,markmark)
+                            local n_markmark = has_attribute(n,markmark)
                             if p_markbase == n_markmark then
                                 local index = has_attribute(n,markdone) or 1
                                 local d = mrks[index]
@@ -301,9 +308,17 @@ function nodes.inject_kerns(head,tail,where,keep)
                                 --  if rlmode and rlmode < 0 then
                                 --      n.xoffset = p.xoffset + d[1]
                                 --  else
-                                        n.xoffset = p.xoffset - d[1]
+                                         n.xoffset = p.xoffset - d[1]
+--~ local k = wx[p]
+--~ if k then
+--~     wx[n] = k
+--~ end
                                 --  end
-                                    n.yoffset = p.yoffset + d[2]
+                                    if mk[p] then
+                                        n.yoffset = p.yoffset + d[2]
+                                    else
+                                        n.yoffset = n.yoffset + p.yoffset + d[2]
+                                    end
                                 end
                             else
                                 break
@@ -358,224 +373,9 @@ function nodes.inject_kerns(head,tail,where,keep)
             kerns, cursives, marks = { }, { }, { }
         end
     elseif has_kerns then
-        -- we assume done is true because there are kerns
-        for n in traverse_id(glyph,head) do
-            local k = has_attribute(n,kernpair)
-            if k then
-                local kk = kerns[k]
-                if kk then
-                 -- only w can be nil, can be sped up when w == nil
-                    local rl, x, y, w = kk[1], kk[2] or 0, kk[3] or 0, kk[4] or 0
-                    if y ~= 0 then
-                        n.yoffset = y -- todo: h ?
-                    end
-                    local wx = w - x
-                    if rl < 0 then
-                        if wx ~= 0 then
-                            insert_node_before(head,n,newkern(wx))
-                        end
-                        if x ~= 0 then
-                            insert_node_after (head,n,newkern(x))
-                        end
-                    else
-                    --  if wx ~= 0 then
-                    --      insert_node_after(head,n,newkern(wx))
-                    --  end
-                        if x ~= 0 then
-                            insert_node_before(head,n,newkern(x))
-                        end
-                    end
-                end
-            end
+        if trace_injections then
+            nodes.trace_injection(head)
         end
-        if not keep then
-            kerns = { }
-        end
-        return head, true
-    end
-    return head, false
-end
-
--- -- -- KEEP OLD ONE, THE NEXT IS JUST OPTIMIZED -- -- --
-
-function nodes.XXXXXXXxinject_kerns(head,tail,keep)
-    if trace_injections then
-        nodes.trace_injection(head)
-    end
-    local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns)
-    if has_marks or has_cursives then
-        -- in the future variant we will not copy items but refs to tables
-        local done, ky, valid, cx, wx = false, { }, { }, { }, { }
-        for n in traverse_id(glyph,head) do
-            if n.subtype < 256 then
-                valid[#valid+1] = n
-                if has_kerns then -- move outside loop
-                    local k = has_attribute(n,kernpair)
-                    if k then
-                        local kk = kerns[k]
-                        if kk then
-                            local x, y, w, h = kk[2], kk[3], kk[4], kk[5]
-                            local dy = y - h
-                            if dy ~= 0 then
-                                ky[n] = dy
-                            end
-                            if w ~= 0 or x ~= 0 then
-                                wx[n] = kk
-                            end
-                        end
-                    end
-                end
-            end
-        end
-        if #valid > 0 then
-            -- we can assume done == true because we have cursives and marks
-            local cx = { }
-            if has_kerns and next(ky) then
-                for n, k in next, ky do
-                    n.yoffset = k
-                end
-            end
-            -- todo: reuse t and use maxt
-            if has_cursives then
-                local n_cursbase, n_curscurs, p_cursbase, n, p, nf, tm = nil, nil, nil, nil, nil, nil, nil
-                -- since we need valid[n+1] we can also use a "while true do"
-                local t, d, maxt = { }, { }, 0
-                for i=1,#valid do -- valid == glyphs
-                    n = valid[i]
-                    if n.font ~= nf then
-                        nf = n.font
-                        tm = fontdata[nf].marks
-                        -- maybe flush
-                        maxt = 0
-                    end
-                    if not tm[n.char] then
-                        n_cursbase = has_attribute(n,cursbase)
-                        n_curscurs = has_attribute(n,curscurs)
-                        if p_cursbase then
-                            if p_cursbase == n_curscurs then
-                                local c = cursives[n_curscurs]
-                                if c then
-                                    local rlmode, dx, dy, ws, wn = c[1], c[2], c[3], c[4], c[5]
-                                    if rlmode >= 0 then
-                                        dx = dx - ws
-                                    else
-                                        dx = dx + wn
-                                    end
-                                    if dx ~= 0 then
-if rlmode < 0 then
-                                        cx[n] = -dx
-else
-                                        cx[n] = dx
-end
-                                    end
-                                --  if rlmode and rlmode < 0 then
-                                        dy = -dy
-                                --  end
-                                    maxt = maxt + 1
-                                    t[maxt] = p
-                                    d[maxt] = dy
-                                else
-                                    maxt = 0
-                                end
-                            end
-                        elseif maxt > 0 then
-                            local ny = n.yoffset
-                            for i=maxt,1,-1 do
-                                ny = ny + d[i]
-                                t[i].yoffset = t[i].yoffset + ny
-                            end
-                            maxt = 0
-                        end
-                        if not n_cursbase and maxt > 0 then
-                            local ny = n.yoffset
-                            for i=maxt,1,-1 do
-                                ny = ny + d[i]
-                                t[i].yoffset = ny
-                            end
-                            maxt = 0
-                        end
-                        p_cursbase, p = n_cursbase, n
-                    end
-                end
-                if maxt > 0 then
-                    local ny = n.yoffset
-                    for i=maxt,1,-1 do
-                        ny = ny + d[i]
-                        t[i].yoffset = ny
-                    end
-                    maxt = 0
-                end
-                if not keep then
-                    cursives = { }
-                end
-            end
-            if has_marks then
-                local p_markbase, n_markmark = nil, nil
-                for i=1,#valid do
-                    local p = valid[i]
-                    p_markbase = has_attribute(p,markbase)
-                    if p_markbase then
-                        local mrks = marks[p_markbase]
-                        for n in traverse_id(glyph,p.next) do
-                            n_markmark = has_attribute(n,markmark)
-                            if p_markbase == n_markmark then
-                                local index = has_attribute(n,markdone) or 1
-                                local d = mrks[index]
-                                if d then
-                                    local d1, d2 = d[1], d[2]
-                                    if d1 ~= 0 then
-                                        n.xoffset = p.xoffset - d[1]
-                                    end
-                                    if d2 ~= 0 then
-                                        n.yoffset = p.yoffset + d[2]
-                                    end
-                                end
-                            else
-                                break
-                            end
-                        end
-                    end
-                end
-                if not keep then
-                    marks = { }
-                end
-            end
-            -- todo : combine
-            if next(wx) then
-                for n, k in next, wx do
-                 -- only w can be nil, can be sped up when w == nil
-                    local rl, x, w = k[1], k[2] or 0, k[4] or 0
-                    local wx = w - x
-                    if rl < 0 then
-                        if wx ~= 0 then
-                            insert_node_before(head,n,newkern(wx))
-                        end
-                        if x ~= 0 then
-                            insert_node_after (head,n,newkern(x))
-                        end
-                    else
-                    --  if wx ~= 0 then
-                    --      insert_node_after(head,n,newkern(wx))
-                    --  end
-                        if x ~= 0 then
-                            insert_node_before(head,n,newkern(x))
-                        end
-                    end
-                end
-            end
-            if next(cx) then
-                for n, k in next, cx do
-                    insert_node_before(head,n,newkern(k))
-                end
-            end
-            if not keep then
-                kerns = { }
-            end
-            return head, true
-        elseif not keep then
-            kerns, cursives, marks = { }, { }, { }
-        end
-    elseif has_kerns then
         -- we assume done is true because there are kerns
         for n in traverse_id(glyph,head) do
             local k = has_attribute(n,kernpair)
@@ -610,6 +410,8 @@ end
             kerns = { }
         end
         return head, true
+    else
+        -- no tracing needed
     end
     return head, false
 end
diff --git a/tex/context/base/node-pro.lua b/tex/context/base/node-pro.lua
index 708237838..acc3f1676 100644
--- a/tex/context/base/node-pro.lua
+++ b/tex/context/base/node-pro.lua
@@ -11,13 +11,8 @@ local format, concat = string.format, table.concat
 
 local trace_callbacks = false  trackers.register("nodes.callbacks", function(v) trace_callbacks = v end)
 
-local hlist = node.id('hlist')
-local vlist = node.id('vlist')
 local glyph = node.id('glyph')
-local disc  = node.id('disc')
-local mark  = node.id('mark')
 
-local slide_nodes     = node.slide
 local free_node       = node.free
 local first_character = node.first_character
 
@@ -30,7 +25,7 @@ lists = lists or { }
 chars = chars or { }
 words = words or { } -- not used yet
 
-local actions = tasks.actions("processors",2) -- head, tail, where, boolean
+local actions = tasks.actions("processors",2) -- head, where, boolean
 
 local n = 0
 
@@ -65,12 +60,12 @@ end
 
 nodes.processors.enabled = true -- thsi will become a proper state (like trackers)
 
-function nodes.processors.pre_linebreak_filter(head,groupcode) -- todo: tail
+function nodes.processors.pre_linebreak_filter(head,groupcode)
     local first, found = first_character(head)
     if found then
         if trace_callbacks then
             local before = nodes.count(head,true)
-            local head, tail, done = actions(head,slide_nodes(head),groupcode)
+            local head, done = actions(head,groupcode)
             local after = nodes.count(head,true)
             if done then
                 tracer("pre_linebreak","changed",head,groupcode,before,after,true)
@@ -79,7 +74,7 @@ function nodes.processors.pre_linebreak_filter(head,groupcode) -- todo: tail
             end
             return (done and head) or true
         else
-            local head, tail, done = actions(head,slide_nodes(head),groupcode)
+            local head, done = actions(head,groupcode)
             return (done and head) or true
         end
     elseif trace_callbacks then
@@ -89,12 +84,12 @@ function nodes.processors.pre_linebreak_filter(head,groupcode) -- todo: tail
     return true
 end
 
-function nodes.processors.hpack_filter(head,groupcode) -- todo: tail
+function nodes.processors.hpack_filter(head,groupcode)
     local first, found = first_character(head)
     if found then
         if trace_callbacks then
             local before = nodes.count(head,true)
-            local head, tail, done = actions(head,slide_nodes(head),groupcode)
+            local head, done = actions(head,groupcode)
             local after = nodes.count(head,true)
             if done then
                 tracer("hpack","changed",head,groupcode,before,after,true)
@@ -103,7 +98,7 @@ function nodes.processors.hpack_filter(head,groupcode) -- todo: tail
             end
             return (done and head) or true
         else
-            local head, tail, done = actions(head,slide_nodes(head),groupcode)
+            local head, done = actions(head,groupcode)
             return (done and head) or true
         end
     elseif trace_callbacks then
@@ -116,17 +111,19 @@ end
 callback.register('pre_linebreak_filter', nodes.processors.pre_linebreak_filter)
 callback.register('hpack_filter'        , nodes.processors.hpack_filter)
 
-local actions = tasks.actions("finalizers",2) -- head, tail, where, boolean
+local actions = tasks.actions("finalizers",2) -- head, where, boolean
 
 -- beware, these are packaged boxes so no first_character test
 -- maybe some day a hash with valid groupcodes
+--
+-- beware, much can pass twice, for instance vadjust passes two times
 
-function nodes.processors.post_linebreak_filter(head,groupcode) -- todo: tail
+function nodes.processors.post_linebreak_filter(head,groupcode)
 --~     local first, found = first_character(head)
 --~     if found then
         if trace_callbacks then
             local before = nodes.count(head,true)
-            local head, tail, done = actions(head,slide_nodes(head),groupcode)
+            local head, done = actions(head,groupcode)
             local after = nodes.count(head,true)
             if done then
                 tracer("finalizer","changed",head,groupcode,before,after,true)
@@ -135,7 +132,7 @@ function nodes.processors.post_linebreak_filter(head,groupcode) -- todo: tail
             end
             return (done and head) or true
         else
-            local head, tail, done = actions(head,slide_nodes(head),groupcode)
+            local head, done = actions(head,groupcode)
             return (done and head) or true
         end
 --~     elseif trace_callbacks then
diff --git a/tex/context/base/node-ref.lua b/tex/context/base/node-ref.lua
new file mode 100644
index 000000000..571ba3dd7
--- /dev/null
+++ b/tex/context/base/node-ref.lua
@@ -0,0 +1,496 @@
+if not modules then modules = { } end modules ['node-bck'] = {
+    version   = 1.001,
+    comment   = "companion to node-bck.tex",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+-- We supported pdf right from the start and in mkii this has resulted in
+-- extensive control over the links. Nowadays pdftex provides a lot more
+-- control over margins but as mkii supports multiple backends we stuck to
+-- our own mechanisms. In mkiv again we implement our own handling. Eventually
+-- we will even disable the pdf primitives.
+
+-- helper, will end up in luatex
+
+local cleanupreferences, cleanupdestinations = false, true
+
+local nodeinjections = backends.nodeinjections
+local codeinjections = backends.codeinjections
+
+local hpack_list = node.hpack
+local copy_list  = node.copy_list
+local flush_list = node.flush_list
+
+local function dimensions(parent,start,stop) -- so we need parent for glue_set info
+    local n = stop.next
+    stop.next = nil
+    local p = hpack_list(copy_list(start))
+    stop.next = n
+    local w, h, d = p.width, p.height, p.depth
+    flush_list(p)
+    return w, h, d
+end
+
+-- current.glue_set current.glue_sign
+
+local trace_backend      = false  trackers.register("nodes.backend",      function(v) trace_backend      = v end)
+local trace_references   = false  trackers.register("nodes.references",   function(v) trace_references   = v end)
+local trace_destinations = false  trackers.register("nodes.destinations", function(v) trace_destinations = v end)
+
+local hlist   = node.id("hlist")
+local vlist   = node.id("vlist")
+local glue    = node.id("glue")
+local whatsit = node.id("whatsit")
+
+local new_kern = nodes.kern
+
+local has_attribute  = node.has_attribute
+local traverse       = node.traverse
+local find_node_tail = node.tail or node.slide
+local tosequence     = nodes.tosequence
+
+local function inject_range(head,first,last,reference,make,stack,parent,pardir,txtdir)
+    local width, height, depth = dimensions(parent,first,last)
+    if pardir == "TRT" or txtdir == "+TRT" then
+        width = - width
+    end
+    local result, resolved = make(width,height,depth,reference)
+    if result and resolved then
+        if head == first then
+            if trace_backend then
+                logs.report("backend","head: %04i %s %s %s => w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",tosequence(first,last,true),width,height,depth,resolved)
+            end
+            result.next = first
+            first.prev = result
+            return result, last
+        else
+            if trace_backend then
+                logs.report("backend","middle: %04i %s %s => w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",tosequence(first,last,true),width,height,depth,resolved)
+            end
+            local prev = first.prev
+            if prev then
+                result.next = first
+                result.prev = prev
+                prev.next = result
+                first.prev = result
+            else
+                result.next = first
+                first.prev = result
+            end
+            if first == head.next then
+                head.next = result -- hm, weird
+            end
+            return head, last
+        end
+    else
+        return head, last
+    end
+end
+
+local function inject_list(id,current,reference,make,stack,pardir,txtdir)
+    local width, height, depth, correction = current.width, current.height, current.depth, 0
+    local moveright = false
+    local first = current.list
+    if id == hlist then
+        -- can be either an explicit hbox or a line and there is no way
+        -- to recognize this; anyway only if ht/dp (then inline)
+        local sr = stack[reference]
+        if first then
+            if sr and sr[2] then
+                local last = find_node_tail(first)
+                if last.id == glue and last.subtype == 9 then
+                    local prev = last.prev
+                    moveright = first.id == glue and first.subtype == 8
+                    if prev.id == glue and prev.subtype == 15 then
+                        width = dimensions(current,first,prev.prev) -- maybe not current as we already take care of it
+                    else
+                        if moveright and first.spec then
+                            width = width - first.spec.stretch*current.glue_set * current.glue_sign
+                        end
+                        if last.spec then
+                            width = width - last.spec.stretch*current.glue_set * current.glue_sign
+                        end
+                    end
+                end
+            else
+                -- also weird
+            end
+        else
+            -- ok
+        end
+        correction = width
+    else
+        correction = height + depth
+        height, depth = depth, height -- ugly hack, needed because pdftex backend does something funny
+    end
+    if pardir == "TRT" then
+        width = - width
+    end
+    local result, resolved = make(width,height,depth,reference)
+    if result and resolved then
+        if trace_backend then
+            logs.report("backend","box: %04i %s %s: w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",width,height,depth,resolved)
+        end
+        if not first then
+            current.list = result
+        elseif moveright then -- brr no prevs done
+            -- result after first
+            local n = first.next
+            result.next = n
+            first.next = result
+            result.prev = first
+            if n then n.prev = result end
+        else
+            -- first after result
+            result.next = first
+            first.prev = result
+            current.list = result
+        end
+    end
+end
+
+local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,txtdir)  -- main
+    if head then
+        local current, first, last, firstdir, reference = head, nil, nil, nil, nil
+        pardir = pardir or "==="
+        txtdir = txtdir or "==="
+        while current do
+            local id = current.id
+            local r = has_attribute(current,attribute)
+            if id == whatsit then
+                local subtype = current.subtype
+                if subtype == 6 then
+                    pardir = current.dir
+                elseif subtype == 7 then
+                    txtdir = current.dir
+                end
+            elseif id == hlist or id == vlist then
+                if r and (not skip or r > skip) then
+                    inject_list(id,current,r,make,stack,pardir,txtdir)
+                    done[r] = true
+                end
+                local list = current.list
+                if list then
+                    local pd
+                    current.list, _, pardir, txtdir = inject_areas(list,attribute,make,stack,done,r or skip or 0,current,pardir,txtdir)
+                end
+            elseif not r then
+                -- just go on, can be kerns
+            elseif not reference then
+                reference, first, last, firstdir = r, current, current, txtdir
+            elseif r == reference then
+                last = current
+            elseif not done[reference] then
+                if not skip or r > skip then
+                    head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir)
+                    reference, first, last, firstdir = nil, nil, nil, nil
+                end
+            else
+                reference, first, last, firstdir = r, current, current, txtdir
+            end
+            current = current.next
+        end
+        if reference and not done[reference] then
+            head = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir)
+        end
+    end
+    return head, true, pardir, txtdir
+end
+
+local function inject_area(head,attribute,make,stack,done,pardir,txtdir) -- singular  !
+    if head then
+        pardir = pardir or "==="
+        txtdir = txtdir or "==="
+        local current = head
+        while current do
+            local id = current.id
+            local r = has_attribute(current,attribute)
+            if id == whatsit then
+                local subtype = current.subtype
+                if subtype == 6 then
+                    pardir = current.dir
+                elseif subtype == 7 then
+                    txtdir = current.dir
+                end
+            elseif id == hlist or id == vlist then
+                if r and not done[r] then
+                    done[r] = true
+                    inject_list(id,current,r,make,stack,pardir,txtdir)
+                end
+                current.list = inject_area(current.list,attribute,make,stack,done,pardir,txtdir)
+            elseif r and not done[r] then
+                done[r] = true
+                head, current = inject_range(head,current,current,r,make,stack,pardir,txtdir)
+            end
+            current = current.next
+        end
+    end
+    return head, true
+end
+
+-- tracing
+
+local new_rule       = nodes.rule
+local new_kern       = nodes.kern
+local set_attribute  = node.set_attribute
+local register_color = colors.register
+
+local a_colormodel   = attributes.private('colormodel')
+local a_color        = attributes.private('color')
+local a_transparency = attributes.private('transparency')
+local u_transparency = nil
+local u_colors       = { }
+local force_gray     = true
+
+local function colorize(width,height,depth,n)
+    if force_gray then n = 0 end
+    u_transparency = u_transparency or transparencies.register(nil,2,.65)
+    local ucolor = u_colors[n]
+    if not ucolor then
+        if n == 1 then
+            u_color = register_color('color',nil,'rgb',.75,0,0)
+        elseif n == 2 then
+            u_color = register_color('color',nil,'rgb',0,.75,0)
+        elseif n == 3 then
+            u_color = register_color('color',nil,'rgb',0,0,.75)
+        else
+            n = 0
+            u_color = register_color('color',nil,'gray',.5)
+        end
+        u_colors[n] = u_color
+    end
+    local rule = new_rule(width,height,depth)
+    set_attribute(rule,a_colormodel,1) -- gray color model
+    set_attribute(rule,a_color,u_color)
+    set_attribute(rule,a_transparency,u_transparency)
+    if width < 0 then
+        local kern = new_kern(width)
+        rule.width = -width
+        kern.next = rule
+        rule.prev = kern
+        return kern
+    else
+        return rule
+    end
+end
+
+local new_kern     = nodes.kern
+local texattribute = tex.attribute
+local texcount     = tex.count
+
+-- references:
+
+nodes.references = {
+    attribute = attributes.private('reference'),
+    stack = { },
+    done  = { },
+}
+
+local stack, done, attribute = nodes.references.stack, nodes.references.done, nodes.references.attribute
+
+local nofreferences, topofstack = 0, 0
+
+local function setreference(n,h,d,r) -- n is just a number, can be used for tracing
+    topofstack = topofstack + 1
+    stack[topofstack] = { n, h, d, codeinjections.prerollreference(r) } -- the preroll permits us to determine samepage (but delayed also has some advantages)
+--~     texattribute[attribute] = topofstack -- todo -> at tex end
+    texcount.lastreferenceattribute = topofstack
+end
+
+nodes.setreference = setreference
+
+local function makereference(width,height,depth,reference)
+    local sr = stack[reference]
+    if sr then
+        local resolved, ht, dp, set = sr[1], sr[2], sr[3], sr[4]
+        if ht then
+            if height < ht then height = ht end
+            if depth  < dp then depth  = dp end
+        end
+        local annot = nodeinjections.reference(width,height,depth,set)
+        if annot then
+            nofreferences = nofreferences + 1
+            local result, current
+            if trace_references then
+                local step = 65536
+                result = hpack_list(colorize(width,height-step,depth-step,2)) -- step subtracted so that we can see seperate links
+                result.width = 0
+                current = result
+            end
+            if current then
+                current.next = annot
+            else
+                result = annot
+            end
+            result = hpack_list(result,0)
+            result.width, result.height, result.depth = 0, 0, 0
+            if cleanupreferences then stack[reference] = nil end
+            return result, resolved
+        else
+            logs.report("backends","unable to resolve reference annotation %s",reference)
+        end
+    else
+        logs.report("backends","unable to resolve reference attribute %s",reference)
+    end
+end
+
+function nodes.add_references(head)
+    if topofstack > 0 then
+        return inject_areas(head,attribute,makereference,stack,done)
+    else
+        return head, false
+    end
+end
+
+-- destinations (we can clean up once set!)
+
+nodes.destinations = {
+    attribute = attributes.private('destination'),
+    stack = { },
+    done  = { },
+}
+
+local stack, done, attribute = nodes.destinations.stack, nodes.destinations.done, nodes.destinations.attribute
+
+local nofdestinations, topofstack = 0, 0
+
+local function setdestination(n,h,d,name,view) -- n = grouplevel, name == table
+    topofstack = topofstack + 1
+    stack[topofstack] = { n, h, d, name, view }
+    return topofstack
+end
+
+nodes.setdestination = setdestination
+
+local function makedestination(width,height,depth,reference)
+    local sr = stack[reference]
+    if sr then
+        local resolved, ht, dp, name, view = sr[1], sr[2], sr[3], sr[4], sr[5]
+        if ht then
+            if height < ht then height = ht end
+            if depth  < dp then depth  = dp end
+        end
+        local result, current
+        if trace_destinations then
+            local step = 0
+            if width  == 0 then
+                step = 4*65536
+                width, height, depth = 5*step, 5*step, 0
+            end
+            for n=1,#name do
+                local rule = hpack_list(colorize(width,height,depth,3))
+                rule.width = 0
+                if not result then
+                    result, current = rule, rule
+                else
+                    current.next = rule
+                    rule.prev = current
+                    current = rule
+                end
+                width, height = width - step, height - step
+            end
+        end
+        nofdestinations = nofdestinations + 1
+        for n=1,#name do
+            local annot = nodeinjections.destination(width,height,depth,name[n],view)
+            if not result then
+                result, current = annot, annot
+            else
+                current.next = annot
+                annot.prev = current
+                current = annot
+            end
+        end
+        result = hpack_list(result,0)
+        result.width, result.height, result.depth = 0, 0, 0
+        if cleanupdestinations then stack[reference] = nil end
+        return result, resolved
+    else
+        logs.report("backends","unable to resolve destination attribute %s",reference)
+    end
+end
+
+function nodes.add_destinations(head)
+    if topofstack > 0 then
+        return inject_area(head,attribute,makedestination,stack,done) -- singular
+    else
+        return head, false
+    end
+end
+
+-- will move
+
+function jobreferences.mark(reference,h,d,view)
+    return setdestination(tex.currentgrouplevel,h,d,reference,view)
+end
+
+function jobreferences.inject(prefix,reference,h,d,highlight,newwindow,layer) -- todo: use currentreference is possible
+    local set, bug = jobreferences.identify(prefix,reference)
+    if bug or #set == 0 then
+        -- unknown ref, just don't set it and issue an error
+    else
+        -- check
+        set.highlight, set.newwindow,set.layer = highlight, newwindow, layer
+        setreference(tex.currentgrouplevel,h,d,set) -- sets attribute / todo: for set[*].error
+    end
+end
+
+function jobreferences.injectcurrentset(h,d) -- used inside doifelse
+    local currentset = jobreferences.currentset
+    if currentset then
+        setreference(tex.currentgrouplevel,h,d,currentset) -- sets attribute / todo: for set[*].error
+    end
+end
+
+--
+
+local function checkboth(open,close)
+    if open and open ~= "" then
+        local set, bug = jobreferences.identify("",open)
+        open = not bug and #set > 0 and set
+    end
+    if close and close ~= "" then
+        local set, bug = jobreferences.identify("",close)
+        close = not bug and #set > 0 and set
+    end
+    return open, close
+end
+
+-- expansion is temp hack
+
+local opendocument, closedocument, openpage, closepage
+
+local function check(what)
+    if what and what ~= "" then
+        local set, bug = jobreferences.identify("",what)
+        return not bug and #set > 0 and set
+    end
+end
+
+function jobreferences.checkopendocumentactions (open)  opendocument  = check(open)  end
+function jobreferences.checkclosedocumentactions(close) closedocument = check(close) end
+function jobreferences.checkopenpageactions     (open)  openpage      = check(open)  end
+function jobreferences.checkclosepageactions    (close) closepage     = check(close) end
+
+function jobreferences.flushdocumentactions()
+    if opendocument or closedocument then
+        backends.codeinjections.flushdocumentactions(opendocument,closedocument) -- backend
+    end
+end
+function jobreferences.flushpageactions()
+    if openpage or closepage then
+        backends.codeinjections.flushpageactions(openpage,closepage) -- backend
+    end
+end
+
+-- end temp hack
+
+statistics.register("interactive elements", function()
+    if nofreferences > 0 or nofdestinations > 0 then
+        return string.format("%s references, %s destinations",nofreferences,nofdestinations)
+    else
+        return nil
+    end
+end)
diff --git a/tex/context/base/node-res.lua b/tex/context/base/node-res.lua
index b84e5b105..4f2cf5a05 100644
--- a/tex/context/base/node-res.lua
+++ b/tex/context/base/node-res.lua
@@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['node-res'] = {
 }
 
 local gmatch, format = string.gmatch, string.format
-local copy_node, free_node, new_node = node.copy, node.free, node.new
+local copy_node, free_node, free_list, new_node = node.copy, node.free, node.flush_list, node.new
 
 --[[ldx--
 The next function is not that much needed but in  we use
@@ -51,7 +51,6 @@ function nodes.usage()
     return t
 end
 
-local pdfliteral = nodes.register(new_node("whatsit",8))   pdfliteral.mode = 1
 local disc       = nodes.register(new_node("disc"))
 local kern       = nodes.register(new_node("kern",1))
 local penalty    = nodes.register(new_node("penalty"))
@@ -60,6 +59,7 @@ local glue_spec  = nodes.register(new_node("glue_spec"))
 local glyph      = nodes.register(new_node("glyph",0))
 local textdir    = nodes.register(new_node("whatsit",7))
 local rule       = nodes.register(new_node("rule"))
+local latelua    = nodes.register(new_node("whatsit",35))
 
 function nodes.glyph(fnt,chr)
     local n = copy_node(glyph)
@@ -91,11 +91,6 @@ end
 function nodes.disc()
     return copy_node(disc)
 end
-function nodes.pdfliteral(str)
-    local t = copy_node(pdfliteral)
-    t.data = str
-    return t
-end
 function nodes.textdir(dir)
     local t = copy_node(textdir)
     t.dir = dir
@@ -108,6 +103,11 @@ function nodes.rule(w,h,d)
     if d then n.depth  = d end
     return n
 end
+function nodes.latelua(code)
+    local n = copy_node(latelua)
+    n.data = code
+    return n
+end
 
 statistics.register("cleaned up reserved nodes", function()
     return format("%s nodes, %s lists of %s", nodes.cleanup_reserved(tex.count["lastallocatedbox"]))
diff --git a/tex/context/base/node-seq.lua b/tex/context/base/node-seq.lua
index b8c432223..43ca8a99b 100644
--- a/tex/context/base/node-seq.lua
+++ b/tex/context/base/node-seq.lua
@@ -115,12 +115,18 @@ function sequencer.tostring(t,n) -- n not done
     return format(template,concat(vars,"\n"),concat(calls,"\n"))
 end
 
+-- we used to deal with tail as well but now that the lists are always
+-- double linked and the kernel function no longer expect tail as
+-- argument we stick to head and done (done can probably also go
+-- as luatex deals with return values efficiently now .. in the
+-- past there was some copying involved, but no longer)
+
 local template = [[
 %s
-return function(head,tail%s)
+return function(head%s)
   local ok, done = false, false
 %s
-  return head, tail, done
+  return head, done
 end]]
 
 function sequencer.nodeprocessor(t,n)
@@ -142,11 +148,9 @@ function sequencer.nodeprocessor(t,n)
             local localized = localize(action)
             vars[#vars+1] = format("local %s = %s",localized,action)
             if kind[action] == "nohead" then
-                calls[#calls+1] = format("              ok = %s(head,tail%s) done = done or ok -- %s %i",localized,args,group,i)
-            elseif kind[action] == "notail" then
-                calls[#calls+1] = format("  head,       ok = %s(head,tail%s) done = done or ok -- %s %i",localized,args,group,i)
+                calls[#calls+1] = format("        ok = %s(head%s) done = done or ok -- %s %i",localized,args,group,i)
             else
-                calls[#calls+1] = format("  head, tail, ok = %s(head,tail%s) done = done or ok -- %s %i",localized,args,group,i)
+                calls[#calls+1] = format("  head, ok = %s(head%s) done = done or ok -- %s %i",localized,args,group,i)
             end
         end
     end
@@ -177,7 +181,7 @@ end
 --~ sequencer.prependaction(t,"taco","taco.j")
 --~ sequencer.removeaction(t,"hans","hans.x")
 
---~ sequencer.setkind(t,"hans.b","notail")
+--~ sequencer.setkind(t,"hans.b")
 --~ sequencer.setkind(t,"taco.j","nohead")
 
 --~ print(sequencer.tostring(t))
diff --git a/tex/context/base/node-shp.lua b/tex/context/base/node-shp.lua
index 48dd8c5c7..22b97ca6e 100644
--- a/tex/context/base/node-shp.lua
+++ b/tex/context/base/node-shp.lua
@@ -62,5 +62,5 @@ end
 local actions = tasks.actions("shipouts",0)  -- no extra arguments
 
 function nodes.process_page(head) -- problem, attr loaded before node, todo ...
-    return actions(head) -- no tail
+    return actions(head)
 end
diff --git a/tex/context/base/node-tex.lua b/tex/context/base/node-tex.lua
index 563e6a397..1995f4aa2 100644
--- a/tex/context/base/node-tex.lua
+++ b/tex/context/base/node-tex.lua
@@ -13,40 +13,25 @@ kernel = kernel or { }
 local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
 local hyphenate, ligaturing, kerning = lang.hyphenate, node.ligaturing, node.kerning
 
-function kernel.hyphenation(head,tail) -- lang.hyphenate returns done
-    if head == tail then
-        return head, tail, false
-    else
+function kernel.hyphenation(head)
     --  starttiming(kernel)
-    --  local done = hyphenate(head,tail)
+    local done = hyphenate(head)
     --  stoptiming(kernel)
-    --  return head, tail, done
-        return head, tail, hyphenate(head,tail)
-    end
+    return head, done
 end
 
-function kernel.ligaturing(head,tail) -- node.ligaturing returns head,tail,done
-    if head == tail then
-        return head, tail, false
-    else
+function kernel.ligaturing(head)
     --  starttiming(kernel)
-    --  local head, tail, done = ligaturing(head,tail)
+    local head, tail, done = ligaturing(head) -- todo: check what is returned
     --  stoptiming(kernel)
-    --  return head, tail, done
-        return ligaturing(head,tail)
-    end
+    return head, done
 end
 
-function kernel.kerning(head,tail) -- node.kerning returns head,tail,done
-    if head == tail then
-        return head, tail, false
-    else
+function kernel.kerning(head)
     --  starttiming(kernel)
-    --  local head, tail, done = kerning(head,tail)
+    local head, tail, done = kerning(head) -- todo: check what is returned
     --  stoptiming(kernel)
-    --  return head, tail, done
-        return kerning(head,tail)
-    end
+    return head, done
 end
 
 callback.register('hyphenate' , false)
diff --git a/tex/context/base/node-tra.lua b/tex/context/base/node-tra.lua
index 50f8287ee..aeaa6769e 100644
--- a/tex/context/base/node-tra.lua
+++ b/tex/context/base/node-tra.lua
@@ -388,9 +388,9 @@ function nodes.pack_list(head)
     return t
 end
 
-function nodes.ids_to_string(head)
+function nodes.ids_to_string(head,tail)
     local t, last_id, last_n = { }, nil, 0
-    for n in traverse_nodes(head) do
+    for n in traverse_nodes(head,tail) do
         local id = n.id
         if not last_id then
             last_id, last_n = id, 1
diff --git a/tex/context/base/node-tsk.lua b/tex/context/base/node-tsk.lua
index bfa9f1196..d2ac57d6b 100644
--- a/tex/context/base/node-tsk.lua
+++ b/tex/context/base/node-tsk.lua
@@ -76,7 +76,7 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
     local data = tasks.data[name]
     if data then
         if n == 0 then
-            return function(head,tail)
+            return function(head)
                 local runner = data.runner
                 total = total + 1 -- will go away
                 if not runner then
@@ -87,10 +87,10 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
                     runner = sequencer.compile(data.list,sequencer.nodeprocessor,0)
                     data.runner = runner
                 end
-                return runner(head,tail)
+                return runner(head)
             end
         elseif n == 1 then
-            return function(head,tail,one)
+            return function(head,one)
                 total = total + 1 -- will go away
                 local runner = data.runner
                 if not runner then
@@ -101,10 +101,10 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
                     runner = sequencer.compile(data.list,sequencer.nodeprocessor,1)
                     data.runner = runner
                 end
-                return runner(head,tail,one)
+                return runner(head,one)
             end
         elseif n == 2 then
-            return function(head,tail,one,two)
+            return function(head,one,two)
                 total = total + 1 -- will go away
                 local runner = data.runner
                 if not runner then
@@ -115,10 +115,10 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
                     runner = sequencer.compile(data.list,sequencer.nodeprocessor,2)
                     data.runner = runner
                 end
-                return runner(head,tail,one,two)
+                return runner(head,one,two)
             end
         else
-            return function(head,tail,...)
+            return function(head,...)
                 total = total + 1 -- will go away
                 local runner = data.runner
                 if not runner then
@@ -129,7 +129,7 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
                     runner = sequencer.compile(data.list,sequencer.nodeprocessor,3)
                     data.runner = runner
                 end
-                return runner(head,tail,...)
+                return runner(head,...)
             end
         end
     else
diff --git a/tex/context/base/node-tst.lua b/tex/context/base/node-tst.lua
index e8b1146f8..4fb6b4bca 100644
--- a/tex/context/base/node-tst.lua
+++ b/tex/context/base/node-tst.lua
@@ -6,6 +6,17 @@ if not modules then modules = { } end modules ['node-tst'] = {
     license   = "see context related readme files"
 }
 
+local glue    = node.id("glue")
+local penalty = node.id("penalty")
+local kern    = node.id("kern")
+local glyph   = node.id("glyph")
+local whatsit = node.id("whatsit")
+local hlist   = node.id("hlist")
+
+local find_node_tail = node.tail or node.slide
+
+local chardata = characters.data
+
 function nodes.leftskip(n)
     while n do
         local id = n.id
@@ -28,7 +39,7 @@ end
 
 function nodes.rightskip(n)
     if n then
-        n = slide_nodes(n)
+        n = find_node_tail(n)
         while n do
             local id = n.id
             if id == glue then
diff --git a/tex/context/base/pack-bar.mkiv b/tex/context/base/pack-bar.mkiv
new file mode 100644
index 000000000..05afd32d0
--- /dev/null
+++ b/tex/context/base/pack-bar.mkiv
@@ -0,0 +1,67 @@
+%D \module
+%D   [       file=pack-bar,
+%D        version=2009.06.26,
+%D          title=\CONTEXT\ Packaging Macros,
+%D       subtitle=Bars,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Packaging Macros / Bars}
+
+%D This code has been moved from scrn-int to here (was some old
+%D experimental code). It could be in scrn-bar but it's static.
+
+\unprotect
+
+%D \startbuffer
+%D \dorecurse{10}
+%D   {\horizontalpositionbar
+%D      \pos\recurselevel \min1 \max10
+%D      \token\framed{\recurselevel}%
+%D    \\}
+%D
+%D \hbox to 15em
+%D   {\hss
+%D    \dorecurse{10}
+%D      {\verticalpositionbar\pos\recurselevel\min1\max10\token\blackrule\\
+%D       \hss}}
+%D \stopbuffer
+
+\def\horizontalpositionbar\pos#1\min#2\max#3\token#4\\%
+  {\hbox to \hsize
+     {\hskip\zeropoint\!!plus #1\!!fill
+      \hskip\zeropoint\!!plus-#2\!!fill
+      #4\relax
+      \hskip\zeropoint\!!plus #3\!!fill
+      \hskip\zeropoint\!!plus-#1\!!fill}}
+
+\def\verticalpositionbar\pos#1\min#2\max#3\token#4\\%
+  {\vbox to \vsize
+     {\vskip\zeropoint\!!plus #1\!!fill
+      \vskip\zeropoint\!!plus-#2\!!fill
+      \hbox{#4}\relax
+      \vskip\zeropoint\!!plus #3\!!fill
+      \vskip\zeropoint\!!plus-#1\!!fill}}
+
+\def\horizontalgrowingbar\pos#1\min#2\max#3\height#4\depth#5\\%
+  {\hbox to \hsize
+     {\scratchcounter\numexpr#1-#2+\plusone\relax
+      \leaders\vrule\hskip\zeropoint\!!plus \scratchcounter\!!fill
+      \vrule\!!width\zeropoint\!!height#4\!!depth#5%
+      \hskip\zeropoint\!!plus #3\!!fill
+      \hskip\zeropoint\!!plus-#1\!!fill}}
+
+\def\verticalgrowingbar\pos#1\min#2\max#3\width#4\\%
+  {\vbox to \vsize
+     {\scratchcounter\numexpr#1-#2+\plusone\relax
+      \leaders\hrule\vskip\zeropoint\!!plus\scratchcounter\!!fill
+      \hrule\!!width#4\!!height\zeropoint\!!depth\zeropoint
+      \vskip\zeropoint\!!plus #3\!!fill
+      \vskip\zeropoint\!!plus-#1\!!fill}}
+
+\protect \endinput
diff --git a/tex/context/base/pack-box.mkiv b/tex/context/base/pack-box.mkiv
index 1be840552..a12ab0263 100644
--- a/tex/context/base/pack-box.mkiv
+++ b/tex/context/base/pack-box.mkiv
@@ -60,10 +60,10 @@
   {\dosingleargument\doanchor}
 
 \def\doanchor[#1]%
-  {\ifundefined{\??an#1}\@EA\dodoanchor\else\@EA\nonoanchor\fi[#1]}
+  {\ifcsname\??an#1\endcsname\@EA\nonoanchor\else\@EA\dodoanchor\fi[#1]}
 
 \def\nonoanchor[#1]%
-  {\getvalue{\??an#1}}
+  {}
 
 \def\dodoanchor[#1]%
   {\dotripleempty\dododoanchor[#1]}
@@ -127,7 +127,7 @@
   {\dodoubleargument\dodefinecollector}
 
 \def\dodefinecollector[#1][#2]%
-  {\ifundefined{\@@collectorbox#1}%
+  {\ifcsname\@@collectorbox#1\endcsname \else
      \expandafter\newbox\csname\@@collectorbox#1\endcsname
    \fi
    \resetcollector[#1]%
@@ -154,10 +154,10 @@
    \forgetall
    \dontcomplain
    \dowithnextbox
-     {\ifundefined{\@@collectorbox#1}%
-        \writestatus{collector}{unknown layer #1}%
-      \else
+     {\ifcsname\@@collectorbox#1\endcsname
         \dodosetcollector[#1][#2]%
+      \else
+        \writestatus{collector}{unknown layer #1}%
       \fi
       \egroup}
      \hbox}
@@ -188,12 +188,12 @@
       \ifdim\@@layerysiz>\zeropoint
         \advance\@@layerypos.5\@@layerysiz
       \fi}%
-     {\ExpandBothAfter\doifinset\v!bottom{\collectorparameter\c!corner}
+     {\normalexpanded{\noexpand\doifinset{\v!bottom}{\collectorparameter\c!corner}}
         {\ifdim\@@layerysiz>\zeropoint
            \advance\@@layerypos-\@@layerysiz
            \@@layerypos-\@@layerypos
          \fi}%
-      \ExpandBothAfter\doifinset\v!right{\collectorparameter\c!corner}
+      \normalexpanded{\noexpand\doifinset{\v!right}{\collectorparameter\c!corner}}
         {\ifdim\@@layerxsiz>\zeropoint
            \advance\@@layerxpos-\@@layerxsiz
            \@@layerxpos-\@@layerxpos
@@ -238,9 +238,7 @@
    \fi}
 
 \def\flushcollector[#1]%
-  {\ifundefined{\@@collectorbox#1}%
-     \writestatus{collector}{unknown collector #1}%
-   \else
+  {\ifcsname\@@collectorbox#1\endcsname
      \doifnotvalue{\??cb#1\c!state}\v!stop
        {\vbox
           {\hbox
@@ -248,12 +246,14 @@
                 {\let\next\copy}{\let\next\box}%
               \raise\dp\csname\@@collectorbox#1\endcsname
               \next\csname\@@collectorbox#1\endcsname}}}%
+   \else
+     \writestatus{collector}{unknown collector #1}%
    \fi}
 
 \def\composedcollector#1{\flushcollector[#1]}
 
 \def\resetcollector[#1]%
-  {\ifundefined{\@@collectorbox#1}\else
+  {\ifcsname\@@collectorbox#1\endcsname
      \global\setbox\csname\@@collectorbox#1\endcsname\emptybox
    \fi}
 
@@ -264,8 +264,7 @@
   {\bgroup
    \def\currentcollector{#1}%
    \mathchardef\collectorbox\csname\@@collectorbox#1\endcsname
-   \getparameters
-     [\??cb#1][\c!voffset=\zeropoint,\c!hoffset=\zeropoint,#2]%
+   \getparameters[\??cb#1][\c!voffset=\zeropoint,\c!hoffset=\zeropoint,#2]%
    \scratchdimen\wd\collectorbox
    \advance\scratchdimen\collectorparameter\c!hoffset
    \global\wd\collectorbox\scratchdimen
@@ -574,13 +573,9 @@
    \hbox\framed[#3]}
 
 \def\dosetlayerframedS[#1][#2][#3]%
-  {\dowithnextbox
-     {\setlayer
-        [#1]
-        [\c!width=\nextboxwd,\c!height=\nextboxht,
-         \c!offset=\!!zeropoint,#2]
-        {\flushnextbox}}%
-   \hbox\framed[\c!location=\v!normal,#2]}
+  {\dowithnextbox % we could use a local setlayer command (no doif..empty) which also saves a nextbox
+     {\setlayer[#1][\c!width=\nextboxwd,\c!height=\nextboxht,\c!offset=\!!zeropoint,#2]{\flushnextbox}}%
+     \hbox\framed[\c!location=\v!normal,#2]}
 
 \def\setlayertext
   {\dotripleempty\dosetlayertext}
diff --git a/tex/context/base/pack-lyr.mkiv b/tex/context/base/pack-lyr.mkiv
index 768b1e0c9..5bb89fccf 100644
--- a/tex/context/base/pack-lyr.mkiv
+++ b/tex/context/base/pack-lyr.mkiv
@@ -13,8 +13,6 @@
 
 \writestatus{loading}{ConTeXt Packaging Macros / Layers}
 
-%D This module is now etex dependent.
-
 % todo : first / last / next / +... => page key
 %        test on left/right box when no doublesided option given
 %        use \ifcsname instead of doifvalue
@@ -36,8 +34,6 @@
 %D will go in. This means that we can move an overlay from one
 %D background to the other using the dimensions of the parent.
 
-%D ! ! ! ! to be documented ! ! ! !
-
 \ifx\undefined\defineoverlay \message{loaded to early} \wait \fi
 
 \def\defineoverlay
@@ -45,7 +41,7 @@
 
 \def\dodefineoverlay[#1][#2][#3]% overlay [layer] content
   {\ifthirdargument
-     \writestatus{BEWARE}{This (overlay definition) has changed!}% temp
+    %\writestatus{BEWARE}{This (overlay definition) has changed!}% temp
      \def\docommand##1{\setvalue{\??ov##1}{\setlayer[#2]{\executedefinedoverlay{##1}{#3}}}}
    \else
      \def\docommand##1{\setvalue{\??ov##1}{\executedefinedoverlay{##1}{#2}}}%
@@ -95,10 +91,10 @@
    \defineoverlay[#1][\composedlayer{#1}]}
 
 \def\dopresetlayerbox#1%
-  {\ifundefined{\@@layerbox#1}%
-     \expandafter\newbox\csname\@@layerbox#1\endcsname
-   \else
+  {\ifcsname\@@layerbox#1\endcsname
      \resetlayer[#1]%
+   \else
+     \expandafter\newbox\csname\@@layerbox#1\endcsname
    \fi}
 
 %D \macros
@@ -155,36 +151,35 @@
 
 \def\dodosetlayer[#1][#2][#3]% #2 = links/rechts
   {\bgroup
-   \recalculatebackgrounds
-   \recalculatelogos
+   \recalculatebackgrounds % brrr
    \global\advance\currentlayerdata\plusone
    \forgetall
    \dontcomplain
    \doifvalue{\??ll#1\c!option}\v!test\tracelayerstrue
    \iftracelayers\traceboxplacementtrue\fi
-   \dowithnextbox % sneller als aparte macro
-     {\ifcsname\@@layerbox#1\endcsname % nb: odd/even discard, left/right not
-        \edef\@@layerloc{#2}%
-        \ifx\@@layerloc\v!even
-          \ifodd\realpageno
-          %  discard nextbox
-          \else
-            \dododosetlayer[#1][\v!left][#3]%
-          \fi
-        \else\ifx\@@layerloc\v!odd
-          \ifodd\realpageno
-            \dododosetlayer[#1][\v!right][#3]%
-          %\else
-          %  discard nextbox
-          \fi
-        \else
-          \dododosetlayer[#1][#2][#3]%
-        \fi\fi
-      \else
-        \writestatus{layer}{unknown layer #1}%
-      \fi
-      \egroup}%
-     \hbox}
+   \dowithnextbox{\dodosetlayerindeed{#1}{#2}{#3}\egroup}\hbox}
+
+\def\dodosetlayerindeed#1#2#3% #2 = links/rechts
+  {\ifcsname\@@layerbox#1\endcsname % nb: odd/even discard, left/right not
+     \edef\@@layerloc{#2}%
+     \ifx\@@layerloc\v!even
+       \ifodd\realpageno
+       %  discard nextbox
+       \else
+         \dododosetlayer[#1][\v!left][#3]%
+       \fi
+     \else\ifx\@@layerloc\v!odd
+       \ifodd\realpageno
+         \dododosetlayer[#1][\v!right][#3]%
+      %\else
+       %  discard nextbox
+       \fi
+     \else
+       \dododosetlayer[#1][#2][#3]%
+     \fi\fi
+   \else
+     \writestatus{layer}{unknown layer #1}%
+   \fi}
 
 \newbox\layerbox
 
@@ -219,7 +214,7 @@
 \def\dodefinelayerpreset[#1][#2]%
   {\doifassignmentelse{#2}
      {\setvalue{\??ll\??ll#1}{\dopresetlayer{#2}}}
-     {\setvalue{\??ll\??ll#1}{\getvalue{\??ll\??ll#2}}}}
+     {\setvalue{\??ll\??ll#1}{\csname\??ll\??ll#2\endcsname}}}
 
 \def\dopresetlayer#1#2#3% #1=list #2=tag #3=list
   {\getparameters[\??ll#2][#1,#3]}
@@ -242,34 +237,24 @@
    \layerheight\@@layerysiz
    % preroll
    \getparameters[\??ll\currentlayer][#3]%
-   % presets and real roll
-% maybe todo:
-% \doif{\layerparameter\c!method}\v!fit
-%   {\@@layerxsiz\thelayerwidth \currentlayer
-%    \@@layerysiz\thelayerheight\currentlayer
-%    \layerwidth \@@layerxsiz
-%    \layerheight\@@layerysiz
-%    }%
-   % etc
-   \executeifdefined{\??ll\??ll\layerparameter\c!preset}\gobbletwoarguments\currentlayer{#3}%
-   % that was real slow
+   %
+   % \executeifdefined{\??ll\??ll\layerparameter\c!preset}\gobbletwoarguments\currentlayer{#3}%
+   %
+   \edef\@@currentlayerpreset{\layerparameter\c!preset}%
+   \ifcsname\??ll\??ll\@@currentlayerpreset\endcsname\csname\??ll\??ll\@@currentlayerpreset\endcsname\currentlayer{#3}\fi
+   %
    \doif{\layerparameter\c!position}\v!overlay  % slow, use \dosetvalue instead
      {\getparameters[\??ll\currentlayer][\c!width=\zeropoint,\c!height=\zeropoint,\c!position=\v!yes]}%
-   \doifsomething{\layerparameter\c!rotation}
-     {\setbox\nextbox\hbox
-        {\rotate % to be checked with new rotation
-           [\c!location=\v!high,\c!rotation=\layerparameter\c!rotation]
-           {\flushnextbox}}}%
+   \doifsomething{\layerparameter\c!rotation}% todo: use direct lowlevel call
+     {\setbox\nextbox\hbox{\rotate[\c!location=\v!high,\c!rotation=\layerparameter\c!rotation]{\flushnextbox}}}%
    % no, not local
    % \@@layerxsiz\layerparameter\c!width
    % \@@layerysiz\layerparameter\c!height
    % never change that
    \@@layerxpos\layerparameter\c!x
    \@@layerypos\layerparameter\c!y
-   \doifelse{\layerparameter\c!hoffset}\v!max
-     {\@@layerxoff\@@layerxsiz}{\@@layerxoff\layerparameter\c!hoffset}%
-   \doifelse{\layerparameter\c!voffset}\v!max
-     {\@@layeryoff\@@layerysiz}{\@@layeryoff\layerparameter\c!voffset}%
+   \doifelse{\layerparameter\c!hoffset}\v!max{\@@layerxoff\@@layerxsiz}{\@@layerxoff\layerparameter\c!hoffset}%
+   \doifelse{\layerparameter\c!voffset}\v!max{\@@layeryoff\@@layerysiz}{\@@layeryoff\layerparameter\c!voffset}%
    % dx/dy are internal context ones and can be used in preset
    \advance\@@layerxoff\dimexpr\layerparameter\c!offset+\layerparameter\c!dx\relax
    \advance\@@layeryoff\dimexpr\layerparameter\c!offset+\layerparameter\c!dy\relax
@@ -277,47 +262,30 @@
    \@@layerypos\layerparameter\c!sy\@@layerypos
    \@@layerxoff\layerparameter\c!sx\@@layerxoff
    \@@layeryoff\layerparameter\c!sy\@@layeryoff
-   \doifelse{\layerparameter\c!position}\v!yes   % combine ^
-     {\setlastlayerpos{#2\currentlayer}% todo l/r %%%%%%%%%%%%
-      \@@layerxpos\lastlayerxpos
-      \@@layerypos\lastlayerypos
-      \letgvalue{\??ll\currentlayer\layerpage\c!position}\v!yes
-      \letgvalue{\??ll\currentlayer\c!state}\v!start % needed ?
-      \setbox\layerbox\vbox to \@@layerysiz
-        {\hbox to \@@layerxsiz{\xypos{lyr:\the\currentlayerdata}\hss}\vss}}
-     {\setbox\layerbox\emptybox
-      \globallet\lastlayerxpos\!!zeropoint
-      \globallet\lastlayerypos\!!zeropoint
-      \ExpandBothAfter\doifinset\v!bottom{\layerparameter\c!corner}
-        {\ifnum\layerparameter\c!line=\zerocount\else % can be < 0
-           \setevalue{\??ll\currentlayer\c!line}%
-             {\the\numexpr-\layerparameter\c!line+\layoutlines+\plusone\relax}%
-         \fi
-         \ifdim\@@layerysiz>\zeropoint
-           \advance\@@layerypos-\@@layerysiz
-           \@@layerypos-\@@layerypos
-           \@@layeryoff-\@@layeryoff
-         \fi}%
-      \ExpandBothAfter\doifinset\v!right{\layerparameter\c!corner}
-        {\ifnum\layerparameter\c!column=\zerocount\else % can be < 0
-           \setevalue{\??ll\currentlayer\c!column}%
-             {\the\numexpr-\layerparameter\c!column+\layoutcolumns+\plusone\relax}%
-         \fi
-         \ifdim\@@layerxsiz>\zeropoint
-           \advance\@@layerxpos-\@@layerxsiz
-           \@@layerxpos-\@@layerxpos
-           \@@layerxoff-\@@layerxoff
-         \fi}%
-      \ExpandBothAfter\doif\v!middle{\layerparameter\c!corner}
-        {\ifdim\@@layerxsiz>\zeropoint \advance\@@layerxpos.5\@@layerxsiz \fi
-         \ifdim\@@layerysiz>\zeropoint \advance\@@layerypos.5\@@layerysiz \fi}%
-      \edef\layerpage{\layerparameter\c!page}}%
-   \doifsomething\layerpage
-     {\edef\layerpage{:\layerpage}%
-      \doifundefined{\@@layerbox#2\currentlayer\layerpage}
-        {\global\expandafter\newbox\csname\@@layerbox#2\currentlayer\layerpage\endcsname}}%
-   \dontcomplain % more comfortable
-   \mathchardef\layerpagebox\csname\@@layerbox#2\currentlayer\layerpage\endcsname
+   \edef\@@currentlayerposition{\layerparameter\c!position}%
+   \ifx\@@currentlayerposition\v!yes   % combine ^
+     \setlastlayerpos{#2\currentlayer}% sets \layerpage; todo l/r %%%%%%%%%%%%
+     \@@layerxpos\lastlayerxpos
+     \@@layerypos\lastlayerypos
+     \letgvalue{\??ll\currentlayer\layerpage\c!position}\v!yes
+     \letgvalue{\??ll\currentlayer\c!state}\v!start % needed ?
+     \setbox\layerbox\vbox to \@@layerysiz{\hbox to \@@layerxsiz{\xypos{lyr:\the\currentlayerdata}\hss}\vss}%
+   \else
+     \setbox\layerbox\emptybox
+     \globallet\lastlayerxpos\!!zeropoint
+     \globallet\lastlayerypos\!!zeropoint
+     \normalexpanded{\noexpand\doifinset{\v!bottom}{\layerparameter\c!corner}}\dosetlayerbottompositions
+     \normalexpanded{\noexpand\doifinset{\v!right }{\layerparameter\c!corner}}\dosetlayerrightpositions
+     \normalexpanded{\noexpand\doifinset{\v!middle}{\layerparameter\c!corner}}\dosetlayermiddlepositions
+     \edef\layerpage{\layerparameter\c!page}%
+   \fi
+   \ifx\layerpage\empty \else % is expanded
+     \edef\layerpage{:\layerpage}%
+     \ifcsname\@@layerbox#2\currentlayer\layerpage\endcsname \else
+       \expandafter\newbox\csname\@@layerbox#2\currentlayer\layerpage\endcsname
+     \fi
+   \fi
+   \chardef\layerpagebox\csname\@@layerbox#2\currentlayer\layerpage\endcsname
    \ifvoid\layerpagebox
      \gsetboxllx\layerpagebox\zeropoint
      \gsetboxlly\layerpagebox\zeropoint
@@ -368,8 +336,7 @@
         \advance\scratchdimen\nextboxwd
         \nextboxwd\ifdim\scratchdimen>\lastlayerwidth \scratchdimen \else \lastlayerwidth \fi
       \fi
-      \scratchdimen\@@layerypos
-      \advance\scratchdimen\@@layeryoff
+      \scratchdimen\dimexpr\@@layerypos+\@@layeryoff\relax
       \ifdim\scratchdimen<\getboxlly\layerpagebox
         \gsetboxlly\layerpagebox\scratchdimen
       \fi
@@ -398,6 +365,30 @@
    % to be placed; never change this !
    \ifvoid\layerbox\else\box\layerbox\fi}
 
+\def\dosetlayerbottompositions
+  {\ifnum\layerparameter\c!line=\zerocount\else % can be < 0
+     \setevalue{\??ll\currentlayer\c!line}{\the\numexpr-\layerparameter\c!line+\layoutlines+\plusone\relax}%
+   \fi
+   \ifdim\@@layerysiz>\zeropoint
+     \advance\@@layerypos-\@@layerysiz
+     \@@layerypos-\@@layerypos
+     \@@layeryoff-\@@layeryoff
+   \fi}
+
+\def\dosetlayerrightpositions
+  {\ifnum\layerparameter\c!column=\zerocount\else % can be < 0
+     \setevalue{\??ll\currentlayer\c!column}{\the\numexpr-\layerparameter\c!column+\layoutcolumns+\plusone\relax}%
+   \fi
+   \ifdim\@@layerxsiz>\zeropoint
+     \advance\@@layerxpos-\@@layerxsiz
+     \@@layerxpos-\@@layerxpos
+     \@@layerxoff-\@@layerxoff
+   \fi}
+
+\def\dosetlayermiddlepositions
+  {\ifdim\@@layerxsiz>\zeropoint \advance\@@layerxpos.5\@@layerxsiz \fi
+   \ifdim\@@layerysiz>\zeropoint \advance\@@layerypos.5\@@layerysiz \fi}
+
 %D Given the task to be accomplished, the previous macro is
 %D not even that complicated. It mainly comes down to skipping
 %D to the right place and placing a box on top of or below the
@@ -406,16 +397,17 @@
 
 %D \macros
 %D  {doifelselayerdata}
-%D
 
 \def\doifelselayerdata#1%
-  {\ifundefined{\@@layerbox#1}%
-     \@EA\secondoftwoarguments
-   \else\ifvoid\csname\@@layerbox#1\endcsname
-     \@EAEAEA\secondoftwoarguments
+  {\ifcsname\@@layerbox#1\endcsname
+     \ifvoid\csname\@@layerbox#1\endcsname
+       \@EAEAEA\secondoftwoarguments
+     \else
+       \@EAEAEA\firstoftwoarguments
+     \fi
    \else
-     \@EAEAEA\firstoftwoarguments
-   \fi\fi}
+     \@EA\secondoftwoarguments
+   \fi}
 
 %D \macros
 %D  {flushlayer}
@@ -427,95 +419,127 @@
 
 % todo: setups before flush, handy hook
 
-\unexpanded\def\flushlayer[#1]%
-  {\doifelsevalue{\??ll#1\c!state}\v!next
-     {\global\letvalue{\??ll#1\c!state}\v!start} % dangerous, stack-built-up
-     {\doifelsevalue{\??ll#1\c!state}\v!continue
-        {\global\letvalue{\??ll#1\c!state}\v!repeat} % dangerous, stack-built-up
-        {\doifelsevalue{\??ll#1\c!doublesided}\v!yes
-           {\doifundefinedelse{\@@layerbox#1}%
-              {\dodoflushlayerA[#1]}
-              {\doifbothsidesoverruled
-                 {\dodoflushlayerB\v!left [#1]}%  left
-                 {\dodoflushlayerB\v!right[#1]}% right
-                 {\dodoflushlayerB\v!left [#1]}}}%  left
-           {\dodoflushlayerA[#1]}}}}
-
-\def\dodoflushlayerA[#1]%
-  {\doifnotvalue{\??ll#1\c!state}\v!stop
-     {\startoverlay
-        {\dodoflushlayer1{#1}{#1}}
-        {\dodoflushlayer0{#1}{#1:\realfolio}}
-      \stopoverlay}}
-
-\def\dodoflushlayerB#1[#2]%
-  {\doifnotvalue{\??ll#2\c!state}\v!stop
-     {\startoverlay
-        {\dodoflushlayer1{#2}{#2}}
-        {\dodoflushlayer0{#2}{#2:\realfolio}}
-        {\dodoflushlayer1{#2}{#1#2}}
-        {\dodoflushlayer0{#2}{#1#2:\realfolio}}
-      \stopoverlay}}
-
-\def\dodoflushlayer#1#2#3%
-  {\ifundefined{\@@layerbox#3}%
-     \ifcase#1\else\writestatus{layer}{unknown layer #3}\fi
+% \unexpanded\def\flushlayer[#1]%
+%   {\doifelsevalue{\??ll#1\c!state}\v!next
+%      {\global\letvalue{\??ll#1\c!state}\v!start} % dangerous, stack-built-up
+%      {\doifelsevalue{\??ll#1\c!state}\v!continue
+%         {\global\letvalue{\??ll#1\c!state}\v!repeat} % dangerous, stack-built-up
+%         {\doifelsevalue{\??ll#1\c!doublesided}\v!yes
+%            {\doifundefinedelse{\@@layerbox#1}%
+%               {\dodoflushlayerA[#1]}
+%               {\doifbothsidesoverruled
+%                  {\dodoflushlayerB\v!left [#1]}%  left
+%                  {\dodoflushlayerB\v!right[#1]}% right
+%                  {\dodoflushlayerB\v!left [#1]}}}%  left
+%            {\dodoflushlayerA[#1]}}}}
+
+\unexpanded\def\flushlayer[#1]% quite core, so optimized
+  {\begingroup
+   \forgetall
+   \edef\currentlayer{#1}%
+   \edef\@@currentlayerstate{\csname\??ll\currentlayer\c!state\endcsname}%
+   \ifx\@@currentlayerstate\v!stop
+     % nothing
+   \else\ifx\@@currentlayerstate\v!next
+     \global\expandafter\let\csname\??ll\currentlayer\c!state\endcsname\v!start  % dangerous, stack-built-up
+   \else\ifx\@@currentlayerstate\v!continue
+     \global\expandafter\let\csname\??ll\currentlayer\c!state\endcsname\v!repeat % dangerous, stack-built-up
    \else
-     \bgroup
-     \forgetall
-     \offinterlineskip
-     % needed because we need to handle method
-     \executeifdefined{\??ll\??ll\getvalue{\??ll#2\c!preset}}\gobbletwoarguments{#2}{}%
-     %
-     \doifvalue{\??ll#2\c!option}\v!test\tracelayerstrue
-     \iftracelayers\traceboxplacementtrue\fi
-     \!!doneafalse
-     \!!donebfalse
-     \doifvalue{\??ll#2\c!method}\v!overlay\!!doneatrue
-     \doifvalue{\??ll#2\c!method}\v!fit\!!donebtrue
-     \!!donectrue
-     \ifcase#1\else
-       \doifnotvalue{\??ll#2\c!position}\v!yes
-         {\doifvalue{\??ll#2\c!repeat}\v!yes\!!donecfalse
-          \doifvalue{\??ll#2\c!state}\v!repeat\!!donecfalse}%
-     \fi
-     \mathchardef\layerbox\csname\@@layerbox#3\endcsname
-     % we need to copy in order to retain the negative offsets for a next
-     % stage of additions, i.e. llx/lly accumulate in repeat mode and the
-     % compensation may differ each flush depending on added content
-     \setbox\nextbox \if!!doneb
-%        \vbox
-%          {\scratchdimen\getboxlly\layerbox
-%           \vskip-\scratchdimen
-%           \scratchdimen\getboxllx\layerbox
-%           \hskip-\scratchdimen
-%           \advance\scratchdimen-\wd\layerbox
-%           \hsize-\scratchdimen
-%           \if!!donec\box\else\copy\fi\layerbox}%
-       \vbox
-         {\vskip-\getboxlly\layerbox
-          \hskip-\getboxllx\layerbox
-          \hsize-\dimexpr\getboxllx\layerbox-\wd\layerbox\relax
-          \if!!donec\box\else\copy\fi\layerbox}%
+     \edef\@@currentlayerdoublesided{\csname\??ll\currentlayer\c!doublesided\endcsname}%
+     \ifx\@@currentlayerdoublesided\v!yes
+       \ifcsname\@@layerbox#1\endcsname
+         % we can make a dedicated one for this
+         \doifbothsidesoverruled{\dodoflushlayerB\v!left}{\dodoflushlayerB\v!right}{\dodoflushlayerB\v!left}%
+       \else
+         \dodoflushlayerA
+       \fi
      \else
-        \if!!donec\box\else\copy\fi\layerbox % sorry for the delay due to copying
+        \dodoflushlayerA
      \fi
-     % todo: method=offset => overlayoffset right/down (handy for backgrounds with offset)
-     \iftracelayers \ruledvbox \else \vbox \fi \if!!donea to \overlayheight \fi
-       {\hbox \if!!donea to \overlaywidth \fi
-          {% klopt dit? #3 en niet #2 ?
-           \doifvalue{\??ll#3\realfolio\c!position}\v!yes{\xypos{lyr:#3:\realfolio}}%
-           \doifoverlayelse{#3}
-             {\box\nextbox}
-             {\startlayoutcomponent{l:#3}{layer #3}\box\nextbox\stoplayoutcomponent}%
-           \hss}%
-        \vss}%
-     \if!!donec
-       \gsetboxllx\layerbox\zeropoint
-       \gsetboxlly\layerbox\zeropoint
+   \fi\fi\fi
+   \endgroup}
+
+%  \ifcase#1\else\writestatus{layer}{unknown layer #3}\fi
+
+\def\dodoflushlayerA
+  {\startoverlay
+     {\ifcsname\@@layerbox\currentlayer           \endcsname\dodoflushlayer\plusone   \currentlayer            \fi}%
+     {\ifcsname\@@layerbox\currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount{\currentlayer:\realfolio}\fi}%
+   \stopoverlay}
+
+\def\dodoflushlayerB#1%
+  {\startoverlay
+     {\ifcsname\@@layerbox  \currentlayer           \endcsname\dodoflushlayer\plusone     \currentlayer            \fi}%
+     {\ifcsname\@@layerbox  \currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount  {\currentlayer:\realfolio}\fi}%
+     {\ifcsname\@@layerbox#1\currentlayer           \endcsname\dodoflushlayer\plusone  {#1\currentlayer           }\fi}%
+     {\ifcsname\@@layerbox#1\currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount{#1\currentlayer:\realfolio}\fi}%
+   \stopoverlay}
+
+\def\dodoflushlayer#1#2% quite core, so optimized
+  {\begingroup % already grouped
+   \offinterlineskip
+   \edef\@@currentlayermethod{\csname\??ll\currentlayer\c!method\endcsname}%
+   \edef\@@currentlayeroption{\csname\??ll\currentlayer\c!option\endcsname}%
+   % needed because we need to handle method but we should find a way to
+   % speed this up
+   \edef\@@currentlayerpreset{\csname\??ll\currentlayer\c!preset\endcsname}%
+   \ifcsname\??ll\??ll\@@currentlayerpreset\endcsname\csname\??ll\??ll\@@currentlayerpreset\endcsname\currentlayer{}\fi
+   %
+   \ifx\@@currentlayeroption\v!test
+     \tracelayerstrue
+   \fi
+   \iftracelayers
+     \traceboxplacementtrue
+   \fi
+   \!!doneafalse
+   \!!donebfalse
+   \ifx\@@currentlayermethod\v!overlay\!!doneatrue\fi
+   \ifx\@@currentlayermethod\v!fit    \!!donebtrue\fi
+   \!!donectrue
+   \ifcase#1\else
+     \edef\@@currentlayerposition{\csname\??ll\currentlayer\c!position\endcsname}%
+     \ifx\@@currentlayerposition\v!yes
+       \edef\@@currentlayerrepeat{\csname\??ll\currentlayer\c!repeat\endcsname}%
+     % \edef\@@currentlayerstate {\csname\??ll\currentlayer\c!state\endcsname}% actually this is already set
+       \ifx\@@currentlayerrepeat\v!yes
+         \!!donecfalse
+       \else\ifx\@@currentlayerstate\v!repeat
+         \!!donecfalse
+       \fi\fi
      \fi
-     \egroup
-   \fi}
+   \fi
+   \chardef\layerbox\csname\@@layerbox#2\endcsname % mathchardef no longer needed can be chardef or just let
+%    \chardef\layerbox\csname\@@layerbox\currentlayer\endcsname % mathchardef no longer needed can be chardef or just let
+   % we need to copy in order to retain the negative offsets for a next
+   % stage of additions, i.e. llx/lly accumulate in repeat mode and the
+   % compensation may differ each flush depending on added content
+   \setbox\nextbox
+     \if!!doneb
+       \therepositionededlayerbox
+     \else
+       \if!!donec\box\else\copy\fi\layerbox % sorry for the delay due to copying
+     \fi
+   % todo: method=offset => overlayoffset right/down (handy for backgrounds with offset)
+   \doifoverlayelse{#2}{\setlayoutcomponentattribute\v!layer{#2}}\resetlayoutcomponentattribute
+   \iftracelayers \ruledvbox \else \vbox \fi \if!!donea to \overlayheight \fi \layoutcomponentboxattribute
+     {\hbox \if!!donea to \overlaywidth \fi
+        {\edef\@@currentlayerpageposition{\csname\??ll#2\realfolio\c!position\endcsname}%
+         \ifx\@@currentlayerpageposition\v!yes\xypos{lyr:#2:\realfolio}\fi
+         \box\nextbox
+         \hss}%
+      \vss}%
+   \if!!donec
+     \gsetboxllx\layerbox\zeropoint
+     \gsetboxlly\layerbox\zeropoint
+   \fi
+   \endgroup}
+
+\def\therepositionededlayerbox % assumes that \if!!donec is set (todo: use dedicated flags)
+  {\vbox
+     {\vskip-\getboxlly\layerbox
+      \hskip-\getboxllx\layerbox
+      \hsize-\dimexpr\getboxllx\layerbox-\wd\layerbox\relax
+      \if!!donec\box\else\copy\fi\layerbox}}
 
 % \definelayer[test][method=fit] \setupcolors[state=start] \tracelayerstrue
 %
@@ -550,7 +574,7 @@
 %D needed as well).
 
 \def\doresetlayer#1%
-  {\ifundefined{\@@layerbox#1}\else
+  {\ifcsname\@@layerbox#1\endcsname
      \global\setbox\csname\@@layerbox#1\endcsname\emptybox
    \fi}
 
@@ -599,8 +623,7 @@
 \def\MPlayerheight{\vsize}
 
 \def\dosetMPlayer[#1][#2][#3]%
-  {\checkpositions % new, else only support after \starttext
-   \edef\MPlayerwidth {\MPw{#2}}%
+  {\edef\MPlayerwidth {\MPw{#2}}%
    \edef\MPlayerheight{\MPh{#2}}%
    \setlayer[#1][\c!x=\MPx{#2},\c!y=\MPy{#2},\c!position=\v!no,#3]}
 
@@ -613,12 +636,12 @@
       \c!frame=\v!off,
       \c!offset=\v!overlay,#2]}
 
-% Some day this (old) mechanism will be combined/integrated
-% in overlays
+% The next mechanism is obsolete and will be removed in \MKIV\ (or move to
+% the compatibility module.
 
-\newskip\xposition  \newskip\yposition
-\newskip\xdimension \newskip\ydimension
-\newskip\xoffset    \newskip\yoffset
+% \newskip\xposition  \newskip\yposition
+% \newskip\xdimension \newskip\ydimension
+% \newskip\xoffset    \newskip\yoffset
 
 % already defined \newbox\positionbox
 
diff --git a/tex/context/base/pack-obj.lua b/tex/context/base/pack-obj.lua
index 3256b3702..ce1c520ce 100644
--- a/tex/context/base/pack-obj.lua
+++ b/tex/context/base/pack-obj.lua
@@ -11,7 +11,7 @@ if not modules then modules = { } end modules ['pack-obj'] = {
 reusable components.
 --ldx]]--
 
-local texsprint = tex.sprint
+local texsprint, texcount = tex.sprint, tex.count
 
 jobobjects           = jobobjects or { }
 jobobjects.collected = jobobjects.collected or { }
diff --git a/tex/context/base/pack-obj.mkiv b/tex/context/base/pack-obj.mkiv
index 6c1e54758..562b15e94 100644
--- a/tex/context/base/pack-obj.mkiv
+++ b/tex/context/base/pack-obj.mkiv
@@ -19,6 +19,170 @@
 
 \registerctxluafile{pack-obj}{1.001}
 
+% \startluacode
+% local texbox, texdimen, texcount, texwrite = tex.box, tex.dimen, tex.count, tex.write
+% local pdfxform, pdfrefxform = pdf.xform, pdf.refxform
+%
+% function pdf.xform   (l) texbox["objectbox"] = nil return l end
+% function pdf.refxform(l) return node.copy_list(l) end
+%
+% backends.codeinjections.register = pdf.xform
+% backends.codeinjections.restore  = pdf.refxform
+%
+% local codeinjections = backends.codeinjections
+%
+% objects = objects or { }
+%
+% local data = { }
+%
+% objects.data = data
+% objects.n    = 0
+%
+% function objects.register(name)
+%     objects.n = objects.n + 1
+%     local list = texbox.objectbox
+%     nodes.process_page(list)
+%     data[name] = {
+%         codeinjections.restore(list),
+%         texdimen.objectwd,
+%         texdimen.objectht,
+%         texdimen.objectdp,
+%         texdimen.objectoff,
+%     }
+% end
+%
+% function objects.restore(name)
+%     local d = data[name]
+%     if d then
+%         texbox  .objectbox = codeinjections.restore(d[1])
+%         texdimen.objectwd  = d[2]
+%         texdimen.objectht  = d[3]
+%         texdimen.objectdp  = d[4]
+%         texdimen.objectoff = d[5]
+%     else
+%         texbox  .objectbox = nil
+%         texdimen.objectwd  = 0
+%         texdimen.objectht  = 0
+%         texdimen.objectdp  = 0
+%         texdimen.objectoff = 0
+%     end
+% end
+%
+% function objects.reference(name)
+%     local d = data[name]
+%     texwrite((d and d[1]) or 0)
+% end
+%
+% function objects.enhance(name)
+%     local d = data[name]
+%     if d then
+%         d[6] = texcount.realpageno
+%     end
+% end
+%
+% function objects.page(name)
+%     local d = data[name]
+%     texwrite((d and d[6]) or texcount.realpageno)
+% end
+%
+% function objects.doifelse(name)
+%     commands.testcase(data[name])
+% end
+% \stopluacode
+%
+% \newbox  \objectbox
+% \newtoks \everyobject
+% \newif   \ifinobject
+%
+% \newdimen\objectoff  \def\objectmargin{\the\objectoff}
+% \newdimen\objectwd   \def\objectwidth {\the\objectwd }
+% \newdimen\objectht   \def\objectheight{\the\objectht }
+% \newdimen\objectdp   \def\objectdepth {\the\objectdp }
+%
+% \def\objectoffset{1cm}
+%
+% \everyobject{\the\everyPDFxform}
+%
+% \let\doresetobjects\relax
+%
+% \def\setobject     #1#2{\begingroup\objectoff\objectoffset\inobjecttrue\the\everyobject\dowithnextbox{\dosetobject{#1}{#2}}}
+% \def\settightobject#1#2{\begingroup\objectoff\zeropoint   \inobjecttrue\the\everyobject\dowithnextbox{\dosetobject{#1}{#2}}}
+%
+% \let\objectsetvbox\vbox  %\def\objectsetvbox{\ruledvbox}
+% \let\objectgetvbox\vbox  %\def\objectgetvbox{\ruledvbox}
+% \let\objectsethbox\hbox  %\def\objectsethbox{\ruledhbox}
+% \let\objectgethbox\hbox  %\def\objectgethbox{\ruledhbox}
+%
+% \def\dosetobject#1#2%
+%   {\objectwd\wd\nextbox
+%    \objectht\ht\nextbox
+%    \objectdp\dp\nextbox
+%    \ifdim\objectoff=\zeropoint\relax
+%      \setbox\objectbox\box\nextbox
+%    \else
+%      \setbox\objectbox\objectsetvbox spread 2\objectoff{\vss\objectsethbox spread 2\objectoff{\hss\flushnextbox\hss}\vss}%
+%    \fi
+%    \ctxlua{objects.register("#1::#2")}%
+%    \endgroup}
+%
+% \def\getobject#1#2%
+%   {\begingroup
+%    \ctxlua{objects.restore("#1::#2")}%
+%    \ifdim\objectoff=\zeropoint\relax \else
+%      \setbox\objectbox\objectgetvbox to \dimexpr\objectht+\objectdp\relax
+%        {\vss\objectgethbox to \objectwd{\hss\box\objectbox\hss}\vss}%
+%      \wd\objectbox\objectwd
+%      \ht\objectbox\objectht
+%      \dp\objectbox\objectdp
+%    \fi
+%    \box\objectbox
+%    \endgroup}
+%
+% \def\getpageobject#1#2%
+%   {\begingroup
+%    \ctxlua{objects.restore("#1::#2")}%
+%    \ifdim\objectoff=\zeropoint\relax
+%       \setbox\objectbox\objectgethbox{\ctxlatelua{objects.enhance("#1::#2")}\box\objectbox}
+%    \else
+%      \setbox\objectbox\objectgetvbox to \dimexpr\objectht+\objectdp\relax
+%        {\vss\objectgethbox to \objectwd{\ctxlatelua{objects.enhance("#1::#2")}\hss\box\objectbox\hss}\vss}%
+%      \wd\objectbox\objectwd
+%      \ht\objectbox\objectht
+%      \dp\objectbox\objectdp
+%    \fi
+%    \box\objectbox
+%    \endgroup}
+%
+% \def\setobjectdirectly           #1#2{\ctxlua{objects.register("#1::#2")}}
+% \def\getobjectdirectly           #1#2{\ctxlua{objects.restore ("#1::#2")}}
+% \def\getobjectdimensions         #1#2{\ctxlua{objects.restore ("#1::#2")}}
+% \def\doifobjectfoundelse         #1#2{\ctxlua{objects.doifelse("#1::#2")}}
+% \def\doifobjectreferencefoundelse#1#2{\ctxlua{objects.doifelse("#1::#2")}}
+%
+% \let\objectreferenced\relax
+% \let\driverreferenced\relax
+%
+% \def\doregisterobjectreference{\writestatus{objects}{obsolete: register object reference}\gobblethreearguments}
+% \def\dooverloadobjectreference{\writestatus{objects}{obsolete: overload object reference}\gobblethreearguments}
+% \def\dosetobjectreference     {\writestatus{objects}{obsolete: set      object reference}\gobblethreearguments}
+% \def\dosetdriverreference     {\writestatus{objects}{obsolete: set      driver reference}\gobblethreearguments}
+%
+% \def\defaultobjectreference{0}
+% \def\defaultobjectpage     {\realfolio}
+%
+% \def\dogetobjectreference    #1#2#3{\xdef#3{\ctxlua{objects.reference("#1::#2)}}}
+% \def\dogetobjectreferencepage#1#2#3{\xdef#3{\ctxlua{objects.page("#1::#2))}}}
+%
+% \protect
+%
+% \starttext
+%     test \setobject{a}{b}\ruledhbox{xxx}\getobject{a}{b} test
+%     \vskip3cm
+%     test \settightobject{a}{b}\ruledhbox{xxx}\getobject{a}{b} test
+%     test \settightobject{a}{c}\ruledhbox{xxx}\getobject{a}{c} test
+%     \dorecurse{5000}{test \setobject{a}{b}\ruledhbox{xxx}\getobject{a}{b} test }
+% \stoptext
+
 %D \macros
 %D   {setobject,getobject,ifinobject}
 %D
@@ -63,7 +227,7 @@
    \fi}
 
 \def\dosetobject#1#2#3% \initializepaper this will move to \everyshipout
-  {\initializepaper
+  {% \initializepaper
    \ifcsname\r!object#2::#3\endcsname
      \expandafter\gobblefivearguments
    \else % tzt, overload internal referenced objects to save entries
@@ -125,7 +289,7 @@
    \csname\r!object#1::#2\endcsname}
 
 \def\dogetobject#1#2#3#4#5#6#7% don't change this, should work for dvi & pdf
-  {\initializepaper
+  {% \initializepaper
    \forgetall
    \dontshowcomposition
    \setbox\scratchbox\vbox
diff --git a/tex/context/base/pack-rul.lua b/tex/context/base/pack-rul.lua
index 11995bfed..6bbd3c856 100644
--- a/tex/context/base/pack-rul.lua
+++ b/tex/context/base/pack-rul.lua
@@ -7,36 +7,47 @@ if not modules then modules = { } end modules ['pack-rul'] = {
 }
 
 --[[ldx--
-An explanation is given in mk.pdf.
+An explanation is given in the history document mk.
 --ldx]]--
 
+local texdimen, texcount, texbox, texwd = tex.dimen, tex.count, tex.box, tex.wd
+local hpack, free, copy, traverse_id = node.hpack, node.free, node.copy_list, node.traverse_id
+
 function commands.doreshapeframedbox(n)
     local noflines, lastlinelength = 0, 0
-    if tex.wd[n] ~= 0 then
-        local hpack, free, copy = node.hpack, node.free, node.copy_list
-        local noflines, width, done = 0, 0, false
-        local list = tex.box[n].list
-        for h in node.traverse_id('hlist',list) do
-            done = true
-            local p = hpack(copy(h.list))
-            lastlinelength = p.width
-            if lastlinelength > width then
-                width = lastlinelength
+    if texwd[n] ~= 0 then
+        local list = texbox[n].list
+        if list then
+            local width, done = 0, false
+            for h in traverse_id('hlist',list) do
+                local l = h.list
+                if l then
+                    done = true
+                    local p = hpack(copy(l))
+                    lastlinelength = p.width
+                    if lastlinelength > width then
+                        width = lastlinelength
+                    end
+                    free(p)
+                end
             end
-            free(p)
-        end
-        if done then
-            if width ~= 0 then
-                for h in node.traverse_id('hlist',list) do
-                    if h.width ~= width then
-                        h.list = hpack(h.list,width,'exactly')
-                        h.width = width
+            if done then
+                if width ~= 0 then
+                    for h in traverse_id('hlist',list) do
+                        local l = h.list
+                        if l then
+                    --  if h.width ~= width then -- else no display math handling (uses shift)
+                            h.list = hpack(l,width,'exactly')
+                            h.shift = 0 -- needed for display math
+                            h.width = width
+                    --  end
+                        end
                     end
                 end
+                texwd[n] = width
             end
-            tex.wd[n] = width
         end
     end
-    tex.dimen["framedlastlength"] = lastlinelength
-    tex.count["framednoflines"]   = noflines
+    texdimen["framedlastlength"] = lastlinelength
+    texcount["framednoflines"]   = noflines
 end
diff --git a/tex/context/base/pack-rul.mkii b/tex/context/base/pack-rul.mkii
index 042e8805d..055094547 100644
--- a/tex/context/base/pack-rul.mkii
+++ b/tex/context/base/pack-rul.mkii
@@ -2777,6 +2777,19 @@
 
 \setfalse\framedtextlocationnone
 
+\def\checkframedtext % messy dependency
+  {\ifinsidefloat
+     \localhsize\hsize
+   \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle
+   % \strut            % rather clean way to invoke the sidefloat OTR
+   % \setbox0=\lastbox % and get the widths set, so from now on we
+   % \setlocalhsize    % can have framed texts alongside sidefloats
+     \checksidefloat
+     \setlocalhsize
+   \else
+     \localhsize\hsize
+   \fi\fi}
+
 \def\dododostartframedtext[#1][#2][#3]% #3 only passed to framed, not to framedtext
   {\doifsomething{#2}{\setvalue{\??kd#1\c!location}{#2}}% does not listen to #3
    \setfalse\framedtextlocationnone
diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv
index 574175dde..26fdaadea 100644
--- a/tex/context/base/pack-rul.mkiv
+++ b/tex/context/base/pack-rul.mkiv
@@ -26,7 +26,12 @@
 \unprotect
 
 %D We have removed the rather old and out dated raster methods. They
-%D have not been used for ages.
+%D have not been used for ages. You can still find the old code in
+%D the \MKII\ counterpart of this module.
+
+%D This module is rather optimized so sometimes readability has been
+%D sacrisfied for speed. This is because the framing mechanism is used
+%D all over the place.
 
 %D \macros
 %D   {linewidth, setuplinewidth}
@@ -58,81 +63,6 @@
 
 \newdimen\ruledlinewidth \newif\ifinheritruledlinewidth
 
-% %D \TEX\ lacks support for color and even gray scales. The next
-% %D macros can provide a sort of poor mans gray scales as well
-% %D as give access to more suitable methods of rendering. Such a
-% %D method looks like:
-% %D
-% %D \starttyping
-% %D \def\methodegraybox#1#2#3#4#5#6%
-% %D   { ... }
-% %D \stoptyping
-% %D
-% %D The string \type{graybox} is a common element in the name,
-% %D so we can have for instance \type {\postscriptgraybox} or
-% %D \type {\texgraybox}. The first three arguments take a
-% %D dimension, the fourth one takes a number between~0 and~1,
-% %D and the last argument specifies a radius of the box when
-% %D rounded corners are used, so:
-% %D
-% %D \startbuffer
-% %D \dotgraybox{.5\hsize}{1cm}{0cm}{.85}{\v!no}{0pt}
-% %D \stopbuffer
-% %D
-% %D \typebuffer
-% %D
-% %D becomes:
-% %D
-% %D %\startlinecorrection
-% %D %  \vbox to 1cm{\getbuffer}
-% %D %\stoplinecorrection
-% %D
-% %D \startlinecorrection
-% %D   \unprotect
-% %D   \vbox to 1cm{\dotgraybox{.5\hsize}{1cm}{0cm}{.85}{\v!no}{0pt}}
-% %D   \protect
-% %D \stoplinecorrection
-% %D
-% %D There are two predefined methodes, one uses periods and the
-% %D other uses small rules. The second method is less
-% %D efficient, but sometimes give better results. The dimensions
-% %D of the resullting box are set to zero.
-%
-% \setvalue{\v!dot  graybox}{\processraster\symbol\rasterdot}
-% \setvalue{\v!rule graybox}{\processraster\symbol\rasterbox}
-%
-% \def\rasterdot{\rasterfont.}
-% \def\rasterbox{\hss\vrule\!!width.4pt\!!height.4pt\!!depth\zeropoint}
-%
-% %D Now of course we need:
-%
-% \ifx\rasterfont\undefined \def\rasterfont{\fivepoint} \fi
-%
-% %D We implement two pure \TEX\ based generators, that use
-% %D \type{\leaders} to quickly gerenate the gray pattern. One
-% %D should beware of \DIMENSION\ conflicts, so we use some
-% %D registers above~8. These macros are memory hungry and byte
-% %D spoiling.
-%
-% \def\processraster#1#2#3#4#5#6#7%
-%   {\bgroup
-%    \forgetall
-%    \dontcomplain
-%    \dimen10=\onepoint
-%    \dimen10=\@@rsfactor\dimen10
-%    \dimen10=#5\dimen10
-%    \setbox2\hbox to #2
-%      {\cleaders\hbox to 2\dimen10{#1\hss}\hss}%
-%    \dimen12=#3%
-%    \advance\dimen12 #4%
-% %    \setbox0\vbox to \dimen12
-%      {\cleaders\vbox to 2\dimen10{\box2\vss}\vss}%
-%    \setbox0\hbox
-%      {\hskip-.5\dimen10\lower0.5\dimen10\copy0
-%       \hskip-\wd0\hskip\dimen10\lower1.5\dimen10\box0}%
-%    \box0
-%    \egroup}
-
 %D \macros
 %D   {setupscreens}
 %D
@@ -144,25 +74,6 @@
 \def\setupscreens
   {\dodoubleargument\getparameters[\??rs]}
 
-% %D The most appropriate way to call for this feature is
-% %D using \type{\graybox}, which is defined as:
-%
-% \def\graybox{\getvalue{\@@rsmethod graybox}}
-%
-% %D We just introduced two pure \TEX\ methods for generating
-% %D rasters. However, it's far more efficient and comfortable in
-% %D terms of speed, memory usage and file size, to use a driver
-% %D supported method.
-%
-% \setvalue{\v!external graybox}{\setgraybox}
-%
-% %D For compatibility reasons we also define the original one:
-%
-% \setvalue{\v!postscript graybox}{\getvalue{\v!external graybox}}
-%
-% %D A quite valid way of letting drivers do the job, is giving
-% %D a solid rule a gray texture.
-
 %D We will communicate through module specific variables, current
 %D framed parameters and some reserved dimension registers.
 
@@ -176,13 +87,14 @@
 
 \def\dofilledbox
   {\bgroup
-   \doifelse{\framedparameter\c!backgroundcorner}\v!rectangular
-     {\dofilledlinedbox}
-     {\ifzeropt\dimexpr\framedparameter\c!backgroundradius\relax % just in case of .x\bodyfontsize
-        \dofilledlinedbox
-      \else
-        \dofilledroundbox
-      \fi}%
+   \edef\@@framedfilledmod{\framedparameter\c!backgroundcorner}%
+   \ifx\@@framedfilledmod\v!rectangular
+     \dofilledlinedbox
+   \else\ifzeropt\dimexpr\framedparameter\c!backgroundradius\relax % just in case of .x\bodyfontsize
+     \dofilledlinedbox
+   \else
+     \dofilledroundbox
+   \fi\fi
    \egroup}
 
 \def\dophantombox
@@ -197,7 +109,11 @@
 \def\dodostrokedroundbox
   {\bgroup
    \edef\ovalmod{\framedparameter\c!framecorner}%
-   \doifelse\ovalmod\v!round{\let\ovalmod\!!zerocount}{\edef\ovalmod{\number\ovalmod}}%
+   \ifx\ovalmod\v!round
+     \let\ovalmod\!!zerocount
+   \else
+     \edef\ovalmod{\number\ovalmod}%
+   \fi
    \edef\ovalwid{\the\frameddimenwd}%
    \edef\ovalhei{\the\frameddimenht}%
    \edef\ovaldep{\the\frameddimendp}%
@@ -212,7 +128,11 @@
 \def\dofilledroundbox
   {\bgroup
    \edef\ovalmod{\framedparameter\c!backgroundcorner}%
-   \doifelse\ovalmod\v!round{\let\ovalmod\!!zerocount}{\edef\ovalmod{\number\ovalmod}}%
+   \ifx\ovalmod\v!round
+     \let\ovalmod\!!zerocount
+   \else
+     \edef\ovalmod{\number\ovalmod}%
+   \fi
    \edef\ovalwid{\the\frameddimenwd}%
    \edef\ovalhei{\the\frameddimenht}%
    \edef\ovaldep{\the\frameddimendp}%
@@ -387,6 +307,7 @@
 
 \long\def\executedefinedoverlay#1#2%
   {\bgroup
+   \setlayoutcomponentattribute\v!overlay{#1}%
    \edef\overlaywidth {\the\frameddimenwd\space}%
    \edef\overlayheight{\the\dimexpr\frameddimenht+\frameddimendp\relax\space}%
    \edef\overlaydepth {\the\frameddimendp\space}%
@@ -395,16 +316,14 @@
   %\edef\overlayradius{\framedparameter\c!backgroundradius}%
    \let\overlayoffset\backgroundoffset % we steal this one
    \setbox\scratchbox\hbox{\lower\overlaydepth\hbox{\the\everyoverlay#2}}%
-   \setbox\scratchbox\hbox
+   \setbox\scratchbox\hbox \layoutcomponentboxattribute
      {\hskip-.5\dimexpr\wd\scratchbox-\overlaywidth \relax
       \raise-.5\dimexpr\ht\scratchbox-\frameddimenht\relax % not overlayheight !
       \box\scratchbox}%
-   \wd\scratchbox\overlaywidth
-   \ht\scratchbox\overlayheight
-   \dp\scratchbox\overlaydepth
-   \startlayoutcomponent{o:#1}{overlay #1}%
-     \box\scratchbox
-   \stoplayoutcomponent
+   \wd\scratchbox\frameddimenwd
+   \ht\scratchbox\frameddimenht
+   \dp\scratchbox\frameddimendp
+   \box\scratchbox
    \egroup}
 
 %D The empty case is:
@@ -414,7 +333,11 @@
 %D For testing we provide:
 
 \def\doifoverlayelse#1%
-  {\doifdefinedelse{\??ov#1}}
+  {\ifcsname\??ov#1\endcsname
+     \expandafter\firstoftwoarguments
+   \else
+     \expandafter\secondoftwoarguments
+   \fi}
 
 %D We predefine two already familiar backgrounds:
 
@@ -447,31 +370,6 @@
 
 \let\currentbackground\empty
 
-% \def\dodobackgroundbox#1% also less passing, we can get rid of the old method
-%   {\bgroup
-%    \def\currentbackground{#1}%
-%    \the\everybackgroundbox
-%    \setbox\extraframebox\hbox
-%      {\vbox{\moveleft\backgroundoffset\hbox{\executeifdefined{\??ov\currentbackground}\donothing}}}%
-%    \wd\extraframebox\zeropoint % \backgroundwidth
-%    \ht\extraframebox\backgroundheight
-%    \dp\extraframebox\backgrounddepth
-%    \box\extraframebox % \hskip-\backgroundwidth
-%    \egroup}
-
-% \def\dodobackgroundbox#1% also less passing, we can get rid of the old method
-%   {\bgroup
-%    \def\currentbackground{#1}%
-%    \ifcsname\??ov\currentbackground\endcsname
-%      \the\everybackgroundbox
-%      \setbox\extraframebox\hbox{\vbox{\moveleft\backgroundoffset\hbox{\csname\??ov\currentbackground\endcsname}}}%
-%      \wd\extraframebox\zeropoint % \backgroundwidth
-%      \ht\extraframebox\backgroundheight
-%      \dp\extraframebox\backgrounddepth
-%      \box\extraframebox % \hskip-\backgroundwidth
-%    \fi
-%    \egroup}
-
 \def\dodobackgroundbox
   {\bgroup
    \ifcsname\??ov\currentbackground\endcsname
@@ -486,7 +384,7 @@
 
 \def\dododobackgroundbox#1,#2% #2 gobbles spaces
   {\edef\currentbackground{#1}%
-   \ifx\currentbackground\s!unknown\else
+   \ifx\currentbackground\s!unknown\else % use $ instead of s!unknown
      \dodobackgroundbox\expandafter\dododobackgroundbox
    \fi#2}
 
@@ -495,60 +393,30 @@
 \def\backgroundwidth {\the\hsize}
 \def\backgroundheight{\the\vsize}
 
-%  todo: also \def\theforegroundbox{#1}
-
-% \def\dobackgroundbox#1%
-%   {\setbox\framebox\vbox
-%      {\forgetall
-%       \boxmaxdepth\maxdimen
-%       \scratchdimen \framedparameter{#1}\relax
-%       \frameddimenwd\dimexpr\wd\framebox+2\scratchdimen\relax
-%       \frameddimenht\dimexpr\ht\framebox+ \scratchdimen\relax
-%       \frameddimendp\dimexpr\dp\framebox+ \scratchdimen+\framedparameter\c!backgrounddepth\relax
-%       \edef\backgroundoffset{\the\scratchdimen}%
-%       \edef\backgroundwidth {\the\wd\framebox}%
-%       \edef\backgroundheight{\the\ht\framebox}%
-%       \edef\backgrounddepth {\the\dp\framebox}%
-%      %\edef\foregroundbox{\box#1}%
-%       \def\foregroundbox% fuzzy but needed hack, this \vss, otherwise
-%         {\vbox to \backgroundheight{\vss\box\framebox\vss}}% vertical shift
-%       \edef\component{\framedparameter\c!component}%
-%       \hbox to \backgroundwidth % in case 'foreground' is used as overlay
-%         {\ifx\component\empty
-%            \rawprocesscommalist[\framedbackground]\dodobackgroundbox
-%          \else
-%            \startlayoutcomponent{b:\component}{\s!background\space\component}%
-%            \rawprocesscommalist[\framedbackground]\dodobackgroundbox
-%            \stoplayoutcomponent
-%          \fi
-%          \box\framebox\hss}}}
-
 \def\normalforegroundbox% fuzzy but needed hack, this \vss, otherwise
   {\vbox to \backgroundheight{\vss\box\framebox\vss}}% vertical shift
 
-\def\dobackgroundbox#1%
+\def\dobackedbox
   {\setbox\framebox\vbox
-     {\forgetall
+     {\framedforgetall
       \boxmaxdepth\maxdimen
-      \scratchdimen \framedparameter{#1}\relax
-      \frameddimenwd\dimexpr\wd\framebox+2\scratchdimen\relax
-      \frameddimenht\dimexpr\ht\framebox+ \scratchdimen\relax
-      \frameddimendp\dimexpr\dp\framebox+ \scratchdimen+\framedparameter\c!backgrounddepth\relax
-      \edef\backgroundoffset{\the\scratchdimen}%
+      \frameddimenwd\dimexpr\wd\framebox+2\!!framedbackgroundoffset\relax
+      \frameddimenht\dimexpr\ht\framebox+ \!!framedbackgroundoffset\relax
+      \frameddimendp\dimexpr\dp\framebox+ \!!framedbackgroundoffset+\framedparameter\c!backgrounddepth\relax
+      \edef\backgroundoffset{\the\!!framedbackgroundoffset}%
       \edef\backgroundwidth {\the\wd\framebox}%
       \edef\backgroundheight{\the\ht\framebox}%
       \edef\backgrounddepth {\the\dp\framebox}%
      %\edef\foregroundbox{\box#1}%
       \edef\component{\framedparameter\c!component}%
+      \ifx\component\empty
+        \resetlayoutcomponentattribute
+      \else
+        \setlayoutcomponentattribute\v!background\component
+      \fi
       \let\foregroundbox\normalforegroundbox
-      \hbox to \backgroundwidth % in case 'foreground' is used as overlay
-        {\ifx\component\empty
-            \normalexpanded{\noexpand\dododobackgroundbox\framedparameter\c!background},\s!unknown,\relax
-         \else
-           \startlayoutcomponent{b:\component}{background \component}%
-           \normalexpanded{\noexpand\dododobackgroundbox\framedparameter\c!background},\s!unknown,\relax
-           \stoplayoutcomponent
-         \fi
+      \hbox to \backgroundwidth \layoutcomponentboxattribute % width in case 'foreground' is used as overlay
+        {\expandafter\dododobackgroundbox\framedbackground,\s!unknown,\relax % hm, messy .. look into it
          \box\framebox\hss}}}
 
 %D One can explictly insert the foreground box. For that
@@ -565,14 +433,11 @@
 %D by \TEX\ itself, the latter one depends on the driver. This
 %D macro also support a negative offset.
 
-\ifx\scratchoffset\undefined \newdimen\scratchoffset \fi
-
 \def\dooutlinebox % we needed to move the color command in order to apply attributes properly
   {\setbox\framebox\vbox % rules on top of box
-     {\scratchoffset \framedparameter\c!frameoffset\relax
-      \frameddimenwd\dimexpr\wd\framebox+2\scratchoffset\relax
-      \frameddimenht\dimexpr\ht\framebox+ \scratchoffset\relax
-      \frameddimendp\dimexpr\dp\framebox+ \scratchoffset+\framedparameter\c!framedepth\relax
+     {\frameddimenwd\dimexpr\wd\framebox+2\!!framedframeoffset\relax
+      \frameddimenht\dimexpr\ht\framebox+ \!!framedframeoffset\relax
+      \frameddimendp\dimexpr\dp\framebox+ \!!framedframeoffset+\framedparameter\c!framedepth\relax
       \ifdim\frameddimendp<\zeropoint
         \advance\frameddimenht \frameddimendp
         \scratchdimen-\frameddimendp
@@ -584,7 +449,7 @@
         {\doifsomething{\framedparameter\c!framecolor}{\color[\framedparameter\c!framecolor]}{\dostrokedbox}}%
       \setbox\extraframebox\hbox
         {\raise\scratchdimen\vbox
-           {\moveleft\scratchoffset
+           {\moveleft\!!framedframeoffset
             \box\extraframebox}}%
       \wd\extraframebox\wd\framebox
       \ht\extraframebox\ht\framebox
@@ -592,13 +457,14 @@
       \hbox{\box\framebox\hskip-\wd\extraframebox\box\extraframebox}}}
 
 \def\dostrokedbox
-  {\doifelse{\framedparameter\c!framecorner}\v!rectangular
-     {\dostrokedlinedbox}
-     {\ifzeropt\dimexpr\framedparameter\c!frameradius\relax   % just in case of .x\bodyfontsize
-        \dostrokedlinedbox
-      \else
-        \dostrokedroundbox
-      \fi}}
+  {\edef\@@framedcornermod{\framedparameter\c!framecorner}%
+   \ifx\@@framedcornermod\v!rectangular
+     \dostrokedlinedbox
+   \else\ifzeropt\dimexpr\framedparameter\c!frameradius\relax   % just in case of .x\bodyfontsize
+     \dostrokedlinedbox
+   \else
+     \dostrokedroundbox
+    \fi\fi}
 
 \def\dostrokedlinedbox
   {\setbox\scratchbox\null
@@ -746,16 +612,12 @@
 
 \presetlocalframed[\??ol]
 
-% \unexpanded\def\framed
-%   {\bgroup
-%    \dodoubleempty\startlocalframed[\??ol]}
-
 \newcount\framednesting
 
 \unexpanded\def\framed
   {\bgroup
    \advance\framednesting\plusone
-   \letvalue{\??ol:\the\framednesting\s!parent}\??ol
+   \expandafter\let\csname\??ol:\the\framednesting\s!parent\endcsname\??ol
    \dodoubleempty\startlocalframed[\??ol:\the\framednesting]}
 
 \def\setupframed
@@ -820,19 +682,19 @@
   {\bgroup
    \inframedtrue
    \edef\@@framed{#1}%
-   % some hackery (no \dimexpr)
-   \scratchdimen\framedparameter\c!frameoffset
-   \setevalue{\@@framed\c!frameoffset}{\the\scratchdimen}%
-   \doifnot{\framedparameter\c!backgroundoffset}\v!frame
-     {\scratchdimen\framedparameter\c!backgroundoffset
-      \setevalue{\@@framed\c!backgroundoffset}{\the\scratchdimen}}%
-   % so far
    \setbox\framebox\hbox{#4}%
    \getparameters[\@@framed][#3]% no \expanded !
+   \!!framedframeoffset\framedparameter\c!frameoffset
+   \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}%
+   \ifx\@@framedbackgroundoffset\v!frame
+     \!!framedbackgroundoffset\!!framedframeoffset
+   \else
+     \!!framedbackgroundoffset\@@framedbackgroundoffset
+   \fi
    % not here, in calling macro: setups
    \removeframedboxdepth
-   \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}%
-   \ifx\framedforegroundcolor\empty\else\docolorframebox\fi
+%    \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}%
+%    \ifx\framedforegroundcolor\empty\else\docolorframebox\fi
    \edef\overlaylinecolor{\framedparameter\c!framecolor}%
    \edef\overlaylinewidth{\the\ruledlinewidth}%
    \edef\@@localframing {\framedparameter\c!frame}%
@@ -850,6 +712,44 @@
    \box\framebox
    \egroup}
 
+%D Here is another fast one:
+
+\def\localbackgroundframed#1#2#3#4% tag box wd ht
+  {\setbox#2\vbox\bgroup
+   \inframedtrue
+   \edef\@@framed{\??ma#1}%
+   \expandafter\def\csname\??ma#1\c!component\endcsname{#1}%
+   \expandafter\def\csname\??ma#1\c!width    \endcsname{#3}%
+   \expandafter\def\csname\??ma#1\c!height   \endcsname{#4}%
+   \!!framedframeoffset\framedparameter\c!frameoffset
+   \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}%
+   \ifx\@@framedbackgroundoffset\v!frame
+     \!!framedbackgroundoffset\!!framedframeoffset
+   \else
+     \!!framedbackgroundoffset\@@framedbackgroundoffset
+   \fi
+   \setbox\framebox\box#2%
+   \dp\framebox\zeropoint
+%  \removeframedboxdepth
+%    \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}%
+%    \ifx\framedforegroundcolor\empty\else\docolorframebox\fi
+   \edef\overlaylinecolor{\framedparameter\c!framecolor}%
+   \edef\overlaylinewidth{\the\ruledlinewidth}%
+   \edef\@@localframing {\framedparameter\c!frame}%
+   \ifx\@@localframing\v!overlay \else \ifx\@@localframing\v!none \else
+     \edef\framedrulethickness{\framedparameter\c!rulethickness}%
+     \ifx\framedrulethickness\empty\else
+        \ruledlinewidth\framedrulethickness\relax
+        \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi
+     \fi
+     \dooutlinebox % real or invisible frame
+   \fi \fi
+   \edef\framedbackground{\framedparameter\c!background}%
+   \ifx\framedbackground\empty\else\dobackedbox\fi
+%  \restoreframedboxdepth
+   \box\framebox
+   \egroup}
+
 %D Before we go into details, we present (and implement) the
 %D main framing routine. I saw no real reason for splitting the
 %D next two macros into smaller pieces. The content will be
@@ -907,15 +807,15 @@
    \c!radius=.5\bodyfontsize,
    \c!rulethickness=\linewidth,
    \c!corner=\v!rectangular,
-   \c!depth=\!!zeropoint,
+   \c!depth=\zeropoint,
   %\c!foregroundcolor=,
   %\c!foregroundstyle=,
   %\c!background=,
   %\c!backgroundscreen=,
   %\c!backgroundcolor=,
-   \c!backgroundoffset=\!!zeropoint,
+   \c!backgroundoffset=\zeropoint,
   %\c!framecolor=,
-   \c!frameoffset=\!!zeropoint,
+   \c!frameoffset=\zeropoint,
    \c!backgroundcorner=\framedparameter\c!corner,
    \c!backgroundradius=\framedparameter\c!radius,
    \c!backgrounddepth=\framedparameter\c!depth,
@@ -943,8 +843,8 @@
    \c!radius=.5\bodyfontsize,
    \c!rulethickness=\linewidth,
    \c!corner=\v!rectangular,
-   \c!backgroundoffset=\!!zeropoint,
-   \c!frameoffset=\!!zeropoint,
+   \c!backgroundoffset=\zeropoint,
+   \c!frameoffset=\zeropoint,
    \c!backgroundcorner=\framedparameter\c!corner,
    \c!backgroundradius=\framedparameter\c!radius,
    \c!backgrounddepth=\framedparameter\c!depth,
@@ -958,29 +858,33 @@
 \newdimen\!!framedwidth
 \newdimen\!!framedheight
 \newdimen\!!framedscratch % so that users can use \scratchdimen
+\newdimen\!!framedframeoffset
+\newdimen\!!framedbackgroundoffset
 
 \let\setextraframedoffsets  \relax
 \let\applyextraframedoffsets\relax
 
+% todo: protect local \framednames
+
 \def\startlocalframed[#1][#2]%
   {\bgroup
    \inframedtrue
    \edef\@@framed{#1}%
-   % this piece of pre expansion is needed (sometimes used circular)
-   \!!framedscratch\framedparameter\c!frameoffset
-   \setevalue{\@@framed\c!frameoffset}{\the\!!framedscratch}%
-   \doifnot{\framedparameter\c!backgroundoffset}\v!frame
-     {\!!framedscratch\framedparameter\c!backgroundoffset
-      \setevalue{\@@framed\c!backgroundoffset}{\the\!!framedscratch}}%
-   % to prevent deadlock in case of self refering
    \ifsecondargument % faster
      \getparameters[\@@framed][#2]% here !
    \fi
+   \!!framedframeoffset\framedparameter\c!frameoffset
+   \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}%
+   \ifx\@@framedbackgroundoffset\v!frame
+     \!!framedbackgroundoffset\!!framedframeoffset
+   \else
+     \!!framedbackgroundoffset\@@framedbackgroundoffset
+   \fi
    % new, experimental dirty hook
    \framedparameter\c!extras
    % to get the right spacing
-   \doifsomething{\framedparameter\c!foregroundstyle}
-     {\@EA\doconvertfont\csname\@@framed\c!foregroundstyle\endcsname\empty}%
+   \edef\fontattributehash{\framedparameterhash\c!foregroundstyle}%
+   \ifx\fontattributehash\empty\else\dosetfontattribute \fontattributehash\c!foregroundstyle\fi
    % beware, both the frame and background offset can be overruled
    %
    \edef\doframedsetups{\framedparameter\c!setups}%
@@ -1043,7 +947,7 @@
      \boxisoverlaidfalse
      \ifx\localoffset\v!default % new per 2-6-2000
        \let\localoffset\defaultframeoffset
-       \letvalue{\@@framed\c!offset}\defaultframeoffset
+       \expandafter\let\csname\@@framed\c!offset\endcsname\defaultframeoffset
      \else
        \let\defaultframeoffset\localoffset
      \fi
@@ -1087,12 +991,14 @@
    \ifboxhasheight
      % obey user set height, also downward compatible
    \else
-     \doifsomething{\framedparameter\c!lines}
-       {\ifcase\framedparameter\c!lines\else
-          \!!framedheight\framedparameter\c!lines\lineheight
+     \edef\@@framedlines{\framedparameter\c!lines}%
+     \ifx\@@framedlines\empty\else
+       \ifcase\@@framedlines\else
+          \!!framedheight\@@framedlines\lineheight
           \edef\localheight{\the\!!framedheight}%
           \boxhasheighttrue
-        \fi}%
+        \fi
+     \fi
    \fi
    % this is now an option: width=local
    %
@@ -1173,24 +1079,15 @@
      \fi
    \fi
    \setextraframedoffsets
-   \edef\framedwidth % a new feature, visible for user
-     {\ifdim\!!framedwidth >\zeropoint\the\!!framedwidth \else\zeropoint\fi}%
-   \edef\framedheight% a new feature, visible for user
-     {\ifdim\!!framedheight>\zeropoint\the\!!framedheight\else\zeropoint\fi}%
-   % we need to register the (outer) color
-   \startregistercolor[\framedparameter\c!foregroundcolor]%
-   % first alternative
-   %\def\dowithframedbox%
-   %  {\let\postprocessframebox\relax %new
-   %   \aftergroup\stoplocalframed}%
-   % \afterassignment\dowithframedbox
-   % \setbox\framebox=\next}
-   % second alternative
-   %\dowithnextbox
-   %  {\setbox\framebox\flushnextbox
-   %   \let\postprocessframebox\relax %new
-   %   \stoplocalframed}
-   %  \next}
+   \edef\framedbackground{\framedparameter\c!background}%
+   \ifx\framedbackground\empty
+     \let\framedforgetall\forgetall
+   \else
+     \let\framedforgetall\relax
+     \forgetall
+   \fi
+   \edef\framedwidth {\ifdim\!!framedwidth >\zeropoint\the\!!framedwidth \else\!!zeropoint\fi}% a new feature, visible for user
+   \edef\framedheight{\ifdim\!!framedheight>\zeropoint\the\!!framedheight\else\!!zeropoint\fi}% a new feature, visible for user
    \@@startframedorientation
    \afterassignment\dodowithframebox
    \setbox\framebox\next}
@@ -1240,7 +1137,6 @@
 \def\stoplocalframed
   {\dontshowcomposition
    \@@stopframedorientation % hm, wrong place ! should rotate the result (after reshape)
-   \stopregistercolor
    \handleframedlocator\c!before\@@locallocation
    \ifboxhasformat
      \ifx\@@localautowidth\v!force
@@ -1258,9 +1154,9 @@
          \resetshapeframebox
        \fi\fi
      \fi
-\ifconditional\boxcontentneedsprocessing
-    \mkdoprocessboxcontents\framebox
-\fi
+    \ifconditional\boxcontentneedsprocessing
+      \mkdoprocessboxcontents\framebox
+    \fi
     \else
      \resetshapeframebox
    \fi
@@ -1270,14 +1166,7 @@
    \ifboxhasheight
      \ht\framebox\!!framedheight
    \fi
-   \doif{\framedparameter\c!empty}\v!yes
-     {\setbox\scratchbox\null
-      \wd\scratchbox\wd\framebox
-      \ht\scratchbox\ht\framebox
-      \dp\scratchbox\dp\framebox
-      \setbox\framebox\box\scratchbox}%
-   \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}%
-   \ifx\framedforegroundcolor\empty\else\docolorframebox\fi
+   \doif{\framedparameter\c!empty}\v!yes\dosetfakedframebox
    \ifboxhasextraoffset
      \applyextraframedoffsets
    \fi
@@ -1297,19 +1186,35 @@
    \ifboxhasframe % real or invisible frame
      \dooutlinebox
    \fi
-   \edef\framedbackground{\framedparameter\c!background}%
    \ifx\framedbackground\empty\else\dobackedbox\fi
    \handleframedlocator\c!after\@@locallocation
    \box\framebox
    \egroup
    \egroup}
 
+\def\dosetfakedframebox
+  {\setbox\scratchbox\null
+   \wd\scratchbox\wd\framebox
+   \ht\scratchbox\ht\framebox
+   \dp\scratchbox\dp\framebox
+   \setbox\framebox\box\scratchbox}
+
+% test: (saves one forgetall)
+%
+% \edef\framedbackground{\framedparameter\c!background}%
+% \ifx\framedbackground\empty
+%     \let\framedforgetall\forgetall
+% \else
+%     \let\framedforgetall\relax
+%     \forgetall
+% \fi
+
 \def\installframedlocator#1#2#3%
   {\setvalue{\??oi:\c!location:\c!before:#1}{#2}%
    \setvalue{\??oi:\c!location:\c!after :#1}{#3}}
 
 \def\handleframedlocator#1#2%
-  {\getvalue{\??oi:\c!location:#1:#2}}
+  {\csname\??oi:\c!location:#1:#2\endcsname}
 
 \def\doprelocframedbox#1%
   {\scratchdimen\dimexpr#1+\ruledlinewidth\relax
@@ -1688,14 +1593,6 @@
 %D additional offset capabilities. The lot of calls to other
 %D macros makes this mechanism not that easy to comprehend.
 
-%D Getting the backgrounds right takes less code. Again we
-%D have to take care of additional offsets.
-
-\def\dobackedbox
-  {\doifelsevalue{\@@framed\c!backgroundoffset}\v!frame % new
-     {\dobackgroundbox\c!frameoffset}
-     {\dobackgroundbox\c!backgroundoffset}}
-
 %D We handle left, right or middle alignment as well as fixed
 %D or free widths and heights. Each combination gets its own
 %D macro.
@@ -1728,11 +1625,18 @@
 
 %D The handlers:
 
+\def\framedforgetall{\forgetall}
+
+\def\setframedforegroundcolor
+  {\edef\colorattributehash{\framedparameterhash\c!foregroundcolor}%
+   \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash\c!foregroundcolor\fi}
+
 \def\doformatboxSomeFormat
   {\vbox to \!!framedheight
      \bgroup
        \let\postprocessframebox\relax
-       \forgetall
+       \framedforgetall
+       \setframedforegroundcolor
        \oninterlineskip
        \hsize\!!framedwidth
        \vsize\!!framedheight
@@ -1750,7 +1654,8 @@
   {\vbox to \!!framedheight
      \bgroup
        \let\postprocessframebox\relax
-       \forgetall
+       \framedforgetall
+       \setframedforegroundcolor
        \oninterlineskip
        \hsize\!!framedwidth
        \vsize\!!framedheight
@@ -1768,7 +1673,8 @@
   {\vbox to \!!framedheight
      \bgroup
        \let\postprocessframebox\relax
-       \forgetall
+       \framedforgetall
+       \setframedforegroundcolor
        \oninterlineskip
        \doframedsetups
        \raggedcommand
@@ -1784,7 +1690,8 @@
   {\vbox
      \bgroup
        \let\postprocessframebox\relax
-       \forgetall
+       \framedforgetall
+       \setframedforegroundcolor
        \oninterlineskip
        \hsize\!!framedwidth
        \doframedsetups
@@ -1801,7 +1708,8 @@
   {\vbox to \!!framedheight
      \bgroup
        \let\postprocessframebox\relax
-       \forgetall
+       \framedforgetall
+       \setframedforegroundcolor
        \vsize\!!framedheight
        \doframedsetups
        \vss
@@ -1818,7 +1726,8 @@
   {\hbox to \!!framedwidth
      \bgroup
        \let\postprocessframebox\relax
-       \forgetall
+       \framedforgetall
+       \setframedforegroundcolor
        \doframedsetups
        \hss
        \localstrut
@@ -1830,6 +1739,7 @@
 \def\doformatboxNoSize
   {\hbox
      \bgroup
+       \setframedforegroundcolor
        \let\postprocessframebox\relax
        \doframedsetups
        \localstrut
@@ -1895,10 +1805,6 @@
 %D of a centered box automatically (\type {fit}). When
 %D doing so, we need to reshape the box:
 
-% The next implementation is frozen! It preserves the depth,
-% otherwise we get problems with framed display math and auto
-% width.
-
 \newcount\framednoflines
 \newdimen\framedlastlength
 
@@ -1910,15 +1816,6 @@
 \let\framedboxheight\!!zeropoint
 \let\framedboxdepth \!!zeropoint
 
-\chardef\reshapeframeboxmethod\plusone % 0=no flush, 1=old method 2=no depth messing
-
-% \newbox\luashapebox
-%
-% \def\doreshapeframedbox
-%   {\setbox\luashapebox\box\framebox
-%    \ctxlua{commands.doreshapeframedbox(\number\luashapebox)}%
-%    \setbox\framebox\box\luashapebox}
-
 \def\doreshapeframedbox{\ifvbox\framebox\ctxlua{commands.doreshapeframedbox(\number\framebox)}\fi}
 
 %D The two variables \type {\framednoflines} and \type
@@ -2164,23 +2061,24 @@
 %D
 %D \showsetup{blackrule}
 
-\def\doblackrule[#1]%
-  {\hbox\bgroup
-   \getparameters[\??bj][#1]%
-   \setstrut
-   \doif\@@bjwidth \v!max{\def\@@bjwidth {1em}}%
-   \doif\@@bjheight\v!max{\def\@@bjheight{\strutht}}%
-   \doif\@@bjdepth \v!max{\def\@@bjdepth {\strutdp}}%
-   \localstartcolor[\@@bjcolor]%
+\def\complexblackrule[#1]%
+  {\hbox\bgroup\getparameters[\??bj][#1]\domakeblackrule\egroup}
+
+\def\simpleblackrule
+  {\hbox\bgroup\domakeblackrule\egroup}
+
+\def\domakeblackrule
+  {\doif\@@bjwidth \v!max{\def\@@bjwidth {1em}}%
+   \doif\@@bjheight\v!max{\setstrut\let\setstrut\relax\def\@@bjheight{\strutht}}%
+   \doif\@@bjdepth \v!max{\setstrut\def\@@bjdepth {\strutdp}}%
+   \startcolor[\@@bjcolor]% can be made faster, just direct attr
      \vrule
        \!!width \@@bjwidth
        \!!height\@@bjheight
        \!!depth \@@bjdepth
-   \localstopcolor
-   \egroup}
+   \stopcolor}
 
-\unexpanded\def\blackrule
-  {\dosingleempty\doblackrule}
+\definecomplexorsimple\blackrule
 
 %D \macros
 %D   {blackrules}
@@ -2225,7 +2123,7 @@
         \advance\!!widtha -\scratchcounter\!!widthb
         \divide \!!widtha \@@bjn
       \fi}%
-   \localstartcolor[\@@bjcolor]%
+   \startcolor[\@@bjcolor]%
      \dorecurse\@@bjn
        {\vrule
           \!!width \!!widtha
@@ -2233,7 +2131,7 @@
           \!!depth \@@bjdepth
         \hskip\!!widthb}%
      \unskip
-   \localstopcolor
+   \stopcolor
    \egroup}
 
 \unexpanded\def\blackrules
@@ -2774,6 +2672,19 @@
 
 \setfalse\framedtextlocationnone
 
+\def\checkframedtext % messy dependency
+  {\ifinsidefloat
+     \localhsize\hsize
+   \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle
+   % \strut            % rather clean way to invoke the sidefloat OTR
+   % \setbox0=\lastbox % and get the widths set, so from now on we
+   % \setlocalhsize    % can have framed texts alongside sidefloats
+     \checksidefloat
+     \setlocalhsize
+   \else
+     \localhsize\hsize
+   \fi\fi}
+
 \def\dododostartframedtext[#1][#2][#3]% #3 only passed to framed, not to framedtext
   {\doifsomething{#2}{\setvalue{\??kd#1\c!location}{#2}}% does not listen to #3
    \setfalse\framedtextlocationnone
@@ -2829,7 +2740,7 @@
       \vskip-\struttotal
       \verticalstrut
       \egroup
-      \forgetall
+      \forgetall % brrr too often
       \vskip-\lineheight
       % will be an option, not default
       % \setbaselinecorrections
@@ -3322,7 +3233,6 @@
          \fi
          \setbox2\vbox \ifcase\backgroundsplit\or to \textheight \fi % max split
            {\vskip\@@agtopoffset
-            \popsplitproperties
             \unvcopy2
             \prevdepth\dp2
             \obeydepth
@@ -3430,14 +3340,15 @@
 
 \def\startframedcontent[#1]%
   {\bgroup
-   \let\stopframedcontent\egroup
-   \doifnot{#1}\v!off
-     {\doifdefined{\??fc#1\c!frame}
-        {\def\stopframedcontent{\dostopframedcontent{#1}}%
-         \dostartframedcontent{#1}}}}
+   \doifelse{#1}\v!off
+     {\let\stopframedcontent\egroup}
+     {\ifcsname\??fc#1\c!frame\endcsname
+        \dostartframedcontent{#1}%
+      \fi}}
 
 \def\dostartframedcontent#1%
-  {\setbox\framebox\hbox\bgroup
+  {\def\stopframedcontent{\dostopframedcontent{#1}}%
+   \setbox\framebox\hbox\bgroup
      \setlocalhsize
      \hsize\localhsize
      \advance\hsize\dimexpr-\getvalue{\??fc#1\c!leftoffset}-\getvalue{\??fc#1\c!rightoffset} \relax
@@ -3487,8 +3398,7 @@
 \def\dobackgroundline#1%
   {\dowithnextbox
      {\hbox
-        {\localcolortrue
-         \startcolor[#1]%
+        {\startcolor[#1]%
          \vrule
            \!!width \nextboxwd
            \!!height\nextboxht
@@ -3525,15 +3435,15 @@
    \c!radius=.5\bodyfontsize,
    \c!rulethickness=\linewidth,
    \c!corner=\v!rectangular,
-   \c!depth=\!!zeropoint,
+   \c!depth=\zeropoint,
    \c!foregroundcolor=,
    \c!foregroundstyle=,
    \c!background=,
    \c!backgroundscreen=\@@rsscreen,
    \c!backgroundcolor=,
-   \c!backgroundoffset=\!!zeropoint,
+   \c!backgroundoffset=\zeropoint,
    \c!framecolor=,
-   \c!frameoffset=\!!zeropoint,
+   \c!frameoffset=\zeropoint,
    \c!backgroundcorner=\framedparameter\c!corner,
    \c!backgroundradius=\framedparameter\c!radius,
    \c!backgrounddepth=\framedparameter\c!depth,
diff --git a/tex/context/base/page-app.mkii b/tex/context/base/page-app.mkii
new file mode 100644
index 000000000..e5c149aa0
--- /dev/null
+++ b/tex/context/base/page-app.mkii
@@ -0,0 +1,225 @@
+%D \module
+%D   [       file=page-app, % from meta-fig
+%D        version=1998.01.15,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Independent page building,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Applications}
+
+%D The fitting page code is moved from \type {meta-fig} to
+%D here.
+
+\unprotect
+
+\definepapersize
+  [\??fp\s!dummy]
+  [\c!width=\fittingwd,
+   \c!height=\fittinght]
+
+\definelayout
+  [\??fp\s!dummy]
+  [\c!width=\fittingwd,\c!height=\fittinght,\c!location=\v!middle,
+   \c!topspace=\!!zeropoint,\c!backspace=\!!zeropoint,
+   \c!cutspace=\!!zeropoint,\c!bottomspace=\!!zeropoint,
+   \c!textdistance=\!!zeropoint,\c!lines=0,\c!grid=\v!no,
+   \c!top=\!!zeropoint,\c!bottom=\!!zeropoint,
+   \c!margin=\!!zeropoint,\c!edge=\!!zeropoint,
+   \c!leftmargin=\!!zeropoint,\c!leftedge=\!!zeropoint,
+   \c!rightmargin=\!!zeropoint,\c!rightedge=\!!zeropoint,
+   \c!header=\!!zeropoint,\c!footer=\!!zeropoint]
+
+
+\def\dostartfittingpage[#1][#2]%
+  {\page % this is kind of tricky! there can be preceding page refs
+   \autostarttext
+   \bgroup % resulting in a zero height page; test fig-make !
+   \def\currentfittingpage{#1}%
+   \dontcomplain
+   % runs under current page regime, i.e. page variables passed to mp
+   \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing
+   \setbox\scratchbox\hbox
+     \bgroup
+     % needed later \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing
+     \doifvalue{\currentfittingpage\c!margin}\v!page % undocumented
+       {\offsetbox
+          [\c!leftoffset=\backspace,
+           \c!rightoffset=\cutspace,
+           \c!topoffset=\topspace,
+           \c!bottomoffset=\bottomspace]\hbox}%
+     \bgroup
+     \scale[\c!scale=\getvalue{\currentfittingpage\c!scale}]%
+     \bgroup\localframed[\currentfittingpage]%
+     \bgroup}
+
+\def\dostopfittingpage
+  {\egroup % localframed
+   \egroup % scale
+   \egroup % offsetbox
+   \egroup % scratchbox
+   \edef\fittingwd{\the\wd\scratchbox}%
+   \edef\fittinght{\the\ht\scratchbox}%
+   \startlocallayout
+   \ifdim\fittinght<\lineheight
+     % write status : too small
+     \setbox\scratchbox\vbox to \lineheight{\vss\box\scratchbox\vss}%
+     \edef\fittinght{\the\lineheight}%
+   \fi
+   \let\checkcurrentlayout\relax % else interference with odd/even layout
+   \processaction
+     [\getvalue{\currentfittingpage\c!paper}]
+     [   \v!auto=>\let\fittingpapersize\printpapersize,
+      \s!unknown=>\let\fittingpapersize\commalistelement,
+      \s!default=>\def\fittingpapersize{\??fp\s!dummy}]%
+   \expanded{\setuppapersize[\??fp\s!dummy][\fittingpapersize]}%
+   \definelayout
+     [\v!page]%
+     [\c!location=\v!middle,
+      \c!width=\fittingwd,
+      \c!height=\fittinght]%
+   \setuplayout
+     [\v!page]%
+   \startmakeup[\v!standard][\c!textstate=\v!empty,\c!doublesided=\v!no,\c!page=]%
+     \centerbox{\box\scratchbox}%
+   \stopmakeup
+   \stoplocallayout
+   \egroup
+   \autostoptext}
+
+%D \TEX\ pages (for \METAPOST\ pages, see \type {meta-fig}):
+
+\presetlocalframed[\??tg]
+
+\def\setupTEXpage
+  {\dodoubleargument\getparameters[\??tg]}
+
+\def\startTEXpage
+  {\dosingleempty\dostartTEXpage}
+
+\def\dostartTEXpage[#1]%
+  {\dostartfittingpage[\??tg][#1]\gobblespacetokens}
+
+\def\stopTEXpage
+  {\removelastspace
+   \dostopfittingpage}
+
+\setupTEXpage
+  [\c!scale=1000,
+   \c!strut=\v!no,
+   \c!align=\v!normal, % needed, else problems !
+   \c!offset=\v!overlay,
+   \c!width=\v!fit,
+   \c!height=\v!fit,
+   \c!frame=\v!off]
+
+%D For Mojca:
+%D
+%D \starttyping
+%D \startTEXstream \chapter{Bla} Hello world!\crlf Hello world! \stopTEXstream
+%D \startTEXpage   \chapter{Bla} Hello world!\crlf Hello world! \stopTEXpage
+%D \stoptyping
+%D
+%D maybe I should support stream=yes in framed.
+
+\def\startTEXstream
+  {\dosingleempty\dostartTEXstream}
+
+\def\dostartTEXstream[#1]%
+  {\page
+   \defineoutputstream[tex]%
+   \enableoutputstream[tex]%
+   \def\stopTEXstream
+     {\disableoutputstream
+      \startTEXpage
+      \outputstreamunvbox[tex]%
+      \stopTEXpage}}
+
+%D Application pages (for an example, see \type {m-pstric}):
+
+\def\@@texapp{texapp}
+\def\@@texdim{texdim}
+
+\def\saveTEXapplication#1#2%
+  {\immediate\openout\scratchwrite=\bufferprefix\@@texdim.tmp
+   \immediate\write\scratchwrite{\dimen#1=\the\ht\scratchbox}%
+   \immediate\write\scratchwrite{\dimen#2=\the\wd\scratchbox}%
+   \immediate\closeout\scratchwrite}
+
+\def\restoreTEXapplication
+  {\readlocfile{\bufferprefix\@@texdim.tmp}\donothing\donothing}
+
+\def\startTEXapplication
+  {\dosingleempty\dostartTEXapplication}
+
+\long\def\dostartTEXapplication[#1]#2#3\stopTEXapplication
+  {\bgroup
+   \bgroup
+   \let\f!temporaryextension\c!tex
+   \setbuffer[\@@texapp]%
+     \starttext
+     #2% preamble
+     \startTEXpage[#1]%
+       \topskip\zeropoint
+       \setbox\scratchbox\hbox{#3}%
+       \saveTEXapplication02% dimensions
+       \box\scratchbox
+     \stopTEXpage
+     \stoptext
+   \endbuffer
+   \egroup
+   \doifelse\jobsuffix{dvi}\donetrue\donefalse
+   \executesystemcommand{texexec \bufferprefix\@@texapp.tex --once --batch}%
+   \ifdone % eps
+     \executesystemcommand{dvips -E* -o \@@texapp.eps \@@texapp}%
+   \else % pdf
+     \executesystemcommand{dvips \bufferprefix\@@texapp}%
+     \executesystemcommand{ps2pdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
+%      \executesystemcommand{texmfstart pstopdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
+   \fi
+   \restoreTEXapplication % dimensions
+   \doifelse\jobsuffix{dvi}\donetrue\donefalse
+   \setbox\scratchbox\hbox
+     {\expanded{\externalfigure
+        [\bufferprefix\@@texapp.\ifdone eps\else pdf\fi]
+        [\c!object=\v!no]}}%
+   \setbox\scratchbox\hbox
+     {\lower\ht\scratchbox\hbox{\raise\dimen2\box\scratchbox}}%
+   \wd\scratchbox\dimen0
+   \ht\scratchbox\dimen2
+   \dp\scratchbox\zeropoint
+   \box\scratchbox
+   \egroup}
+
+%D \macros
+%D   {startpagefigure}
+%D
+%D \starttyping
+%D \starttext \pagefigure[two.1] \stoptext
+%D \stoptyping
+
+\def\startpagefigure
+  {\dodoubleempty\dostartpagefigure}
+
+\def\dostartpagefigure[#1][#2]%
+  {\bgroup
+   \getparameters[\??ex][\c!offset=\v!overlay,#2]%
+   \startTEXpage[\c!offset=\@@exoffset]%
+     \externalfigure[#1][#2]\ignorespaces} % so we can put some text below the graphic
+
+\def\stoppagefigure
+  {\stopTEXpage
+   \egroup}
+
+\def\pagefigure
+  {\dodoubleempty\dopagefigure}
+
+\def\dopagefigure[#1][#2]%
+  {\dostartpagefigure[#1][#2]\stoppagefigure}
+
+\protect \endinput
diff --git a/tex/context/base/page-app.mkiv b/tex/context/base/page-app.mkiv
new file mode 100644
index 000000000..e5c149aa0
--- /dev/null
+++ b/tex/context/base/page-app.mkiv
@@ -0,0 +1,225 @@
+%D \module
+%D   [       file=page-app, % from meta-fig
+%D        version=1998.01.15,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Independent page building,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Applications}
+
+%D The fitting page code is moved from \type {meta-fig} to
+%D here.
+
+\unprotect
+
+\definepapersize
+  [\??fp\s!dummy]
+  [\c!width=\fittingwd,
+   \c!height=\fittinght]
+
+\definelayout
+  [\??fp\s!dummy]
+  [\c!width=\fittingwd,\c!height=\fittinght,\c!location=\v!middle,
+   \c!topspace=\!!zeropoint,\c!backspace=\!!zeropoint,
+   \c!cutspace=\!!zeropoint,\c!bottomspace=\!!zeropoint,
+   \c!textdistance=\!!zeropoint,\c!lines=0,\c!grid=\v!no,
+   \c!top=\!!zeropoint,\c!bottom=\!!zeropoint,
+   \c!margin=\!!zeropoint,\c!edge=\!!zeropoint,
+   \c!leftmargin=\!!zeropoint,\c!leftedge=\!!zeropoint,
+   \c!rightmargin=\!!zeropoint,\c!rightedge=\!!zeropoint,
+   \c!header=\!!zeropoint,\c!footer=\!!zeropoint]
+
+
+\def\dostartfittingpage[#1][#2]%
+  {\page % this is kind of tricky! there can be preceding page refs
+   \autostarttext
+   \bgroup % resulting in a zero height page; test fig-make !
+   \def\currentfittingpage{#1}%
+   \dontcomplain
+   % runs under current page regime, i.e. page variables passed to mp
+   \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing
+   \setbox\scratchbox\hbox
+     \bgroup
+     % needed later \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing
+     \doifvalue{\currentfittingpage\c!margin}\v!page % undocumented
+       {\offsetbox
+          [\c!leftoffset=\backspace,
+           \c!rightoffset=\cutspace,
+           \c!topoffset=\topspace,
+           \c!bottomoffset=\bottomspace]\hbox}%
+     \bgroup
+     \scale[\c!scale=\getvalue{\currentfittingpage\c!scale}]%
+     \bgroup\localframed[\currentfittingpage]%
+     \bgroup}
+
+\def\dostopfittingpage
+  {\egroup % localframed
+   \egroup % scale
+   \egroup % offsetbox
+   \egroup % scratchbox
+   \edef\fittingwd{\the\wd\scratchbox}%
+   \edef\fittinght{\the\ht\scratchbox}%
+   \startlocallayout
+   \ifdim\fittinght<\lineheight
+     % write status : too small
+     \setbox\scratchbox\vbox to \lineheight{\vss\box\scratchbox\vss}%
+     \edef\fittinght{\the\lineheight}%
+   \fi
+   \let\checkcurrentlayout\relax % else interference with odd/even layout
+   \processaction
+     [\getvalue{\currentfittingpage\c!paper}]
+     [   \v!auto=>\let\fittingpapersize\printpapersize,
+      \s!unknown=>\let\fittingpapersize\commalistelement,
+      \s!default=>\def\fittingpapersize{\??fp\s!dummy}]%
+   \expanded{\setuppapersize[\??fp\s!dummy][\fittingpapersize]}%
+   \definelayout
+     [\v!page]%
+     [\c!location=\v!middle,
+      \c!width=\fittingwd,
+      \c!height=\fittinght]%
+   \setuplayout
+     [\v!page]%
+   \startmakeup[\v!standard][\c!textstate=\v!empty,\c!doublesided=\v!no,\c!page=]%
+     \centerbox{\box\scratchbox}%
+   \stopmakeup
+   \stoplocallayout
+   \egroup
+   \autostoptext}
+
+%D \TEX\ pages (for \METAPOST\ pages, see \type {meta-fig}):
+
+\presetlocalframed[\??tg]
+
+\def\setupTEXpage
+  {\dodoubleargument\getparameters[\??tg]}
+
+\def\startTEXpage
+  {\dosingleempty\dostartTEXpage}
+
+\def\dostartTEXpage[#1]%
+  {\dostartfittingpage[\??tg][#1]\gobblespacetokens}
+
+\def\stopTEXpage
+  {\removelastspace
+   \dostopfittingpage}
+
+\setupTEXpage
+  [\c!scale=1000,
+   \c!strut=\v!no,
+   \c!align=\v!normal, % needed, else problems !
+   \c!offset=\v!overlay,
+   \c!width=\v!fit,
+   \c!height=\v!fit,
+   \c!frame=\v!off]
+
+%D For Mojca:
+%D
+%D \starttyping
+%D \startTEXstream \chapter{Bla} Hello world!\crlf Hello world! \stopTEXstream
+%D \startTEXpage   \chapter{Bla} Hello world!\crlf Hello world! \stopTEXpage
+%D \stoptyping
+%D
+%D maybe I should support stream=yes in framed.
+
+\def\startTEXstream
+  {\dosingleempty\dostartTEXstream}
+
+\def\dostartTEXstream[#1]%
+  {\page
+   \defineoutputstream[tex]%
+   \enableoutputstream[tex]%
+   \def\stopTEXstream
+     {\disableoutputstream
+      \startTEXpage
+      \outputstreamunvbox[tex]%
+      \stopTEXpage}}
+
+%D Application pages (for an example, see \type {m-pstric}):
+
+\def\@@texapp{texapp}
+\def\@@texdim{texdim}
+
+\def\saveTEXapplication#1#2%
+  {\immediate\openout\scratchwrite=\bufferprefix\@@texdim.tmp
+   \immediate\write\scratchwrite{\dimen#1=\the\ht\scratchbox}%
+   \immediate\write\scratchwrite{\dimen#2=\the\wd\scratchbox}%
+   \immediate\closeout\scratchwrite}
+
+\def\restoreTEXapplication
+  {\readlocfile{\bufferprefix\@@texdim.tmp}\donothing\donothing}
+
+\def\startTEXapplication
+  {\dosingleempty\dostartTEXapplication}
+
+\long\def\dostartTEXapplication[#1]#2#3\stopTEXapplication
+  {\bgroup
+   \bgroup
+   \let\f!temporaryextension\c!tex
+   \setbuffer[\@@texapp]%
+     \starttext
+     #2% preamble
+     \startTEXpage[#1]%
+       \topskip\zeropoint
+       \setbox\scratchbox\hbox{#3}%
+       \saveTEXapplication02% dimensions
+       \box\scratchbox
+     \stopTEXpage
+     \stoptext
+   \endbuffer
+   \egroup
+   \doifelse\jobsuffix{dvi}\donetrue\donefalse
+   \executesystemcommand{texexec \bufferprefix\@@texapp.tex --once --batch}%
+   \ifdone % eps
+     \executesystemcommand{dvips -E* -o \@@texapp.eps \@@texapp}%
+   \else % pdf
+     \executesystemcommand{dvips \bufferprefix\@@texapp}%
+     \executesystemcommand{ps2pdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
+%      \executesystemcommand{texmfstart pstopdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
+   \fi
+   \restoreTEXapplication % dimensions
+   \doifelse\jobsuffix{dvi}\donetrue\donefalse
+   \setbox\scratchbox\hbox
+     {\expanded{\externalfigure
+        [\bufferprefix\@@texapp.\ifdone eps\else pdf\fi]
+        [\c!object=\v!no]}}%
+   \setbox\scratchbox\hbox
+     {\lower\ht\scratchbox\hbox{\raise\dimen2\box\scratchbox}}%
+   \wd\scratchbox\dimen0
+   \ht\scratchbox\dimen2
+   \dp\scratchbox\zeropoint
+   \box\scratchbox
+   \egroup}
+
+%D \macros
+%D   {startpagefigure}
+%D
+%D \starttyping
+%D \starttext \pagefigure[two.1] \stoptext
+%D \stoptyping
+
+\def\startpagefigure
+  {\dodoubleempty\dostartpagefigure}
+
+\def\dostartpagefigure[#1][#2]%
+  {\bgroup
+   \getparameters[\??ex][\c!offset=\v!overlay,#2]%
+   \startTEXpage[\c!offset=\@@exoffset]%
+     \externalfigure[#1][#2]\ignorespaces} % so we can put some text below the graphic
+
+\def\stoppagefigure
+  {\stopTEXpage
+   \egroup}
+
+\def\pagefigure
+  {\dodoubleempty\dopagefigure}
+
+\def\dopagefigure[#1][#2]%
+  {\dostartpagefigure[#1][#2]\stoppagefigure}
+
+\protect \endinput
diff --git a/tex/context/base/page-app.tex b/tex/context/base/page-app.tex
deleted file mode 100644
index e5c149aa0..000000000
--- a/tex/context/base/page-app.tex
+++ /dev/null
@@ -1,225 +0,0 @@
-%D \module
-%D   [       file=page-app, % from meta-fig
-%D        version=1998.01.15,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Independent page building,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Applications}
-
-%D The fitting page code is moved from \type {meta-fig} to
-%D here.
-
-\unprotect
-
-\definepapersize
-  [\??fp\s!dummy]
-  [\c!width=\fittingwd,
-   \c!height=\fittinght]
-
-\definelayout
-  [\??fp\s!dummy]
-  [\c!width=\fittingwd,\c!height=\fittinght,\c!location=\v!middle,
-   \c!topspace=\!!zeropoint,\c!backspace=\!!zeropoint,
-   \c!cutspace=\!!zeropoint,\c!bottomspace=\!!zeropoint,
-   \c!textdistance=\!!zeropoint,\c!lines=0,\c!grid=\v!no,
-   \c!top=\!!zeropoint,\c!bottom=\!!zeropoint,
-   \c!margin=\!!zeropoint,\c!edge=\!!zeropoint,
-   \c!leftmargin=\!!zeropoint,\c!leftedge=\!!zeropoint,
-   \c!rightmargin=\!!zeropoint,\c!rightedge=\!!zeropoint,
-   \c!header=\!!zeropoint,\c!footer=\!!zeropoint]
-
-
-\def\dostartfittingpage[#1][#2]%
-  {\page % this is kind of tricky! there can be preceding page refs
-   \autostarttext
-   \bgroup % resulting in a zero height page; test fig-make !
-   \def\currentfittingpage{#1}%
-   \dontcomplain
-   % runs under current page regime, i.e. page variables passed to mp
-   \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing
-   \setbox\scratchbox\hbox
-     \bgroup
-     % needed later \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing
-     \doifvalue{\currentfittingpage\c!margin}\v!page % undocumented
-       {\offsetbox
-          [\c!leftoffset=\backspace,
-           \c!rightoffset=\cutspace,
-           \c!topoffset=\topspace,
-           \c!bottomoffset=\bottomspace]\hbox}%
-     \bgroup
-     \scale[\c!scale=\getvalue{\currentfittingpage\c!scale}]%
-     \bgroup\localframed[\currentfittingpage]%
-     \bgroup}
-
-\def\dostopfittingpage
-  {\egroup % localframed
-   \egroup % scale
-   \egroup % offsetbox
-   \egroup % scratchbox
-   \edef\fittingwd{\the\wd\scratchbox}%
-   \edef\fittinght{\the\ht\scratchbox}%
-   \startlocallayout
-   \ifdim\fittinght<\lineheight
-     % write status : too small
-     \setbox\scratchbox\vbox to \lineheight{\vss\box\scratchbox\vss}%
-     \edef\fittinght{\the\lineheight}%
-   \fi
-   \let\checkcurrentlayout\relax % else interference with odd/even layout
-   \processaction
-     [\getvalue{\currentfittingpage\c!paper}]
-     [   \v!auto=>\let\fittingpapersize\printpapersize,
-      \s!unknown=>\let\fittingpapersize\commalistelement,
-      \s!default=>\def\fittingpapersize{\??fp\s!dummy}]%
-   \expanded{\setuppapersize[\??fp\s!dummy][\fittingpapersize]}%
-   \definelayout
-     [\v!page]%
-     [\c!location=\v!middle,
-      \c!width=\fittingwd,
-      \c!height=\fittinght]%
-   \setuplayout
-     [\v!page]%
-   \startmakeup[\v!standard][\c!textstate=\v!empty,\c!doublesided=\v!no,\c!page=]%
-     \centerbox{\box\scratchbox}%
-   \stopmakeup
-   \stoplocallayout
-   \egroup
-   \autostoptext}
-
-%D \TEX\ pages (for \METAPOST\ pages, see \type {meta-fig}):
-
-\presetlocalframed[\??tg]
-
-\def\setupTEXpage
-  {\dodoubleargument\getparameters[\??tg]}
-
-\def\startTEXpage
-  {\dosingleempty\dostartTEXpage}
-
-\def\dostartTEXpage[#1]%
-  {\dostartfittingpage[\??tg][#1]\gobblespacetokens}
-
-\def\stopTEXpage
-  {\removelastspace
-   \dostopfittingpage}
-
-\setupTEXpage
-  [\c!scale=1000,
-   \c!strut=\v!no,
-   \c!align=\v!normal, % needed, else problems !
-   \c!offset=\v!overlay,
-   \c!width=\v!fit,
-   \c!height=\v!fit,
-   \c!frame=\v!off]
-
-%D For Mojca:
-%D
-%D \starttyping
-%D \startTEXstream \chapter{Bla} Hello world!\crlf Hello world! \stopTEXstream
-%D \startTEXpage   \chapter{Bla} Hello world!\crlf Hello world! \stopTEXpage
-%D \stoptyping
-%D
-%D maybe I should support stream=yes in framed.
-
-\def\startTEXstream
-  {\dosingleempty\dostartTEXstream}
-
-\def\dostartTEXstream[#1]%
-  {\page
-   \defineoutputstream[tex]%
-   \enableoutputstream[tex]%
-   \def\stopTEXstream
-     {\disableoutputstream
-      \startTEXpage
-      \outputstreamunvbox[tex]%
-      \stopTEXpage}}
-
-%D Application pages (for an example, see \type {m-pstric}):
-
-\def\@@texapp{texapp}
-\def\@@texdim{texdim}
-
-\def\saveTEXapplication#1#2%
-  {\immediate\openout\scratchwrite=\bufferprefix\@@texdim.tmp
-   \immediate\write\scratchwrite{\dimen#1=\the\ht\scratchbox}%
-   \immediate\write\scratchwrite{\dimen#2=\the\wd\scratchbox}%
-   \immediate\closeout\scratchwrite}
-
-\def\restoreTEXapplication
-  {\readlocfile{\bufferprefix\@@texdim.tmp}\donothing\donothing}
-
-\def\startTEXapplication
-  {\dosingleempty\dostartTEXapplication}
-
-\long\def\dostartTEXapplication[#1]#2#3\stopTEXapplication
-  {\bgroup
-   \bgroup
-   \let\f!temporaryextension\c!tex
-   \setbuffer[\@@texapp]%
-     \starttext
-     #2% preamble
-     \startTEXpage[#1]%
-       \topskip\zeropoint
-       \setbox\scratchbox\hbox{#3}%
-       \saveTEXapplication02% dimensions
-       \box\scratchbox
-     \stopTEXpage
-     \stoptext
-   \endbuffer
-   \egroup
-   \doifelse\jobsuffix{dvi}\donetrue\donefalse
-   \executesystemcommand{texexec \bufferprefix\@@texapp.tex --once --batch}%
-   \ifdone % eps
-     \executesystemcommand{dvips -E* -o \@@texapp.eps \@@texapp}%
-   \else % pdf
-     \executesystemcommand{dvips \bufferprefix\@@texapp}%
-     \executesystemcommand{ps2pdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
-%      \executesystemcommand{texmfstart pstopdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
-   \fi
-   \restoreTEXapplication % dimensions
-   \doifelse\jobsuffix{dvi}\donetrue\donefalse
-   \setbox\scratchbox\hbox
-     {\expanded{\externalfigure
-        [\bufferprefix\@@texapp.\ifdone eps\else pdf\fi]
-        [\c!object=\v!no]}}%
-   \setbox\scratchbox\hbox
-     {\lower\ht\scratchbox\hbox{\raise\dimen2\box\scratchbox}}%
-   \wd\scratchbox\dimen0
-   \ht\scratchbox\dimen2
-   \dp\scratchbox\zeropoint
-   \box\scratchbox
-   \egroup}
-
-%D \macros
-%D   {startpagefigure}
-%D
-%D \starttyping
-%D \starttext \pagefigure[two.1] \stoptext
-%D \stoptyping
-
-\def\startpagefigure
-  {\dodoubleempty\dostartpagefigure}
-
-\def\dostartpagefigure[#1][#2]%
-  {\bgroup
-   \getparameters[\??ex][\c!offset=\v!overlay,#2]%
-   \startTEXpage[\c!offset=\@@exoffset]%
-     \externalfigure[#1][#2]\ignorespaces} % so we can put some text below the graphic
-
-\def\stoppagefigure
-  {\stopTEXpage
-   \egroup}
-
-\def\pagefigure
-  {\dodoubleempty\dopagefigure}
-
-\def\dopagefigure[#1][#2]%
-  {\dostartpagefigure[#1][#2]\stoppagefigure}
-
-\protect \endinput
diff --git a/tex/context/base/page-bck.mkiv b/tex/context/base/page-bck.mkiv
index 2522c882d..fae091c6a 100644
--- a/tex/context/base/page-bck.mkiv
+++ b/tex/context/base/page-bck.mkiv
@@ -15,6 +15,8 @@
 
 % \chardef\kindofpagetextareas=1 will isolate graphics from backgrounds
 
+% todo \fastlocalframed -> \localbackgroundframed
+
 \unprotect
 
 %D \macros
@@ -70,6 +72,45 @@
 %D (On the 824 pages maps bibliography runtime went down from
 %D 309 to 299 seconds.)
 
+% \let\currentotrbackground\empty
+%
+% \def\@@docheckbackground#1#2%
+%   {\ifcsname\currentotrbackground#1\endcsname
+%      \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\!!doneatrue\fi
+%    \fi}
+%
+% \def\@@nocheckbackground#1#2%
+%   {\ifcsname\currentotrbackground#1\endcsname
+%      \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\else\!!doneatrue\fi
+%    \fi}
+%
+% \def\checkbackground#1%
+%   {\edef\currentotrbackground{\??ma#1}%
+%    \begingroup
+%    \!!doneafalse
+%    \if!!donea\else\@@nocheckbackground\c!background     \empty
+%    \if!!donea\else\@@docheckbackground\c!frame          \v!on
+%    \if!!donea\else\@@nocheckbackground\c!foregroundcolor\empty
+%    \if!!donea\else\@@docheckbackground\c!leftframe      \v!on
+%    \if!!donea\else\@@docheckbackground\c!rightframe     \v!on
+%    \if!!donea\else\@@docheckbackground\c!topframe       \v!on
+%    \if!!donea\else\@@docheckbackground\c!bottomframe    \v!on \fi\fi\fi\fi\fi\fi\fi
+%    \if!!donea
+%      \endgroup\setusage  \currentotrbackground
+%    \else
+%      \endgroup\resetusage\currentotrbackground
+%    \fi}
+%
+% \def\ifsomebackgroundfound#1%
+%   {\ifusage{\??ma#1}}
+%
+% \def\doifsomebackgroundelse#1%
+%   {\ifusage{\??ma#1}%
+%      \expandafter\firstoftwoarguments
+%    \else
+%      \expandafter\secondoftwoarguments
+%    \fi}
+
 \let\currentotrbackground\empty
 
 \def\@@docheckbackground#1#2%
@@ -82,7 +123,7 @@
      \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\else\!!doneatrue\fi
    \fi}
 
-\def\checkbackground#1%
+\def\checkbackground#1% here we need an \ifempty primitive
   {\edef\currentotrbackground{\??ma#1}%
    \begingroup
    \!!doneafalse
@@ -94,34 +135,49 @@
    \if!!donea\else\@@docheckbackground\c!topframe       \v!on
    \if!!donea\else\@@docheckbackground\c!bottomframe    \v!on \fi\fi\fi\fi\fi\fi\fi
    \if!!donea
-     \endgroup\setusage  \currentotrbackground
+     \endgroup\expandafter\let\csname\currentotrbackground\endcsname\relax
    \else
-     \endgroup\resetusage\currentotrbackground
+     \endgroup\expandafter\let\csname\currentotrbackground\endcsname\undefined
    \fi}
 
 \def\ifsomebackgroundfound#1%
-  {\ifusage{\??ma#1}}
+  {\ifcsname\??ma#1\endcsname}
 
 \def\doifsomebackgroundelse#1%
-  {\ifusage{\??ma#1}%
+  {\ifcsname\??ma#1\endcsname
      \expandafter\firstoftwoarguments
    \else
      \expandafter\secondoftwoarguments
    \fi}
 
+\def\doifsomebackground#1%
+  {\ifcsname\??ma#1\endcsname
+     \expandafter\firstofoneargument
+   \else
+     \expandafter\gobbleoneargument
+   \fi}
+
 %D The background mechanism falls back on the \type {\framed}
 %D macro. This means that all normal frame and overlay
 %D features can be used.
 
+% \def\addsomebackground#1#2#3#4% area box width height / zero test added
+%   {\ifsomebackgroundfound#1\ifdim#3>\zeropoint\ifdim#4>\zeropoint
+%      \ifcsname\??ma#1\c!setups\endcsname % to be done
+%         \doifvaluesomething{\??ma#1\c!setups}{\setups[\csname\??ma#1\c!setups\endcsname]}% should not produce funny spaces !
+%      \fi
+%      \setbox#2\vbox\fastlocalframed % maybe \superfastlocalframed{tag}{w}{h}
+%        [\??ma#1]%
+%        [\c!component=#1,\c!width=#3,\c!height=#4]% are width and height used?
+%        {\dp#2\zeropoint\box#2}%
+%    \fi\fi\fi}
+
 \def\addsomebackground#1#2#3#4% area box width height / zero test added
   {\ifsomebackgroundfound#1\ifdim#3>\zeropoint\ifdim#4>\zeropoint
      \ifcsname\??ma#1\c!setups\endcsname % to be done
-        \doifvaluesomething{\??ma#1\c!setups}{\setups[\getvalue{\??ma#1\c!setups}]}% should not produce funny spaces !
+        \doifvaluesomething{\??ma#1\c!setups}{\setups[\csname\??ma#1\c!setups\endcsname]}% should not produce funny spaces !
      \fi
-     \setbox#2\vbox\fastlocalframed
-       [\??ma#1]
-       [\c!component=#1,\c!width=#3,\c!height=#4]% are width and height used?
-       {\dp#2\zeropoint\box#2}%
+     \localbackgroundframed{#1}{#2}{#3}{#4}%
    \fi\fi\fi}
 
 %D There are quite some backgrounds. At the bottom layer,
@@ -179,10 +235,6 @@
 \newdimen\pageoffset % bleed
 \newdimen\pagedepth
 
-\let\pagebackgroundhoffset\!!zeropoint
-\let\pagebackgroundvoffset\!!zeropoint
-\let\pagebackgrounddepth  \!!zeropoint
-
 % \def\setbackgroundboxes
 %   {\showmessage\m!layouts8\empty
 %    \setbackgroundbox\leftbackground\relax
@@ -204,30 +256,36 @@
 
 \def\setbackgroundboxes
   {\ifnewbackground
-     \global\chardef\newrightbackground\plusone
-     \global\chardef\newleftbackground\plusone
-     \global\setbox\leftbackground\emptybox
-     \global\setbox\rightbackground\emptybox
+     \dosetbackgroundboxesr
    \fi
-   \doifbothsides
-     {\ifcase\newleftbackground \else
-        % \showmessage\m!layouts8\empty
-        \setbackgroundbox\leftbackground\relax
-        \global\chardef\newleftbackground\zerocount
-        \global\chardef\newrightbackground\zerocount
-      \fi}
-     {\ifcase\newleftbackground \else
-        % \showmessage\m!layouts8\empty
-        \setbackgroundbox\leftbackground\relax
-        \global\chardef\newleftbackground\zerocount
-      \fi}
-     {\ifcase\newrightbackground \else
-        % \showmessage\m!layouts8\empty
-        \setbackgroundbox\rightbackground\doswapmargins
-        \global\chardef\newrightbackground\zerocount
-      \fi}%
+   \doifbothsides\dosetbackgroundboxesa\dosetbackgroundboxesb\dosetbackgroundboxesc
    \ifx\@@mastate\v!repeat\else\global\newbackgroundfalse\fi}
 
+\def\dosetbackgroundboxesr
+  {\global\chardef\newrightbackground\plusone
+   \global\chardef\newleftbackground\plusone
+   \global\setbox\leftbackground\emptybox
+   \global\setbox\rightbackground\emptybox}
+\def\dosetbackgroundboxesa
+  {\ifcase\newleftbackground \else
+     % \showmessage\m!layouts8\empty
+     \setbackgroundbox\leftbackground\relax
+     \global\chardef\newleftbackground\zerocount
+     \global\chardef\newrightbackground\zerocount
+   \fi}
+\def\dosetbackgroundboxesb
+  {\ifcase\newleftbackground \else
+     % \showmessage\m!layouts8\empty
+     \setbackgroundbox\leftbackground\relax
+     \global\chardef\newleftbackground\zerocount
+   \fi}
+\def\dosetbackgroundboxesc
+  {\ifcase\newrightbackground \else
+     % \showmessage\m!layouts8\empty
+     \setbackgroundbox\rightbackground\doswapmargins
+     \global\chardef\newrightbackground\zerocount
+   \fi}
+
 \def\addmainbackground#1% todo: dimension spec
   {\ifsomebackground
      \setbackgroundboxes
@@ -237,25 +295,29 @@
         \box#1}%
    \fi}
 
-\def\setbackgroundoffsets
+\newdimen\pagebackgroundhoffset
+\newdimen\pagebackgroundvoffset
+\newdimen\pagebackgrounddepth
+\newdimen\pagebackgroundoffset
+
+\def\setbackgroundoffsets % used in menus (we can use ifcsname's here)
   {\ifsomebackground \ifnewbackground
-     \global\let\pagebackgroundhoffset\!!zeropoint
-     \global\let\pagebackgroundvoffset\!!zeropoint
-     \global\let\pagebackgrounddepth  \!!zeropoint
+     \global\pagebackgroundhoffset\zeropoint
+     \global\pagebackgroundvoffset\zeropoint
+     \global\pagebackgrounddepth  \zeropoint
      \doifsomebackgroundelse{\v!text\v!text}\donetrue\donefalse
      \ifdone\else\doifsomebackgroundelse\v!text\donetrue\donothing\fi
      \ifdone
-       \bgroup
-       \scratchdimen\getvalue{\??ma\v!page\c!offset}%
+       \begingroup
+       \scratchdimen\csname\??ma\v!page\c!offset\endcsname
        \doifsomebackgroundelse{\v!top\v!text}\donothing
          {\doifsomebackgroundelse{\v!bottom\v!text}\donothing
-            {\xdef\pagebackgroundhoffset{\the\scratchdimen}}}%
+            {\global\pagebackgroundhoffset\scratchdimen}}%
        \doifsomebackgroundelse{\v!text\v!rightedge}\donothing
          {\doifsomebackgroundelse{\v!text\v!leftedge}\donothing
-            {\xdef\pagebackgroundvoffset{\the\scratchdimen}%
-             \scratchdimen\getvalue{\??ma\v!page\c!depth}%
-             \xdef\pagebackgrounddepth{\the\scratchdimen}}}%
-       \egroup
+            {\global\pagebackgroundvoffset\scratchdimen
+             \global\pagebackgrounddepth\csname\??ma\v!page\c!depth\endcsname}}%
+       \endgroup
      \fi
    \fi \fi}
 
@@ -288,7 +350,7 @@
       \vfilll}%
   \smashbox#1}
 
-\def\dodopagebodybackground#1#2%
+\def\dodopagebodybackground#1#2% maybe helper
   {\ifdim#2>\zeropoint % added, faster
      \setbox\scratchbox\vbox to #2
        \bgroup\hbox\bgroup
@@ -308,17 +370,17 @@
      \box\scratchbox\relax
    \fi}
 
-\def\dododopagebodybackground#1#2#3#4% width height pos pos
+\def\dododopagebodybackground#1#2#3#4% width height pos pos %  maybe helper
   {\ifsomebackgroundfound{#3#4}%
      \ifdim#2>\zeropoint\relax
        \ifdim#1>\zeropoint\relax
          \ifcsname\??ma#3#4\c!setups\endcsname % to be done
-            \doifvaluesomething{\??ma#3#4\c!setups}{\setups[\getvalue{\??ma#3#4\c!setups}]}% should not produce funny spaces !
+            \doifvaluesomething{\??ma#3#4\c!setups}{\setups[\csname\??ma#3#4\c!setups\endcsname]}% should not produce funny spaces !
          \fi
          \fastlocalframed
-           [\??ma#3#4]
-           [\c!component=#3-#4]
-           {\vbox to #2{\vss\hbox to#1{\hss\getvalue{\??ma#3#4\c!command}\hss}\vss}}%
+           [\??ma#3#4]%
+           [\c!component=#3-#4]%
+           {\vbox to #2{\vss\hbox to#1{\hss\csname\??ma#3#4\c!command\endcsname\hss}\vss}}%
        \else
          \hskip#1%
        \fi
@@ -371,17 +433,14 @@
    \fi\fi\fi
    \doifelsevalue{\??ma\v!page\c!offset}\v!overlay
      {\global\pageoffset\zeropoint}
-     {\global\pageoffset\getvalue{\??ma\v!page\c!offset}}%
-   \global\pagedepth\getvalue{\??ma\v!page\c!depth}%
-   \xdef\pagebackgroundoffset{\the\pageoffset}%
-   \xdef\pagebackgrounddepth {\the\pagedepth }%
+     {\global\pageoffset\csname\??ma\v!page\c!offset\endcsname}%
+   \global\pagedepth\csname\??ma\v!page\c!depth\endcsname
+   \global\pagebackgroundoffset\pageoffset
+   \global\pagebackgrounddepth\pagedepth
    \doifelse\@@mastate\v!stop
      {\global\newbackgroundfalse}
      {\global\newbackgroundtrue }}
 
-\let\pagebackgroundoffset\!!zeropoint
-\let\pagebackgrounddepth \!!zeropoint
-
 %D Each areas (currently there are $1+3+25+1=30$ of them)
 %D has its own low level framed object associated.
 
@@ -426,8 +485,8 @@
 
 \getparameters
   [\??ma\v!page]
-  [\c!offset=\!!zeropoint, % hm, so we need to force overlay elsewhere
-   \c!depth=\!!zeropoint]
+  [\c!offset=\zeropoint, % hm, so we need to force overlay elsewhere
+   \c!depth=\zeropoint]
 
 %D General setup:
 
@@ -502,20 +561,3 @@
 \somebackgroundfalse
 
 \protect \endinput
-
-%D Removed \quote {features}:
-%D
-%D \starttyping
-%D \startinteraction
-%D \doifmarginswapelse
-%D   {\copy\leftbackground}
-%D   {\copy\rightbackground}%
-%D \stopinteraction
-%D \stoptyping
-%D
-%D \starttyping
-%D \edef\setpagebackgrounddepth%
-%D   {\dp#2=\the\dp#2}%
-%D \setbox#2=\vbox\localframed[\??ma#1]{...}
-%D \setpagebackgrounddepth
-%D \stoptyping
diff --git a/tex/context/base/page-flw.mkii b/tex/context/base/page-flw.mkii
new file mode 100644
index 000000000..3eb867a78
--- /dev/null
+++ b/tex/context/base/page-flw.mkii
@@ -0,0 +1,107 @@
+%D \module
+%D   [       file=page-flw,
+%D        version=2003.04.19, % from test-002 (1997) profile experiment
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Text Flows,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright=PRAGMA ADE]
+%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 / Text Flows}
+
+%D This is high experimental and especially flushing may change (proper
+%D spacing is the driving force here).
+
+\unprotect
+
+\def\definetextflow
+  {\dodoubleempty\dodefinetextflow}
+
+\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}
+
+\def\textflowparameter#1#2{\csname\??tx:p:#1#2\endcsname}
+\def\textflowcollector  #1{\csname\??tx:c:#1\endcsname}
+
+\def\doiftextflowcollectorelse#1{\doifdefinedelse{\??tx:c:#1}}
+
+\def\doiftextflowelse#1%
+  {\doiftextflowcollectorelse{#1}
+     {\ifvoid\textflowcollector{#1}%
+        \expandafter\secondoftwoarguments
+      \else
+        \expandafter\firstoftwoarguments
+      \fi}
+     {\secondoftwoarguments}}
+
+\def\doiftextflow#1%
+  {\doiftextflowelse{#1}\firstofoneargument\gobbleoneargument}
+
+\def\starttextflow[#1]%
+  {\doiftextflowcollectorelse{#1}
+     {\global\setbox\textflowcollector{#1}\vbox
+        \bgroup
+        \unvbox\textflowcollector{#1}%
+        \hsize\textflowparameter{#1}\c!width
+        \doifsomething{\textflowparameter{#1}\c!style}%
+          {\doconvertfont{\textflowparameter{#1}\c!style}}%
+        \def\stoptextflow{\endgraf\egroup}}
+     {\let\stoptextflow\relax}}
+
+\def\flushtextflow#1%
+  {\doiftextflow{#1}
+     {\ifdim\ht\textflowcollector{#1}>\vsize
+        \setbox\scratchbox\vsplit\textflowcollector{#1} to \vsize
+        \unvbox\scratchbox
+      \else
+        \unvbox\textflowcollector{#1}%
+      \fi}}
+
+\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-flw.mkiv b/tex/context/base/page-flw.mkiv
new file mode 100644
index 000000000..3eb867a78
--- /dev/null
+++ b/tex/context/base/page-flw.mkiv
@@ -0,0 +1,107 @@
+%D \module
+%D   [       file=page-flw,
+%D        version=2003.04.19, % from test-002 (1997) profile experiment
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Text Flows,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright=PRAGMA ADE]
+%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 / Text Flows}
+
+%D This is high experimental and especially flushing may change (proper
+%D spacing is the driving force here).
+
+\unprotect
+
+\def\definetextflow
+  {\dodoubleempty\dodefinetextflow}
+
+\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}
+
+\def\textflowparameter#1#2{\csname\??tx:p:#1#2\endcsname}
+\def\textflowcollector  #1{\csname\??tx:c:#1\endcsname}
+
+\def\doiftextflowcollectorelse#1{\doifdefinedelse{\??tx:c:#1}}
+
+\def\doiftextflowelse#1%
+  {\doiftextflowcollectorelse{#1}
+     {\ifvoid\textflowcollector{#1}%
+        \expandafter\secondoftwoarguments
+      \else
+        \expandafter\firstoftwoarguments
+      \fi}
+     {\secondoftwoarguments}}
+
+\def\doiftextflow#1%
+  {\doiftextflowelse{#1}\firstofoneargument\gobbleoneargument}
+
+\def\starttextflow[#1]%
+  {\doiftextflowcollectorelse{#1}
+     {\global\setbox\textflowcollector{#1}\vbox
+        \bgroup
+        \unvbox\textflowcollector{#1}%
+        \hsize\textflowparameter{#1}\c!width
+        \doifsomething{\textflowparameter{#1}\c!style}%
+          {\doconvertfont{\textflowparameter{#1}\c!style}}%
+        \def\stoptextflow{\endgraf\egroup}}
+     {\let\stoptextflow\relax}}
+
+\def\flushtextflow#1%
+  {\doiftextflow{#1}
+     {\ifdim\ht\textflowcollector{#1}>\vsize
+        \setbox\scratchbox\vsplit\textflowcollector{#1} to \vsize
+        \unvbox\scratchbox
+      \else
+        \unvbox\textflowcollector{#1}%
+      \fi}}
+
+\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-flw.tex b/tex/context/base/page-flw.tex
deleted file mode 100644
index 3eb867a78..000000000
--- a/tex/context/base/page-flw.tex
+++ /dev/null
@@ -1,107 +0,0 @@
-%D \module
-%D   [       file=page-flw,
-%D        version=2003.04.19, % from test-002 (1997) profile experiment
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Text Flows,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright=PRAGMA ADE]
-%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 / Text Flows}
-
-%D This is high experimental and especially flushing may change (proper
-%D spacing is the driving force here).
-
-\unprotect
-
-\def\definetextflow
-  {\dodoubleempty\dodefinetextflow}
-
-\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}
-
-\def\textflowparameter#1#2{\csname\??tx:p:#1#2\endcsname}
-\def\textflowcollector  #1{\csname\??tx:c:#1\endcsname}
-
-\def\doiftextflowcollectorelse#1{\doifdefinedelse{\??tx:c:#1}}
-
-\def\doiftextflowelse#1%
-  {\doiftextflowcollectorelse{#1}
-     {\ifvoid\textflowcollector{#1}%
-        \expandafter\secondoftwoarguments
-      \else
-        \expandafter\firstoftwoarguments
-      \fi}
-     {\secondoftwoarguments}}
-
-\def\doiftextflow#1%
-  {\doiftextflowelse{#1}\firstofoneargument\gobbleoneargument}
-
-\def\starttextflow[#1]%
-  {\doiftextflowcollectorelse{#1}
-     {\global\setbox\textflowcollector{#1}\vbox
-        \bgroup
-        \unvbox\textflowcollector{#1}%
-        \hsize\textflowparameter{#1}\c!width
-        \doifsomething{\textflowparameter{#1}\c!style}%
-          {\doconvertfont{\textflowparameter{#1}\c!style}}%
-        \def\stoptextflow{\endgraf\egroup}}
-     {\let\stoptextflow\relax}}
-
-\def\flushtextflow#1%
-  {\doiftextflow{#1}
-     {\ifdim\ht\textflowcollector{#1}>\vsize
-        \setbox\scratchbox\vsplit\textflowcollector{#1} to \vsize
-        \unvbox\scratchbox
-      \else
-        \unvbox\textflowcollector{#1}%
-      \fi}}
-
-\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.mkii b/tex/context/base/page-imp.mkii
new file mode 100644
index 000000000..e4ece04a6
--- /dev/null
+++ b/tex/context/base/page-imp.mkii
@@ -0,0 +1,1314 @@
+%D \module
+%D   [       file=page-imp, % was: core-pag,
+%D        version=1998.01.15,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Pagebody Building (Imposition),
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% much of this can more to run time loading !
+
+\writestatus{loading}{ConTeXt Page Macros / Pagebody Building}
+
+\unprotect
+
+% sizing bug:
+%
+% \setuppapersize[A4][A4,landscape] \setuparranging[2UP] \showframe
+%
+% \starttext \dorecurse{10}{\input tufte \par} \stoptext
+
+% to be moved code:
+
+\newif\ifclipprintbox \clipprintboxtrue
+%newif\ifclippagebox  \clippageboxtrue
+
+\def\clippedprintbox#1#2% can be made more efficient, see other clipper
+  {\ifclipprintbox
+     \!!widthc \pagebackgroundoffset
+     \!!widtha \dimexpr\paperwidth + \!!widthc\relax
+     \!!heighta\dimexpr\paperheight+2\!!widthc\relax
+     \setbox#2\vbox to \paperheight{\vfill\box#2}%
+     \ht#2\paperheight
+     \wd#2\paperwidth
+     \setbox#2\vbox
+       {\framed
+          [\c!offset=\!!widthc,\c!strut=\v!no,\c!frame=\v!off]
+          {\box#2}}%
+     \setbox#2\hbox to \paperwidth
+       {\ifcase#1\relax
+          \!!widthb\zeropoint
+          \hskip-\!!widthc
+        \else
+          \!!widthb\!!widthc
+        \fi
+        \lower\!!widthc\hbox
+          {\clip
+             [\c!width=\!!widtha,\c!height=\!!heighta,
+              \c!hoffset=\!!widthb,\c!voffset=\zeropoint]
+             {\box#2}}}%
+     \wd#2\paperwidth
+     \ht#2\paperheight
+   \fi
+   \box#2\relax}
+
+\let\clippagebox \gobbleoneargument
+\let\clipprintbox\gobbleoneargument
+
+% \setuppagenumbering[alternative=doublesided]
+% \setupcolors[state=start]
+% \setuppapersize[A4][A4,oversized]
+% \setuplayout[location=middle,clipoffset=5mm]
+% \setupbackgrounds
+%   [page]
+%   [frame=on,rulethickness=1mm,
+%    backgroundoffset=10mm,background=color,backgroundcolor=red]
+% \starttext \dorecurse{10}{\input tufte \par} \stoptext
+
+\def\clippagebox#1%
+  {\ifdim\@@lyclipoffset>\zeropoint
+     \!!widtha \wd#1%
+     \!!heighta\ht#1%
+     \!!deptha \dp#1%
+     \setbox#1\hbox
+       {\!!widthb \@@lyclipoffset
+        \advance\!!heighta\dimexpr\!!deptha+2\!!widthb\relax
+        \advance\!!widtha \!!widthb
+        \doifbothsides
+          {\advance\!!widtha\!!widthb \!!widthc-\!!widthb \hskip\!!widthc}%
+          {\!!widthc\zeropoint}
+          {\!!widthc-\!!widthb \hskip\!!widthc}%
+        \lower\!!widthb\hbox
+          {\clip
+             [\c!hoffset=\!!widthc,
+              \c!voffset=-\!!widthb,
+                \c!width=\!!widtha,
+               \c!height=\!!heighta]%
+             {\box#1}}}%
+     \wd#1\!!widtha
+     \ht#1\!!heighta
+     \dp#1\!!deptha
+   \fi}
+
+%D \macros
+%D   {starttextdata}
+%D
+%D This is a user macro (appending to every last shipout is not
+%D really user friendly.
+
+\newtoks \collectedtextdata
+
+\long\def\starttextdata#1\stoptextdata
+  {\doglobal\appendtoks#1\to\collectedtextdata}
+
+\def\flushtextdata
+  {\vsmashed{\the\collectedtextdata}% all dimensions zero
+   \global\collectedtextdata\emptytoks
+   \globallet\flushtextdata\donothing}
+
+\prependtoks \flushtextdata \to \everylastshipout
+
+% moved code:
+
+% \def\myshipout#1%
+%   {\beforeshipout % voor de pagebody dus !
+%    \dontshowcomposition
+%    \ifarrangingpages\@EA\actualarrange\else\@EA\actualshipout\fi
+%      {\thisisrealpage\realfolio#1}%
+%    \gotonextrealpage
+%    \aftershipout}
+
+\def\installpagehandler#1#2%          % a handler takes one argument: something to be boxed
+  {\setvalue{\??pp:\c!method:#1}{#2}} % and shipped out (don't depend on the exact package)
+
+\installpagehandler\v!normal
+  {\ifarrangingpages\expandafter\actualarrange\else\expandafter\actualshipout\fi}
+
+\def\myshipout#1%
+ {\beforeshipout % voor de pagebody dus !
+  \dontshowcomposition
+  \executeifdefined{\??pp:\c!method:\@@ppmethod}\gobbleoneargument{\thisisrealpage\realfolio#1}%
+  \gotonextrealpage
+  \aftershipout}
+
+\newbox\postponedcontent
+
+% \def\flushatshipout
+%   {\dowithnextbox
+%      {\global\setbox\postponedcontent\hbox to \zeropoint
+%         {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
+%          \box\postponedcontent\flushnextbox}%
+%       \global\ht\postponedcontent\zeropoint
+%       \global\dp\postponedcontent\zeropoint
+%       \global\wd\postponedcontent\zeropoint}%
+%    \hbox}
+
+\def\flushatshipout
+  {\dowithnextbox
+     {\global\setbox\postponedcontent\hbox to \zeropoint
+        {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
+         \unhbox\postponedcontent\unhbox\nextbox}%
+      \global\ht\postponedcontent\zeropoint
+      \global\dp\postponedcontent\zeropoint
+      \global\wd\postponedcontent\zeropoint}%
+   \hbox}
+
+% \starttypen
+% \def\pagestoshipout{1,3,5}
+% \stoptypen
+
+\newcount\shippedoutpages
+
+\let\pagestoshipout\empty      % {1,3,6}
+\chardef\whichpagetoshipout=0  % 0=all 1=odd 2=even
+
+\ifx\finalizeshipoutbox\undefined \let\finalizeshipoutbox\firstofoneargument \fi
+
+\def\actualshipout#1%
+  {\global\advance\shippedoutpages\plusone
+   % this is not resource safe!
+   \ifx\pagestoshipout\empty
+     \ifcase\whichpagetoshipout\relax
+       \donetrue
+     \or % 1
+       \ifodd\shippedoutpages\relax\donetrue\else\donefalse\fi
+     \or % 2
+       \ifodd\shippedoutpages\relax\donefalse\else\donetrue\fi
+     \else
+       \donetrue
+     \fi
+   \else % testen, aangepast / expanded nodig ?
+     \expanded{\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}%
+       \donetrue\donefalse
+   \fi
+   \ifdone
+     \shipout\vbox
+       {\forgetall
+        \offinterlineskip
+        \dontcomplain
+        \scratchdimen-1in
+        \vskip\scratchdimen
+        \hskip\scratchdimen
+        \hbox % \setbox0=\box.. is nicer
+          {\setbox0\hbox{\finalizeshipoutbox{#1}}% just in case there are objects there, hook for testing
+           \setbox\scratchbox\hbox
+             {% before the main one !
+              \ifcase\realfolio \or
+                \the\everyfirstshipout
+                \global\everyfirstshipout\emptytoks
+              \fi
+              % the main one
+              \the\everyshipout\relax
+              % always last (and after the main one)
+              \ifnum\realpageno=\lastpage\relax
+                \the\everylastshipout
+                \global\everylastshipout\emptytoks
+              \fi}%
+           \smashbox\scratchbox
+           \box\scratchbox
+           \box\postponedcontent % evt ver naar links !
+           \box0}}%
+   \else
+     \message
+       {[\ifarrangingpages arranged \fi page
+         \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace
+         not flushed]}%
+     \setbox0\hbox{#1}%
+     \deadcycles\zerocount
+   \fi}
+
+\def\actualarrange#1%
+  {\setbox0\hbox{\thisisrealpage{\realfolio}#1}%
+   \pusharrangedpage0%
+   \deadcycles\zerocount}
+
+%D We need a couple of boxes for duplex printing \unknown
+
+\newbox\arrangedpageA \newbox\arrangedpageB
+
+%D \unknown\ and some for simulating big sheets.
+
+\newbox\arrangedpageC \newbox\arrangedpageD
+\newbox\arrangedpageE \newbox\arrangedpageF
+\newbox\arrangedpageG \newbox\arrangedpageH
+
+\newif\ifswaparranged
+\newif\ifnegatearranged
+\newif\ifmirrorarranged
+\newif\ifdoublearranged
+
+\newif\ifarrangingdisabled
+
+\def\arrangedrotationO{0}
+\def\arrangedrotationE{0}
+
+\newcounter\arrangedpageN
+\newcounter\arrangedpageM
+
+\chardef\arrangedpageT=1
+\chardef\arrangedpageX=1
+\chardef\arrangedpageY=1
+
+\def\calculatepaperoffsets#1%
+  {\scratchdimen\getvalue{\??pp#1\c!offset}%
+   \divide\scratchdimen \arrangedpageX
+   \global\advance\paperwidth -2\scratchdimen
+   \scratchdimen\getvalue{\??pp#1\c!offset}%
+   \divide\scratchdimen \arrangedpageY
+   \global\advance\paperheight-2\scratchdimen}
+
+\newconditional\arrangedbackgroundokay % more ifs -> conditionals
+
+\def\setuparranging[#1]%
+  {\ifarrangingdisabled \else
+     \doifelse{#1}\v!disable
+       {\global\arrangingdisabledtrue}
+       {\global\arrangingdisabledfalse}%
+     \global\arrangingpagestrue
+     \global\negatearrangedfalse
+     \global\mirrorarrangedfalse
+     \global\doublearrangedfalse
+     \gdef\arrangedrotationO{0}%
+     \gdef\arrangedrotationE{180}%
+     \processallactionsinset
+       [#1]
+       [    \v!mirrored=>\global\mirrorarrangedtrue,
+         \v!doublesided=>\global\doublearrangedtrue,
+            \v!negative=>\global\negatearrangedtrue,
+             \v!rotated=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
+                     90=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
+                    180=>\gdef\arrangedrotationO{180}\gdef\arrangedrotationE{0},
+                    270=>\gdef\arrangedrotationO{270}\gdef\arrangedrotationE{90},
+               \s!reset=>\global\arrangingpagesfalse,
+          \v!background=>\global\settrue\arrangedbackgroundokay,
+             \s!unknown=>\checkinstalledpagearrangement\commalistelement]%
+        % no \s!default=> we can have aaa,,bbb
+     \ifx\handlearrangedpage\undefined
+       \global\arrangingpagesfalse
+     \fi
+     \doifcommonelse{#1}{90,270,\v!rotated}
+       {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
+     \setuppapersize
+     \ifarrangingpages
+       \abortutilitygeneration
+     \fi
+   \fi}
+
+\def\installpagearrangement #1 %
+  {\setgvalue{\??pp\??pp#1}}
+
+\def\checkinstalledpagearrangement#1% can be empty: aaa,,bbb
+  {\executeifdefined{\??pp\??pp#1}\donothing}
+
+\def\dosetuparrangement#1#2#3#4#5#6#7#8%
+  {\global\chardef\arrangedpageX     #1%
+   \global\chardef\arrangedpageY     #2%
+   \global\chardef\arrangedpageT     #3%
+   \global\chardef\horizontalcutmarks#4%
+   \global\chardef\verticalcutmarks  #5%
+   \global\let    \pusharrangedpage  #6%
+   \global\let    \poparrangedpages  #7%
+   \global\let    \handlearrangedpage#8}
+
+\installpagearrangement {\v!normal}
+  {\global\arrangingpagesfalse}
+
+\installpagearrangement 2*16
+  {\dosetuparrangement{4}{4}{16}{5}{5}%
+     \pusharrangedpageTHIRTYTWO\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*8
+  {\dosetuparrangement{4}{2}{8}{5}{3}%
+     \pusharrangedpageSIXTEEN\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*4
+  {\dosetuparrangement{2}{2}{4}{3}{3}%
+     \pusharrangedpageEIGHT\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*2
+  {\dosetuparrangement{2}{1}{2}{3}{2}%
+     \pusharrangedpageFOURA\poparrangedpagesAB\relax}
+
+\installpagearrangement 2**2
+  {\dosetuparrangement{2}{1}{2}{3}{2}%
+     \pusharrangedpageFOURB\poparrangedpagesAB\relax}
+
+\installpagearrangement 2SIDE
+  {\dosetuparrangement{2}{1}{2}{3}{2}%
+     \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageSIDE}
+
+\installpagearrangement 2TOP
+  {\dosetuparrangement{1}{2}{2}{2}{3}%
+     \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageTOP}
+
+\installpagearrangement 2UP
+  {\dosetuparrangement{2}{1}{4}{3}{2}%
+     \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWOUP}
+
+\installpagearrangement 2DOWN
+  {\dosetuparrangement{1}{2}{4}{2}{3}%
+     \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWODOWN}
+
+\installpagearrangement 2*4*2 % one defined by Willy Egger:
+  {\dosetuparrangement{2}{2}{4}{3}{2}%
+     \pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax}
+
+\installpagearrangement 2*2*4 % onother one of Willy Egger
+  {\dosetuparrangement{2}{1}{8}{3}{2}%
+     \pusharrangedpageSIXTEENFOUR\poparrangedpagesAtoH\relax}
+
+\installpagearrangement 2TOPSIDE
+  {\dosetuparrangement{1}{2}{4}{2}{3}%
+     \pusharrangedpageTWOTOPSIDE\poparrangedpagesTWOTOPSIDE\handlearrangedpageTOP}
+
+% \def\filluparrangedpages % beware: \realpageno is 1 ahead
+%   {\ifarrangingpages
+%      \scratchcounter-\realpageno
+%      \divide\scratchcounter \arrangedpageT
+%      \multiply\scratchcounter \arrangedpageT
+%      \advance\scratchcounter \realpageno
+%      \advance\scratchcounter \minusone
+%      \dorecurse\scratchcounter{\noheaderandfooterlines\ejectdummypage}%
+%    \fi}
+
+\def\filluparrangedpages % beware: \realpageno is 1 ahead
+  {\ifarrangingpages
+     \scratchcounter\numexpr\realpageno-\plusone\relax
+     \dosetmodulo\scratchcounter\arrangedpageT\scratchcounter
+     \ifcase\scratchcounter\else
+       \advance\scratchcounter \plusone
+       \dostepwiserecurse\scratchcounter\arrangedpageT\plusone
+         {\noheaderandfooterlines\ejectdummypage}%
+     \fi
+   \fi}
+
+\def\handlearrangedpageXandY#1#2#3#4#5%
+  {\global\setbox#5\hbox to \arrangedpageX\paperwidth
+     {\setbox\scratchbox\vbox to \arrangedpageY\paperheight
+        {\forgetall
+         \offinterlineskip
+         \dontcomplain
+         \vskip#4\paperheight
+         \hskip#3\paperwidth
+         \dorotatebox{\ifcase#2 0\else180\fi}\hbox{\box#1}%
+         \vfill}%
+      \wd\scratchbox\zeropoint
+      \box\scratchbox\box#5\hss}}
+
+\def\gotonextarrangepage
+  {\global\advance\arrangeno \plusone
+   \def\pagecutmarksymbol{\the\arrangeno}}
+
+\def\outputarrangedbox#1%
+  {\bgroup
+   \gotonextarrangepage
+   \ifnum\arrangedrotationO\arrangedrotationE>\zerocount
+     \setbox#1\vbox
+       {\ifdoublearranged
+          \ifodd\arrangeno
+            \dorotatebox\arrangedrotationO\hbox{\box#1}%
+          \else
+            \dorotatebox\arrangedrotationE\hbox{\box#1}%
+          \fi
+        \else
+          \dorotatebox\arrangedrotationO\hbox{\box#1}%
+        \fi}%
+   \fi
+   \ifmirrorarranged
+     \setbox#1\vbox{\domirrorbox\vbox{\box#1}}%
+   \fi
+   \ifnegatearranged
+     \negatecolorbox{#1}%
+   \fi
+   \finishpagebox#1%
+   \ifconditional\arrangedbackgroundokay\addprintbackground#1\fi
+   \actualshipout{\box#1}%
+   \egroup}
+
+%D The format file can be 16K smaller when we postpone the
+%D real arrangments. Some day ...
+
+% TOP
+
+% 32/16/8/4/SIDE
+
+\def\poparrangedpagesAB
+  {\ifnum\arrangedpageN>\zerocount
+     \dontcomplain
+     \paperwidth\arrangedpageX\paperwidth
+     \paperheight\arrangedpageY\paperheight
+     \outputarrangedbox\arrangedpageA
+     \outputarrangedbox\arrangedpageB
+     \doglobal\newcounter\arrangedpageN
+   \fi}
+
+\def\pusharrangedpageTHIRTYTWO#1% taco's challenge
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}033\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}003\arrangedpageB %  2
+   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  3
+   \or \handlearrangedpageXandY{#1}130\arrangedpageA %  4
+   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
+   \or \handlearrangedpageXandY{#1}130\arrangedpageB %  6
+   \or \handlearrangedpageXandY{#1}033\arrangedpageB %  7
+   \or \handlearrangedpageXandY{#1}003\arrangedpageA %  8
+   \or \handlearrangedpageXandY{#1}102\arrangedpageA %  9
+   \or \handlearrangedpageXandY{#1}132\arrangedpageB % 10
+   \or \handlearrangedpageXandY{#1}031\arrangedpageB % 11
+   \or \handlearrangedpageXandY{#1}001\arrangedpageA % 12
+   \or \handlearrangedpageXandY{#1}031\arrangedpageA % 13
+   \or \handlearrangedpageXandY{#1}001\arrangedpageB % 14
+   \or \handlearrangedpageXandY{#1}102\arrangedpageB % 15
+   \or \handlearrangedpageXandY{#1}132\arrangedpageA % 16
+   \or \handlearrangedpageXandY{#1}122\arrangedpageA % 17
+   \or \handlearrangedpageXandY{#1}112\arrangedpageB % 18
+   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 19
+   \or \handlearrangedpageXandY{#1}021\arrangedpageA % 20
+   \or \handlearrangedpageXandY{#1}011\arrangedpageA % 21
+   \or \handlearrangedpageXandY{#1}021\arrangedpageB % 22
+   \or \handlearrangedpageXandY{#1}122\arrangedpageB % 23
+   \or \handlearrangedpageXandY{#1}112\arrangedpageA % 24
+   \or \handlearrangedpageXandY{#1}013\arrangedpageA % 25
+   \or \handlearrangedpageXandY{#1}023\arrangedpageB % 26
+   \or \handlearrangedpageXandY{#1}120\arrangedpageB % 27
+   \or \handlearrangedpageXandY{#1}110\arrangedpageA % 28
+   \or \handlearrangedpageXandY{#1}120\arrangedpageA % 29
+   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 30
+   \or \handlearrangedpageXandY{#1}013\arrangedpageB % 31
+   \or \handlearrangedpageXandY{#1}023\arrangedpageA % 32
+     \poparrangedpages
+   \fi}
+
+\def\pusharrangedpageSIXTEEN#1% changed to match the official way of doing
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}031\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
+   \or \handlearrangedpageXandY{#1}031\arrangedpageB %  3
+   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  4
+   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
+   \or \handlearrangedpageXandY{#1}130\arrangedpageB %  6
+   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  7
+   \or \handlearrangedpageXandY{#1}130\arrangedpageA %  8
+   \or \handlearrangedpageXandY{#1}120\arrangedpageA %  9
+   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
+   \or \handlearrangedpageXandY{#1}120\arrangedpageB % 11
+   \or \handlearrangedpageXandY{#1}110\arrangedpageA % 12
+   \or \handlearrangedpageXandY{#1}011\arrangedpageA % 13
+   \or \handlearrangedpageXandY{#1}021\arrangedpageB % 14
+   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
+   \or \handlearrangedpageXandY{#1}021\arrangedpageA % 16
+     \poparrangedpages
+   \fi}
+
+\def\pusharrangedpageEIGHT#1% changed to match the official way of doing
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
+   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  3
+   \or \handlearrangedpageXandY{#1}110\arrangedpageA %  4
+   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
+   \or \handlearrangedpageXandY{#1}110\arrangedpageB %  6
+   \or \handlearrangedpageXandY{#1}011\arrangedpageB %  7
+   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  8
+     \poparrangedpages
+   \fi}
+
+\def\pusharrangedpageFOURA{\pusharrangedpageFOURdo01}
+\def\pusharrangedpageFOURB{\pusharrangedpageFOURdo10}
+
+\def\pusharrangedpageFOURdo#1#2#3%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#3}010\arrangedpageA    %  1
+   \or \handlearrangedpageXandY{#3}0{#1}0\arrangedpageB %  2/3 not {1}
+   \or \handlearrangedpageXandY{#3}0{#2}0\arrangedpageB %  3/2 not {1}
+   \or \handlearrangedpageXandY{#3}000\arrangedpageA    %  4
+     \poparrangedpages
+   \fi}
+
+\def\pusharrangedpageSIDETOP#1%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
+     \poparrangedpages
+   \fi}
+
+\def\handlearrangedpageSIDE
+  {\global\wd\arrangedpageA\paperwidth
+   \global\wd\arrangedpageB\paperwidth
+   \global\setbox\arrangedpageA\hbox
+     {\box\arrangedpageA\box\arrangedpageB}%
+   \global\ht\arrangedpageA\paperheight}
+
+\def\handlearrangedpageTOP
+  {\global\ht\arrangedpageA\paperheight
+   \global\ht\arrangedpageB\paperheight
+   \global\setbox\arrangedpageA\vbox
+     {\forgetall\offinterlineskip\vskip\paperheight
+      \box\arrangedpageA\box\arrangedpageB}%
+   \global\setbox\arrangedpageB\box\scratchbox} % ?
+
+% 2UP/2DOWN / 1pt prevents overflow
+
+\def\splitoffarrangedpagesTWO
+  {\splittopskip\zeropoint
+   \global\setbox\arrangedpageA\vsplit\arrangedpageB to \onepoint
+   \scratchdimen\dimexpr\ht\arrangedpageB-\onepoint\relax
+   \ifdim\scratchdimen>\onepoint
+     \setbox\scratchbox\vsplit\arrangedpageB to \scratchdimen
+   \fi}
+
+\def\handlearrangedpageTWOUP
+  {\splitoffarrangedpagesTWO
+   \ifswaparranged
+     \global\setbox\arrangedpageA\hbox
+       {\clippedprintbox0\arrangedpageA
+        \clippedprintbox1\arrangedpageB}%
+     \swaparrangedfalse
+   \else
+     \global\setbox\arrangedpageA\hbox
+       {\clippedprintbox0\arrangedpageB
+        \clippedprintbox1\arrangedpageA}%
+     \swaparrangedtrue
+   \fi
+   \global\ht\arrangedpageA\paperheight
+   \global\setbox\arrangedpageB\box\scratchbox}
+
+\def\handlearrangedpageTWODOWN
+  {\splitoffarrangedpagesTWO
+   \global\ht\arrangedpageA\paperheight
+   \global\ht\arrangedpageB\paperheight
+   \ifswaparranged
+     \global\setbox\arrangedpageA\vbox
+       {\forgetall\offinterlineskip\vskip\paperheight
+        \box\arrangedpageA\box\arrangedpageB}%
+     \swaparrangedfalse
+   \else
+     \global\setbox\arrangedpageA\vbox
+       {\forgetall\offinterlineskip\vskip\paperheight
+        \box\arrangedpageB\box\arrangedpageA}%
+     \swaparrangedtrue
+   \fi
+   \global\setbox\arrangedpageB\box\scratchbox}
+
+\def\poparrangedpagesTWO
+  {\ifnum\arrangedpageN>\zerocount
+     \dontcomplain
+     \swaparrangedfalse
+     \doloop
+       {\handlearrangedpage
+        \bgroup
+        \paperwidth\arrangedpageX\paperwidth
+        \paperheight\arrangedpageY\paperheight
+        \ht\arrangedpageA\paperheight
+        \wd\arrangedpageA\paperwidth
+        \outputarrangedbox\arrangedpageA
+        \egroup
+        \ifdim\ht\arrangedpageB=\zeropoint
+          \exitloop
+        \fi}%
+     \doglobal\newcounter\arrangedpageN
+   \fi}
+
+\def\pusharrangedpageTWO#1%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \global\setbox\arrangedpageB\vbox
+     {\forgetall
+      \offinterlineskip
+      \unvbox\arrangedpageB
+      \allowbreak
+      \ht#1\onepoint
+      \dp#1\zeropoint
+      \vbox{\box#1}}}
+
+\def\poparrangedpagesTWOTOPSIDE
+  {\ifnum\arrangedpageN>\zerocount
+     \bgroup
+     \gdef\arrangedpageN{2}\poparrangedpagesTWO
+     \let\arrangedpageA\arrangedpageC
+     \let\arrangedpageB\arrangedpageD
+     \gdef\arrangedpageN{2}\poparrangedpagesTWO
+     \doglobal\newcounter\arrangedpageN
+     \egroup
+  \fi}
+
+\def\pusharrangedpageTWOTOPSIDE#1%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}000\arrangedpageC %  2
+   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  1
+   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  2
+     \poparrangedpages
+   \fi}
+
+%D Willy Egger's sheet simulations:
+
+\def\poparrangedpagesAtoH
+  {\ifnum\arrangedpageN>\zerocount
+     \dontcomplain
+     \paperwidth\arrangedpageX\paperwidth
+     \paperheight\arrangedpageY\paperheight
+     \outputarrangedbox\arrangedpageA
+     \outputarrangedbox\arrangedpageB
+     \outputarrangedbox\arrangedpageC
+     \outputarrangedbox\arrangedpageD
+     \outputarrangedbox\arrangedpageE
+     \outputarrangedbox\arrangedpageF
+     \outputarrangedbox\arrangedpageG
+     \outputarrangedbox\arrangedpageH
+     \doglobal\newcounter\arrangedpageN
+   \fi}
+
+% to arrange 16 pages on 2 sheets to form one booklet
+
+\def\poparrangedpagesAtoD
+  {\ifnum\arrangedpageN>\zerocount
+     \dontcomplain
+     \paperwidth\arrangedpageX\paperwidth
+     \paperheight\arrangedpageY\paperheight
+     \outputarrangedbox\arrangedpageA
+     \outputarrangedbox\arrangedpageB
+     \outputarrangedbox\arrangedpageC
+     \outputarrangedbox\arrangedpageD
+     \doglobal\newcounter\arrangedpageN
+   \fi}
+
+% to arrange 16 pages on 4 sheets to form one booklet
+
+\def\pusharrangedpageSIXTEENFOUR#1%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
+   \or \handlearrangedpageXandY{#1}010\arrangedpageC %  3
+   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  4
+   \or \handlearrangedpageXandY{#1}010\arrangedpageE %  5
+   \or \handlearrangedpageXandY{#1}000\arrangedpageF %  6
+   \or \handlearrangedpageXandY{#1}010\arrangedpageG %  7
+   \or \handlearrangedpageXandY{#1}000\arrangedpageH %  8
+   \or \handlearrangedpageXandY{#1}010\arrangedpageH %  9
+   \or \handlearrangedpageXandY{#1}000\arrangedpageG % 10
+   \or \handlearrangedpageXandY{#1}010\arrangedpageF % 11
+   \or \handlearrangedpageXandY{#1}000\arrangedpageE % 12
+   \or \handlearrangedpageXandY{#1}010\arrangedpageD % 13
+   \or \handlearrangedpageXandY{#1}000\arrangedpageC % 14
+   \or \handlearrangedpageXandY{#1}010\arrangedpageB % 15
+   \or \handlearrangedpageXandY{#1}000\arrangedpageA % 16
+     \poparrangedpages
+   \fi}
+
+% to arrange 16 pages on 2 sheets to form one booklet
+
+\def\pusharrangedpageSIXTEENTWO#1%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
+   \or \handlearrangedpageXandY{#1}011\arrangedpageC %  3
+   \or \handlearrangedpageXandY{#1}001\arrangedpageD %  4
+   \or \handlearrangedpageXandY{#1}100\arrangedpageD %  5
+   \or \handlearrangedpageXandY{#1}110\arrangedpageC %  6
+   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  7
+   \or \handlearrangedpageXandY{#1}110\arrangedpageA %  8
+   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  9
+   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
+   \or \handlearrangedpageXandY{#1}100\arrangedpageC % 11
+   \or \handlearrangedpageXandY{#1}110\arrangedpageD % 12
+   \or \handlearrangedpageXandY{#1}011\arrangedpageD % 13
+   \or \handlearrangedpageXandY{#1}001\arrangedpageC % 14
+   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
+   \or \handlearrangedpageXandY{#1}001\arrangedpageA % 16
+     \poparrangedpages
+   \fi}
+
+% % handy for stickers etc, this way we can treat them as page
+%
+% \setuppapersize [XY][A4]
+% \setuppaper     [topspace=5mm,backspace=5mm,dx=1mm,dy=1mm,nx=2,ny=6]
+% \setuplayout    [page] [topspace=5mm,backspace=5mm]
+% \setuplayout    [page]
+% \setuplayout    [location=middle]
+% \setuparranging [XY]
+% \showframe
+%
+% \starttext \dorecurse{30}{test \recurselevel \page} \stoptext
+
+\def\pusharrangedpageXY#1%
+   {\doglobal\increment\arrangedpageN
+    \reportarrangedpage\arrangedpageN
+    \doglobal\increment\arrangedpageM
+    \global\setbox\arrangedpageB\hbox
+      \ifdim\@@ppwidth>\zeropoint to \@@ppwidth \fi
+      {\ifvoid\arrangedpageB\else
+         \unhbox\arrangedpageB
+         \ifdim\@@ppdx>\zeropoint \else \hss\fi
+         \hskip\@@ppdx
+         \ifdim\@@ppdx>\zeropoint \else \hss\fi
+       \fi
+       \box#1}%
+    \ifnum\arrangedpageM<\arrangedpageX\else
+      \global\setbox\arrangedpageA\vbox
+        \ifdim\@@ppheight>\zeropoint to \@@ppheight \fi
+        {\offinterlineskip
+         \ifvoid\arrangedpageA\else
+           \unvbox\arrangedpageA
+           \ifdim\@@ppdy>\zeropoint \else \vss\fi
+           \vskip\@@ppdy
+           \ifdim\@@ppdy>\zeropoint \else \vss\fi
+         \fi
+         \box\arrangedpageB}%
+      \doglobal\newcounter\arrangedpageM
+    \fi
+    \ifnum\arrangedpageN<\arrangedpageT\else
+      \poparrangedpages
+    \fi}
+
+\def\poparrangedpagesXY
+  {\ifnum\arrangedpageN>\zerocount
+     \dontcomplain
+     \paperwidth\arrangedpageX\paperwidth
+     \paperheight \arrangedpageY\paperheight
+     \outputarrangedbox\arrangedpageA
+     \doglobal\newcounter\arrangedpageN
+     \doglobal\newcounter\arrangedpageM
+   \fi}
+
+\installpagearrangement XY
+  {\dosetuparrangement\@@ppnx\@@ppny\@@ppxy\!!zerocount\!!zerocount
+     \pusharrangedpageXY\poparrangedpagesXY\relax}
+
+%D A crazy definition, don't guess who pushed me for the landscape option.
+
+\definepapersize
+  [XY]
+  [\c!height=\dimexpr\dimexpr\@@ppheight-\numexpr\@@ppny-1\relax\dimexpr\@@ppdy\relax\relax/\@@ppny\relax,
+   \c!width =\dimexpr\dimexpr\@@ppwidth -\numexpr\@@ppnx-1\relax\dimexpr\@@ppdx\relax\relax/\@@ppnx\relax]
+
+\setuppaper
+  [\c!width =\dimexpr\printpaperwidth -2\dimexpr\@@ppbackspace\relax\relax,
+   \c!height=\dimexpr\printpaperheight-2\dimexpr\@@pptopspace \relax\relax]
+
+% \definepageshift[test][horizontal][10pt,20pt,30pt,40pt,50pt]
+% \definepageshift[test][vertical]  [10pt,20pt,30pt,40pt,50pt]
+%
+% \setuppageshift[test]
+% \setuppageshift[test][test]
+% \setuppageshift[test][none]
+% \setuppageshift[none][test]
+% \setuppageshift[paper][test][test] % arrange only
+% \setuppageshift[paper][test]       % arrange only
+% \setuppageshift[print][test][test]
+%
+% \showframe \dorecurse{100}{\input tufte \par}
+
+% #1=name #2=horizontal|vertical #3=shiftlist
+
+\def\definepageshift
+  {\dotripleargument\dodefinepageshift}
+
+\def\dodefinepageshift[#1][#2][#3]%
+  {\setvalue{\??pt#2:#1}{#3}}
+
+\letempty \hpageshifts \newcounter\nofhpageshifts
+\letempty \vpageshifts \newcounter\nofvpageshifts
+
+% \let\shiftprintpagebox\gobbleoneargument
+% \let\shiftpaperpagebox\gobbleoneargument
+
+\def\dogetpageshift#1#2#3% #1=\dimenx #2=\xpageshifts #3=\nofxpageshifts
+  {\ifx#2\empty
+     #1\zeropoint
+   \else
+     \doglobal\increment#3%
+     \getfromcommacommand[#2][#3]%
+     \ifx\commalistelement\empty
+       \globallet#3\!!plusone
+       \getfromcommacommand[#2][#3]%
+     \fi
+     \ifx\commalistelement\empty
+       #1\zeropoint
+     \else
+       #1=\commalistelement
+       \donetrue
+     \fi
+   \fi}
+
+\def\shiftpagebox#1%
+  {\donefalse
+   \dogetpageshift{\dimen0}\hpageshifts\nofhpageshifts
+   \dogetpageshift{\dimen2}\vpageshifts\nofvpageshifts
+   \ifdone % see also layout offsets, maybe \movebox
+     \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
+     \setbox#1\vbox % \forgetall already done
+       {\offinterlineskip\vskip\dimen2\hskip\dimen0\box#1}%
+     \next
+   \fi}
+
+\def\setuppageshift
+  {\dotripleempty\dosetuppageshift}
+
+\def\dosetuppageshift[#1][#2][#3]% page|paper horizontal vertical
+  {\ifthirdargument              % paper=arrange
+     \let\hpageshifts\empty
+     \let\vpageshifts\empty
+     \let\shiftprintpagebox\gobbleoneargument
+     \let\shiftpaperpagebox\gobbleoneargument
+     \doifdefined{\??pt\v!horizontal:#2}
+       {\edef\hpageshifts{\getvalue{\??pt\v!horizontal:#2}}}%
+     \doifdefined{\??pt\v!vertical  :#3}
+       {\edef\vpageshifts{\getvalue{\??pt\v!vertical  :#3}}}%
+     \doif{#1}\v!page{\let\shiftprintpagebox\shiftpagebox}%
+     \doif{#1}\v!paper{\let\shiftpaperpagebox\shiftpagebox}%
+   \else\ifsecondargument
+     \doifinsetelse{#1}{\v!page,\v!paper}
+       {\setuppageshift[#1][#2][#2]}
+       {\setuppageshift[\v!page][#1][#2]}%
+   \else\iffirstargument
+     \setuppageshift[\v!page][#1][#1]%
+   \fi\fi\fi}
+
+%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}{\null\page}%
+   \dorecurse\@@ipn
+     {\dofilterpage{#1}\recurselevel
+      \doifinset\recurselevel{#2}{\null\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
+              {\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
+   \executeifdefined{\strippedcsname\docombinepages\@@ipalternative}\docombinepagesb
+   \@@ipafter
+   \egroup}
+
+\def\docombinepagesa
+  {\globallet\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=\combinedpagescounter,
+                             \c!factor=\v!max,
+                             \c!background=\@@ipbackground,
+                             \c!backgroundcolor=\@@ipbackgroundcolor,
+                             \c!frame=\@@ipframe]%
+                        \fi\fi
+                        \@@ipright}
+                     \@@ipbottom}%
+                  \doglobal\increment\combinedpagescounter
+                  \hfil}%
+               \hfilneg}
+            \vfil}%
+         \vfilneg}%
+         \page
+         \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
+
+\def\docombinepagesc
+  {\globallet\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=\combinedpagescounter,
+                                   \c!factor=\v!max,
+                                   \c!background=\@@ipbackground,
+                                   \c!backgroundcolor=\@@ipbackgroundcolor,
+                                   \c!frame=\@@ipframe]%
+                              \fi\fi}}
+                         \doglobal\increment\combinedpagescounter
+                         \@@ipbottom}%
+                      \vfil}%
+                   \vfilneg}
+                \hfil}%
+            \hfilneg}}
+         \page
+         \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
+
+\let\docombinepageshorizontal\docombinepagesa
+\let\docombinepagesvertical  \docombinepagesc
+
+\def\docombinepagesb
+  {\globallet\combinedpagescounter\@@ipstart
+   \doloop
+     {\startbaselinecorrection
+        \scratchdimen\@@ipdistance
+        \!!widtha\dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
+        \hbox to \hsize
+          {\dorecurse\@@ipnx
+             {\doglobal\increment\combinedpagescounter
+              \ifnum\combinedpagescounter>\@@ipn \else
+                 \expanded{\externalfigure[\@@ipname]
+                   [\c!page=\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}}
+
+%D \macros
+%D   {setuppagecomment,startpagecomment}
+%D
+%D This command is not yet documented. Usage:
+%D
+%D \starttyping
+%D \setuppagecomment[state=start,location=right]
+%D
+%D \startpagecomment
+%D \input knuth
+%D \stoppagecomment
+%D \stoptyping
+
+\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\relax}%
+         \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset\relax}%
+         \defineoverlay[\v!pagecomment][\placepagecommentTB]}
+        {\setuppapersize[\c!top=\vskip\@@pcoffset]%
+         \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset\relax}%
+         \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcwidth\relax}%
+         \defineoverlay[\v!pagecomment][\placepagecommentLR]}%
+      \processaction
+        [\@@pclocation]
+        [ \v!bottom=>{\setuppapersize[\c!bottom =\vss,\c!top =\vskip\@@pcoffset]},
+             \v!top=>{\setuppapersize[\c!top =\vss,\c!bottom =\vskip\@@pcoffset]},
+            \v!left=>{\setuppapersize[\c!left =\hss,\c!right=\hskip\@@pcoffset]},
+           \v!right=>{\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]}
+    {\doif\@@pcstate\v!stop % else initialization  invokes backgrounds
+       {% this should be tested first
+        % \expanded{\setuppapersize[\papersize][\@@pcprintpapersize]}%
+        \setupbackgrounds[\v!paper][\c!background=]}}}
+
+\def\@@pcprintpapersize{\printpapersize}
+
+\def\placepagecommentTB
+  {\vbox to \printpaperheight
+     {\forgetall
+      \hsize\printpaperwidth
+      \vskip\@@pcoffset
+      \doifelse\@@pclocation\v!bottom{\vskip\dimexpr\paperheight+\@@pcdistance\relax}\vss
+      \hskip\@@pcoffset
+      \vbox to \@@pcheight
+        {\forgetall
+         \hsize\paperwidth
+         \ifpagecomment
+           \getbuffer[\v!pagecomment]%
+           \global\pagecommentfalse
+         \fi}%
+      \hfill
+      \doifelse\@@pclocation\v!bottom\vss{\vskip\dimexpr\paperheight+\@@pcdistance\relax}%
+      \vskip\@@pcoffset}}
+
+\def\placepagecommentLR
+  {\hbox to \printpaperwidth
+     {\hskip\@@pcoffset
+      \doifelse\@@pclocation\v!right{\hskip\paperwidth\hskip\@@pcdistance}\hss
+      \vbox to \printpaperheight
+        {\forgetall
+         \vskip\@@pcoffset
+         \hsize\@@pcwidth
+         \ifpagecomment
+           \getbuffer[\v!pagecomment]%
+           \global\pagecommentfalse
+         \fi
+         \vss}%
+      \doifelse\@@pclocation\v!right\hss{\hskip\paperwidth\hskip\@@pcdistance}%
+      \hskip\@@pcoffset}}
+
+\newif\ifpagecomment
+
+\setvalue{\e!start\v!pagecomment}%
+  {\global\pagecommenttrue
+   \dostartbuffer[\v!pagecomment][\e!start\v!pagecomment][\e!stop\v!pagecomment]}
+
+\setuppagecomment
+  [\c!state=, % \v!stop would invoke background calculation
+   \c!location=\v!bottom,
+   \c!offset=.5cm,
+   \c!distance=.5cm,
+   \c!height=5cm,
+   \c!width=10cm]
+
+% 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-imp.mkiv b/tex/context/base/page-imp.mkiv
new file mode 100644
index 000000000..fd0482585
--- /dev/null
+++ b/tex/context/base/page-imp.mkiv
@@ -0,0 +1,1298 @@
+%D \module
+%D   [       file=page-imp, % was: core-pag,
+%D        version=1998.01.15,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Pagebody Building (Imposition),
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% much of this can more to run time loading !
+
+\writestatus{loading}{ConTeXt Page Macros / Pagebody Building}
+
+\unprotect
+
+% sizing bug:
+%
+% \setuppapersize[A4][A4,landscape] \setuparranging[2UP] \showframe
+%
+% \starttext \dorecurse{10}{\input tufte \par} \stoptext
+
+% to be moved code:
+
+\newif\ifclipprintbox \clipprintboxtrue
+%newif\ifclippagebox  \clippageboxtrue
+
+\def\clippedprintbox#1#2% can be made more efficient, see other clipper
+  {\ifclipprintbox
+     \!!widthc \pagebackgroundoffset
+     \!!widtha \dimexpr\paperwidth + \!!widthc\relax
+     \!!heighta\dimexpr\paperheight+2\!!widthc\relax
+     \setbox#2\vbox to \paperheight{\vfill\box#2}%
+     \ht#2\paperheight
+     \wd#2\paperwidth
+     \setbox#2\vbox
+       {\framed
+          [\c!offset=\!!widthc,\c!strut=\v!no,\c!frame=\v!off]
+          {\box#2}}%
+     \setbox#2\hbox to \paperwidth
+       {\ifcase#1\relax
+          \!!widthb\zeropoint
+          \hskip-\!!widthc
+        \else
+          \!!widthb\!!widthc
+        \fi
+        \lower\!!widthc\hbox
+          {\clip
+             [\c!width=\!!widtha,\c!height=\!!heighta,
+              \c!hoffset=\!!widthb,\c!voffset=\zeropoint]
+             {\box#2}}}%
+     \wd#2\paperwidth
+     \ht#2\paperheight
+   \fi
+   \box#2\relax}
+
+\let\clippagebox \gobbleoneargument
+\let\clipprintbox\gobbleoneargument
+
+% \setuppagenumbering[alternative=doublesided]
+% \setupcolors[state=start]
+% \setuppapersize[A4][A4,oversized]
+% \setuplayout[location=middle,clipoffset=5mm]
+% \setupbackgrounds
+%   [page]
+%   [frame=on,rulethickness=1mm,
+%    backgroundoffset=10mm,background=color,backgroundcolor=red]
+% \starttext \dorecurse{10}{\input tufte \par} \stoptext
+
+\def\clippagebox % skip fast over false
+  {\ifdim\@@lyclipoffset>\zeropoint
+      \expandafter\doclippagebox
+   \else
+      \expandafter\gobbleoneargument
+   \fi}
+
+\def\doclippagebox#1%
+  {\!!widtha \wd#1%
+   \!!heighta\ht#1%
+   \!!deptha \dp#1%
+   \setbox#1\hbox
+     {\!!widthb \@@lyclipoffset
+      \advance\!!heighta\dimexpr\!!deptha+2\!!widthb\relax
+      \advance\!!widtha \!!widthb
+      \doifbothsides
+        {\advance\!!widtha\!!widthb \!!widthc-\!!widthb \hskip\!!widthc}%
+        {\!!widthc\zeropoint}
+        {\!!widthc-\!!widthb \hskip\!!widthc}%
+      \lower\!!widthb\hbox
+        {\clip
+           [\c!hoffset=\!!widthc,
+            \c!voffset=-\!!widthb,
+              \c!width=\!!widtha,
+             \c!height=\!!heighta]%
+           {\box#1}}}%
+   \wd#1\!!widtha
+   \ht#1\!!heighta
+   \dp#1\!!deptha}
+
+%D \macros
+%D   {starttextdata}
+%D
+%D This is a user macro (appending to every last shipout is not
+%D really user friendly.
+
+\newtoks \collectedtextdata
+
+\long\def\starttextdata#1\stoptextdata
+  {\doglobal\appendtoks#1\to\collectedtextdata}
+
+\def\flushtextdata
+  {\vsmashed{\the\collectedtextdata}% all dimensions zero
+   \global\collectedtextdata\emptytoks
+   \globallet\flushtextdata\donothing}
+
+\prependtoks \flushtextdata \to \everylastshipout
+
+\def\installpagehandler#1#2%                  % a handler takes one argument: something to be boxed
+  {\setgvalue{\??pp:\c!method:#1}##1{#2{##1}}} % and shipped out (don't depend on the exact package)
+
+\installpagehandler\v!normal
+  {\ifarrangingpages\expandafter\actualarrange\else\expandafter\actualshipout\fi}
+
+\def\myshipout#1%
+ {\beforeshipout % voor de pagebody dus !
+  \dontshowcomposition
+  \executeifdefined{\??pp:\c!method:\@@ppmethod}\gobbleoneargument{#1}%
+  \setnextrealpageno
+  \aftershipout}
+
+\newbox\postponedcontent
+
+\def\flushatshipout
+  {\dowithnextbox
+     {\global\setbox\postponedcontent\hbox to \zeropoint
+        {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
+         \unhbox\postponedcontent\unhbox\nextbox}% was \box
+      \global\ht\postponedcontent\zeropoint
+      \global\dp\postponedcontent\zeropoint
+      \global\wd\postponedcontent\zeropoint}%
+   \hbox}
+
+% \starttypen
+% \def\pagestoshipout{1,3,5}
+% \stoptypen
+
+\newcount\shippedoutpages
+
+\let\pagestoshipout\empty      % {1,3,6}
+\chardef\whichpagetoshipout=0  % 0=all 1=odd 2=even
+
+\def\actualshipout#1%
+  {\global\advance\shippedoutpages\plusone
+   % this is not resource safe!
+   \ifx\pagestoshipout\empty
+     \ifcase\whichpagetoshipout\relax
+       \donetrue
+     \or % 1
+       \ifodd\shippedoutpages\relax\donetrue\else\donefalse\fi
+     \or % 2
+       \ifodd\shippedoutpages\relax\donefalse\else\donetrue\fi
+     \else
+       \donetrue
+     \fi
+   \else % testen, aangepast / expanded nodig ?
+     \normalexpanded{\noexpand\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}%
+       \donetrue\donefalse
+   \fi
+   \ifdone
+     \shipout\vbox
+       {%\forgetall
+        \offinterlineskip
+        \dontcomplain
+        \scratchdimen-1in
+        \vskip\scratchdimen
+        \hskip\scratchdimen
+        \setbox0\hbox{#1}% just in case there are objects there, hook for testing
+        \finalizeshipoutbox0%
+        \setbox\scratchbox\hbox
+          {% before the main one !
+           \ifcase\realfolio \or
+             \the\everyfirstshipout
+             \global\everyfirstshipout\emptytoks
+           \fi
+           % the main one
+           \the\everyshipout\relax
+           % always last (and after the main one)
+           \ifnum\realpageno=\lastpage\relax
+             \the\everylastshipout
+             \global\everylastshipout\emptytoks
+           \fi}%
+        \smashbox\scratchbox
+        \hbox % \setbox0=\box.. is nicer
+          {\box\scratchbox
+           \ifvoid\postponedcontent\else\box\postponedcontent\fi % evt ver naar links !
+           \box0}}%
+   \else
+     \message
+       {[\ifarrangingpages arranged \fi page
+         \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace
+         not flushed]}%
+     \setbox0\hbox{#1}%
+     \deadcycles\zerocount
+   \fi}
+
+\def\actualarrange#1%
+  {\setbox0\hbox{#1}%
+   \pusharrangedpage0%
+   \deadcycles\zerocount}
+
+%D We need a couple of boxes for duplex printing \unknown
+
+\newbox\arrangedpageA \newbox\arrangedpageB
+
+%D \unknown\ and some for simulating big sheets.
+
+\newbox\arrangedpageC \newbox\arrangedpageD
+\newbox\arrangedpageE \newbox\arrangedpageF
+\newbox\arrangedpageG \newbox\arrangedpageH
+
+\newif\ifswaparranged
+\newif\ifnegatearranged
+\newif\ifmirrorarranged
+\newif\ifdoublearranged
+
+\newif\ifarrangingdisabled
+
+\def\arrangedrotationO{0}
+\def\arrangedrotationE{0}
+
+\newcounter\arrangedpageN
+\newcounter\arrangedpageM
+
+\chardef\arrangedpageT=1
+\chardef\arrangedpageX=1
+\chardef\arrangedpageY=1
+
+\def\calculatepaperoffsets#1%
+  {\scratchdimen\getvalue{\??pp#1\c!offset}%
+   \divide\scratchdimen \arrangedpageX
+   \global\advance\paperwidth -2\scratchdimen
+   \scratchdimen\getvalue{\??pp#1\c!offset}%
+   \divide\scratchdimen \arrangedpageY
+   \global\advance\paperheight-2\scratchdimen}
+
+\newconditional\arrangedbackgroundokay % more ifs -> conditionals
+
+\def\setuparranging[#1]%
+  {\ifarrangingdisabled \else
+     \doifelse{#1}\v!disable
+       {\global\arrangingdisabledtrue}
+       {\global\arrangingdisabledfalse}%
+     \global\arrangingpagestrue
+     \global\negatearrangedfalse
+     \global\mirrorarrangedfalse
+     \global\doublearrangedfalse
+     \gdef\arrangedrotationO{0}%
+     \gdef\arrangedrotationE{180}%
+     \processallactionsinset
+       [#1]
+       [    \v!mirrored=>\global\mirrorarrangedtrue,
+         \v!doublesided=>\global\doublearrangedtrue,
+            \v!negative=>\global\negatearrangedtrue,
+             \v!rotated=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
+                     90=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
+                    180=>\gdef\arrangedrotationO{180}\gdef\arrangedrotationE{0},
+                    270=>\gdef\arrangedrotationO{270}\gdef\arrangedrotationE{90},
+               \s!reset=>\global\arrangingpagesfalse,
+          \v!background=>\global\settrue\arrangedbackgroundokay,
+             \s!unknown=>\checkinstalledpagearrangement\commalistelement]%
+        % no \s!default=> we can have aaa,,bbb
+     \ifx\handlearrangedpage\undefined
+       \global\arrangingpagesfalse
+     \fi
+     \doifcommonelse{#1}{90,270,\v!rotated}
+       {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
+     \setuppapersize
+   \fi}
+
+\def\installpagearrangement #1 %
+  {\setgvalue{\??pp\??pp#1}}
+
+\def\checkinstalledpagearrangement#1% can be empty: aaa,,bbb
+  {\executeifdefined{\??pp\??pp#1}\donothing}
+
+\def\dosetuparrangement#1#2#3#4#5#6#7#8%
+  {\global\chardef\arrangedpageX     #1%
+   \global\chardef\arrangedpageY     #2%
+   \global\chardef\arrangedpageT     #3%
+   \global\chardef\horizontalcutmarks#4%
+   \global\chardef\verticalcutmarks  #5%
+   \global\let    \pusharrangedpage  #6%
+   \global\let    \poparrangedpages  #7%
+   \global\let    \handlearrangedpage#8}
+
+\installpagearrangement {\v!normal}
+  {\global\arrangingpagesfalse}
+
+\installpagearrangement 2*16
+  {\dosetuparrangement{4}{4}{16}{5}{5}%
+     \pusharrangedpageTHIRTYTWO\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*8
+  {\dosetuparrangement{4}{2}{8}{5}{3}%
+     \pusharrangedpageSIXTEEN\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*4
+  {\dosetuparrangement{2}{2}{4}{3}{3}%
+     \pusharrangedpageEIGHT\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*2
+  {\dosetuparrangement{2}{1}{2}{3}{2}%
+     \pusharrangedpageFOURA\poparrangedpagesAB\relax}
+
+\installpagearrangement 2**2
+  {\dosetuparrangement{2}{1}{2}{3}{2}%
+     \pusharrangedpageFOURB\poparrangedpagesAB\relax}
+
+\installpagearrangement 2SIDE
+  {\dosetuparrangement{2}{1}{2}{3}{2}%
+     \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageSIDE}
+
+\installpagearrangement 2TOP
+  {\dosetuparrangement{1}{2}{2}{2}{3}%
+     \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageTOP}
+
+\installpagearrangement 2UP
+  {\dosetuparrangement{2}{1}{4}{3}{2}%
+     \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWOUP}
+
+\installpagearrangement 2DOWN
+  {\dosetuparrangement{1}{2}{4}{2}{3}%
+     \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWODOWN}
+
+\installpagearrangement 2*4*2 % one defined by Willy Egger:
+  {\dosetuparrangement{2}{2}{4}{3}{2}%
+     \pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax}
+
+\installpagearrangement 2*2*4 % onother one of Willy Egger
+  {\dosetuparrangement{2}{1}{8}{3}{2}%
+     \pusharrangedpageSIXTEENFOUR\poparrangedpagesAtoH\relax}
+
+\installpagearrangement 2TOPSIDE
+  {\dosetuparrangement{1}{2}{4}{2}{3}%
+     \pusharrangedpageTWOTOPSIDE\poparrangedpagesTWOTOPSIDE\handlearrangedpageTOP}
+
+% \def\filluparrangedpages % beware: \realpageno is 1 ahead
+%   {\ifarrangingpages
+%      \scratchcounter-\realpageno
+%      \divide\scratchcounter \arrangedpageT
+%      \multiply\scratchcounter \arrangedpageT
+%      \advance\scratchcounter \realpageno
+%      \advance\scratchcounter \minusone
+%      \dorecurse\scratchcounter{\noheaderandfooterlines\ejectdummypage}%
+%    \fi}
+
+\def\filluparrangedpages % beware: \realpageno is 1 ahead
+  {\ifarrangingpages
+     \scratchcounter\numexpr\realpageno-\plusone\relax
+     \dosetmodulo\scratchcounter\arrangedpageT\scratchcounter
+     \ifcase\scratchcounter\else
+       \advance\scratchcounter \plusone
+       \dostepwiserecurse\scratchcounter\arrangedpageT\plusone
+         {\noheaderandfooterlines\ejectdummypage}%
+     \fi
+   \fi}
+
+\def\handlearrangedpageXandY#1#2#3#4#5%
+  {\global\setbox#5\hbox to \arrangedpageX\paperwidth
+     {\setbox\scratchbox\vbox to \arrangedpageY\paperheight
+        {%\forgetall
+         \offinterlineskip
+         \dontcomplain
+         \vskip#4\paperheight
+         \hskip#3\paperwidth
+         \dorotatebox{\ifcase#2 0\else180\fi}\hbox{\box#1}%
+         \vfill}%
+      \wd\scratchbox\zeropoint
+      \box\scratchbox\box#5\hss}}
+
+\def\gotonextarrangepage
+  {\global\advance\arrangeno \plusone
+   \def\pagecutmarksymbol{\the\arrangeno}}
+
+\def\outputarrangedbox#1%
+  {\bgroup
+   \gotonextarrangepage
+   \ifnum\arrangedrotationO\arrangedrotationE>\zerocount
+     \setbox#1\vbox
+       {\ifdoublearranged
+          \ifodd\arrangeno
+            \dorotatebox\arrangedrotationO\hbox{\box#1}%
+          \else
+            \dorotatebox\arrangedrotationE\hbox{\box#1}%
+          \fi
+        \else
+          \dorotatebox\arrangedrotationO\hbox{\box#1}%
+        \fi}%
+   \fi
+   \ifmirrorarranged
+     \setbox#1\vbox{\domirrorbox\vbox{\box#1}}%
+   \fi
+   \ifnegatearranged
+     \negatecolorbox{#1}%
+   \fi
+   \finishpagebox#1%
+   \ifconditional\arrangedbackgroundokay\addprintbackground#1\fi
+   \actualshipout{\box#1}%
+   \egroup}
+
+%D The format file can be 16K smaller when we postpone the
+%D real arrangments. Some day ...
+
+% TOP
+
+% 32/16/8/4/SIDE
+
+\def\poparrangedpagesAB
+  {\ifnum\arrangedpageN>\zerocount
+     \dontcomplain
+     \paperwidth\arrangedpageX\paperwidth
+     \paperheight\arrangedpageY\paperheight
+     \outputarrangedbox\arrangedpageA
+     \outputarrangedbox\arrangedpageB
+     \doglobal\newcounter\arrangedpageN
+   \fi}
+
+\def\pusharrangedpageTHIRTYTWO#1% taco's challenge
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}033\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}003\arrangedpageB %  2
+   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  3
+   \or \handlearrangedpageXandY{#1}130\arrangedpageA %  4
+   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
+   \or \handlearrangedpageXandY{#1}130\arrangedpageB %  6
+   \or \handlearrangedpageXandY{#1}033\arrangedpageB %  7
+   \or \handlearrangedpageXandY{#1}003\arrangedpageA %  8
+   \or \handlearrangedpageXandY{#1}102\arrangedpageA %  9
+   \or \handlearrangedpageXandY{#1}132\arrangedpageB % 10
+   \or \handlearrangedpageXandY{#1}031\arrangedpageB % 11
+   \or \handlearrangedpageXandY{#1}001\arrangedpageA % 12
+   \or \handlearrangedpageXandY{#1}031\arrangedpageA % 13
+   \or \handlearrangedpageXandY{#1}001\arrangedpageB % 14
+   \or \handlearrangedpageXandY{#1}102\arrangedpageB % 15
+   \or \handlearrangedpageXandY{#1}132\arrangedpageA % 16
+   \or \handlearrangedpageXandY{#1}122\arrangedpageA % 17
+   \or \handlearrangedpageXandY{#1}112\arrangedpageB % 18
+   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 19
+   \or \handlearrangedpageXandY{#1}021\arrangedpageA % 20
+   \or \handlearrangedpageXandY{#1}011\arrangedpageA % 21
+   \or \handlearrangedpageXandY{#1}021\arrangedpageB % 22
+   \or \handlearrangedpageXandY{#1}122\arrangedpageB % 23
+   \or \handlearrangedpageXandY{#1}112\arrangedpageA % 24
+   \or \handlearrangedpageXandY{#1}013\arrangedpageA % 25
+   \or \handlearrangedpageXandY{#1}023\arrangedpageB % 26
+   \or \handlearrangedpageXandY{#1}120\arrangedpageB % 27
+   \or \handlearrangedpageXandY{#1}110\arrangedpageA % 28
+   \or \handlearrangedpageXandY{#1}120\arrangedpageA % 29
+   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 30
+   \or \handlearrangedpageXandY{#1}013\arrangedpageB % 31
+   \or \handlearrangedpageXandY{#1}023\arrangedpageA % 32
+     \poparrangedpages
+   \fi}
+
+\def\pusharrangedpageSIXTEEN#1% changed to match the official way of doing
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}031\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
+   \or \handlearrangedpageXandY{#1}031\arrangedpageB %  3
+   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  4
+   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
+   \or \handlearrangedpageXandY{#1}130\arrangedpageB %  6
+   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  7
+   \or \handlearrangedpageXandY{#1}130\arrangedpageA %  8
+   \or \handlearrangedpageXandY{#1}120\arrangedpageA %  9
+   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
+   \or \handlearrangedpageXandY{#1}120\arrangedpageB % 11
+   \or \handlearrangedpageXandY{#1}110\arrangedpageA % 12
+   \or \handlearrangedpageXandY{#1}011\arrangedpageA % 13
+   \or \handlearrangedpageXandY{#1}021\arrangedpageB % 14
+   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
+   \or \handlearrangedpageXandY{#1}021\arrangedpageA % 16
+     \poparrangedpages
+   \fi}
+
+\def\pusharrangedpageEIGHT#1% changed to match the official way of doing
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
+   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  3
+   \or \handlearrangedpageXandY{#1}110\arrangedpageA %  4
+   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
+   \or \handlearrangedpageXandY{#1}110\arrangedpageB %  6
+   \or \handlearrangedpageXandY{#1}011\arrangedpageB %  7
+   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  8
+     \poparrangedpages
+   \fi}
+
+\def\pusharrangedpageFOURA{\pusharrangedpageFOURdo01}
+\def\pusharrangedpageFOURB{\pusharrangedpageFOURdo10}
+
+\def\pusharrangedpageFOURdo#1#2#3%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#3}010\arrangedpageA    %  1
+   \or \handlearrangedpageXandY{#3}0{#1}0\arrangedpageB %  2/3 not {1}
+   \or \handlearrangedpageXandY{#3}0{#2}0\arrangedpageB %  3/2 not {1}
+   \or \handlearrangedpageXandY{#3}000\arrangedpageA    %  4
+     \poparrangedpages
+   \fi}
+
+\def\pusharrangedpageSIDETOP#1%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
+     \poparrangedpages
+   \fi}
+
+\def\handlearrangedpageSIDE
+  {\global\wd\arrangedpageA\paperwidth
+   \global\wd\arrangedpageB\paperwidth
+   \global\setbox\arrangedpageA\hbox
+     {\box\arrangedpageA\box\arrangedpageB}%
+   \global\ht\arrangedpageA\paperheight}
+
+\def\handlearrangedpageTOP
+  {\global\ht\arrangedpageA\paperheight
+   \global\ht\arrangedpageB\paperheight
+   \global\setbox\arrangedpageA\vbox
+     {%\forgetall
+      \offinterlineskip\vskip\paperheight
+      \box\arrangedpageA\box\arrangedpageB}%
+   \global\setbox\arrangedpageB\box\scratchbox} % ?
+
+% 2UP/2DOWN / 1pt prevents overflow
+
+\def\splitoffarrangedpagesTWO
+  {\splittopskip\zeropoint
+   \global\setbox\arrangedpageA\vsplit\arrangedpageB to \onepoint
+   \scratchdimen\dimexpr\ht\arrangedpageB-\onepoint\relax
+   \ifdim\scratchdimen>\onepoint
+     \setbox\scratchbox\vsplit\arrangedpageB to \scratchdimen
+   \fi}
+
+\def\handlearrangedpageTWOUP
+  {\splitoffarrangedpagesTWO
+   \ifswaparranged
+     \global\setbox\arrangedpageA\hbox
+       {\clippedprintbox0\arrangedpageA
+        \clippedprintbox1\arrangedpageB}%
+     \swaparrangedfalse
+   \else
+     \global\setbox\arrangedpageA\hbox
+       {\clippedprintbox0\arrangedpageB
+        \clippedprintbox1\arrangedpageA}%
+     \swaparrangedtrue
+   \fi
+   \global\ht\arrangedpageA\paperheight
+   \global\setbox\arrangedpageB\box\scratchbox}
+
+\def\handlearrangedpageTWODOWN
+  {\splitoffarrangedpagesTWO
+   \global\ht\arrangedpageA\paperheight
+   \global\ht\arrangedpageB\paperheight
+   \ifswaparranged
+     \global\setbox\arrangedpageA\vbox
+       {%\forgetall
+        \offinterlineskip\vskip\paperheight
+        \box\arrangedpageA\box\arrangedpageB}%
+     \swaparrangedfalse
+   \else
+     \global\setbox\arrangedpageA\vbox
+       {%\forgetall
+        \offinterlineskip\vskip\paperheight
+        \box\arrangedpageB\box\arrangedpageA}%
+     \swaparrangedtrue
+   \fi
+   \global\setbox\arrangedpageB\box\scratchbox}
+
+\def\poparrangedpagesTWO
+  {\ifnum\arrangedpageN>\zerocount
+     \dontcomplain
+     \swaparrangedfalse
+     \doloop
+       {\handlearrangedpage
+        \bgroup
+        \paperwidth\arrangedpageX\paperwidth
+        \paperheight\arrangedpageY\paperheight
+        \ht\arrangedpageA\paperheight
+        \wd\arrangedpageA\paperwidth
+        \outputarrangedbox\arrangedpageA
+        \egroup
+        \ifdim\ht\arrangedpageB=\zeropoint
+          \exitloop
+        \fi}%
+     \doglobal\newcounter\arrangedpageN
+   \fi}
+
+\def\pusharrangedpageTWO#1%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \global\setbox\arrangedpageB\vbox
+     {%\forgetall
+      \offinterlineskip
+      \unvbox\arrangedpageB
+      \allowbreak
+      \ht#1\onepoint
+      \dp#1\zeropoint
+      \vbox{\box#1}}}
+
+\def\poparrangedpagesTWOTOPSIDE
+  {\ifnum\arrangedpageN>\zerocount
+     \bgroup
+     \gdef\arrangedpageN{2}\poparrangedpagesTWO
+     \let\arrangedpageA\arrangedpageC
+     \let\arrangedpageB\arrangedpageD
+     \gdef\arrangedpageN{2}\poparrangedpagesTWO
+     \doglobal\newcounter\arrangedpageN
+     \egroup
+  \fi}
+
+\def\pusharrangedpageTWOTOPSIDE#1%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}000\arrangedpageC %  2
+   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  1
+   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  2
+     \poparrangedpages
+   \fi}
+
+%D Willy Egger's sheet simulations:
+
+\def\poparrangedpagesAtoH
+  {\ifnum\arrangedpageN>\zerocount
+     \dontcomplain
+     \paperwidth\arrangedpageX\paperwidth
+     \paperheight\arrangedpageY\paperheight
+     \outputarrangedbox\arrangedpageA
+     \outputarrangedbox\arrangedpageB
+     \outputarrangedbox\arrangedpageC
+     \outputarrangedbox\arrangedpageD
+     \outputarrangedbox\arrangedpageE
+     \outputarrangedbox\arrangedpageF
+     \outputarrangedbox\arrangedpageG
+     \outputarrangedbox\arrangedpageH
+     \doglobal\newcounter\arrangedpageN
+   \fi}
+
+% to arrange 16 pages on 2 sheets to form one booklet
+
+\def\poparrangedpagesAtoD
+  {\ifnum\arrangedpageN>\zerocount
+     \dontcomplain
+     \paperwidth\arrangedpageX\paperwidth
+     \paperheight\arrangedpageY\paperheight
+     \outputarrangedbox\arrangedpageA
+     \outputarrangedbox\arrangedpageB
+     \outputarrangedbox\arrangedpageC
+     \outputarrangedbox\arrangedpageD
+     \doglobal\newcounter\arrangedpageN
+   \fi}
+
+% to arrange 16 pages on 4 sheets to form one booklet
+
+\def\pusharrangedpageSIXTEENFOUR#1%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
+   \or \handlearrangedpageXandY{#1}010\arrangedpageC %  3
+   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  4
+   \or \handlearrangedpageXandY{#1}010\arrangedpageE %  5
+   \or \handlearrangedpageXandY{#1}000\arrangedpageF %  6
+   \or \handlearrangedpageXandY{#1}010\arrangedpageG %  7
+   \or \handlearrangedpageXandY{#1}000\arrangedpageH %  8
+   \or \handlearrangedpageXandY{#1}010\arrangedpageH %  9
+   \or \handlearrangedpageXandY{#1}000\arrangedpageG % 10
+   \or \handlearrangedpageXandY{#1}010\arrangedpageF % 11
+   \or \handlearrangedpageXandY{#1}000\arrangedpageE % 12
+   \or \handlearrangedpageXandY{#1}010\arrangedpageD % 13
+   \or \handlearrangedpageXandY{#1}000\arrangedpageC % 14
+   \or \handlearrangedpageXandY{#1}010\arrangedpageB % 15
+   \or \handlearrangedpageXandY{#1}000\arrangedpageA % 16
+     \poparrangedpages
+   \fi}
+
+% to arrange 16 pages on 2 sheets to form one booklet
+
+\def\pusharrangedpageSIXTEENTWO#1%
+  {\doglobal\increment\arrangedpageN
+   \reportarrangedpage\arrangedpageN
+   \ifcase\arrangedpageN
+   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  1
+   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
+   \or \handlearrangedpageXandY{#1}011\arrangedpageC %  3
+   \or \handlearrangedpageXandY{#1}001\arrangedpageD %  4
+   \or \handlearrangedpageXandY{#1}100\arrangedpageD %  5
+   \or \handlearrangedpageXandY{#1}110\arrangedpageC %  6
+   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  7
+   \or \handlearrangedpageXandY{#1}110\arrangedpageA %  8
+   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  9
+   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
+   \or \handlearrangedpageXandY{#1}100\arrangedpageC % 11
+   \or \handlearrangedpageXandY{#1}110\arrangedpageD % 12
+   \or \handlearrangedpageXandY{#1}011\arrangedpageD % 13
+   \or \handlearrangedpageXandY{#1}001\arrangedpageC % 14
+   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
+   \or \handlearrangedpageXandY{#1}001\arrangedpageA % 16
+     \poparrangedpages
+   \fi}
+
+% % handy for stickers etc, this way we can treat them as page
+%
+% \setuppapersize [XY][A4]
+% \setuppaper     [topspace=5mm,backspace=5mm,dx=1mm,dy=1mm,nx=2,ny=6]
+% \setuplayout    [page] [topspace=5mm,backspace=5mm]
+% \setuplayout    [page]
+% \setuplayout    [location=middle]
+% \setuparranging [XY]
+% \showframe
+%
+% \starttext \dorecurse{30}{test \recurselevel \page} \stoptext
+
+\def\pusharrangedpageXY#1%
+   {\doglobal\increment\arrangedpageN
+    \reportarrangedpage\arrangedpageN
+    \doglobal\increment\arrangedpageM
+    \global\setbox\arrangedpageB\hbox
+      \ifdim\@@ppwidth>\zeropoint to \@@ppwidth \fi
+      {\ifvoid\arrangedpageB\else
+         \unhbox\arrangedpageB
+         \ifdim\@@ppdx>\zeropoint \else \hss\fi
+         \hskip\@@ppdx
+         \ifdim\@@ppdx>\zeropoint \else \hss\fi
+       \fi
+       \box#1}%
+    \ifnum\arrangedpageM<\arrangedpageX\else
+      \global\setbox\arrangedpageA\vbox
+        \ifdim\@@ppheight>\zeropoint to \@@ppheight \fi
+        {\offinterlineskip
+         \ifvoid\arrangedpageA\else
+           \unvbox\arrangedpageA
+           \ifdim\@@ppdy>\zeropoint \else \vss\fi
+           \vskip\@@ppdy
+           \ifdim\@@ppdy>\zeropoint \else \vss\fi
+         \fi
+         \box\arrangedpageB}%
+      \doglobal\newcounter\arrangedpageM
+    \fi
+    \ifnum\arrangedpageN<\arrangedpageT\else
+      \poparrangedpages
+    \fi}
+
+\def\poparrangedpagesXY
+  {\ifnum\arrangedpageN>\zerocount
+     \dontcomplain
+     \paperwidth\arrangedpageX\paperwidth
+     \paperheight \arrangedpageY\paperheight
+     \outputarrangedbox\arrangedpageA
+     \doglobal\newcounter\arrangedpageN
+     \doglobal\newcounter\arrangedpageM
+   \fi}
+
+\installpagearrangement XY
+  {\dosetuparrangement\@@ppnx\@@ppny\@@ppxy\!!zerocount\!!zerocount
+     \pusharrangedpageXY\poparrangedpagesXY\relax}
+
+%D A crazy definition, don't guess who pushed me for the landscape option.
+
+\definepapersize
+  [XY]
+  [\c!height=\dimexpr\dimexpr\@@ppheight-\numexpr\@@ppny-1\relax\dimexpr\@@ppdy\relax\relax/\@@ppny\relax,
+   \c!width =\dimexpr\dimexpr\@@ppwidth -\numexpr\@@ppnx-1\relax\dimexpr\@@ppdx\relax\relax/\@@ppnx\relax]
+
+\setuppaper
+  [\c!width =\dimexpr\printpaperwidth -2\dimexpr\@@ppbackspace\relax\relax,
+   \c!height=\dimexpr\printpaperheight-2\dimexpr\@@pptopspace \relax\relax]
+
+% \definepageshift[test][horizontal][10pt,20pt,30pt,40pt,50pt]
+% \definepageshift[test][vertical]  [10pt,20pt,30pt,40pt,50pt]
+%
+% \setuppageshift[test]
+% \setuppageshift[test][test]
+% \setuppageshift[test][none]
+% \setuppageshift[none][test]
+% \setuppageshift[paper][test][test] % arrange only
+% \setuppageshift[paper][test]       % arrange only
+% \setuppageshift[print][test][test]
+%
+% \showframe \dorecurse{100}{\input tufte \par}
+
+% #1=name #2=horizontal|vertical #3=shiftlist
+
+\def\definepageshift
+  {\dotripleargument\dodefinepageshift}
+
+\def\dodefinepageshift[#1][#2][#3]%
+  {\setvalue{\??pt#2:#1}{#3}}
+
+\letempty \hpageshifts \newcounter\nofhpageshifts
+\letempty \vpageshifts \newcounter\nofvpageshifts
+
+% \let\shiftprintpagebox\gobbleoneargument
+% \let\shiftpaperpagebox\gobbleoneargument
+
+\def\dogetpageshift#1#2#3% #1=\dimenx #2=\xpageshifts #3=\nofxpageshifts
+  {\ifx#2\empty
+     #1\zeropoint
+   \else
+     \doglobal\increment#3%
+     \getfromcommacommand[#2][#3]%
+     \ifx\commalistelement\empty
+       \globallet#3\!!plusone
+       \getfromcommacommand[#2][#3]%
+     \fi
+     \ifx\commalistelement\empty
+       #1\zeropoint
+     \else
+       #1=\commalistelement
+       \donetrue
+     \fi
+   \fi}
+
+\def\shiftpagebox#1%
+  {\donefalse
+   \dogetpageshift{\dimen0}\hpageshifts\nofhpageshifts
+   \dogetpageshift{\dimen2}\vpageshifts\nofvpageshifts
+   \ifdone % see also layout offsets, maybe \movebox
+     \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
+     \setbox#1\vbox
+       {\offinterlineskip\vskip\dimen2\hskip\dimen0\box#1}%
+     \next
+   \fi}
+
+\def\setuppageshift
+  {\dotripleempty\dosetuppageshift}
+
+\def\dosetuppageshift[#1][#2][#3]% page|paper horizontal vertical
+  {\ifthirdargument              % paper=arrange
+     \let\hpageshifts\empty
+     \let\vpageshifts\empty
+     \let\shiftprintpagebox\gobbleoneargument
+     \let\shiftpaperpagebox\gobbleoneargument
+     \doifdefined{\??pt\v!horizontal:#2}
+       {\edef\hpageshifts{\getvalue{\??pt\v!horizontal:#2}}}%
+     \doifdefined{\??pt\v!vertical  :#3}
+       {\edef\vpageshifts{\getvalue{\??pt\v!vertical  :#3}}}%
+     \doif{#1}\v!page{\let\shiftprintpagebox\shiftpagebox}%
+     \doif{#1}\v!paper{\let\shiftpaperpagebox\shiftpagebox}%
+   \else\ifsecondargument
+     \doifinsetelse{#1}{\v!page,\v!paper}
+       {\setuppageshift[#1][#2][#2]}
+       {\setuppageshift[\v!page][#1][#2]}%
+   \else\iffirstargument
+     \setuppageshift[\v!page][#1][#1]%
+   \fi\fi\fi}
+
+%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}{\null\page}%
+   \dorecurse\@@ipn
+     {\dofilterpage{#1}\recurselevel
+      \doifinset\recurselevel{#2}{\null\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
+              {\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}%
+  {\globallet\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=\combinedpagescounter,
+                             \c!factor=\v!max,
+                             \c!background=\@@ipbackground,
+                             \c!backgroundcolor=\@@ipbackgroundcolor,
+                             \c!frame=\@@ipframe]%
+                        \fi\fi
+                        \@@ipright}
+                     \@@ipbottom}%
+                  \doglobal\increment\combinedpagescounter
+                  \hfil}%
+               \hfilneg}
+            \vfil}%
+         \vfilneg}%
+         \page
+         \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
+
+\setvalue{\??ip::\c!alternative:\v!c}%
+  {\globallet\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=\combinedpagescounter,
+                                   \c!factor=\v!max,
+                                   \c!background=\@@ipbackground,
+                                   \c!backgroundcolor=\@@ipbackgroundcolor,
+                                   \c!frame=\@@ipframe]%
+                              \fi\fi}}
+                         \doglobal\increment\combinedpagescounter
+                         \@@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}%
+  {\globallet\combinedpagescounter\@@ipstart
+   \doloop
+     {\startbaselinecorrection
+        \scratchdimen\@@ipdistance
+        \!!widtha\dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
+        \hbox to \hsize
+          {\dorecurse\@@ipnx
+             {\doglobal\increment\combinedpagescounter
+              \ifnum\combinedpagescounter>\@@ipn \else
+                 \normalexpanded{\noexpand\externalfigure[\@@ipname]
+                   [\c!page=\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}}
+
+%D \macros
+%D   {setuppagecomment,startpagecomment}
+%D
+%D This command is not yet documented. Usage:
+%D
+%D \starttyping
+%D \setuppagecomment[state=start,location=right]
+%D
+%D \startpagecomment
+%D \input knuth
+%D \stoppagecomment
+%D \stoptyping
+
+\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\relax}%
+         \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset\relax}%
+         \defineoverlay[\v!pagecomment][\placepagecommentTB]}
+        {\setuppapersize[\c!top=\vskip\@@pcoffset]%
+         \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset\relax}%
+         \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcwidth\relax}%
+         \defineoverlay[\v!pagecomment][\placepagecommentLR]}%
+      \processaction
+        [\@@pclocation]
+        [ \v!bottom=>{\setuppapersize[\c!bottom =\vss,\c!top =\vskip\@@pcoffset]},
+             \v!top=>{\setuppapersize[\c!top =\vss,\c!bottom =\vskip\@@pcoffset]},
+            \v!left=>{\setuppapersize[\c!left =\hss,\c!right=\hskip\@@pcoffset]},
+           \v!right=>{\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]}
+    {\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}
+
+\def\placepagecommentTB
+  {\vbox to \printpaperheight
+     {%\forgetall
+      \hsize\printpaperwidth
+      \vskip\@@pcoffset
+      \doifelse\@@pclocation\v!bottom{\vskip\dimexpr\paperheight+\@@pcdistance\relax}\vss
+      \hskip\@@pcoffset
+      \vbox to \@@pcheight
+        {%\forgetall
+         \hsize\paperwidth
+         \ifpagecomment
+           \getbuffer[\v!pagecomment]%
+           \global\pagecommentfalse
+         \fi}%
+      \hfill
+      \doifelse\@@pclocation\v!bottom\vss{\vskip\dimexpr\paperheight+\@@pcdistance\relax}%
+      \vskip\@@pcoffset}}
+
+\def\placepagecommentLR
+  {\hbox to \printpaperwidth
+     {\hskip\@@pcoffset
+      \doifelse\@@pclocation\v!right{\hskip\paperwidth\hskip\@@pcdistance}\hss
+      \vbox to \printpaperheight
+        {%\forgetall
+         \vskip\@@pcoffset
+         \hsize\@@pcwidth
+         \ifpagecomment
+           \getbuffer[\v!pagecomment]%
+           \global\pagecommentfalse
+         \fi
+         \vss}%
+      \doifelse\@@pclocation\v!right\hss{\hskip\paperwidth\hskip\@@pcdistance}%
+      \hskip\@@pcoffset}}
+
+\newif\ifpagecomment
+
+\setvalue{\e!start\v!pagecomment}%
+  {\global\pagecommenttrue
+   \dostartbuffer[\v!pagecomment][\e!start\v!pagecomment][\e!stop\v!pagecomment]}
+
+\setuppagecomment
+  [\c!state=, % \v!stop would invoke background calculation
+   \c!location=\v!bottom,
+   \c!offset=.5cm,
+   \c!distance=.5cm,
+   \c!height=5cm,
+   \c!width=10cm]
+
+% 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-imp.tex b/tex/context/base/page-imp.tex
deleted file mode 100644
index e4ece04a6..000000000
--- a/tex/context/base/page-imp.tex
+++ /dev/null
@@ -1,1314 +0,0 @@
-%D \module
-%D   [       file=page-imp, % was: core-pag,
-%D        version=1998.01.15,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Pagebody Building (Imposition),
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% much of this can more to run time loading !
-
-\writestatus{loading}{ConTeXt Page Macros / Pagebody Building}
-
-\unprotect
-
-% sizing bug:
-%
-% \setuppapersize[A4][A4,landscape] \setuparranging[2UP] \showframe
-%
-% \starttext \dorecurse{10}{\input tufte \par} \stoptext
-
-% to be moved code:
-
-\newif\ifclipprintbox \clipprintboxtrue
-%newif\ifclippagebox  \clippageboxtrue
-
-\def\clippedprintbox#1#2% can be made more efficient, see other clipper
-  {\ifclipprintbox
-     \!!widthc \pagebackgroundoffset
-     \!!widtha \dimexpr\paperwidth + \!!widthc\relax
-     \!!heighta\dimexpr\paperheight+2\!!widthc\relax
-     \setbox#2\vbox to \paperheight{\vfill\box#2}%
-     \ht#2\paperheight
-     \wd#2\paperwidth
-     \setbox#2\vbox
-       {\framed
-          [\c!offset=\!!widthc,\c!strut=\v!no,\c!frame=\v!off]
-          {\box#2}}%
-     \setbox#2\hbox to \paperwidth
-       {\ifcase#1\relax
-          \!!widthb\zeropoint
-          \hskip-\!!widthc
-        \else
-          \!!widthb\!!widthc
-        \fi
-        \lower\!!widthc\hbox
-          {\clip
-             [\c!width=\!!widtha,\c!height=\!!heighta,
-              \c!hoffset=\!!widthb,\c!voffset=\zeropoint]
-             {\box#2}}}%
-     \wd#2\paperwidth
-     \ht#2\paperheight
-   \fi
-   \box#2\relax}
-
-\let\clippagebox \gobbleoneargument
-\let\clipprintbox\gobbleoneargument
-
-% \setuppagenumbering[alternative=doublesided]
-% \setupcolors[state=start]
-% \setuppapersize[A4][A4,oversized]
-% \setuplayout[location=middle,clipoffset=5mm]
-% \setupbackgrounds
-%   [page]
-%   [frame=on,rulethickness=1mm,
-%    backgroundoffset=10mm,background=color,backgroundcolor=red]
-% \starttext \dorecurse{10}{\input tufte \par} \stoptext
-
-\def\clippagebox#1%
-  {\ifdim\@@lyclipoffset>\zeropoint
-     \!!widtha \wd#1%
-     \!!heighta\ht#1%
-     \!!deptha \dp#1%
-     \setbox#1\hbox
-       {\!!widthb \@@lyclipoffset
-        \advance\!!heighta\dimexpr\!!deptha+2\!!widthb\relax
-        \advance\!!widtha \!!widthb
-        \doifbothsides
-          {\advance\!!widtha\!!widthb \!!widthc-\!!widthb \hskip\!!widthc}%
-          {\!!widthc\zeropoint}
-          {\!!widthc-\!!widthb \hskip\!!widthc}%
-        \lower\!!widthb\hbox
-          {\clip
-             [\c!hoffset=\!!widthc,
-              \c!voffset=-\!!widthb,
-                \c!width=\!!widtha,
-               \c!height=\!!heighta]%
-             {\box#1}}}%
-     \wd#1\!!widtha
-     \ht#1\!!heighta
-     \dp#1\!!deptha
-   \fi}
-
-%D \macros
-%D   {starttextdata}
-%D
-%D This is a user macro (appending to every last shipout is not
-%D really user friendly.
-
-\newtoks \collectedtextdata
-
-\long\def\starttextdata#1\stoptextdata
-  {\doglobal\appendtoks#1\to\collectedtextdata}
-
-\def\flushtextdata
-  {\vsmashed{\the\collectedtextdata}% all dimensions zero
-   \global\collectedtextdata\emptytoks
-   \globallet\flushtextdata\donothing}
-
-\prependtoks \flushtextdata \to \everylastshipout
-
-% moved code:
-
-% \def\myshipout#1%
-%   {\beforeshipout % voor de pagebody dus !
-%    \dontshowcomposition
-%    \ifarrangingpages\@EA\actualarrange\else\@EA\actualshipout\fi
-%      {\thisisrealpage\realfolio#1}%
-%    \gotonextrealpage
-%    \aftershipout}
-
-\def\installpagehandler#1#2%          % a handler takes one argument: something to be boxed
-  {\setvalue{\??pp:\c!method:#1}{#2}} % and shipped out (don't depend on the exact package)
-
-\installpagehandler\v!normal
-  {\ifarrangingpages\expandafter\actualarrange\else\expandafter\actualshipout\fi}
-
-\def\myshipout#1%
- {\beforeshipout % voor de pagebody dus !
-  \dontshowcomposition
-  \executeifdefined{\??pp:\c!method:\@@ppmethod}\gobbleoneargument{\thisisrealpage\realfolio#1}%
-  \gotonextrealpage
-  \aftershipout}
-
-\newbox\postponedcontent
-
-% \def\flushatshipout
-%   {\dowithnextbox
-%      {\global\setbox\postponedcontent\hbox to \zeropoint
-%         {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
-%          \box\postponedcontent\flushnextbox}%
-%       \global\ht\postponedcontent\zeropoint
-%       \global\dp\postponedcontent\zeropoint
-%       \global\wd\postponedcontent\zeropoint}%
-%    \hbox}
-
-\def\flushatshipout
-  {\dowithnextbox
-     {\global\setbox\postponedcontent\hbox to \zeropoint
-        {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
-         \unhbox\postponedcontent\unhbox\nextbox}%
-      \global\ht\postponedcontent\zeropoint
-      \global\dp\postponedcontent\zeropoint
-      \global\wd\postponedcontent\zeropoint}%
-   \hbox}
-
-% \starttypen
-% \def\pagestoshipout{1,3,5}
-% \stoptypen
-
-\newcount\shippedoutpages
-
-\let\pagestoshipout\empty      % {1,3,6}
-\chardef\whichpagetoshipout=0  % 0=all 1=odd 2=even
-
-\ifx\finalizeshipoutbox\undefined \let\finalizeshipoutbox\firstofoneargument \fi
-
-\def\actualshipout#1%
-  {\global\advance\shippedoutpages\plusone
-   % this is not resource safe!
-   \ifx\pagestoshipout\empty
-     \ifcase\whichpagetoshipout\relax
-       \donetrue
-     \or % 1
-       \ifodd\shippedoutpages\relax\donetrue\else\donefalse\fi
-     \or % 2
-       \ifodd\shippedoutpages\relax\donefalse\else\donetrue\fi
-     \else
-       \donetrue
-     \fi
-   \else % testen, aangepast / expanded nodig ?
-     \expanded{\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}%
-       \donetrue\donefalse
-   \fi
-   \ifdone
-     \shipout\vbox
-       {\forgetall
-        \offinterlineskip
-        \dontcomplain
-        \scratchdimen-1in
-        \vskip\scratchdimen
-        \hskip\scratchdimen
-        \hbox % \setbox0=\box.. is nicer
-          {\setbox0\hbox{\finalizeshipoutbox{#1}}% just in case there are objects there, hook for testing
-           \setbox\scratchbox\hbox
-             {% before the main one !
-              \ifcase\realfolio \or
-                \the\everyfirstshipout
-                \global\everyfirstshipout\emptytoks
-              \fi
-              % the main one
-              \the\everyshipout\relax
-              % always last (and after the main one)
-              \ifnum\realpageno=\lastpage\relax
-                \the\everylastshipout
-                \global\everylastshipout\emptytoks
-              \fi}%
-           \smashbox\scratchbox
-           \box\scratchbox
-           \box\postponedcontent % evt ver naar links !
-           \box0}}%
-   \else
-     \message
-       {[\ifarrangingpages arranged \fi page
-         \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace
-         not flushed]}%
-     \setbox0\hbox{#1}%
-     \deadcycles\zerocount
-   \fi}
-
-\def\actualarrange#1%
-  {\setbox0\hbox{\thisisrealpage{\realfolio}#1}%
-   \pusharrangedpage0%
-   \deadcycles\zerocount}
-
-%D We need a couple of boxes for duplex printing \unknown
-
-\newbox\arrangedpageA \newbox\arrangedpageB
-
-%D \unknown\ and some for simulating big sheets.
-
-\newbox\arrangedpageC \newbox\arrangedpageD
-\newbox\arrangedpageE \newbox\arrangedpageF
-\newbox\arrangedpageG \newbox\arrangedpageH
-
-\newif\ifswaparranged
-\newif\ifnegatearranged
-\newif\ifmirrorarranged
-\newif\ifdoublearranged
-
-\newif\ifarrangingdisabled
-
-\def\arrangedrotationO{0}
-\def\arrangedrotationE{0}
-
-\newcounter\arrangedpageN
-\newcounter\arrangedpageM
-
-\chardef\arrangedpageT=1
-\chardef\arrangedpageX=1
-\chardef\arrangedpageY=1
-
-\def\calculatepaperoffsets#1%
-  {\scratchdimen\getvalue{\??pp#1\c!offset}%
-   \divide\scratchdimen \arrangedpageX
-   \global\advance\paperwidth -2\scratchdimen
-   \scratchdimen\getvalue{\??pp#1\c!offset}%
-   \divide\scratchdimen \arrangedpageY
-   \global\advance\paperheight-2\scratchdimen}
-
-\newconditional\arrangedbackgroundokay % more ifs -> conditionals
-
-\def\setuparranging[#1]%
-  {\ifarrangingdisabled \else
-     \doifelse{#1}\v!disable
-       {\global\arrangingdisabledtrue}
-       {\global\arrangingdisabledfalse}%
-     \global\arrangingpagestrue
-     \global\negatearrangedfalse
-     \global\mirrorarrangedfalse
-     \global\doublearrangedfalse
-     \gdef\arrangedrotationO{0}%
-     \gdef\arrangedrotationE{180}%
-     \processallactionsinset
-       [#1]
-       [    \v!mirrored=>\global\mirrorarrangedtrue,
-         \v!doublesided=>\global\doublearrangedtrue,
-            \v!negative=>\global\negatearrangedtrue,
-             \v!rotated=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
-                     90=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
-                    180=>\gdef\arrangedrotationO{180}\gdef\arrangedrotationE{0},
-                    270=>\gdef\arrangedrotationO{270}\gdef\arrangedrotationE{90},
-               \s!reset=>\global\arrangingpagesfalse,
-          \v!background=>\global\settrue\arrangedbackgroundokay,
-             \s!unknown=>\checkinstalledpagearrangement\commalistelement]%
-        % no \s!default=> we can have aaa,,bbb
-     \ifx\handlearrangedpage\undefined
-       \global\arrangingpagesfalse
-     \fi
-     \doifcommonelse{#1}{90,270,\v!rotated}
-       {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
-     \setuppapersize
-     \ifarrangingpages
-       \abortutilitygeneration
-     \fi
-   \fi}
-
-\def\installpagearrangement #1 %
-  {\setgvalue{\??pp\??pp#1}}
-
-\def\checkinstalledpagearrangement#1% can be empty: aaa,,bbb
-  {\executeifdefined{\??pp\??pp#1}\donothing}
-
-\def\dosetuparrangement#1#2#3#4#5#6#7#8%
-  {\global\chardef\arrangedpageX     #1%
-   \global\chardef\arrangedpageY     #2%
-   \global\chardef\arrangedpageT     #3%
-   \global\chardef\horizontalcutmarks#4%
-   \global\chardef\verticalcutmarks  #5%
-   \global\let    \pusharrangedpage  #6%
-   \global\let    \poparrangedpages  #7%
-   \global\let    \handlearrangedpage#8}
-
-\installpagearrangement {\v!normal}
-  {\global\arrangingpagesfalse}
-
-\installpagearrangement 2*16
-  {\dosetuparrangement{4}{4}{16}{5}{5}%
-     \pusharrangedpageTHIRTYTWO\poparrangedpagesAB\relax}
-
-\installpagearrangement 2*8
-  {\dosetuparrangement{4}{2}{8}{5}{3}%
-     \pusharrangedpageSIXTEEN\poparrangedpagesAB\relax}
-
-\installpagearrangement 2*4
-  {\dosetuparrangement{2}{2}{4}{3}{3}%
-     \pusharrangedpageEIGHT\poparrangedpagesAB\relax}
-
-\installpagearrangement 2*2
-  {\dosetuparrangement{2}{1}{2}{3}{2}%
-     \pusharrangedpageFOURA\poparrangedpagesAB\relax}
-
-\installpagearrangement 2**2
-  {\dosetuparrangement{2}{1}{2}{3}{2}%
-     \pusharrangedpageFOURB\poparrangedpagesAB\relax}
-
-\installpagearrangement 2SIDE
-  {\dosetuparrangement{2}{1}{2}{3}{2}%
-     \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageSIDE}
-
-\installpagearrangement 2TOP
-  {\dosetuparrangement{1}{2}{2}{2}{3}%
-     \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageTOP}
-
-\installpagearrangement 2UP
-  {\dosetuparrangement{2}{1}{4}{3}{2}%
-     \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWOUP}
-
-\installpagearrangement 2DOWN
-  {\dosetuparrangement{1}{2}{4}{2}{3}%
-     \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWODOWN}
-
-\installpagearrangement 2*4*2 % one defined by Willy Egger:
-  {\dosetuparrangement{2}{2}{4}{3}{2}%
-     \pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax}
-
-\installpagearrangement 2*2*4 % onother one of Willy Egger
-  {\dosetuparrangement{2}{1}{8}{3}{2}%
-     \pusharrangedpageSIXTEENFOUR\poparrangedpagesAtoH\relax}
-
-\installpagearrangement 2TOPSIDE
-  {\dosetuparrangement{1}{2}{4}{2}{3}%
-     \pusharrangedpageTWOTOPSIDE\poparrangedpagesTWOTOPSIDE\handlearrangedpageTOP}
-
-% \def\filluparrangedpages % beware: \realpageno is 1 ahead
-%   {\ifarrangingpages
-%      \scratchcounter-\realpageno
-%      \divide\scratchcounter \arrangedpageT
-%      \multiply\scratchcounter \arrangedpageT
-%      \advance\scratchcounter \realpageno
-%      \advance\scratchcounter \minusone
-%      \dorecurse\scratchcounter{\noheaderandfooterlines\ejectdummypage}%
-%    \fi}
-
-\def\filluparrangedpages % beware: \realpageno is 1 ahead
-  {\ifarrangingpages
-     \scratchcounter\numexpr\realpageno-\plusone\relax
-     \dosetmodulo\scratchcounter\arrangedpageT\scratchcounter
-     \ifcase\scratchcounter\else
-       \advance\scratchcounter \plusone
-       \dostepwiserecurse\scratchcounter\arrangedpageT\plusone
-         {\noheaderandfooterlines\ejectdummypage}%
-     \fi
-   \fi}
-
-\def\handlearrangedpageXandY#1#2#3#4#5%
-  {\global\setbox#5\hbox to \arrangedpageX\paperwidth
-     {\setbox\scratchbox\vbox to \arrangedpageY\paperheight
-        {\forgetall
-         \offinterlineskip
-         \dontcomplain
-         \vskip#4\paperheight
-         \hskip#3\paperwidth
-         \dorotatebox{\ifcase#2 0\else180\fi}\hbox{\box#1}%
-         \vfill}%
-      \wd\scratchbox\zeropoint
-      \box\scratchbox\box#5\hss}}
-
-\def\gotonextarrangepage
-  {\global\advance\arrangeno \plusone
-   \def\pagecutmarksymbol{\the\arrangeno}}
-
-\def\outputarrangedbox#1%
-  {\bgroup
-   \gotonextarrangepage
-   \ifnum\arrangedrotationO\arrangedrotationE>\zerocount
-     \setbox#1\vbox
-       {\ifdoublearranged
-          \ifodd\arrangeno
-            \dorotatebox\arrangedrotationO\hbox{\box#1}%
-          \else
-            \dorotatebox\arrangedrotationE\hbox{\box#1}%
-          \fi
-        \else
-          \dorotatebox\arrangedrotationO\hbox{\box#1}%
-        \fi}%
-   \fi
-   \ifmirrorarranged
-     \setbox#1\vbox{\domirrorbox\vbox{\box#1}}%
-   \fi
-   \ifnegatearranged
-     \negatecolorbox{#1}%
-   \fi
-   \finishpagebox#1%
-   \ifconditional\arrangedbackgroundokay\addprintbackground#1\fi
-   \actualshipout{\box#1}%
-   \egroup}
-
-%D The format file can be 16K smaller when we postpone the
-%D real arrangments. Some day ...
-
-% TOP
-
-% 32/16/8/4/SIDE
-
-\def\poparrangedpagesAB
-  {\ifnum\arrangedpageN>\zerocount
-     \dontcomplain
-     \paperwidth\arrangedpageX\paperwidth
-     \paperheight\arrangedpageY\paperheight
-     \outputarrangedbox\arrangedpageA
-     \outputarrangedbox\arrangedpageB
-     \doglobal\newcounter\arrangedpageN
-   \fi}
-
-\def\pusharrangedpageTHIRTYTWO#1% taco's challenge
-  {\doglobal\increment\arrangedpageN
-   \reportarrangedpage\arrangedpageN
-   \ifcase\arrangedpageN
-   \or \handlearrangedpageXandY{#1}033\arrangedpageA %  1
-   \or \handlearrangedpageXandY{#1}003\arrangedpageB %  2
-   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  3
-   \or \handlearrangedpageXandY{#1}130\arrangedpageA %  4
-   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
-   \or \handlearrangedpageXandY{#1}130\arrangedpageB %  6
-   \or \handlearrangedpageXandY{#1}033\arrangedpageB %  7
-   \or \handlearrangedpageXandY{#1}003\arrangedpageA %  8
-   \or \handlearrangedpageXandY{#1}102\arrangedpageA %  9
-   \or \handlearrangedpageXandY{#1}132\arrangedpageB % 10
-   \or \handlearrangedpageXandY{#1}031\arrangedpageB % 11
-   \or \handlearrangedpageXandY{#1}001\arrangedpageA % 12
-   \or \handlearrangedpageXandY{#1}031\arrangedpageA % 13
-   \or \handlearrangedpageXandY{#1}001\arrangedpageB % 14
-   \or \handlearrangedpageXandY{#1}102\arrangedpageB % 15
-   \or \handlearrangedpageXandY{#1}132\arrangedpageA % 16
-   \or \handlearrangedpageXandY{#1}122\arrangedpageA % 17
-   \or \handlearrangedpageXandY{#1}112\arrangedpageB % 18
-   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 19
-   \or \handlearrangedpageXandY{#1}021\arrangedpageA % 20
-   \or \handlearrangedpageXandY{#1}011\arrangedpageA % 21
-   \or \handlearrangedpageXandY{#1}021\arrangedpageB % 22
-   \or \handlearrangedpageXandY{#1}122\arrangedpageB % 23
-   \or \handlearrangedpageXandY{#1}112\arrangedpageA % 24
-   \or \handlearrangedpageXandY{#1}013\arrangedpageA % 25
-   \or \handlearrangedpageXandY{#1}023\arrangedpageB % 26
-   \or \handlearrangedpageXandY{#1}120\arrangedpageB % 27
-   \or \handlearrangedpageXandY{#1}110\arrangedpageA % 28
-   \or \handlearrangedpageXandY{#1}120\arrangedpageA % 29
-   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 30
-   \or \handlearrangedpageXandY{#1}013\arrangedpageB % 31
-   \or \handlearrangedpageXandY{#1}023\arrangedpageA % 32
-     \poparrangedpages
-   \fi}
-
-\def\pusharrangedpageSIXTEEN#1% changed to match the official way of doing
-  {\doglobal\increment\arrangedpageN
-   \reportarrangedpage\arrangedpageN
-   \ifcase\arrangedpageN
-   \or \handlearrangedpageXandY{#1}031\arrangedpageA %  1
-   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
-   \or \handlearrangedpageXandY{#1}031\arrangedpageB %  3
-   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  4
-   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
-   \or \handlearrangedpageXandY{#1}130\arrangedpageB %  6
-   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  7
-   \or \handlearrangedpageXandY{#1}130\arrangedpageA %  8
-   \or \handlearrangedpageXandY{#1}120\arrangedpageA %  9
-   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
-   \or \handlearrangedpageXandY{#1}120\arrangedpageB % 11
-   \or \handlearrangedpageXandY{#1}110\arrangedpageA % 12
-   \or \handlearrangedpageXandY{#1}011\arrangedpageA % 13
-   \or \handlearrangedpageXandY{#1}021\arrangedpageB % 14
-   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
-   \or \handlearrangedpageXandY{#1}021\arrangedpageA % 16
-     \poparrangedpages
-   \fi}
-
-\def\pusharrangedpageEIGHT#1% changed to match the official way of doing
-  {\doglobal\increment\arrangedpageN
-   \reportarrangedpage\arrangedpageN
-   \ifcase\arrangedpageN
-   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  1
-   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
-   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  3
-   \or \handlearrangedpageXandY{#1}110\arrangedpageA %  4
-   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  5
-   \or \handlearrangedpageXandY{#1}110\arrangedpageB %  6
-   \or \handlearrangedpageXandY{#1}011\arrangedpageB %  7
-   \or \handlearrangedpageXandY{#1}001\arrangedpageA %  8
-     \poparrangedpages
-   \fi}
-
-\def\pusharrangedpageFOURA{\pusharrangedpageFOURdo01}
-\def\pusharrangedpageFOURB{\pusharrangedpageFOURdo10}
-
-\def\pusharrangedpageFOURdo#1#2#3%
-  {\doglobal\increment\arrangedpageN
-   \reportarrangedpage\arrangedpageN
-   \ifcase\arrangedpageN
-   \or \handlearrangedpageXandY{#3}010\arrangedpageA    %  1
-   \or \handlearrangedpageXandY{#3}0{#1}0\arrangedpageB %  2/3 not {1}
-   \or \handlearrangedpageXandY{#3}0{#2}0\arrangedpageB %  3/2 not {1}
-   \or \handlearrangedpageXandY{#3}000\arrangedpageA    %  4
-     \poparrangedpages
-   \fi}
-
-\def\pusharrangedpageSIDETOP#1%
-  {\doglobal\increment\arrangedpageN
-   \reportarrangedpage\arrangedpageN
-   \ifcase\arrangedpageN
-   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  1
-   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
-     \poparrangedpages
-   \fi}
-
-\def\handlearrangedpageSIDE
-  {\global\wd\arrangedpageA\paperwidth
-   \global\wd\arrangedpageB\paperwidth
-   \global\setbox\arrangedpageA\hbox
-     {\box\arrangedpageA\box\arrangedpageB}%
-   \global\ht\arrangedpageA\paperheight}
-
-\def\handlearrangedpageTOP
-  {\global\ht\arrangedpageA\paperheight
-   \global\ht\arrangedpageB\paperheight
-   \global\setbox\arrangedpageA\vbox
-     {\forgetall\offinterlineskip\vskip\paperheight
-      \box\arrangedpageA\box\arrangedpageB}%
-   \global\setbox\arrangedpageB\box\scratchbox} % ?
-
-% 2UP/2DOWN / 1pt prevents overflow
-
-\def\splitoffarrangedpagesTWO
-  {\splittopskip\zeropoint
-   \global\setbox\arrangedpageA\vsplit\arrangedpageB to \onepoint
-   \scratchdimen\dimexpr\ht\arrangedpageB-\onepoint\relax
-   \ifdim\scratchdimen>\onepoint
-     \setbox\scratchbox\vsplit\arrangedpageB to \scratchdimen
-   \fi}
-
-\def\handlearrangedpageTWOUP
-  {\splitoffarrangedpagesTWO
-   \ifswaparranged
-     \global\setbox\arrangedpageA\hbox
-       {\clippedprintbox0\arrangedpageA
-        \clippedprintbox1\arrangedpageB}%
-     \swaparrangedfalse
-   \else
-     \global\setbox\arrangedpageA\hbox
-       {\clippedprintbox0\arrangedpageB
-        \clippedprintbox1\arrangedpageA}%
-     \swaparrangedtrue
-   \fi
-   \global\ht\arrangedpageA\paperheight
-   \global\setbox\arrangedpageB\box\scratchbox}
-
-\def\handlearrangedpageTWODOWN
-  {\splitoffarrangedpagesTWO
-   \global\ht\arrangedpageA\paperheight
-   \global\ht\arrangedpageB\paperheight
-   \ifswaparranged
-     \global\setbox\arrangedpageA\vbox
-       {\forgetall\offinterlineskip\vskip\paperheight
-        \box\arrangedpageA\box\arrangedpageB}%
-     \swaparrangedfalse
-   \else
-     \global\setbox\arrangedpageA\vbox
-       {\forgetall\offinterlineskip\vskip\paperheight
-        \box\arrangedpageB\box\arrangedpageA}%
-     \swaparrangedtrue
-   \fi
-   \global\setbox\arrangedpageB\box\scratchbox}
-
-\def\poparrangedpagesTWO
-  {\ifnum\arrangedpageN>\zerocount
-     \dontcomplain
-     \swaparrangedfalse
-     \doloop
-       {\handlearrangedpage
-        \bgroup
-        \paperwidth\arrangedpageX\paperwidth
-        \paperheight\arrangedpageY\paperheight
-        \ht\arrangedpageA\paperheight
-        \wd\arrangedpageA\paperwidth
-        \outputarrangedbox\arrangedpageA
-        \egroup
-        \ifdim\ht\arrangedpageB=\zeropoint
-          \exitloop
-        \fi}%
-     \doglobal\newcounter\arrangedpageN
-   \fi}
-
-\def\pusharrangedpageTWO#1%
-  {\doglobal\increment\arrangedpageN
-   \reportarrangedpage\arrangedpageN
-   \global\setbox\arrangedpageB\vbox
-     {\forgetall
-      \offinterlineskip
-      \unvbox\arrangedpageB
-      \allowbreak
-      \ht#1\onepoint
-      \dp#1\zeropoint
-      \vbox{\box#1}}}
-
-\def\poparrangedpagesTWOTOPSIDE
-  {\ifnum\arrangedpageN>\zerocount
-     \bgroup
-     \gdef\arrangedpageN{2}\poparrangedpagesTWO
-     \let\arrangedpageA\arrangedpageC
-     \let\arrangedpageB\arrangedpageD
-     \gdef\arrangedpageN{2}\poparrangedpagesTWO
-     \doglobal\newcounter\arrangedpageN
-     \egroup
-  \fi}
-
-\def\pusharrangedpageTWOTOPSIDE#1%
-  {\doglobal\increment\arrangedpageN
-   \reportarrangedpage\arrangedpageN
-   \ifcase\arrangedpageN
-   \or \handlearrangedpageXandY{#1}000\arrangedpageA %  1
-   \or \handlearrangedpageXandY{#1}000\arrangedpageC %  2
-   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  1
-   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  2
-     \poparrangedpages
-   \fi}
-
-%D Willy Egger's sheet simulations:
-
-\def\poparrangedpagesAtoH
-  {\ifnum\arrangedpageN>\zerocount
-     \dontcomplain
-     \paperwidth\arrangedpageX\paperwidth
-     \paperheight\arrangedpageY\paperheight
-     \outputarrangedbox\arrangedpageA
-     \outputarrangedbox\arrangedpageB
-     \outputarrangedbox\arrangedpageC
-     \outputarrangedbox\arrangedpageD
-     \outputarrangedbox\arrangedpageE
-     \outputarrangedbox\arrangedpageF
-     \outputarrangedbox\arrangedpageG
-     \outputarrangedbox\arrangedpageH
-     \doglobal\newcounter\arrangedpageN
-   \fi}
-
-% to arrange 16 pages on 2 sheets to form one booklet
-
-\def\poparrangedpagesAtoD
-  {\ifnum\arrangedpageN>\zerocount
-     \dontcomplain
-     \paperwidth\arrangedpageX\paperwidth
-     \paperheight\arrangedpageY\paperheight
-     \outputarrangedbox\arrangedpageA
-     \outputarrangedbox\arrangedpageB
-     \outputarrangedbox\arrangedpageC
-     \outputarrangedbox\arrangedpageD
-     \doglobal\newcounter\arrangedpageN
-   \fi}
-
-% to arrange 16 pages on 4 sheets to form one booklet
-
-\def\pusharrangedpageSIXTEENFOUR#1%
-  {\doglobal\increment\arrangedpageN
-   \reportarrangedpage\arrangedpageN
-   \ifcase\arrangedpageN
-   \or \handlearrangedpageXandY{#1}010\arrangedpageA %  1
-   \or \handlearrangedpageXandY{#1}000\arrangedpageB %  2
-   \or \handlearrangedpageXandY{#1}010\arrangedpageC %  3
-   \or \handlearrangedpageXandY{#1}000\arrangedpageD %  4
-   \or \handlearrangedpageXandY{#1}010\arrangedpageE %  5
-   \or \handlearrangedpageXandY{#1}000\arrangedpageF %  6
-   \or \handlearrangedpageXandY{#1}010\arrangedpageG %  7
-   \or \handlearrangedpageXandY{#1}000\arrangedpageH %  8
-   \or \handlearrangedpageXandY{#1}010\arrangedpageH %  9
-   \or \handlearrangedpageXandY{#1}000\arrangedpageG % 10
-   \or \handlearrangedpageXandY{#1}010\arrangedpageF % 11
-   \or \handlearrangedpageXandY{#1}000\arrangedpageE % 12
-   \or \handlearrangedpageXandY{#1}010\arrangedpageD % 13
-   \or \handlearrangedpageXandY{#1}000\arrangedpageC % 14
-   \or \handlearrangedpageXandY{#1}010\arrangedpageB % 15
-   \or \handlearrangedpageXandY{#1}000\arrangedpageA % 16
-     \poparrangedpages
-   \fi}
-
-% to arrange 16 pages on 2 sheets to form one booklet
-
-\def\pusharrangedpageSIXTEENTWO#1%
-  {\doglobal\increment\arrangedpageN
-   \reportarrangedpage\arrangedpageN
-   \ifcase\arrangedpageN
-   \or \handlearrangedpageXandY{#1}011\arrangedpageA %  1
-   \or \handlearrangedpageXandY{#1}001\arrangedpageB %  2
-   \or \handlearrangedpageXandY{#1}011\arrangedpageC %  3
-   \or \handlearrangedpageXandY{#1}001\arrangedpageD %  4
-   \or \handlearrangedpageXandY{#1}100\arrangedpageD %  5
-   \or \handlearrangedpageXandY{#1}110\arrangedpageC %  6
-   \or \handlearrangedpageXandY{#1}100\arrangedpageB %  7
-   \or \handlearrangedpageXandY{#1}110\arrangedpageA %  8
-   \or \handlearrangedpageXandY{#1}100\arrangedpageA %  9
-   \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
-   \or \handlearrangedpageXandY{#1}100\arrangedpageC % 11
-   \or \handlearrangedpageXandY{#1}110\arrangedpageD % 12
-   \or \handlearrangedpageXandY{#1}011\arrangedpageD % 13
-   \or \handlearrangedpageXandY{#1}001\arrangedpageC % 14
-   \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
-   \or \handlearrangedpageXandY{#1}001\arrangedpageA % 16
-     \poparrangedpages
-   \fi}
-
-% % handy for stickers etc, this way we can treat them as page
-%
-% \setuppapersize [XY][A4]
-% \setuppaper     [topspace=5mm,backspace=5mm,dx=1mm,dy=1mm,nx=2,ny=6]
-% \setuplayout    [page] [topspace=5mm,backspace=5mm]
-% \setuplayout    [page]
-% \setuplayout    [location=middle]
-% \setuparranging [XY]
-% \showframe
-%
-% \starttext \dorecurse{30}{test \recurselevel \page} \stoptext
-
-\def\pusharrangedpageXY#1%
-   {\doglobal\increment\arrangedpageN
-    \reportarrangedpage\arrangedpageN
-    \doglobal\increment\arrangedpageM
-    \global\setbox\arrangedpageB\hbox
-      \ifdim\@@ppwidth>\zeropoint to \@@ppwidth \fi
-      {\ifvoid\arrangedpageB\else
-         \unhbox\arrangedpageB
-         \ifdim\@@ppdx>\zeropoint \else \hss\fi
-         \hskip\@@ppdx
-         \ifdim\@@ppdx>\zeropoint \else \hss\fi
-       \fi
-       \box#1}%
-    \ifnum\arrangedpageM<\arrangedpageX\else
-      \global\setbox\arrangedpageA\vbox
-        \ifdim\@@ppheight>\zeropoint to \@@ppheight \fi
-        {\offinterlineskip
-         \ifvoid\arrangedpageA\else
-           \unvbox\arrangedpageA
-           \ifdim\@@ppdy>\zeropoint \else \vss\fi
-           \vskip\@@ppdy
-           \ifdim\@@ppdy>\zeropoint \else \vss\fi
-         \fi
-         \box\arrangedpageB}%
-      \doglobal\newcounter\arrangedpageM
-    \fi
-    \ifnum\arrangedpageN<\arrangedpageT\else
-      \poparrangedpages
-    \fi}
-
-\def\poparrangedpagesXY
-  {\ifnum\arrangedpageN>\zerocount
-     \dontcomplain
-     \paperwidth\arrangedpageX\paperwidth
-     \paperheight \arrangedpageY\paperheight
-     \outputarrangedbox\arrangedpageA
-     \doglobal\newcounter\arrangedpageN
-     \doglobal\newcounter\arrangedpageM
-   \fi}
-
-\installpagearrangement XY
-  {\dosetuparrangement\@@ppnx\@@ppny\@@ppxy\!!zerocount\!!zerocount
-     \pusharrangedpageXY\poparrangedpagesXY\relax}
-
-%D A crazy definition, don't guess who pushed me for the landscape option.
-
-\definepapersize
-  [XY]
-  [\c!height=\dimexpr\dimexpr\@@ppheight-\numexpr\@@ppny-1\relax\dimexpr\@@ppdy\relax\relax/\@@ppny\relax,
-   \c!width =\dimexpr\dimexpr\@@ppwidth -\numexpr\@@ppnx-1\relax\dimexpr\@@ppdx\relax\relax/\@@ppnx\relax]
-
-\setuppaper
-  [\c!width =\dimexpr\printpaperwidth -2\dimexpr\@@ppbackspace\relax\relax,
-   \c!height=\dimexpr\printpaperheight-2\dimexpr\@@pptopspace \relax\relax]
-
-% \definepageshift[test][horizontal][10pt,20pt,30pt,40pt,50pt]
-% \definepageshift[test][vertical]  [10pt,20pt,30pt,40pt,50pt]
-%
-% \setuppageshift[test]
-% \setuppageshift[test][test]
-% \setuppageshift[test][none]
-% \setuppageshift[none][test]
-% \setuppageshift[paper][test][test] % arrange only
-% \setuppageshift[paper][test]       % arrange only
-% \setuppageshift[print][test][test]
-%
-% \showframe \dorecurse{100}{\input tufte \par}
-
-% #1=name #2=horizontal|vertical #3=shiftlist
-
-\def\definepageshift
-  {\dotripleargument\dodefinepageshift}
-
-\def\dodefinepageshift[#1][#2][#3]%
-  {\setvalue{\??pt#2:#1}{#3}}
-
-\letempty \hpageshifts \newcounter\nofhpageshifts
-\letempty \vpageshifts \newcounter\nofvpageshifts
-
-% \let\shiftprintpagebox\gobbleoneargument
-% \let\shiftpaperpagebox\gobbleoneargument
-
-\def\dogetpageshift#1#2#3% #1=\dimenx #2=\xpageshifts #3=\nofxpageshifts
-  {\ifx#2\empty
-     #1\zeropoint
-   \else
-     \doglobal\increment#3%
-     \getfromcommacommand[#2][#3]%
-     \ifx\commalistelement\empty
-       \globallet#3\!!plusone
-       \getfromcommacommand[#2][#3]%
-     \fi
-     \ifx\commalistelement\empty
-       #1\zeropoint
-     \else
-       #1=\commalistelement
-       \donetrue
-     \fi
-   \fi}
-
-\def\shiftpagebox#1%
-  {\donefalse
-   \dogetpageshift{\dimen0}\hpageshifts\nofhpageshifts
-   \dogetpageshift{\dimen2}\vpageshifts\nofvpageshifts
-   \ifdone % see also layout offsets, maybe \movebox
-     \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
-     \setbox#1\vbox % \forgetall already done
-       {\offinterlineskip\vskip\dimen2\hskip\dimen0\box#1}%
-     \next
-   \fi}
-
-\def\setuppageshift
-  {\dotripleempty\dosetuppageshift}
-
-\def\dosetuppageshift[#1][#2][#3]% page|paper horizontal vertical
-  {\ifthirdargument              % paper=arrange
-     \let\hpageshifts\empty
-     \let\vpageshifts\empty
-     \let\shiftprintpagebox\gobbleoneargument
-     \let\shiftpaperpagebox\gobbleoneargument
-     \doifdefined{\??pt\v!horizontal:#2}
-       {\edef\hpageshifts{\getvalue{\??pt\v!horizontal:#2}}}%
-     \doifdefined{\??pt\v!vertical  :#3}
-       {\edef\vpageshifts{\getvalue{\??pt\v!vertical  :#3}}}%
-     \doif{#1}\v!page{\let\shiftprintpagebox\shiftpagebox}%
-     \doif{#1}\v!paper{\let\shiftpaperpagebox\shiftpagebox}%
-   \else\ifsecondargument
-     \doifinsetelse{#1}{\v!page,\v!paper}
-       {\setuppageshift[#1][#2][#2]}
-       {\setuppageshift[\v!page][#1][#2]}%
-   \else\iffirstargument
-     \setuppageshift[\v!page][#1][#1]%
-   \fi\fi\fi}
-
-%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}{\null\page}%
-   \dorecurse\@@ipn
-     {\dofilterpage{#1}\recurselevel
-      \doifinset\recurselevel{#2}{\null\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
-              {\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
-   \executeifdefined{\strippedcsname\docombinepages\@@ipalternative}\docombinepagesb
-   \@@ipafter
-   \egroup}
-
-\def\docombinepagesa
-  {\globallet\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=\combinedpagescounter,
-                             \c!factor=\v!max,
-                             \c!background=\@@ipbackground,
-                             \c!backgroundcolor=\@@ipbackgroundcolor,
-                             \c!frame=\@@ipframe]%
-                        \fi\fi
-                        \@@ipright}
-                     \@@ipbottom}%
-                  \doglobal\increment\combinedpagescounter
-                  \hfil}%
-               \hfilneg}
-            \vfil}%
-         \vfilneg}%
-         \page
-         \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
-
-\def\docombinepagesc
-  {\globallet\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=\combinedpagescounter,
-                                   \c!factor=\v!max,
-                                   \c!background=\@@ipbackground,
-                                   \c!backgroundcolor=\@@ipbackgroundcolor,
-                                   \c!frame=\@@ipframe]%
-                              \fi\fi}}
-                         \doglobal\increment\combinedpagescounter
-                         \@@ipbottom}%
-                      \vfil}%
-                   \vfilneg}
-                \hfil}%
-            \hfilneg}}
-         \page
-         \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
-
-\let\docombinepageshorizontal\docombinepagesa
-\let\docombinepagesvertical  \docombinepagesc
-
-\def\docombinepagesb
-  {\globallet\combinedpagescounter\@@ipstart
-   \doloop
-     {\startbaselinecorrection
-        \scratchdimen\@@ipdistance
-        \!!widtha\dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
-        \hbox to \hsize
-          {\dorecurse\@@ipnx
-             {\doglobal\increment\combinedpagescounter
-              \ifnum\combinedpagescounter>\@@ipn \else
-                 \expanded{\externalfigure[\@@ipname]
-                   [\c!page=\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}}
-
-%D \macros
-%D   {setuppagecomment,startpagecomment}
-%D
-%D This command is not yet documented. Usage:
-%D
-%D \starttyping
-%D \setuppagecomment[state=start,location=right]
-%D
-%D \startpagecomment
-%D \input knuth
-%D \stoppagecomment
-%D \stoptyping
-
-\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\relax}%
-         \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset\relax}%
-         \defineoverlay[\v!pagecomment][\placepagecommentTB]}
-        {\setuppapersize[\c!top=\vskip\@@pcoffset]%
-         \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset\relax}%
-         \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcwidth\relax}%
-         \defineoverlay[\v!pagecomment][\placepagecommentLR]}%
-      \processaction
-        [\@@pclocation]
-        [ \v!bottom=>{\setuppapersize[\c!bottom =\vss,\c!top =\vskip\@@pcoffset]},
-             \v!top=>{\setuppapersize[\c!top =\vss,\c!bottom =\vskip\@@pcoffset]},
-            \v!left=>{\setuppapersize[\c!left =\hss,\c!right=\hskip\@@pcoffset]},
-           \v!right=>{\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]}
-    {\doif\@@pcstate\v!stop % else initialization  invokes backgrounds
-       {% this should be tested first
-        % \expanded{\setuppapersize[\papersize][\@@pcprintpapersize]}%
-        \setupbackgrounds[\v!paper][\c!background=]}}}
-
-\def\@@pcprintpapersize{\printpapersize}
-
-\def\placepagecommentTB
-  {\vbox to \printpaperheight
-     {\forgetall
-      \hsize\printpaperwidth
-      \vskip\@@pcoffset
-      \doifelse\@@pclocation\v!bottom{\vskip\dimexpr\paperheight+\@@pcdistance\relax}\vss
-      \hskip\@@pcoffset
-      \vbox to \@@pcheight
-        {\forgetall
-         \hsize\paperwidth
-         \ifpagecomment
-           \getbuffer[\v!pagecomment]%
-           \global\pagecommentfalse
-         \fi}%
-      \hfill
-      \doifelse\@@pclocation\v!bottom\vss{\vskip\dimexpr\paperheight+\@@pcdistance\relax}%
-      \vskip\@@pcoffset}}
-
-\def\placepagecommentLR
-  {\hbox to \printpaperwidth
-     {\hskip\@@pcoffset
-      \doifelse\@@pclocation\v!right{\hskip\paperwidth\hskip\@@pcdistance}\hss
-      \vbox to \printpaperheight
-        {\forgetall
-         \vskip\@@pcoffset
-         \hsize\@@pcwidth
-         \ifpagecomment
-           \getbuffer[\v!pagecomment]%
-           \global\pagecommentfalse
-         \fi
-         \vss}%
-      \doifelse\@@pclocation\v!right\hss{\hskip\paperwidth\hskip\@@pcdistance}%
-      \hskip\@@pcoffset}}
-
-\newif\ifpagecomment
-
-\setvalue{\e!start\v!pagecomment}%
-  {\global\pagecommenttrue
-   \dostartbuffer[\v!pagecomment][\e!start\v!pagecomment][\e!stop\v!pagecomment]}
-
-\setuppagecomment
-  [\c!state=, % \v!stop would invoke background calculation
-   \c!location=\v!bottom,
-   \c!offset=.5cm,
-   \c!distance=.5cm,
-   \c!height=5cm,
-   \c!width=10cm]
-
-% 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-ini.mkiv b/tex/context/base/page-ini.mkiv
index 4c230c1fd..249b6eca6 100644
--- a/tex/context/base/page-ini.mkiv
+++ b/tex/context/base/page-ini.mkiv
@@ -38,13 +38,6 @@
 
 \fi
 
-\ifx\recalculatelogos\undefined
-
-  \let \recalculatelogos  \relax
-  \let \addlogobackground \gobbleoneargument % 
-
-\fi
-
 \ifx\recalculatebackgrounds\undefined
 
   \let \recalculatebackgrounds \relax
@@ -132,22 +125,6 @@
 % floats:
 %
 % tricky in balancing mode, a la huidige multi columns
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
 
 \ifx\dosetuplayout\undefined % overloaded in page-lay !
 
@@ -455,17 +432,9 @@
 \ifx\bye\undefined \def\bye{\par\vfill\supereject\end} \fi % plain tex command
 
 % floats
-%
-% \def\ejectinsert
-%   {\flushnotes
-%    \bgroup
-%    \noftopfloats\plusthousand
-%    \nofbotfloats\zerocount
-%    \doflushfloats
-%    \egroup}
 
 \def\ejectinsert
-  {\flushnotes
+  {%\flushnotes already done
    \bgroup
    \noftopfloats\plusthousand
    \nofbotfloats\zerocount
@@ -481,7 +450,7 @@
 \def\ejectdummypage
   {\endgraf \ifvmode
      \ejectinsert
-     \hardespatie % will be different
+     \fixedspace
      \vfill
      \gotonextpage
    \fi}
@@ -490,7 +459,7 @@
   {}
 
 \def\afterfinaloutput
-  {\forgetall
+  {%\forgetall
    \vskip\zeropoint\relax
    \ifvoid\normalpagebox \else
      \unvbox\normalpagebox
@@ -507,36 +476,32 @@
    \adaptfuzzypagegoal} % watch this hack!
 
 \def\dofinaloutput#1#2% \vbox: prevents spurious spaces in every..pagebody
-  {\beforefinaloutput
+  {\forgetall
+   \beforefinaloutput
    \the\everybeforeshipout % brrr not in shipout
    \the\pageboundsettings
-   \myshipout{\hbox{\vbox{\dopagebody#1#2\setpagecounters}}}%
+   \myshipout{\hbox{\vbox{\dopagebody#1#2}}}% is this hbox needed
    \the\everyaftershipout
-   \afterfinaloutput
-   \popproperties}  % ... and here ...
+   \afterfinaloutput}
 
 \def\donofinaloutput#1#2%
-  {\beforefinaloutput
+  {\forgetall
+   \beforefinaloutput
    \the\everybeforeshipout
    \setpagecounters
    \message{[-\the\realpageno]}%
-   \setbox\scratchbox\hbox
-     {%\the\everyshipout % still needed here ?
-      \dopagebody#1#2}%
+   \setbox\scratchbox\hbox{\dopagebody#1#2}%
    \deadcycles\zerocount
-   \gotonextrealpage
+   \setnextrealpageno
    \the\everyaftershipout
-   \afterfinaloutput
-   \popproperties}  % ... and here
+   \afterfinaloutput}
 
 % beware: \ifprocessingpages is in use
 
-\ifx\checkpageversion\undefined \let\checkpageversion\relax \fi % todo: hook into \everybeforeshipout
-\ifx\doflushspread   \undefined \let\doflushspread   \relax \fi % todo
+\ifdefined\doflushspread\else \let\doflushspread\relax \fi % todo
 
 \def\finaloutput#1#2%
-  {\checkpageversion
-   \ifprocessingpages
+  {\ifprocessingpages
      \ifpageselected
        \@EAEAEA\dofinaloutput
      \else
@@ -624,9 +589,8 @@
       \offinterlineskip
       \vskip\topspace
       \hsize\paperwidth
-      \hfill\hbox{\placetestinfo\hskip.5cm}\vss
+     %\hfill\hbox{\placetestinfo\hskip.5cm}\vss % obsolete
       \settexthoffset\hskip\texthoffset % brrrr
-     %\tlap{\placeversioninfo}\vskip.5cm
       \vbox to 1cm{\vss\placeversioninfo\vss}}}
 
 \def\dotestinfo#1#2#3%
@@ -651,44 +615,6 @@
      \fi
    \fi\fi}
 
-% this will be inserts some day
-
-% \installinsertion\referenceinfobox
-% \installinsertion\registerinfobox
-% \installinsertion\floatinfobox
-
-\newbox\referenceinfobox
-\newbox\registerinfobox
-\newbox\floatinfobox
-
-\def\referenceinfo{\dotestinfo\referenceinfobox}
-\def\registerinfo  {\dotestinfo\registerinfobox}
-\def\floatinfo     {\dotestinfo\floatinfobox}
-
-\def\placetestinfo
-  {\vbox to \makeupheight
-     {\forgetall
-      \infofont
-      \hsize10em
-      \ifvoid\floatinfobox\else
-        \strut \getmessage\m!systems{24}%
-        \vskip\!!sixpoint
-        \unvbox\floatinfobox
-        \vskip\!!twelvepoint
-      \fi
-      \ifvoid\referenceinfobox\else
-        \strut \getmessage\m!systems{25}%
-        \vskip\!!sixpoint
-        \unvbox\referenceinfobox
-        \vskip\!!twelvepoint
-      \fi
-      \ifvoid\registerinfobox\else
-        \strut \getmessage\m!systems{26}%
-        \vskip\!!sixpoint
-        \unvbox\registerinfobox
-      \fi
-      \vss}}
-
 \version[\v!final]
 
 % bewaren tvb documentatie
@@ -803,7 +729,7 @@
   {\ifsavepagebody\global\setbox\savedpagebody\fi
    \vbox
      {\beginrestorecatcodes
-      \forgetall  % igv problemen, check: \boxmaxdepth\maxdimen
+%       \forgetall  % igv problemen, check: \boxmaxdepth\maxdimen
       \boxmaxdepth\maxdimen % new
       \dontcomplain
       % the following plugin uses and sets pagebox; beware: this
@@ -854,7 +780,6 @@
       \getmainbox#1#2}% including footnotes
    \ifcase\pageornamentstate
      \addmainbackground \pagebox
-     \addlogobackground \pagebox
    \fi
    \buildpagebox  \pagebox
    \addstatusinfo \pagebox}
@@ -870,8 +795,9 @@
      \negateprintbox   #1%
    \fi}
 
+\appendtoks \restoreouterspacing   \to \everybeforepagebody
 \appendtoks \restoreglobalbodyfont \to \everybeforepagebody
-\appendtoks \restorecolumnsettings \to \everybeforepagebody
+%appendtoks \restoreouterspacing   \to \everybeforepagebody
 
 \ifx\nestednewbox\undefined \newbox\nestednextbox \fi
 
@@ -881,14 +807,14 @@
   {%\getallmarks % now in following token register
    \the\everybeforepagebody
    \starttextproperties
-   \gotonextsubpage  % nog eens: als in pagina (tbv standaard opmaak)
-   \dontshowboxes    % dan hier blokkeren en verderop resetten
+   \setnextsubpageno  % nog eens: als in pagina (tbv standaard opmaak)
+   \dontshowboxes     % dan hier blokkeren en verderop resetten
 %    \shipoutfacingpage
    \checkmargeblokken
    \the\beforeeverypage
-   \flushtoks\beforepage
+   \normalexpanded{\global\beforepage\emptytoks\the\beforepage}% \scratchtoks\beforepage\global\beforepage\emptytoks\the\scratchtoks % was \flushtoks\beforepage
    \inpagebodytrue\buildpagebody#1#2%
-   \flushtoks\afterpage
+   \normalexpanded{\global\afterpage \emptytoks\the\afterpage }% \scratchtoks\afterpage \global\afterpage \emptytoks\the\scratchtoks % was \flushtoks\afterpage
    \the\aftereverypage
    \resetpagebreak
    %updatelistreferences % now in aftereverypage
@@ -898,65 +824,12 @@
 
 \newtoks\pageboundsettings
 
-\prependtoks \initializepaper \to \pageboundsettings
+% \prependtoks \initializepaper \to \pageboundsettings
 
 % not here
 
 \newif\ifpagebreakdisabled \pagebreakdisabledfalse
 
-% \chardef\testpagemethod=0 % todo: \testnewpage[method=,lines=,voffset=]
-%
-% \def\testpage    {\dotripleempty\dotestpage[\plusone]}
-% \def\testpageonly{\dotripleempty\dotestpage[\plustwo]}
-%
-% \def\dotestpage[#1][#2][#3]%
-%   {%\relax % needed  before \if
-%    \endgraf
-%    \ifpagebreakdisabled
-%      % do nothing
-%    \else
-%      %ifnum#1=\plusone\synchronizeoutput\fi
-%      \ifdim\pagegoal<\maxdimen \relax
-%        \ifdim\pagetotal<\pagegoal \relax
-%          \scratchdimen\lineheight
-%          \multiply\scratchdimen#2\relax
-%          \advance\scratchdimen \pagetotal
-%          \ifdim\lastskip<\parskip
-%            \advance\scratchdimen \parskip
-%          \fi
-%          \ifthirdargument
-%            \advance\scratchdimen#3\relax
-%          \fi
-%          \ifcase\testpagemethod
-%            \ifdim\scratchdimen>.99\pagegoal
-%              \vfill\eject % \penalty-\!!tenthousand\relax
-%            \fi
-%          \or
-%            \advance\scratchdimen-\pagegoal
-%            \ifdim\scratchdimen>-\lineheight
-%              \vfill\eject % \penalty-\!!tenthousand\relax
-%            \fi
-%          \or
-%            \getnoflines\pagegoal
-%            \advance\scratchdimen-\noflines\lineheight \relax
-%            \ifdim\scratchdimen>-\lineheight
-%              \vfill\eject % \penalty-\!!tenthousand\relax
-%            \fi
-%          \or % same as 0 but more accurate
-%            \advance\scratchdimen-10\s!sp\relax
-%            \ifdim\scratchdimen>\pagegoal
-%              \vfill\eject % \penalty-\!!tenthousand\relax
-%            \fi
-%          \fi
-%        \else
-%          % force page break / new
-%          % \vfill\eject % \penalty-\!!tenthousand\relax
-%        \fi
-%      \else
-%        \ifnum#1=\plusone\goodbreak\fi
-%      \fi
-%    \fi}
-
 \chardef\testpagemethod \zerocount % todo: \testnewpage[method=,lines=,voffset=]
 \chardef\testpagetrigger\zerocount
 
@@ -1075,38 +948,32 @@
 
 \def\executepagebreakhandler#1%
   {\edef\@@pagespecification{#1}%
-   \doifdefinedelse{\??pe:\@@pagespecification}
-     {\getvalue{\??pe:\@@pagespecification}}
-     {\doifdefinedelse{\??pe::\@@pagespecification}
-        {\executepagebreakhandlers{\getvalue{\??pe::\@@pagespecification}}}
-        {\getvalue{\??pe:\s!unknown}}}}
+   \ifcsname\??pe:\@@pagespecification\endcsname
+     \csname\??pe:\@@pagespecification\endcsname
+   \else\ifcsname\??pe::\@@pagespecification\endcsname
+     \executepagebreakhandlers{\csname\??pe::\@@pagespecification\endcsname}%
+   \else
+     \csname\??pe:\s!unknown\endcsname
+   \fi\fi}
 
 \long\def\installpagebreakhandler#1#2%
   {\long\setvalue{\??pe:#1}{#2}}
 
-% \definecomplexorsimple\pagebreak
-
-% \def\simplepagebreak
-%   {\executepagebreakhandler\v!ja}
-
-% \def\complexpagebreak[#1]% if empty, do nothing and avoid processing,
-%   {\flushnotes           % see head's; watch how we group
-%    \doifsomething{#1}{\bgroup\executepagebreakhandlers{#1}\egroup}}
-
 \unexpanded\def\pagebreak
   {\dosingleempty\dopagebreak}
 
 \def\dopagebreak[#1]% so, page ornaments are reset after a pagebreak command, unless set
   {\bgroup
+   \flushnotes
    \edef\prevrealpageno{\the\realpageno}%
    \ifcase\pageornamentstate \or
      % disable reset after shipout
      \global\chardef\pageornamentstate\plustwo
    \fi
    \iffirstargument % or if empty i.e. []
-     \flushnotes\executepagebreakhandlers{#1}%
+     \executepagebreakhandlers{#1}%
    \else % so, no pagebreak when \pagebreak[] ! ! !
-     \flushnotes\executepagebreakhandler\v!yes
+     \executepagebreakhandler\v!yes
    \fi
    \ifnum\prevrealpageno<\realpageno
      \global\chardef\pageornamentstate\zerocount
@@ -1375,7 +1242,7 @@
 
 \def\dodobeforeshipout#1%
   {\global\let\beforeshipout\relax
-   \getvalue{\??pg#1\c!before}}
+   \csname\??pg#1\c!before\endcsname}
 
 \def\dobeforeshipout
   {\doifsomething\currentpageselection
@@ -1384,7 +1251,7 @@
 \def\dododoaftershipout#1%
   {\global\let\aftershipout\relax
    \global\let\currentpageselection\empty
-   \getvalue{\??pg#1\c!after}}
+   \csname\??pg#1\c!after\endcsname}
 
 \def\dodoaftershipout#1%
   {\doifelsevalue{\??pg#1\c!option}\v!doublesided
diff --git a/tex/context/base/page-ins.mkii b/tex/context/base/page-ins.mkii
new file mode 100644
index 000000000..069153434
--- /dev/null
+++ b/tex/context/base/page-ins.mkii
@@ -0,0 +1,103 @@
+%D \module
+%D   [       file=core-ins,
+%D        version=2002.04.16,
+%D          title=\CONTEXT\ Insertion Macros,
+%D       subtitle=Insertions,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / 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.
+
+\unprotect
+
+\newtoks\@@insertionlist
+
+\def\processinsertions{\the\@@insertionlist}
+
+\let\doprocessinsert\gobbleoneargument
+
+%\def\installinsertion#1%
+%  {\ifx#1\undefined
+%     \newinsert#1%
+%     \count#1\plusthousand
+%     \skip #1\zeropoint
+%     \dimen#1\maxdimen
+%     \appendtoks\doprocessinsert#1\to\@@insertionlist
+%   \fi}
+
+\def\installinsertion#1%
+  {\ifx#1\undefined
+     \let#1\relax
+   \fi
+   \ifx#1\relax % permits \csname...\endcsname
+     \newinsert#1%
+     \count#1\plusthousand
+     \skip #1\zeropoint
+     \dimen#1\maxdimen
+     \appendtoks\doprocessinsert#1\to\@@insertionlist
+   \fi}
+
+
+\def\synchronizeinsertions
+  {\def\doprocessinsert##1{\ifvoid##1\else\insert##1{\unvbox##1}\fi}%
+   \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
+   \fi}
+
+\def\restoreinsertionbox#1%
+  {\ifvoid\backupinsertion#1\else % if void, we keep the content
+     \global\setbox#1\box\backupinsertion#1%
+   \fi}
+
+\def\eraseinsertionbackup#1%
+  {\global\setbox\backupinsertion#1\emptybox}
+
+\def\saveinsertiondata#1%
+  {\global\skip \backupinsertion#1\skip #1%
+   \global\count\backupinsertion#1\count#1%
+   \global\dimen\backupinsertion#1\dimen#1}
+
+\def\restoreinsertiondata#1%
+  {\global\skip #1\skip \backupinsertion#1%
+   \global\count#1\count\backupinsertion#1%
+   \global\dimen#1\dimen\backupinsertion#1}
+
+%D Auxiliary macros:
+
+\def\addinsertionheight#1\to#2%
+  {\ifvoid#1\else
+     \advance#2 1\skip#1\relax
+     \advance#2  \ht  #1\relax
+   \fi}
+
+\protect \endinput
diff --git a/tex/context/base/page-ins.mkiv b/tex/context/base/page-ins.mkiv
new file mode 100644
index 000000000..3e12bfcf0
--- /dev/null
+++ b/tex/context/base/page-ins.mkiv
@@ -0,0 +1,94 @@
+%D \module
+%D   [       file=core-ins,
+%D        version=2002.04.16,
+%D          title=\CONTEXT\ Insertion Macros,
+%D       subtitle=Insertions,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / 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.
+
+\unprotect
+
+\newtoks\@@insertionlist
+
+\def\processinsertions{\the\@@insertionlist}
+
+\let\doprocessinsert\gobbleoneargument
+
+\def\installinsertion#1%
+  {\ifdefined#1\else
+     \let#1\relax
+   \fi
+   \ifx#1\relax % permits \csname...\endcsname
+     \newinsert#1%
+     \count#1\plusthousand
+     \skip #1\zeropoint
+     \dimen#1\maxdimen
+     \appendtoks\doprocessinsert#1\to\@@insertionlist
+   \fi}
+
+
+\def\synchronizeinsertions
+  {\def\doprocessinsert##1{\ifvoid##1\else\insert##1{\unvbox##1}\fi}%
+   \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
+   \fi}
+
+\def\restoreinsertionbox#1%
+  {\ifvoid\backupinsertion#1\else % if void, we keep the content
+     \global\setbox#1\box\backupinsertion#1%
+   \fi}
+
+\def\eraseinsertionbackup#1%
+  {\global\setbox\backupinsertion#1\emptybox}
+
+\def\saveinsertiondata#1%
+  {\global\skip \backupinsertion#1\skip #1%
+   \global\count\backupinsertion#1\count#1%
+   \global\dimen\backupinsertion#1\dimen#1}
+
+\def\restoreinsertiondata#1%
+  {\global\skip #1\skip \backupinsertion#1%
+   \global\count#1\count\backupinsertion#1%
+   \global\dimen#1\dimen\backupinsertion#1}
+
+%D Auxiliary macros:
+
+\def\addinsertionheight#1\to#2%
+  {\ifvoid#1\else
+     \advance#2 1\skip#1\relax
+     \advance#2  \ht  #1\relax
+   \fi}
+
+\protect \endinput
diff --git a/tex/context/base/page-lay.mkii b/tex/context/base/page-lay.mkii
new file mode 100644
index 000000000..de1194c2a
--- /dev/null
+++ b/tex/context/base/page-lay.mkii
@@ -0,0 +1,1429 @@
+%D \module
+%D   [       file=page-lay,
+%D        version=2000.10.20, % copied from main-001
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Layout Specification,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Layout Specification}
+
+%D This module is now etex dependent.
+
+% to be translated into english
+
+% hoofdhoogte wordt bij status=hoog niet aangepast op outer
+% level, wel binnen bepaalde berekeningen
+
+%D Before you start wondering why some of the page related
+%D modules skip upward or left in order to place elements, you
+%D must realize that the reference point is the top left
+%D corner of the main typesetting area. One reason for this
+%D choice is that it suited some viewers that displayed page
+%D areas. Another reason is that margins, edges and top and
+%D bottom areas are kind of virtual, while the header, text
+%D and footer areas normally determine the text flow.
+
+\unprotect
+
+%D First we get rid of the funny \TEX\ offset defaults of one
+%D inch by setting them to zero.
+
+\voffset = 0pt % setting this to -1in let's go metapost crazy
+\hoffset = 0pt % setting this to -1in let's go metapost crazy
+
+%D The dimensions related to layout areas are represented by
+%D real dimensions.
+
+\newdimen\paperheight          \paperheight          = 297mm
+\newdimen\paperwidth           \paperwidth           = 210mm
+
+\newdimen\printpaperheight     \printpaperheight     = \paperheight
+\newdimen\printpaperwidth      \printpaperwidth      = \paperwidth
+
+\newdimen\makeupheight                               % calculated
+\newdimen\makeupwidth                                % calculated
+
+\newdimen\textheight                                 % calculated
+\newdimen\textwidth                                  % calculated
+
+\newdimen\topspace             \topspace             = 2cm
+\newdimen\backspace            \backspace            = \topspace
+\newdimen\cutspace             \cutspace             = 0pt
+\newdimen\bottomspace          \bottomspace          = 0pt
+
+\newdimen\headerheight         \headerheight         = 2cm
+\newdimen\footerheight         \footerheight         = \headerheight
+
+\newdimen\topoffset            \topoffset            = 0pt
+\newdimen\backoffset           \backoffset           = \topoffset
+
+\newdimen\leftmarginwidth      \leftmarginwidth      = 3cm
+\newdimen\rightmarginwidth     \rightmarginwidth     = \leftmarginwidth
+
+\newdimen\leftedgewidth        \leftedgewidth        = 3cm
+\newdimen\rightedgewidth       \rightedgewidth       = \leftedgewidth
+
+\newdimen\topheight            \topheight            = 0cm
+\newdimen\bottomheight         \bottomheight         = \topheight
+
+\newcount\layoutlines          \layoutlines          = 0
+\newcount\layoutcolumns        \layoutcolumns        = 0
+\newdimen\layoutcolumndistance \layoutcolumndistance = 0pt
+\newdimen\layoutcolumnwidth    \layoutcolumnwidth    = 0pt
+
+%D We can save some tokens and fuzzy parameters by using a
+%D symbolic name for the current set of layout parameters.
+
+\let\currentlayout\empty
+
+\def\layoutparameter#1%
+  {\csname\??ly\ifcsname
+     \??ly\currentlayout#1\endcsname\currentlayout
+   \fi#1\endcsname}
+
+\def\namedlayoutparameter#1#2%
+  {\csname\??ly\ifcsname\??ly            #1#2\endcsname#1\else
+               \ifcsname\??ly\currentlayout#2\endcsname\currentlayout
+   \fi\fi#2\endcsname}
+
+%D Beause normal \TEX\ has at most 256 dimensions (of which a
+%D substantial part is already in use), we provide a way to
+%D generate a format with macro based alternatives. For a long
+%D time, this used to be the default case. Beware: only fixed
+%D dimensions can be used in calculations! By the way, the
+%D gain in speed can hardly be called impressive and is roughly
+%D 1 second on a 35 second run of 850 empty pages with a
+%D couple of backgrounds only (which is far less than one
+%D percent on a normal document).
+
+%D The next series of dimensions are complemented by left
+%D and rights ones.
+
+\newdimen \margindistance
+\newdimen \edgedistance
+\newdimen \marginwidth
+\newdimen \edgewidth
+
+%D Because a distance does not really makes sense when there
+%D is no area, we use a zero distance in case there is no
+%D area.
+
+\def\layoutdistance#1#2%
+  {\ifdim\zeropoint<#1\layoutparameter#2\else\zeropoint\fi}
+
+%D The horizontal distances are:
+
+\newdimen \leftedgedistance
+\newdimen \rightedgedistance
+\newdimen \leftmargindistance
+\newdimen \rightmargindistance
+
+%D The vertical distances are:
+
+\newdimen \topdistance
+\newdimen \headerdistance
+\newdimen \footerdistance
+\newdimen \bottomdistance
+
+%D We need to calculate the extra distances:
+
+\def\setlayoutdimensions
+  {\global\marginwidth        \layoutparameter\c!margin
+   \global\edgewidth          \layoutparameter\c!edge
+   \global\margindistance     \layoutparameter\c!margindistance
+   \global\edgedistance       \layoutparameter\c!edgedistance
+   \global\leftedgedistance   \layoutdistance \leftedgewidth    \c!leftedgedistance
+   \global\rightedgedistance  \layoutdistance \rightedgewidth   \c!rightedgedistance
+   \global\leftmargindistance \layoutdistance \leftmarginwidth  \c!leftmargindistance
+   \global\rightmargindistance\layoutdistance \rightmarginwidth \c!rightmargindistance
+   \global\topdistance        \layoutdistance \topheight        \c!topdistance
+   \global\headerdistance     \layoutdistance \headerheight     \c!headerdistance
+   \global\footerdistance     \layoutdistance \footerheight     \c!footerdistance
+   \global\bottomdistance     \layoutdistance \bottomheight     \c!bottomdistance}
+
+\def\setlayoutdistances % local in \setreducedvsize
+  {\headerdistance\layoutdistance\headerheight\c!headerdistance
+   \footerdistance\layoutdistance\footerheight\c!footerdistance}
+
+% these are wrong in the running text, assumes some swapping, needs a cleanup
+
+\def\outermarginwidth   {\rightorleftpageaction\rightmarginwidth   \leftmarginwidth }
+\def\innermarginwidth   {\rightorleftpageaction\leftmarginwidth    \rightmarginwidth}
+\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance }
+\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance}
+
+\def\outeredgewidth     {\rightorleftpageaction\rightedgewidth   \leftedgewidth }
+\def\inneredgewidth     {\rightorleftpageaction\leftedgewidth    \rightedgewidth}
+\def\outeredgedistance  {\rightorleftpageaction\rightedgedistance\leftedgedistance }
+\def\inneredgedistance  {\rightorleftpageaction\leftedgedistance \rightedgedistance}
+
+\def\outerspacewidth    {\rightorleftpageaction\cutspace\backspace}
+\def\innerspacewidth    {\rightorleftpageaction\backspace\cutspace}
+
+\newtoks\extralayoutcalculations \def\calculatelayoutextras{\the\extralayoutcalculations}
+
+% \appendtoks
+%   non etex calculations used to go here
+% \to \extralayoutcalculations
+
+\newtoks\everyswapmargins % watch the order !
+
+\appendtoks
+   \swapdimens\leftmargindistance\rightmargindistance
+   \swapdimens\leftedgedistance  \rightedgedistance
+   \swapdimens\leftmarginwidth   \rightmarginwidth
+   \swapdimens\leftedgewidth     \rightedgewidth
+\to \everyswapmargins
+
+\appendtoks
+  \swapmacros\leftmargintotal \rightmargintotal
+  \swapmacros\leftedgetotal   \rightedgetotal
+  \swapmacros\leftsidetotal   \rightsidetotal
+  \swapmacros\leftcombitotal  \rightcombitotal
+  \swapmacros\innermargintotal\outermargintotal
+  \swapmacros\inneredgetotal  \outeredgetotal
+  \swapmacros\innercombitotal \outercombitotal
+  \swapmacros\innersidetotal  \outersidetotal
+\to \everyswapmargins
+
+%D \macros
+%D   {definepapersize}
+%D
+%D Before we start calculating layout dimensions, we will
+%D first take care of paper sizes. The first argument can be
+%D either an assignment (for defaults) or an identifier, in
+%D which case the second argument is an assignment.
+%D
+%D \showsetup{definepapersize}
+
+\def\definepapersize
+  {\dodoubleempty\dodefinepapersize}
+
+\def\definepapersize
+  {\dotripleempty\dodefinepapersize}
+
+\def\dodefinepapersize[#1][#2][#3]%
+  {\ifsecondargument
+     \doifsomething{#1} % to be sure
+       {\doifassignmentelse{#2}
+          {\getparameters
+             [\??pp#1] % geen \c!scale, scheelt hash ruimte
+             [\c!width=\@@ppwidth,\c!height=\@@ppheight,\c!offset=\@@ppoffset,#2]}
+          {\setvalue{\??pp:1:#1}{#2}%
+           \setvalue{\??pp:2:#1}{#3}}}%
+   \else
+     \getparameters[\??pp][#1]%
+     \setuppapersize % hm. this will freeze !
+   \fi}
+
+%D For the moment we need to fake this macro.
+
+\ifx\setuppapersize\undefined
+  \let\setuppapersize\relax
+\fi
+
+%D We set the defaults to the dimensions of an A4 sheet of
+%D paper.
+
+\definepapersize
+  [\c!width=210mm,\c!height=297mm,\c!offset=\!!zeropoint]
+
+%D Yet undocumented, let's see if it gets noticed.
+%D
+%D \starttyping
+%D \definepapersize[main] [A4]          [A4]
+%D \definepapersize[extra][A4,landscape][A4,landscape]
+%D
+%D \starttext
+%D     \setuppapersize[main]
+%D     Page 1. \page
+%D     Page 2. \page
+%D     \setuppapersize[extra]
+%D     Page 2 \page
+%D     \setuppapersize[main]
+%D     Page 3. \page
+%D     Page 4. \page
+%D     \adaptpapersize[extra]
+%D     Page 5. \page
+%D     Page 6. \page
+%D \stoptext
+%D \stoptyping
+
+%D \macros
+%D   {setuppaper,setuppapersize}
+%D
+%D When setting up the papersize on which to typeset and
+%D print, we can also determine some more characteristics.
+%D
+%D \showsetup{setuppapersize}
+%D
+%D We keep track of these features with the following
+%D variables.
+
+\chardef\papermirror     =0  \chardef\printmirror     =0
+\chardef\paperorientation=0  \chardef\printorientation=0 % beware: later no chardef
+\chardef\paperreverse    =0  \chardef\printreverse    =0
+\chardef\paperlandscape  =0  \chardef\printlandscape  =0
+
+\let\papersize\empty \let\printpapersize\empty
+
+\def\paperscale{1} \newif\ifnegateprintbox
+
+\def\setuppaper[#1]%
+  {\getparameters[\??pp][\c!paper=,\c!page=,#1]%
+   \edef\@@ppxy{\the\numexpr\@@ppnx*\@@ppny\relax}%
+   \doifelsenothing\@@pppage
+     {\doifelsenothing\@@pppaper
+        {} % {\setuppapersize} % added, removed, no need for, too tricky, mag-01 (fixed by freezing pp's)
+        {\dodosetuppapersize[\papersize][\@@pppaper]}}
+     {\doifelsenothing\@@pppaper
+        {\dodosetuppapersize[\@@pppage][\printpapersize]}
+        {\dodosetuppapersize[\@@pppage][\@@pppaper]}}}
+
+\def\setuppapersize
+  {\dodoubleempty\dosetuppapersize}
+
+\def\dosetuppapersize[#1][#2]%
+  {\doifassignmentelse{#1}
+     {\setuppaper[#1]}
+     {\doifelsenothing{#2}
+        {\expanded{\dodosetuppapersize
+           [\executeifdefined{\??pp:1:#1}{#1}]%
+           [\executeifdefined{\??pp:2:#1}{}]}}
+        {\doifassignmentelse{#2}
+           {\getparameters[\??pp\executeifdefined{\??pp:1:#1}{#1}][#2]}
+           {\expanded{\dodosetuppapersize
+              [\executeifdefined{\??pp:1:#1}{#1}]%
+              [\executeifdefined{\??pp:1:#2}{#2}]}}}}}
+
+\let\reinstatepapersize\relax
+
+\def\adaptpapersize
+  {\global\let\reinstatepapersize\restorepapersize
+   \setuppapersize}
+
+\appendtoks
+  \reinstatepapersize
+  \global\let\reinstatepapersize\relax
+\to \everyaftershipout
+
+\def\dodosetuppapersize[#1][#2]%
+  {\ifsecondargument
+     \expanded{\dododosetuppapersize[#1][#2]}%
+     \calculatehsizes
+     \calculatevsizes
+     \recalculatelogos
+     \recalculatebackgrounds
+     \recalculatelayout
+   \else\iffirstargument
+     \setuppapersize[#1][#2]%
+   \else\ifx\papersize\undefined\else
+     \restorepapersize
+   \fi\fi\fi}
+
+% dimen freeze is a bit tricky, but catches local redundant calls
+% with values where e.g width is defined in terms of \paperwidth
+
+\def\dododosetuppapersize[#1][#2]%
+  {\xdef\restorepapersize{\noexpand\setuppapersize[#1][#2]}%
+   \dosetuppaperorientation{#1}\paperlandscape\paperorientation\paperreverse\papermirror
+   \dosetuppaperorientation{#2}\printlandscape\printorientation\printreverse\printmirror
+   \def\docommand##1%
+     {\doifsomething{##1}{\doifdefined{\??pp##1\c!width}
+        {\global\paperwidth \getvalue{\??pp##1\c!width}%
+         \global\paperheight\getvalue{\??pp##1\c!height}%
+\ifinpagebody
+  \setevalue{\??pp##1\c!height}{\the\paperheight}%
+  \setevalue{\??pp##1\c!width }{\the\paperwidth }%
+\fi
+         \calculatepaperoffsets{##1}%
+         \xdef\papersize{##1}}}}%
+   \processcommacommand[#1]\docommand
+   \doifdefinedelse{\??pp#1\c!scale}
+     {\edef\paperscale{\getvalue{\??pp#1\c!scale}}}
+     {\edef\paperscale{1}}%
+   \def\docommand##1%
+     {\doifsomething{##1}{\doifdefined{\??pp##1\c!width}
+        {\global\printpaperwidth \getvalue{\??pp##1\c!width}%
+         \global\printpaperheight\getvalue{\??pp##1\c!height}%
+\ifinpagebody
+  \setevalue{\??pp##1\c!height}{\the\printpaperheight}%
+  \setevalue{\??pp##1\c!width }{\the\printpaperwidth}%
+\fi
+         \xdef\printpapersize{##1}}}}%
+   \processcommacommand[#2]\docommand
+   \global\setdimentoatleast\paperwidth      \onepoint
+   \global\setdimentoatleast\paperheight     \onepoint
+   \global\setdimentoatleast\printpaperwidth \onepoint
+   \global\setdimentoatleast\printpaperheight\onepoint
+   \ifcase\paperlandscape\else
+     \doglobal\swapdimens\paperwidth\paperheight
+   \fi
+   \ifcase\printlandscape\else
+     \doglobal\swapdimens\printpaperwidth\printpaperheight
+   \fi
+   % this check can be confusing, so we've added the possibility
+   % to bypass this test: \setuppapersize[option=fit]
+   \doif\@@ppoption\v!max % \v!fit is
+     {\bgroup
+      % we need to pre-swap else we get the wrong paper size
+      \ifcase\paperorientation\else
+        \doifinset\paperorientation{90,270}{\swapdimens\paperwidth\paperheight}%
+      \fi
+      \ifcase\printorientation\else
+        \doifinset\printorientation{90,270}{\swapdimens\printpaperwidth\printpaperheight}%
+      \fi
+      \ifdim\paperheight>\printpaperheight
+        \global\printpaperheight\paperheight
+        \writestatus\m!systems{print height forced to paper height}%
+      \fi
+      \ifdim\paperwidth>\printpaperwidth
+        \global\printpaperwidth\paperwidth
+        \writestatus\m!systems{print width forced to paper width}%
+      \fi
+      \egroup}}
+
+\def\dosetuppaperorientation#1#2#3#4#5%
+  {\global\chardef#2\zerocount
+   \global\chardef#5\zerocount
+   \globallet#3\!!zerocount
+   \globallet#4\!!zerocount
+   \global\negateprintboxfalse
+   \processallactionsinset
+     [#1]
+     [ \v!landscape=>\global\chardef#2\plusone,
+        \v!mirrored=>\global\chardef#5\plusone,
+         \v!rotated=>\gdef#3{90}\gdef#4{270},
+        \v!negative=>\global\negateprintboxtrue,
+                 90=>\gdef#3{90}\gdef#4{270},
+                180=>\gdef#3{180}\gdef#4{0},
+                270=>\gdef#3{270}\gdef#4{90}]}
+
+\ifx\calculatepaperoffsets\undefined
+
+  \def\calculatepaperoffsets#1%
+    {\scratchdimen\getvalue{\??pp#1\c!offset}%
+     \global\advance\paperwidth -2\scratchdimen
+     \global\advance\paperheight-2\scratchdimen}
+
+\fi
+
+\let\restorepapersize\relax
+
+\def\checkforems[#1]%
+  {\def\docommand##1%
+     {\beforesplitstring##1\at em\to\asciia
+      \doifnot\asciia{##1}
+        {\aftersplitstring\asciia\at=\to\asciia
+         \doifsomething\asciia
+           {\showmessage\m!systems{10}{##1}}}}%
+   \processcommalist[#1]\docommand}
+
+\ifx\setups\undefined \def\setups[#1]{\setdefaultpenalties} \fi
+
+% \newtoks \everybeforelayout \relax
+% \newtoks \everyafterlayout  \relax
+
+\def\recalculatelayout
+  {\doifsomething{\layoutparameter\c!page\layoutparameter\c!paper}
+     {\expanded{\dododosetuppapersize[\layoutparameter\c!page][\layoutparameter\c!paper]}}%
+   \dorecalculatelayout}
+
+\def\dorecalculatelayout
+  {%\the\everybeforelayout
+   \setups[\layoutparameter\c!preset]%
+   \global\leftmarginwidth \layoutparameter\c!leftmargin
+   \global\rightmarginwidth\layoutparameter\c!rightmargin
+   \global\leftedgewidth   \layoutparameter\c!leftedge
+   \global\rightedgewidth  \layoutparameter\c!rightedge
+   \global\headerheight    \layoutparameter\c!header
+   \global\footerheight    \layoutparameter\c!footer
+   \global\bottomheight    \layoutparameter\c!bottom
+   \global\topheight       \layoutparameter\c!top
+   \global\backspace       \layoutparameter\c!backspace
+   \global\topspace        \layoutparameter\c!topspace
+   \setlayoutdimensions % the rest of the `dimensions'
+   \doifelse\@@lygrid\v!yes\gridsnappingtrue\gridsnappingfalse
+   \ifgridsnapping
+     \setsystemmode\v!grid
+   \else
+     \resetsystemmode\v!grid
+   \fi
+   \setups[\layoutparameter\c!setups]% depends on gridsnapping !
+   \simplesetupwhitespace
+   \simplesetupblank
+   \global\cutspace\layoutparameter\c!cutspace
+   \relax
+   \doifelse{\layoutparameter\c!width}\v!middle
+     {\ifdim\cutspace=\zeropoint
+        \global\cutspace\backspace
+      \fi
+      \global\makeupwidth\dimexpr\paperwidth-\backspace-\cutspace\relax}
+     {\doifelse{\layoutparameter\c!width}\v!fit
+        {\ifdim\cutspace=\zeropoint
+           \global\cutspace\backspace
+         \fi
+         \global\makeupwidth\dimexpr\paperwidth-\cutspace\relax
+         \scratchdimen\dimexpr\backspace
+           -\leftedgewidth  -\leftedgedistance
+           -\leftmarginwidth-\leftmargindistance\relax
+         \ifdim\scratchdimen<\zeropoint
+           \scratchdimen\zeropoint
+         \fi
+         \global\advance\makeupwidth\dimexpr
+           -\rightmargindistance-\rightmarginwidth
+           -\rightedgedistance  -\rightedgewidth
+           -\scratchdimen\relax}
+        {\global\makeupwidth\layoutparameter\c!width\relax
+         \ifdim\cutspace=\zeropoint
+           \global\cutspace\dimexpr\paperwidth-\makeupwidth-\backspace\relax
+        % \else
+            % A kind of inconsistent specification, but used
+            % in for instance s-pre-19.tex; the cutspace is
+            % used only for determining some kind of right
+            % margin; don't use this in doublesided mode
+         \fi}}%
+   \scratchdimen\layoutparameter\c!bottomspace\relax
+  %\ifdim\scratchdimen=\zeropoint
+  %  \scratchdimen\topspace
+  %\fi
+   \global\bottomspace\layoutparameter\c!bottomspace\relax
+   \global\layoutlines0\number\layoutparameter\c!lines\relax % may be empty
+   \ifcase\layoutlines
+     \doifelse{\layoutparameter\c!height}\v!middle
+       {\ifdim\bottomspace=\zeropoint
+          \global\bottomspace\topspace
+        \fi
+        \global\makeupheight\dimexpr\paperheight-\topspace-\bottomspace\relax}
+       {\doifelse{\layoutparameter\c!height}\v!fit
+          {\ifdim\bottomspace=\zeropoint
+            \global\bottomspace\topspace
+           \fi
+           \global\makeupheight\dimexpr\paperheight-\bottomspace\relax
+           \scratchdimen\dimexpr\topspace-\topheight-\topdistance\relax
+           \ifdim\scratchdimen<\zeropoint
+             \scratchdimen\zeropoint
+           \fi
+           \global\advance\makeupheight\dimexpr-\bottomdistance-\bottomheight-\scratchdimen\relax}
+          {\global\makeupheight\layoutparameter\c!height\relax
+           \ifdim\bottomspace=\zeropoint
+             \global\bottomspace\dimexpr\paperheight-\makeupheight-\topspace\relax
+           \else
+             % inconsistent specification
+           \fi}}%
+   \else
+     % beware, when the bodyfont changes (switched) this will change as well; implementing
+     % a global lineheight is tricky: should we take the bodyfont interlinespace or the one set
+     % independent of the bodyfont (before or after a layout spec); way too fuzzy, so we
+     % stick to the current method (after a night of experimenting ...2003/10/13)
+     \global\makeupheight\dimexpr
+        \layoutparameter\c!lines\lineheight-\strutheight+\topskip+
+        \headerdistance+\headerheight+\footerdistance+\footerheight\relax
+   \fi
+   \backoffset\layoutparameter\c!horoffset
+   \topoffset \layoutparameter\c!veroffset
+   \global\setdimentoatleast\makeupwidth\onepoint
+   \global\setdimentoatleast\makeupheight \onepoint
+   % \checkcurrentlayout % here ?
+   % \the\everyafterlayout
+   \calculatelayoutextras
+   \calculatehsizes
+   \calculatevsizes
+   \calculatepseudocolumns
+   \checkgridsnapping
+   \recalculatelogos
+   \recalculatebackgrounds}
+
+\def\calculatepseudocolumns
+  {\global\layoutcolumns\layoutparameter\c!columns
+   \global\layoutcolumndistance\layoutparameter\c!columndistance
+   \global\layoutcolumnwidth\dimexpr\makeupwidth-\layoutcolumns\layoutcolumndistance+\layoutcolumndistance\relax
+   \global\divide\layoutcolumnwidth\layoutcolumns
+   \dorecurse\layoutcolumns
+     {\setxvalue{\??ly:c:\recurselevel}%
+        {\the\numexpr\recurselevel-\plusone\relax\dimexpr\layoutcolumnwidth+\layoutcolumndistance\relax}}}
+
+%\dorecurse\layoutcolumns
+%  {\setxvalue{\??ly:c:\recurselevel}{\the\dimexpr
+%     (\numexpr(\recurselevel-1)\dimexpr(\layoutcolumnwidth+\layoutcolumndistance))}}
+
+\def\layoutcolumnoffset#1%
+  {\executeifdefined{\??ly:c:#1}\!!zeropoint}
+
+\def\checklayout
+  {\ifdim\makeupheight=\layoutlines\lineheight \else \recalculatelayout \fi}
+
+\appendtoks \checklayout \to \everystarttext
+
+% document:
+%
+% \setuplayout[odd][state=stop] \setuplayout[even][state=stop] \setuplayout[page]
+%
+% \startstandardmakeup[page=blank] ... \stopstandardmakeup
+
+\def\changetolayout#1%
+  {%\writestatus\m!layouts{changing to layout #1}%
+   \xdef\currentlayout{#1}\recalculatelayout}
+
+\def\checkcurrentoddlayout
+  {\ifcsname\??ly\v!odd\c!state\endcsname
+     \doifvalue{\??ly\v!odd\c!state}\v!start{\changetolayout\v!odd}%
+   \fi}
+
+\def\checkcurrentevenlayout
+  {\ifcsname\??ly\v!even\c!state\endcsname
+     \doifvalue{\??ly\v!even\c!state}\v!start{\changetolayout\v!even}%
+   \fi}
+
+\ifx\lastpage\undefined \def\lastpage{1} \fi
+
+\def\reverserealfolio
+  {\ifnum\lastpage>\plusone
+     \ifnum\lastpage=\realfolio
+       \v!last
+     \else\ifnum\plusone=\realfolio
+       \v!first
+     \else
+       \the\numexpr\realfolio-\lastpage\relax
+     \fi\fi
+   \else
+     \!!zerocount
+   \fi}
+
+\def\checkcurrentlayout % public and used in naw, so keep this name
+  {\ifcsname\??ly\realfolio\c!state\endcsname
+     \doifvalue{\??ly\realfolio\c!state}\v!start{\changetolayout\realfolio}%
+   \else\ifcsname\??ly\reverserealfolio\c!state\endcsname
+     \doifvalue{\??ly\reverserealfolio\c!state}\v!start{\changetolayout\reverserealfolio}%
+   \else\ifcsname\??ly\v!current\c!state\endcsname
+     \changetolayout\v!current % no start test ?
+   \else
+     \doifoddpageelse\checkcurrentoddlayout\checkcurrentevenlayout
+   \fi\fi\fi}
+
+% testcase
+%
+% \setuppagenumbering[alternative=doublesided]
+%
+% \setuplayout         [width=11cm]
+% \definelayout [odd]  [backspace=1cm]
+% \definelayout [even] [backspace=4cm]
+% \definelayout [5]    [backspace=5cm]
+% \definelayout [6]    [backspace=5cm]
+% \definelayout [-2]   [backspace=0cm,cutspace=0cm]
+% \definelayout [last] [backspace=0cm,cutspace=0cm]
+%
+% \checkcurrentlayout \showframe
+%
+% \starttext
+%     \dorecurse{20} {\input knuth \endgraf \input tufte \endgraf}
+% \stoptext
+
+%appendtoks \checkcurrentlayout \to \everyaftershipout % no
+\appendtoks \checkcurrentlayout \to \everystarttext
+
+\appendtoks
+  \dochecknextlayout
+\to \everyaftershipout
+
+% \def\dochecknextlayout
+%   {\ifx\currentlayout\v!current
+%      % prevent redundant calculations
+%    \else
+%      \globallet\currentlayout\empty
+%      \global\letbeundefined{\??ly\v!current\c!state}%
+%      \checkcurrentlayout
+%    \fi}
+%
+% this breaks after a standardmakeup
+
+\def\dochecknextlayout{\checkcurrentlayout}
+
+\newif\ifdoublesidedprint
+
+\def\presetcenterpagebox % in \setuplayout !!!!!!!!!!!!!!!!
+  {\doublesidedprintfalse
+   \ExpandFirstAfter\processallactionsinset
+     [\@@lylocation]
+     [     \v!middle=>{\setuppapersize[\c!left=\hss,\c!right=\hss,\c!top=\vss,\c!bottom=\vss]},
+             \v!left=>{\setuppapersize[\c!left=,\c!right=\hss]},
+            \v!right=>{\setuppapersize[\c!left=\hss,\c!right=]},
+           \v!bottom=>{\setuppapersize[\c!top=\vss,\c!bottom=]},
+              \v!top=>{\setuppapersize[\c!top=,\c!bottom=\vss]},%
+      \v!doublesided=>\doublesidedprinttrue,
+      \v!singlesided=>\doublesidedprintfalse]}
+
+\def\definelayout
+  {\dodoubleargument\dodefinelayout}
+
+\def\dodefinelayout[#1][#2]%
+  {\getparameters[\??ly#1][\c!state=\v!start,#2]}
+
+\def\dodosetuplayout[#1][#2]%
+  {\ConvertToConstant\doifnot{#2}\v!reset % #2 ?
+     {\getparameters[\??ly#1][#2]%
+      \checkforems[#2]}}
+
+% global needed for non-doublesided standardmakeup
+
+\def\dosetuplayout[#1][#2]%
+  {\globallet\currentlayout\empty % new, global
+   \ifsecondargument
+     \dodosetuplayout[#1][#2]%
+   \else\iffirstargument
+     \doifassignmentelse{#1}
+       {\dodosetuplayout[][#1]}
+       {\doifnot{#1}\v!reset{\xdef\currentlayout{#1}}}% new, global
+   \fi\fi
+   \recalculatelayout
+   \checkcurrentlayout % here ?
+   \presetcenterpagebox}
+
+\def\setuplayout
+  {\dodoubleempty\dosetuplayout}
+
+\let\@@zaheight=\!!zeropoint
+
+\def\dopushpagedimensions
+  {\xdef\oldtextheight  {\the\textheight  }%
+   \xdef\oldfooterheight{\the\footerheight}%
+   \global\let\@@zaheight\@@zaheight}
+
+\def\dopoppagedimensions
+  {\global\textheight  \oldtextheight
+   \global\footerheight\oldfooterheight
+   \recalculatelayout
+   \global\let\pushpagedimensions\dopushpagedimensions
+   \global\let\poppagedimensions\relax}
+
+\let\poppagedimensions  = \relax
+\let\pushpagedimensions = \dopushpagedimensions
+
+% Elke \csname ... \endcsname wordt ook aangemaakt, dus ook
+% in een test met \doifdefined. Bij veel bladzijden kan dit
+% te veel macro's kosten. Vandaar de set \adaptedpages. Het
+% kost tijd, maar scheelt macro's.
+
+\let\adaptedpages\empty
+
+\def\adaptpagedimensions
+  {\ifx\adaptedpages\empty\else
+     \rawdoifinsetelse\realfolio\adaptedpages
+       {\getvalue{\??za\realfolio}%
+        \letbeundefined{\??za\realfolio}}
+       \donothing
+   \fi}
+
+\def\checkpagedimensions
+  {\poppagedimensions
+   \adaptpagedimensions}
+
+\def\reportpagedimensions
+  {\ifx\poppagedimensions\relax \else
+     \space\the\dimexpr\@@zaheight\relax\space-\space
+   \fi
+   \realfolio}
+
+\def\dodoadaptlayout[#1]%
+  {\getparameters[\??za][\c!height=,\c!lines=0,#1]%
+   \pushpagedimensions
+   \ifcase\@@zalines\relax
+     \showmessage\m!layouts1{\@@zaheight,\realfolio}%
+   \else
+     \showmessage\m!layouts1{\@@zalines\space\v!lines,\realfolio}%
+     \def\@@zaheight{\@@zalines\openlineheight}%
+   \fi
+   \doifelse\@@zaheight\v!max
+     {\balancedimensions\textheight\footerheight\footerheight}
+     {\balancedimensions\textheight\footerheight\@@zaheight}%
+   \ifdim\footerheight<\zeropoint
+     \global\advance\textheight \footerheight
+     \global\footerheight\zeropoint
+     \global\xdef\@@zaheight{\layoutparameter\c!footer\space(\v!max)}%
+   \fi
+   \setvsize
+   \global\pagegoal\vsize  % nog corrigeren voor insertions ?
+   \recalculatelogos
+   \recalculatebackgrounds
+   \global\let\pushpagedimensions\relax
+   \global\let\poppagedimensions\dopoppagedimensions}
+
+\def\doadaptlayout[#1][#2]%
+  {\doifelsenothing{#2}
+     {\dodoadaptlayout[#1]}
+     {\def\docommand##1%
+        {\addtocommalist{##1}\adaptedpages
+         \setgvalue{\??za##1}{\dodoadaptlayout[#2]}}%
+      \processcommalist[#1]\docommand
+      \adaptpagedimensions}}
+
+\def\adaptlayout
+  {\dodoubleempty\doadaptlayout}
+
+% describe interface
+
+%D Centering the paper area on the print area is determined
+%D by the \type {top}, \type {bottom}, \type {left} and \type
+%D {right} parameters.
+
+\def\centerpagebox#1%
+  {\printpaperwidth \paperscale\printpaperwidth
+   \printpaperheight\paperscale\printpaperheight
+   \setbox#1\vbox to \printpaperheight
+     {\@@pptop
+      \hbox to \printpaperwidth
+        {\ifdoublesidedprint
+           \doifbothsides
+             {\@@ppleft \box#1\@@ppright}
+             {\@@ppleft \box#1\@@ppright}
+             {\@@ppright\box#1\@@ppleft }%
+         \else
+              \@@ppleft \box#1\@@ppright
+         \fi}%
+      \par
+      \@@ppbottom}}
+
+\def\offsetprintbox#1%
+  {\ifdim\topoffset=\zeropoint % \relax
+     \ifdim\backoffset=\zeropoint
+       \donefalse
+     \else
+       \donetrue
+     \fi
+   \else
+     \donetrue
+   \fi
+   \ifdone
+     \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
+     \setbox#1\vbox
+       {%\forgetall
+        \offinterlineskip
+        \vskip\topoffset
+        \doifbothsides{\hskip\backoffset}{\hskip\backoffset}{\hskip-\backoffset}%
+        \box#1}%
+     \next
+   \fi}
+
+\def\replicatepagebox#1%
+  {\ifnum\@@lynx>\plusone
+     \donetrue
+   \else\ifnum\@@lyny>\plusone
+     \donetrue
+   \else
+     \donefalse
+   \fi\fi
+   \ifdone
+     \setbox#1\vbox
+       {%\forgetall
+        \offinterlineskip
+        \dorecurse\@@lyny
+          {\hbox{\dorecurse\@@lynx{\copy#1\hskip\@@lydx}\unskip}%
+           \vskip\@@lydy}
+        \unskip}%
+   \fi}
+
+\def\orientpagebodybox#1#2#3%
+  {\ifnum#2#3>\zerocount
+     \setbox#1\vbox
+       {\edef\somerotation{\ifdoublesided\ifodd\realpageno#2\else#3\fi\else#2\fi}%
+        \dorotatebox\somerotation\hbox{\box#1}}%
+   \fi}
+
+\def\orientpaperbox#1%
+  {\orientpagebodybox{#1}\paperorientation\paperreverse}
+
+\def\orientprintbox#1%
+  {\orientpagebodybox{#1}\printorientation\printreverse}
+
+\def\mirrorpagebodybox#1#2%
+  {\ifcase#2\or
+     \setbox#1\vbox
+       {\domirrorbox\vbox{\box#1}}%
+   \fi}
+
+\def\mirrorpaperbox#1%
+  {\mirrorpagebodybox{#1}\papermirror}
+
+\def\mirrorprintbox#1%
+  {\mirrorpagebodybox{#1}\printmirror}
+
+\def\scalepagebox#1%
+  {\ifdim\@@lyscale\points=\onepoint \else
+     \setbox#1\vbox
+       {\scale[\c!sx=\@@lyscale,\c!sy=\@@lyscale]{\box#1}}%
+     \paperwidth\@@lyscale\paperwidth
+     \paperheight \@@lyscale\paperheight
+   \fi}
+
+\def\negateprintbox#1%
+  {\ifnegateprintbox
+     \negatecolorbox{#1}%
+   \fi}
+
+\def\pagecutmarksymbol    {\the\realpageno}
+\def\pagecutmarklength    {.5cm}
+\let\pagecutmarktoptext    \empty
+\let\pagecutmarkbottomtext \empty
+
+\def\extrapagecutmarkbottomtext
+  {\rlap{\jobname}\hfill\currentdate\space-\space\currenttime\hfill\llap{\realfolio}}
+
+\def\makepagecutbox % #1
+  {\let\cutmarksymbol    \pagecutmarksymbol
+   \let\cutmarklength    \pagecutmarklength
+   \let\cutmarktoptext   \pagecutmarktoptext
+   \let\cutmarkbottomtext\pagecutmarkbottomtext
+   \makecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!on}%
+  {\makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!page}% only at outer when nx/ny > 0
+  {\makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!empty}%
+  {\let\pagecutmarksymbol\empty
+   \let\pagecutmarktoptext\empty
+   \let\pagecutmarkbottomtext\empty
+   \makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!text}%
+  {\let\pagecutmarksymbol\empty
+   \let\pagecutmarkbottomtext\extrapagecutmarkbottomtext
+   \makepagecutbox}
+
+\setvalue{\??ly:c:\c!marking:\v!color}%
+  {\doaddpagecolormarks\colormarkbox}
+
+\setvalue{\??ly:c:\c!marking:\v!screen}%
+  {\doaddpagecolormarks\rastermarkbox}
+
+\def\addpagecutmarks % #1
+  {\executeifdefined{\??ly:n:\c!marking:\@@lymarking}\gobbleoneargument}
+
+\def\addpagecolormarks % #1
+  {\executeifdefined{\??ly:c:\c!marking:\@@lymarking}\gobbleoneargument}
+
+\def\doaddpagecolormarks#1#2%
+  {\makepagecutbox{#2}%
+   \ifnum\horizontalcutmarks>2 \chardef\colormarkoffset4 \fi
+   \ifnum\verticalcutmarks  >2 \chardef\colormarkoffset4 \fi
+   #1{#2}}
+
+% NOG EENS NAGAAN WANNEER NU GLOBAL EN WANNEER NIET
+
+\ifx\doifelselayoutsomeline\undefined % defined in page-txt
+    \let\doifelselayoutsomeline\secondofthreearguments
+\fi
+
+\def\calculatevsizes % global needed in \recalculatelayoutregel
+  {\redoglobal\textheight\makeupheight
+   \doifelselayoutsomeline \v!header
+     {\redoglobal\advance\textheight-\dimexpr\headerheight+\headerdistance\relax}%
+     \donothing
+   \doifelselayoutsomeline \v!footer
+     {\redoglobal\advance\textheight-\dimexpr\footerheight+\footerdistance\relax}%
+     \donothing
+   \ifzeropt\headerheight
+     \resetsystemmode\v!header
+   \else
+     \setsystemmode\v!header
+   \fi
+   \ifzeropt\footerheight
+     \resetsystemmode\v!footer
+   \else
+     \setsystemmode\v!footer
+   \fi
+   \resetglobal
+   \setvsize}
+
+\def\calculatereducedvsizes
+  {\textheight\makeupheight
+   \doifelselayoutsomeline \v!header
+     {\advance\textheight-\dimexpr\headerheight+\headerdistance\relax}%
+     {\headerheight\zeropoint
+      \setlayoutdistances}%
+   \doifelselayoutsomeline \v!footer
+     {\advance\textheight-\dimexpr\footerheight+\footerdistance\relax}%
+     {\footerheight\zeropoint
+      \setlayoutdistances}}
+
+\newdimen\innermakeupwidth  % special purpose
+\newdimen\innermakeupmargin % special purpose
+
+\chardef\innermakeupcompensation\plusone
+
+\def\compensatedinnermakeupmargin
+  {\dimexpr\ifnum\innermakeupcompensation=\plusone+\innermakeupmargin\else\zeropoint\fi\relax}
+
+\def\freezetextwidth      % \makeupwidth may be set to \textwidth
+  {\textwidth\makeupwidth % which is a tricky but valid value
+   \doifsomething{\layoutparameter\c!textwidth}
+     {\textwidth\layoutparameter\c!textwidth}%         % local
+   \global\innermakeupwidth\textwidth
+   \doifelsenothing{\layoutparameter\c!textmargin}
+     {\global\innermakeupmargin\zeropoint}
+     {\global\innermakeupmargin\layoutparameter\c!textmargin}%
+   \global\advance\innermakeupwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax
+   \advance\textwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax}   % local
+
+\def\calculatehsizes
+  {\freezetextwidth
+   \sethsize}
+
+% De onderstaande macro voert commando's uit, afhankelijk van
+% het karakter van het paginanummer.
+%
+% \doifoddpageelse{then-commando}{else-commando}
+
+%D When we start at an even page, we need to swap the layout
+%D differently. We cannot adapt the real page number, since
+%D it is used in cross referencing. The next switch is set
+%D when we start at an even page.
+
+\newif\ifshiftedrealpageno
+
+% \def\doifoddpageelse#1#2%
+%   {\ifshiftedrealpageno
+%      \ifodd\realpageno#2\else#1\fi
+%    \else
+%      \ifodd\realpageno#1\else#2\fi
+%    \fi}
+
+\def\doifoddpageelse
+  {\ifshiftedrealpageno
+     \ifodd\realpageno
+       \@EAEAEA\secondoftwoarguments
+     \else
+       \@EAEAEA\firstoftwoarguments
+     \fi
+   \else
+     \ifodd\realpageno
+       \@EAEAEA\firstoftwoarguments
+     \else
+       \@EAEAEA\secondoftwoarguments
+     \fi
+   \fi}
+
+\let\doifonevenpaginaelse\doifoddpageelse
+
+% what are those \relax'es doing there?
+
+% \def\doifbothsidesoverruled#1#2#3%
+%   {\ifdoublesided
+%      \doifoddpageelse{#2}{#3}\relax
+%    \else
+%      #1\relax
+%    \fi}
+
+% \def\doifbothsides#1#2#3%
+%   {\ifdoublesided
+%      \ifsinglesided
+%        #1\relax
+%      \else
+%        \doifoddpageelse{#2}{#3}\relax
+%      \fi
+%    \else
+%      #1\relax
+%    \fi}
+
+\def\redoifoddpageelse#1{\doifoddpageelse}
+
+\def\doifbothsidesoverruled
+  {\ifdoublesided
+     \@EA\redoifoddpageelse
+   \else
+     \@EA\firstofthreearguments
+   \fi}
+
+\def\doifbothsides
+  {\ifdoublesided
+     \ifsinglesided
+       \@EAEAEA\firstofthreearguments
+     \else
+       \@EAEAEA\redoifoddpageelse
+     \fi
+   \else
+     \@EA\firstofthreearguments
+   \fi}
+
+\newdimen\texthoffset
+
+\def\settexthoffset
+  {\doifbothsides
+     {\texthoffset\backspace}
+     {\texthoffset\backspace}
+     {\texthoffset\dimexpr\paperwidth-\backspace-\makeupwidth\relax}}
+
+\def\goleftonpage
+  {\hskip-\dimexpr\leftmargindistance+\leftmarginwidth+\leftedgedistance+\leftedgewidth\relax}
+
+\def\doifmarginswapelse#1#2%
+  {\doifbothsides{#1}{#1}{#2}}
+
+\def\swapmargins
+  {\doifmarginswapelse\relax\doswapmargins}
+
+\def\doswapmargins
+  {\let\swapmargins  \relax % to prevent local swapping
+   \let\doswapmargins\relax % to prevent local swapping
+   \the\everyswapmargins}
+
+\def\rightorleftpageaction
+  {\ifdoublesided
+     \ifsinglesided
+       \@EAEAEA\firstoftwoarguments
+     \else
+       \@EAEAEA\doifoddpageelse
+     \fi
+   \else
+     \@EA\firstoftwoarguments
+   \fi}
+
+\def\outermarginwidth   {\rightorleftpageaction\rightmarginwidth   \leftmarginwidth }
+\def\innermarginwidth   {\rightorleftpageaction\leftmarginwidth    \rightmarginwidth}
+\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance }
+\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance}
+
+\def\outeredgewidth     {\rightorleftpageaction\rightedgewidth   \leftedgewidth }
+\def\inneredgewidth     {\rightorleftpageaction\leftedgewidth    \rightedgewidth}
+\def\outeredgedistance  {\rightorleftpageaction\rightedgedistance\leftedgedistance }
+\def\inneredgedistance  {\rightorleftpageaction\leftedgedistance \rightedgedistance}
+
+\def\outerspacewidth    {\rightorleftpageaction\cutspace \backspace }
+\def\innerspacewidth    {\rightorleftpageaction\backspace\cutspace}
+
+\def\leftmargintotal    {\dimexpr\leftmarginwidth +\leftmargindistance \relax}
+\def\rightmargintotal   {\dimexpr\rightmarginwidth+\rightmargindistance\relax}
+\def\leftedgetotal      {\dimexpr\leftedgewidth   +\leftedgedistance   \relax}
+\def\rightedgetotal     {\dimexpr\rightedgewidth  +\rightedgedistance  \relax}
+
+\def\leftsidetotal      {\dimexpr\leftmarginwidth +\leftedgetotal \relax}
+\def\rightsidetotal     {\dimexpr\rightmarginwidth+\rightedgetotal\relax}
+\def\leftcombitotal     {\dimexpr\leftmargintotal +\leftedgetotal \relax}
+\def\rightcombitotal    {\dimexpr\rightmargintotal+\rightedgetotal\relax}
+
+\def\innermargintotal   {\dimexpr\innermarginwidth+\innermargindistance\relax}
+\def\outermargintotal   {\dimexpr\outermarginwidth+\outermargindistance\relax}
+\def\inneredgetotal     {\dimexpr\inneredgewidth  +\inneredgedistance  \relax}
+\def\outeredgetotal     {\dimexpr\outeredgewidth  +\outeredgedistance  \relax}
+
+\def\innercombitotal    {\dimexpr\innermargintotal+\inneredgetotal\relax}
+\def\outercombitotal    {\dimexpr\outermargintotal+\outeredgetotal\relax}
+\def\innersidetotal     {\dimexpr\innermarginwidth+\inneredgetotal\relax}
+\def\outersidetotal     {\dimexpr\outermarginwidth+\outeredgetotal\relax}
+
+%D \macros
+%D   {startlocallayout}
+%D
+%D These macros should be used with care. They permit local
+%D layouts (as used in fitting pages, see \type {page-app.tex}).
+
+%D This is kind of obsolete now that we have \type
+%D {\definelayout}, so this hack will disappear in future
+%D versions.
+
+\def\startlocallayout
+  {\globalpushmacro\restorepapersize
+   \globalpushmacro\currentlayout}
+
+\def\stoplocallayout
+  {\globalpopmacro\currentlayout
+   \globalpopmacro\restorepapersize
+   \restorepapersize
+   \setuplayout}
+
+%D \macros
+%D   {showprint, showframe, showlayout, showsetups}
+%D
+%D We predefine a couple of tracing macros.
+%D
+%D \showsetup{showprint}
+%D \showsetup{showframe}
+%D \showsetup{showlayout}
+%D \showsetup{showsetups}
+%D %showsetup{showmargins}
+
+\fetchruntimecommand \showprint   {page-run.mkii}
+\fetchruntimecommand \showframe   {page-run.mkii}
+\fetchruntimecommand \showlayout  {page-run.mkii}
+\fetchruntimecommand \showsetups  {page-run.mkii}
+\fetchruntimecommand \showmargins {page-run.mkii}
+
+%D The default dimensions are quite old and will not change.
+%D The funny fractions were introduced when we went from fixed
+%D dimensions to relative ones. Since \CONTEXT\ is a dutch
+%D package, the dimensions are based on the metric system. The
+%D asymmetrical layout is kind of handy for short
+%D quick||and||dirty stapled documents.
+%D
+%D Although valid, it is not a real good idea to use
+%D dimensions based on the \type {em} unit. First of all,
+%D since there are no fonts loaded yet, this dimension makes
+%D no sense, and second, you would loose track of values,
+%D since they could change while going to a new page,
+%D depending on the current font setting.
+
+\setuplayout
+  [             \c!topspace=.08417508418\paperheight,  %  2.5cm
+                     \c!top=\!!zeropoint,
+             \c!topdistance=\!!zeropoint,
+                  \c!header=.06734006734\paperheight,  %  2.0cm
+          \c!headerdistance=\!!zeropoint,
+                  \c!height=.84175084175\paperheight,  % 25.0cm
+          \c!footerdistance=\layoutparameter\c!headerdistance,
+                  \c!footer=.06734006734\paperheight,  %  2.0cm
+          \c!bottomdistance=\layoutparameter\c!topdistance,
+                  \c!bottom=\!!zeropoint,
+               \c!backspace=.11904761905\paperwidth, %  2.5cm
+                    \c!edge=\!!zeropoint,
+            \c!edgedistance=\layoutparameter\c!margindistance,
+                  \c!margin=.12649983170\paperwidth, %  snijwit-2*afstand
+          \c!margindistance=.02008341748\paperwidth, %  12.0pt
+                \c!leftedge=\layoutparameter\c!edge,
+        \c!leftedgedistance=\layoutparameter\c!edgedistance,
+              \c!leftmargin=\layoutparameter\c!margin,
+      \c!leftmargindistance=\layoutparameter\c!margindistance,
+                   \c!width=.71428571429\paperwidth, %  15.0cm
+     \c!rightmargindistance=\layoutparameter\c!margindistance,
+             \c!rightmargin=\layoutparameter\c!margin,
+       \c!rightedgedistance=\layoutparameter\c!edgedistance,
+               \c!rightedge=\layoutparameter\c!edge,
+               \c!veroffset=\!!zeropoint,
+             \c!bottomspace=\!!zeropoint,
+               \c!horoffset=\!!zeropoint,
+                \c!cutspace=\!!zeropoint,
+               \c!textwidth=, % dangerous option -> centered / local
+              \c!textmargin=, % dangerous option -> both sides
+            \c!textdistance=\!!zeropoint, % shift down on grid
+                   \c!style=,
+                   \c!color=,
+                 \c!marking=\v!off,
+                \c!location=, % \v!singlesided, but empty is signal
+                   \c!scale=1,
+                      \c!nx=1,
+                      \c!ny=1,
+                      \c!dx=\!!zeropoint,
+                      \c!dy=\!!zeropoint,
+                    \c!grid=\v!no,
+                  \c!preset=,
+                  \c!setups=\systemsetupsprefix\s!default,
+              \c!clipoffset=\!!zeropoint,
+                   \c!lines=0,
+                   \c!paper=, % for foxet
+                    \c!page=, % for foxet
+                 \c!columns=1,
+          \c!columndistance=\!!zeropoint]
+
+%D First we define a whole range of (DIN) papersizes,
+%D of which the A-series makes most sense. We enable checking.
+
+%D We also set some of the parameters that will be used when
+%D positioning the typeset paper onto the print paper.
+
+\setuppaper % (size) % only used in XY imposition
+  [\c!width=\zeropoint,
+   \c!height=\zeropoint,
+   \c!topspace=\zeropoint,
+   \c!backspace=\zeropoint,
+   \c!dx=\zeropoint,
+   \c!dy=\zeropoint,
+   \c!nx=1,
+   \c!ny=1,
+   \c!method=\v!normal]
+
+\setuppapersize
+  [\c!option=\v!max,
+   \c!top=,
+   \c!bottom=\vss,
+   \c!left=,
+   \c!right=\hss]
+
+\definepapersize [A0]  [\c!width=841mm,\c!height=1189mm]
+\definepapersize [A1]  [\c!width=594mm,\c!height=841mm]
+\definepapersize [A2]  [\c!width=420mm,\c!height=594mm]
+\definepapersize [A3]  [\c!width=297mm,\c!height=420mm]
+\definepapersize [A4]  [\c!width=210mm,\c!height=297mm]
+\definepapersize [A5]  [\c!width=148mm,\c!height=210mm]
+\definepapersize [A6]  [\c!width=105mm,\c!height=148mm]
+\definepapersize [A7]  [\c!width=74mm,\c!height=105mm]
+\definepapersize [A8]  [\c!width=52mm,\c!height=74mm]
+\definepapersize [A9]  [\c!width=37mm,\c!height=52mm]
+\definepapersize [A10] [\c!width=26mm,\c!height=37mm]
+
+\definepapersize [B0]  [\c!width=1000mm,\c!height=1414mm]
+\definepapersize [B1]  [\c!width=707mm,\c!height=1000mm]
+\definepapersize [B2]  [\c!width=500mm,\c!height=707mm]
+\definepapersize [B3]  [\c!width=353mm,\c!height=500mm] % [\c!width=354mm,\c!height=500mm]
+\definepapersize [B4]  [\c!width=250mm,\c!height=353mm] % [\c!width=250mm,\c!height=354mm]
+\definepapersize [B5]  [\c!width=176mm,\c!height=250mm] % [\c!width=177mm,\c!height=250mm]
+\definepapersize [B6]  [\c!width=125mm,\c!height=176mm] % [\c!width=125mm,\c!height=177mm]
+\definepapersize [B7]  [\c!width=88mm,\c!height=125mm]
+\definepapersize [B8]  [\c!width=62mm,\c!height=88mm]   % [\c!width=63mm,\c!height=88mm]
+\definepapersize [B9]  [\c!width=44mm,\c!height=62mm]   % [\c!width=44mm,\c!height=63mm]
+\definepapersize [B10] [\c!width=31mm,\c!height=44mm]
+
+\definepapersize [C0]  [\c!width=917mm,\c!height=1297mm]
+\definepapersize [C1]  [\c!width=648mm,\c!height=917mm] % [\c!width=649mm,\c!height=917mm]
+\definepapersize [C2]  [\c!width=458mm,\c!height=648mm] % [\c!width=459mm,\c!height=649mm]
+\definepapersize [C3]  [\c!width=324mm,\c!height=458mm] % [\c!width=324mm,\c!height=459mm]
+\definepapersize [C4]  [\c!width=229mm,\c!height=324mm]
+\definepapersize [C5]  [\c!width=162mm,\c!height=229mm]
+\definepapersize [C6]  [\c!width=114mm,\c!height=162mm] % [\c!width=115mm,\c!height=162mm]
+\definepapersize [C7]  [\c!width=81mm,\c!height=114mm]  % [\c!width=81mm,\c!height=115mm]
+\definepapersize [C8]  [\c!width=57mm,\c!height=81mm]
+\definepapersize [C9]  [\c!width=40mm,\c!height=57mm]
+\definepapersize [C10] [\c!width=28mm,\c!height=40mm]
+
+%D Per August 2004 the rounding of some (seldom used) sizes
+%D were corrected top the latest DIN specifications. Peter
+%D Rolf came up with these and a few more missing sizes.
+%D Watch out: spaces and slashes!
+
+\definepapersize [4 A0]  [\c!width=1682mm,\c!height=2378mm]
+\definepapersize [2 A0]  [\c!width=1189mm,\c!height=1682mm]
+\definepapersize [C6/C5] [\c!width=114mm,\c!height=229mm]
+
+%D Because there are no standardized screen sizes, we define
+%D a bunch of sizes with $4:3$ ratios. The \type {S6} size is
+%D nearly as wide as a sheet of \type {A4} paper.
+
+\definepapersize [S3] [\c!width=300pt,\c!height=225pt]
+\definepapersize [S4] [\c!width=400pt,\c!height=300pt]
+\definepapersize [S5] [\c!width=500pt,\c!height=375pt]
+\definepapersize [S6] [\c!width=600pt,\c!height=450pt]
+\definepapersize [S8] [\c!width=800pt,\c!height=600pt]
+\definepapersize [SW] [\c!width=800pt,\c!height=450pt]
+\definepapersize [SM] [\c!width=720pt,\c!height=450pt]
+
+%D These are handy too:
+
+\definepapersize [S33] [\c!width=300pt,\c!height=300pt]
+\definepapersize [S44] [\c!width=400pt,\c!height=400pt]
+\definepapersize [S55] [\c!width=500pt,\c!height=500pt]
+\definepapersize [S66] [\c!width=600pt,\c!height=600pt]
+
+%D One may wonder if \TEX\ should be used for typesetting
+%D \CDROM\ covers, but it does not hurt to have the paper size
+%D ready.
+
+\definepapersize [CD] [\c!width=120mm,\c!height=120mm]
+
+%D The next series is for our English speaking friends who
+%D decided to stick to non metric values. Thanks to Nelson
+%D Beebe for completing the inch based list.
+
+\definepapersize [letter]    [\c!width=8.5in,\c!height=11in]
+\definepapersize [ledger]    [\c!width=11in,\c!height=17in]
+\definepapersize [tabloid]   [\c!width=17in,\c!height=11in]
+
+\definepapersize [legal]     [\c!width=8.5in,\c!height=14in]
+\definepapersize [folio]     [\c!width=8.5in,\c!height=13in]
+\definepapersize [executive] [\c!width=7.25in,\c!height=10.5in]
+
+\definepapersize [A] [\c!width=8.5in,\c!height=11in] % 1 sheet
+\definepapersize [B] [\c!width=11in,\c!height=17in]  % 2 sheets
+\definepapersize [C] [\c!width=17in,\c!height=22in]  % 4 sheets
+
+%D The next set is for Tobias Burnus, who gave me the sizes.
+
+\definepapersize [envelope 9]  [\c!width=8.88in,\c!height=3.88in]
+\definepapersize [envelope 10] [\c!width=9.5in,\c!height=4.13in]
+\definepapersize [envelope 11] [\c!width=10.38in,\c!height=4.5in]
+\definepapersize [envelope 12] [\c!width=11.0in,\c!height=4.75in]
+\definepapersize [envelope 14] [\c!width=11.5in,\c!height=5.0in]
+\definepapersize [monarch]     [\c!width=7.5in,\c!height=3.88in]
+\definepapersize [check]       [\c!width=8.58in,\c!height=3.88in]
+\definepapersize [DL]          [\c!width=110mm,\c!height=220mm] % [\c!width=220mm,\c!height=110mm]
+\definepapersize [E4]          [\c!width=280mm,\c!height=400mm]
+
+%D The next three sets are supplied by Taco:
+
+\definepapersize [RA0]  [\c!width=860mm,\c!height=1220mm]
+\definepapersize [RA1]  [\c!width=610mm,\c!height=860mm]
+\definepapersize [RA2]  [\c!width=430mm,\c!height=610mm]
+\definepapersize [RA3]  [\c!width=305mm,\c!height=430mm]
+\definepapersize [RA4]  [\c!width=215mm,\c!height=305mm]
+
+%D ISO SRA (supplementary raw A) sizes:
+
+\definepapersize [SRA0]  [\c!width=900mm,\c!height=1280mm]
+\definepapersize [SRA1]  [\c!width=640mm,\c!height=900mm]
+\definepapersize [SRA2]  [\c!width=450mm,\c!height=640mm]
+\definepapersize [SRA3]  [\c!width=320mm,\c!height=450mm]
+\definepapersize [SRA4]  [\c!width=225mm,\c!height=320mm]
+
+%D Swedish thesis formats:
+
+\definepapersize [G5]  [\c!width=169mm,\c!height=239mm]
+\definepapersize [E5]  [\c!width=155mm,\c!height=220mm]
+
+%D Industry invention:
+
+\definepapersize [A3plus] [\c!width=329mm,\c!height=483mm]
+
+%D We can now default to a reasonable size. We match the print
+%D paper size with the typeset paper size. This setting should
+%D come after the first layout specification (already done).
+
+\setuppapersize
+  [A4][A4]
+
+%D A few goodies:
+
+\definepapersize
+  [oversized]
+  [ \c!width=\dimexpr\paperwidth +1.5cm\relax,
+   \c!height=\dimexpr\paperheight+1.5cm\relax]
+
+\definepapersize
+  [doublesized]
+  [ \c!width=\dimexpr \paperwidth \relax,
+   \c!height=\dimexpr2\paperheight\relax]
+
+\definepapersize
+  [doubleoversized]
+  [ \c!width=\dimexpr \paperheight+1.5cm\relax,
+   \c!height=\dimexpr2\paperwidth +1.5cm\relax]
+
+%D For orthogonality:
+
+\definepapersize
+  [undersized]
+  [ \c!width=\dimexpr\paperwidth -1.5cm\relax,
+   \c!height=\dimexpr\paperheight-1.5cm\relax]
+
+\definelayout
+  [\v!page]
+  [\c!backspace=\zeropoint,
+   \c!cutspace=\zeropoint,
+   \c!topspace=\zeropoint,
+   \c!bottomspace=\zeropoint,
+   \c!margin=\zeropoint,
+   \c!edge=\zeropoint,
+   \c!header=\zeropoint,
+   \c!footer=\zeropoint,
+   \c!top=\zeropoint,
+   \c!bottom=\zeropoint,
+   \c!leftmargin=\zeropoint,
+   \c!rightmargin=\zeropoint,
+   \c!leftedge=\zeropoint,
+   \c!rightedge=\zeropoint,
+   \c!textdistance=\zeropoint,
+   \c!width=\v!middle,
+   \c!height=\v!middle,
+   \c!lines=0,
+   \c!grid=\v!no]
+
+\definelayout
+  [\v!middle]
+  [\c!width=\v!middle,
+   \c!height=\v!middle]
+
+\protect \endinput
diff --git a/tex/context/base/page-lay.mkiv b/tex/context/base/page-lay.mkiv
new file mode 100644
index 000000000..5d0b06418
--- /dev/null
+++ b/tex/context/base/page-lay.mkiv
@@ -0,0 +1,1404 @@
+%D \module
+%D   [       file=page-lay,
+%D        version=2000.10.20, % copied from main-001
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Layout Specification,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Layout Specification}
+
+%D This module is now etex dependent.
+
+% to be translated into english
+
+% hoofdhoogte wordt bij status=hoog niet aangepast op outer
+% level, wel binnen bepaalde berekeningen
+
+%D Before you start wondering why some of the page related
+%D modules skip upward or left in order to place elements, you
+%D must realize that the reference point is the top left
+%D corner of the main typesetting area. One reason for this
+%D choice is that it suited some viewers that displayed page
+%D areas. Another reason is that margins, edges and top and
+%D bottom areas are kind of virtual, while the header, text
+%D and footer areas normally determine the text flow.
+
+\unprotect
+
+%D First we get rid of the funny \TEX\ offset defaults of one
+%D inch by setting them to zero.
+
+\voffset = 0pt % setting this to -1in let's go metapost crazy
+\hoffset = 0pt % setting this to -1in let's go metapost crazy
+
+%D The dimensions related to layout areas are represented by
+%D real dimensions.
+
+\newdimen\paperheight          \paperheight          = 297mm
+\newdimen\paperwidth           \paperwidth           = 210mm
+
+\newdimen\printpaperheight     \printpaperheight     = \paperheight
+\newdimen\printpaperwidth      \printpaperwidth      = \paperwidth
+
+\newdimen\makeupheight                               % calculated
+\newdimen\makeupwidth                                % calculated
+
+\newdimen\textheight                                 % calculated
+\newdimen\textwidth                                  % calculated
+
+\newdimen\topspace             \topspace             = 2cm
+\newdimen\backspace            \backspace            = \topspace
+\newdimen\cutspace             \cutspace             = 0pt
+\newdimen\bottomspace          \bottomspace          = 0pt
+
+\newdimen\headerheight         \headerheight         = 2cm
+\newdimen\footerheight         \footerheight         = \headerheight
+
+\newdimen\topoffset            \topoffset            = 0pt
+\newdimen\backoffset           \backoffset           = \topoffset
+
+\newdimen\leftmarginwidth      \leftmarginwidth      = 3cm
+\newdimen\rightmarginwidth     \rightmarginwidth     = \leftmarginwidth
+
+\newdimen\leftedgewidth        \leftedgewidth        = 3cm
+\newdimen\rightedgewidth       \rightedgewidth       = \leftedgewidth
+
+\newdimen\topheight            \topheight            = 0cm
+\newdimen\bottomheight         \bottomheight         = \topheight
+
+\newcount\layoutlines          \layoutlines          = 0
+\newcount\layoutcolumns        \layoutcolumns        = 0
+\newdimen\layoutcolumndistance \layoutcolumndistance = 0pt
+\newdimen\layoutcolumnwidth    \layoutcolumnwidth    = 0pt
+
+%D We can save some tokens and fuzzy parameters by using a
+%D symbolic name for the current set of layout parameters.
+
+\let\currentlayout\empty
+
+\def\layoutparameter#1%
+  {\csname\??ly\ifcsname
+     \??ly\currentlayout#1\endcsname\currentlayout
+   \fi#1\endcsname}
+
+\def\namedlayoutparameter#1#2%
+  {\csname\??ly\ifcsname\??ly            #1#2\endcsname#1\else
+               \ifcsname\??ly\currentlayout#2\endcsname\currentlayout
+   \fi\fi#2\endcsname}
+
+%D Beause normal \TEX\ has at most 256 dimensions (of which a
+%D substantial part is already in use), we provide a way to
+%D generate a format with macro based alternatives. For a long
+%D time, this used to be the default case. Beware: only fixed
+%D dimensions can be used in calculations! By the way, the
+%D gain in speed can hardly be called impressive and is roughly
+%D 1 second on a 35 second run of 850 empty pages with a
+%D couple of backgrounds only (which is far less than one
+%D percent on a normal document).
+
+%D The next series of dimensions are complemented by left
+%D and rights ones.
+
+\newdimen \margindistance
+\newdimen \edgedistance
+\newdimen \marginwidth
+\newdimen \edgewidth
+
+%D Because a distance does not really makes sense when there
+%D is no area, we use a zero distance in case there is no
+%D area.
+
+\def\layoutdistance#1#2%
+  {\ifdim\zeropoint<#1\layoutparameter#2\else\zeropoint\fi}
+
+%D The horizontal distances are:
+
+\newdimen \leftedgedistance
+\newdimen \rightedgedistance
+\newdimen \leftmargindistance
+\newdimen \rightmargindistance
+
+%D The vertical distances are:
+
+\newdimen \topdistance
+\newdimen \headerdistance
+\newdimen \footerdistance
+\newdimen \bottomdistance
+
+%D We need to calculate the extra distances:
+
+\def\setlayoutdimensions
+  {\global\marginwidth        \layoutparameter\c!margin
+   \global\edgewidth          \layoutparameter\c!edge
+   \global\margindistance     \layoutparameter\c!margindistance
+   \global\edgedistance       \layoutparameter\c!edgedistance
+   \global\leftedgedistance   \layoutdistance \leftedgewidth    \c!leftedgedistance
+   \global\rightedgedistance  \layoutdistance \rightedgewidth   \c!rightedgedistance
+   \global\leftmargindistance \layoutdistance \leftmarginwidth  \c!leftmargindistance
+   \global\rightmargindistance\layoutdistance \rightmarginwidth \c!rightmargindistance
+   \global\topdistance        \layoutdistance \topheight        \c!topdistance
+   \global\headerdistance     \layoutdistance \headerheight     \c!headerdistance
+   \global\footerdistance     \layoutdistance \footerheight     \c!footerdistance
+   \global\bottomdistance     \layoutdistance \bottomheight     \c!bottomdistance}
+
+\def\setlayoutdistances % local in \setreducedvsize
+  {\headerdistance\layoutdistance\headerheight\c!headerdistance
+   \footerdistance\layoutdistance\footerheight\c!footerdistance}
+
+% these are wrong in the running text, assumes some swapping, needs a cleanup
+
+\def\outermarginwidth   {\rightorleftpageaction\rightmarginwidth   \leftmarginwidth }
+\def\innermarginwidth   {\rightorleftpageaction\leftmarginwidth    \rightmarginwidth}
+\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance }
+\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance}
+
+\def\outeredgewidth     {\rightorleftpageaction\rightedgewidth   \leftedgewidth }
+\def\inneredgewidth     {\rightorleftpageaction\leftedgewidth    \rightedgewidth}
+\def\outeredgedistance  {\rightorleftpageaction\rightedgedistance\leftedgedistance }
+\def\inneredgedistance  {\rightorleftpageaction\leftedgedistance \rightedgedistance}
+
+\def\outerspacewidth    {\rightorleftpageaction\cutspace\backspace}
+\def\innerspacewidth    {\rightorleftpageaction\backspace\cutspace}
+
+\newtoks\extralayoutcalculations \def\calculatelayoutextras{\the\extralayoutcalculations}
+
+% \appendtoks
+%   non etex calculations used to go here
+% \to \extralayoutcalculations
+
+\newtoks\everyswapmargins % watch the order !
+
+\appendtoks
+   \swapdimens\leftmargindistance\rightmargindistance
+   \swapdimens\leftedgedistance  \rightedgedistance
+   \swapdimens\leftmarginwidth   \rightmarginwidth
+   \swapdimens\leftedgewidth     \rightedgewidth
+\to \everyswapmargins
+
+\appendtoks
+  \swapmacros\leftmargintotal \rightmargintotal
+  \swapmacros\leftedgetotal   \rightedgetotal
+  \swapmacros\leftsidetotal   \rightsidetotal
+  \swapmacros\leftcombitotal  \rightcombitotal
+  \swapmacros\innermargintotal\outermargintotal
+  \swapmacros\inneredgetotal  \outeredgetotal
+  \swapmacros\innercombitotal \outercombitotal
+  \swapmacros\innersidetotal  \outersidetotal
+\to \everyswapmargins
+
+%D \macros
+%D   {definepapersize}
+%D
+%D Before we start calculating layout dimensions, we will
+%D first take care of paper sizes. The first argument can be
+%D either an assignment (for defaults) or an identifier, in
+%D which case the second argument is an assignment.
+%D
+%D \showsetup{definepapersize}
+
+\def\definepapersize
+  {\dodoubleempty\dodefinepapersize}
+
+\def\definepapersize
+  {\dotripleempty\dodefinepapersize}
+
+\def\dodefinepapersize[#1][#2][#3]%
+  {\ifsecondargument
+     \doifsomething{#1} % to be sure
+       {\doifassignmentelse{#2}
+          {\getparameters
+             [\??pp#1] % geen \c!scale, scheelt hash ruimte
+             [\c!width=\@@ppwidth,\c!height=\@@ppheight,\c!offset=\@@ppoffset,#2]}
+          {\setvalue{\??pp:1:#1}{#2}%
+           \setvalue{\??pp:2:#1}{#3}}}%
+   \else
+     \getparameters[\??pp][#1]%
+     \setuppapersize % hm. this will freeze !
+   \fi}
+
+%D For the moment we need to fake this macro.
+
+\ifx\setuppapersize\undefined
+  \let\setuppapersize\relax
+\fi
+
+%D We set the defaults to the dimensions of an A4 sheet of
+%D paper.
+
+\definepapersize
+  [\c!width=210mm,\c!height=297mm,\c!offset=\zeropoint]
+
+%D Yet undocumented, let's see if it gets noticed.
+%D
+%D \starttyping
+%D \definepapersize[main] [A4]          [A4]
+%D \definepapersize[extra][A4,landscape][A4,landscape]
+%D
+%D \starttext
+%D     \setuppapersize[main]
+%D     Page 1. \page
+%D     Page 2. \page
+%D     \setuppapersize[extra]
+%D     Page 2 \page
+%D     \setuppapersize[main]
+%D     Page 3. \page
+%D     Page 4. \page
+%D     \adaptpapersize[extra]
+%D     Page 5. \page
+%D     Page 6. \page
+%D \stoptext
+%D \stoptyping
+
+%D \macros
+%D   {setuppaper,setuppapersize}
+%D
+%D When setting up the papersize on which to typeset and
+%D print, we can also determine some more characteristics.
+%D
+%D \showsetup{setuppapersize}
+%D
+%D We keep track of these features with the following
+%D variables.
+
+\chardef\papermirror     =0  \chardef\printmirror     =0
+\chardef\paperorientation=0  \chardef\printorientation=0 % beware: later no chardef
+\chardef\paperreverse    =0  \chardef\printreverse    =0
+\chardef\paperlandscape  =0  \chardef\printlandscape  =0
+
+\let\papersize\empty \let\printpapersize\empty
+
+\def\paperscale{1} \newif\ifnegateprintbox
+
+\def\setuppaper[#1]%
+  {\getparameters[\??pp][\c!paper=,\c!page=,#1]%
+   \edef\@@ppxy{\the\numexpr\@@ppnx*\@@ppny\relax}%
+   \doifelsenothing\@@pppage
+     {\doifelsenothing\@@pppaper
+        {} % {\setuppapersize} % added, removed, no need for, too tricky, mag-01 (fixed by freezing pp's)
+        {\dodosetuppapersize[\papersize][\@@pppaper]}}
+     {\doifelsenothing\@@pppaper
+        {\dodosetuppapersize[\@@pppage][\printpapersize]}
+        {\dodosetuppapersize[\@@pppage][\@@pppaper]}}}
+
+\def\setuppapersize
+  {\dodoubleempty\dosetuppapersize}
+
+\def\dosetuppapersize[#1][#2]%
+  {\doifassignmentelse{#1}
+     {\setuppaper[#1]}
+     {\doifelsenothing{#2}
+        {\expanded{\dodosetuppapersize
+           [\executeifdefined{\??pp:1:#1}{#1}]%
+           [\executeifdefined{\??pp:2:#1}{}]}}
+        {\doifassignmentelse{#2}
+           {\getparameters[\??pp\executeifdefined{\??pp:1:#1}{#1}][#2]}
+           {\expanded{\dodosetuppapersize
+              [\executeifdefined{\??pp:1:#1}{#1}]%
+              [\executeifdefined{\??pp:1:#2}{#2}]}}}}}
+
+\let\reinstatepapersize\relax
+
+\def\adaptpapersize
+  {\global\let\reinstatepapersize\restorepapersize
+   \setuppapersize}
+
+\appendtoks
+  \reinstatepapersize
+  \global\let\reinstatepapersize\relax
+\to \everyaftershipout
+
+\def\dodosetuppapersize[#1][#2]%
+  {\ifsecondargument
+     \expanded{\dododosetuppapersize[#1][#2]}%
+     \calculatehsizes
+     \calculatevsizes
+     \recalculatebackgrounds
+     \recalculatelayout
+   \else\iffirstargument
+     \setuppapersize[#1][#2]%
+   \else\ifx\papersize\undefined\else
+     \restorepapersize
+   \fi\fi\fi}
+
+% dimen freeze is a bit tricky, but catches local redundant calls
+% with values where e.g width is defined in terms of \paperwidth
+
+\def\dododosetuppapersize[#1][#2]%
+  {\xdef\restorepapersize{\noexpand\setuppapersize[#1][#2]}%
+   \dosetuppaperorientation{#1}\paperlandscape\paperorientation\paperreverse\papermirror
+   \dosetuppaperorientation{#2}\printlandscape\printorientation\printreverse\printmirror
+   \def\docommand##1%
+     {\doifsomething{##1}{\doifdefined{\??pp##1\c!width}
+        {\global\paperwidth \getvalue{\??pp##1\c!width}%
+         \global\paperheight\getvalue{\??pp##1\c!height}%
+         \ifinpagebody
+           \setevalue{\??pp##1\c!height}{\the\paperheight}%
+           \setevalue{\??pp##1\c!width }{\the\paperwidth }%
+         \fi
+         \calculatepaperoffsets{##1}%
+         \xdef\papersize{##1}}}}%
+   \processcommacommand[#1]\docommand
+   \doifdefinedelse{\??pp#1\c!scale}
+     {\edef\paperscale{\getvalue{\??pp#1\c!scale}}}
+     {\edef\paperscale{1}}%
+   \def\docommand##1%
+     {\doifsomething{##1}{\doifdefined{\??pp##1\c!width}
+        {\global\printpaperwidth \getvalue{\??pp##1\c!width}%
+         \global\printpaperheight\getvalue{\??pp##1\c!height}%
+         \ifinpagebody
+           \setevalue{\??pp##1\c!height}{\the\printpaperheight}%
+           \setevalue{\??pp##1\c!width }{\the\printpaperwidth}%
+         \fi
+         \xdef\printpapersize{##1}}}}%
+   \processcommacommand[#2]\docommand
+   \global\setdimentoatleast\paperwidth      \onepoint
+   \global\setdimentoatleast\paperheight     \onepoint
+   \global\setdimentoatleast\printpaperwidth \onepoint
+   \global\setdimentoatleast\printpaperheight\onepoint
+   \ifcase\paperlandscape\else
+     \doglobal\swapdimens\paperwidth\paperheight
+   \fi
+   \ifcase\printlandscape\else
+     \doglobal\swapdimens\printpaperwidth\printpaperheight
+   \fi
+   % this check can be confusing, so we've added the possibility
+   % to bypass this test: \setuppapersize[option=fit]
+   \doif\@@ppoption\v!max % \v!fit is
+     {\bgroup
+      % we need to pre-swap else we get the wrong paper size
+      \ifcase\paperorientation\else
+        \doifinset\paperorientation{90,270}{\swapdimens\paperwidth\paperheight}%
+      \fi
+      \ifcase\printorientation\else
+        \doifinset\printorientation{90,270}{\swapdimens\printpaperwidth\printpaperheight}%
+      \fi
+      \ifdim\paperheight>\printpaperheight
+        \global\printpaperheight\paperheight
+        \writestatus\m!systems{print height forced to paper height}%
+      \fi
+      \ifdim\paperwidth>\printpaperwidth
+        \global\printpaperwidth\paperwidth
+        \writestatus\m!systems{print width forced to paper width}%
+      \fi
+      \egroup}}
+
+\def\dosetuppaperorientation#1#2#3#4#5%
+  {\global\chardef#2\zerocount
+   \global\chardef#5\zerocount
+   \globallet#3\!!zerocount
+   \globallet#4\!!zerocount
+   \global\negateprintboxfalse
+   \processallactionsinset
+     [#1]
+     [ \v!landscape=>\global\chardef#2\plusone,
+        \v!mirrored=>\global\chardef#5\plusone,
+         \v!rotated=>\gdef#3{90}\gdef#4{270},
+        \v!negative=>\global\negateprintboxtrue,
+                 90=>\gdef#3{90}\gdef#4{270},
+                180=>\gdef#3{180}\gdef#4{0},
+                270=>\gdef#3{270}\gdef#4{90}]}
+
+\ifx\calculatepaperoffsets\undefined
+
+  \def\calculatepaperoffsets#1%
+    {\scratchdimen\getvalue{\??pp#1\c!offset}%
+     \global\advance\paperwidth -2\scratchdimen
+     \global\advance\paperheight-2\scratchdimen}
+
+\fi
+
+\let\restorepapersize\relax
+
+% \def\docheckforems#1%
+%   {\beforesplitstring#1\at em\to\asciia
+%    \doifnot\asciia{#1}
+%      {\aftersplitstring\asciia\at=\to\asciia
+%       \doifsomething\asciia{\showmessage\m!systems{10}{#1}}}}
+%
+% \def\checkforems[#1]%
+%   {\processcommalist[#1]\docheckforems}
+
+\ifx\setups\undefined \def\setups[#1]{\setdefaultpenalties} \fi
+
+% \newtoks \everybeforelayout \relax
+% \newtoks \everyafterlayout  \relax
+
+\def\recalculatelayout
+  {\doifsomething{\layoutparameter\c!page\layoutparameter\c!paper}
+     {\expanded{\dododosetuppapersize[\layoutparameter\c!page][\layoutparameter\c!paper]}}%
+   \dorecalculatelayout}
+
+\def\dorecalculatelayout
+  {%\the\everybeforelayout
+   \setups[\layoutparameter\c!preset]%
+   \global\leftmarginwidth \layoutparameter\c!leftmargin
+   \global\rightmarginwidth\layoutparameter\c!rightmargin
+   \global\leftedgewidth   \layoutparameter\c!leftedge
+   \global\rightedgewidth  \layoutparameter\c!rightedge
+   \global\headerheight    \layoutparameter\c!header
+   \global\footerheight    \layoutparameter\c!footer
+   \global\bottomheight    \layoutparameter\c!bottom
+   \global\topheight       \layoutparameter\c!top
+   \global\backspace       \layoutparameter\c!backspace
+   \global\topspace        \layoutparameter\c!topspace
+   \setlayoutdimensions % the rest of the `dimensions'
+   \doifelse\@@lygrid\v!yes\gridsnappingtrue\gridsnappingfalse
+   \ifgridsnapping
+     \setsystemmode\v!grid
+   \else
+     \resetsystemmode\v!grid
+   \fi
+   \setups[\layoutparameter\c!setups]% depends on gridsnapping !
+   \simplesetupwhitespace
+   \simplesetupblank
+   \global\cutspace\layoutparameter\c!cutspace
+   \relax
+   \doifelse{\layoutparameter\c!width}\v!middle
+     {\ifdim\cutspace=\zeropoint
+        \global\cutspace\backspace
+      \fi
+      \global\makeupwidth\dimexpr\paperwidth-\backspace-\cutspace\relax}
+     {\doifelse{\layoutparameter\c!width}\v!fit
+        {\ifdim\cutspace=\zeropoint
+           \global\cutspace\backspace
+         \fi
+         \global\makeupwidth\dimexpr\paperwidth-\cutspace\relax
+         \scratchdimen\dimexpr\backspace
+           -\leftedgewidth  -\leftedgedistance
+           -\leftmarginwidth-\leftmargindistance\relax
+         \ifdim\scratchdimen<\zeropoint
+           \scratchdimen\zeropoint
+         \fi
+         \global\advance\makeupwidth\dimexpr
+           -\rightmargindistance-\rightmarginwidth
+           -\rightedgedistance  -\rightedgewidth
+           -\scratchdimen\relax}
+        {\global\makeupwidth\layoutparameter\c!width\relax
+         \ifdim\cutspace=\zeropoint
+           \global\cutspace\dimexpr\paperwidth-\makeupwidth-\backspace\relax
+        % \else
+            % A kind of inconsistent specification, but used
+            % in for instance s-pre-19.tex; the cutspace is
+            % used only for determining some kind of right
+            % margin; don't use this in doublesided mode
+         \fi}}%
+   \scratchdimen\layoutparameter\c!bottomspace\relax
+  %\ifdim\scratchdimen=\zeropoint
+  %  \scratchdimen\topspace
+  %\fi
+   \global\bottomspace\layoutparameter\c!bottomspace\relax
+   \global\layoutlines0\number\layoutparameter\c!lines\relax % may be empty
+   \ifcase\layoutlines
+     \doifelse{\layoutparameter\c!height}\v!middle
+       {\ifdim\bottomspace=\zeropoint
+          \global\bottomspace\topspace
+        \fi
+        \global\makeupheight\dimexpr\paperheight-\topspace-\bottomspace\relax}
+       {\doifelse{\layoutparameter\c!height}\v!fit
+          {\ifdim\bottomspace=\zeropoint
+            \global\bottomspace\topspace
+           \fi
+           \global\makeupheight\dimexpr\paperheight-\bottomspace\relax
+           \scratchdimen\dimexpr\topspace-\topheight-\topdistance\relax
+           \ifdim\scratchdimen<\zeropoint
+             \scratchdimen\zeropoint
+           \fi
+           \global\advance\makeupheight\dimexpr-\bottomdistance-\bottomheight-\scratchdimen\relax}
+          {\global\makeupheight\layoutparameter\c!height\relax
+           \ifdim\bottomspace=\zeropoint
+             \global\bottomspace\dimexpr\paperheight-\makeupheight-\topspace\relax
+           \else
+             % inconsistent specification
+           \fi}}%
+   \else
+     % beware, when the bodyfont changes (switched) this will change as well; implementing
+     % a global lineheight is tricky: should we take the bodyfont interlinespace or the one set
+     % independent of the bodyfont (before or after a layout spec); way too fuzzy, so we
+     % stick to the current method (after a night of experimenting ...2003/10/13)
+     \global\makeupheight\dimexpr
+        \layoutparameter\c!lines\lineheight-\strutheight+\topskip+
+        \headerdistance+\headerheight+\footerdistance+\footerheight\relax
+   \fi
+   \backoffset\layoutparameter\c!horoffset
+   \topoffset \layoutparameter\c!veroffset
+   \global\setdimentoatleast\makeupwidth\onepoint
+   \global\setdimentoatleast\makeupheight \onepoint
+   % \checkcurrentlayout % here ?
+   % \the\everyafterlayout
+   \calculatelayoutextras
+   \calculatehsizes
+   \calculatevsizes
+   \calculatepseudocolumns
+   \checkgridsnapping
+   \recalculatebackgrounds}
+
+\def\calculatepseudocolumns
+  {\global\layoutcolumns\layoutparameter\c!columns
+   \global\layoutcolumndistance\layoutparameter\c!columndistance
+   \global\layoutcolumnwidth\dimexpr\makeupwidth-\layoutcolumns\layoutcolumndistance+\layoutcolumndistance\relax
+   \global\divide\layoutcolumnwidth\layoutcolumns
+   \dorecurse\layoutcolumns
+     {\setxvalue{\??ly:c:\recurselevel}%
+        {\the\numexpr\recurselevel-\plusone\relax\dimexpr\layoutcolumnwidth+\layoutcolumndistance\relax}}}
+
+%\dorecurse\layoutcolumns
+%  {\setxvalue{\??ly:c:\recurselevel}{\the\dimexpr
+%     (\numexpr(\recurselevel-1)\dimexpr(\layoutcolumnwidth+\layoutcolumndistance))}}
+
+\def\layoutcolumnoffset#1%
+  {\executeifdefined{\??ly:c:#1}\zeropoint}
+
+\def\checklayout
+  {\ifdim\makeupheight=\layoutlines\lineheight \else \recalculatelayout \fi}
+
+\appendtoks \checklayout \to \everystarttext
+
+% document:
+%
+% \setuplayout[odd][state=stop] \setuplayout[even][state=stop] \setuplayout[page]
+%
+% \startstandardmakeup[page=blank] ... \stopstandardmakeup
+
+\def\changetolayout#1%
+  {%\writestatus\m!layouts{changing to layout #1}%
+   \xdef\currentlayout{#1}\recalculatelayout}
+
+\def\checkcurrentoddlayout
+  {\ifcsname\??ly\v!odd\c!state\endcsname
+     \doifvalue{\??ly\v!odd\c!state}\v!start{\changetolayout\v!odd}%
+   \fi}
+
+\def\checkcurrentevenlayout
+  {\ifcsname\??ly\v!even\c!state\endcsname
+     \doifvalue{\??ly\v!even\c!state}\v!start{\changetolayout\v!even}%
+   \fi}
+
+\ifx\lastpage\undefined \def\lastpage{1} \fi
+
+\def\reverserealfolio
+  {\ifnum\lastpage>\plusone
+     \ifnum\lastpage=\realfolio
+       \v!last
+     \else\ifnum\plusone=\realfolio
+       \v!first
+     \else
+       \the\numexpr\realfolio-\lastpage\relax
+     \fi\fi
+   \else
+     \!!zerocount
+   \fi}
+
+\def\checkcurrentlayout % public and used in naw, so keep this name
+  {\ifcsname\??ly\realfolio\c!state\endcsname
+     \doifvalue{\??ly\realfolio\c!state}\v!start{\changetolayout\realfolio}%
+   \else\ifcsname\??ly\reverserealfolio\c!state\endcsname
+     \doifvalue{\??ly\reverserealfolio\c!state}\v!start{\changetolayout\reverserealfolio}%
+   \else\ifcsname\??ly\v!current\c!state\endcsname
+     \changetolayout\v!current % no start test ?
+   \else
+     \doifoddpageelse\checkcurrentoddlayout\checkcurrentevenlayout
+   \fi\fi\fi}
+
+% testcase
+%
+% \setuppagenumbering[alternative=doublesided]
+%
+% \setuplayout         [width=11cm]
+% \definelayout [odd]  [backspace=1cm]
+% \definelayout [even] [backspace=4cm]
+% \definelayout [5]    [backspace=5cm]
+% \definelayout [6]    [backspace=5cm]
+% \definelayout [-2]   [backspace=0cm,cutspace=0cm]
+% \definelayout [last] [backspace=0cm,cutspace=0cm]
+%
+% \checkcurrentlayout \showframe
+%
+% \starttext
+%     \dorecurse{20} {\input knuth \endgraf \input tufte \endgraf}
+% \stoptext
+
+%appendtoks \checkcurrentlayout \to \everyaftershipout % no
+\appendtoks \checkcurrentlayout \to \everystarttext
+
+\appendtoks
+  \dochecknextlayout
+\to \everyaftershipout
+
+% \def\dochecknextlayout
+%   {\ifx\currentlayout\v!current
+%      % prevent redundant calculations
+%    \else
+%      \globallet\currentlayout\empty
+%      \global\letbeundefined{\??ly\v!current\c!state}%
+%      \checkcurrentlayout
+%    \fi}
+%
+% this breaks after a standardmakeup
+
+\def\dochecknextlayout{\checkcurrentlayout}
+
+\newif\ifdoublesidedprint
+
+\def\presetcenterpagebox % in \setuplayout !!!!!!!!!!!!!!!!
+  {\doublesidedprintfalse
+   \normalexpanded{\noexpand\processallactionsinset[\@@lylocation]}
+     [     \v!middle=>{\setuppapersize[\c!left=\hss,\c!right=\hss,\c!top=\vss,\c!bottom=\vss]},
+             \v!left=>{\setuppapersize[\c!left=,\c!right=\hss]},
+            \v!right=>{\setuppapersize[\c!left=\hss,\c!right=]},
+           \v!bottom=>{\setuppapersize[\c!top=\vss,\c!bottom=]},
+              \v!top=>{\setuppapersize[\c!top=,\c!bottom=\vss]},%
+      \v!doublesided=>\doublesidedprinttrue,
+      \v!singlesided=>\doublesidedprintfalse]}
+
+\def\definelayout
+  {\dodoubleargument\dodefinelayout}
+
+\def\dodefinelayout[#1][#2]%
+  {\getparameters[\??ly#1][\c!state=\v!start,#2]}
+
+% \def\dodosetuplayout[#1][#2]%
+%   {\ConvertToConstant\doifnot{#2}\v!reset % #2 ?
+%      {\getparameters[\??ly#1][#2]%
+%       \checkforems[#2]}}
+
+\def\dodosetuplayout[#1][#2]%
+  {\doifnot{#2}\v!reset{\getparameters[\??ly#1][#2]}}
+
+% global needed for non-doublesided standardmakeup
+
+\def\dosetuplayout[#1][#2]%
+  {\globallet\currentlayout\empty % new, global
+   \ifsecondargument
+     \dodosetuplayout[#1][#2]%
+   \else\iffirstargument
+     \doifassignmentelse{#1}
+       {\dodosetuplayout[][#1]}
+       {\doifnot{#1}\v!reset{\xdef\currentlayout{#1}}}% new, global
+   \fi\fi
+   \recalculatelayout
+   \checkcurrentlayout % here ?
+   \presetcenterpagebox}
+
+\def\setuplayout
+  {\dodoubleempty\dosetuplayout}
+
+\let\@@zaheight\!!zeropoint
+
+\def\dopushpagedimensions
+  {\xdef\oldtextheight  {\the\textheight  }%
+   \xdef\oldfooterheight{\the\footerheight}%
+   \global\let\@@zaheight\@@zaheight}
+
+\def\dopoppagedimensions
+  {\global\textheight  \oldtextheight
+   \global\footerheight\oldfooterheight
+   \recalculatelayout
+   \global\let\pushpagedimensions\dopushpagedimensions
+   \global\let\poppagedimensions\relax}
+
+\let\poppagedimensions \relax
+\let\pushpagedimensions\dopushpagedimensions
+
+% Elke \csname ... \endcsname wordt ook aangemaakt, dus ook
+% in een test met \doifdefined. Bij veel bladzijden kan dit
+% te veel macro's kosten. Vandaar de set \adaptedpages. Het
+% kost tijd, maar scheelt macro's.
+
+\let\adaptedpages\empty
+
+\def\adaptpagedimensions
+  {\ifx\adaptedpages\empty\else
+     \adaptpagedimensionsindeed
+   \fi}
+
+\def\adaptpagedimensionsindeed
+  {\rawdoifinsetelse\realfolio\adaptedpages
+     {\removefromcommalist\realfolio\adaptedpages
+      \getvalue{\??za\realfolio}%
+      \letbeundefined{\??za\realfolio}}}
+
+\def\checkpagedimensions
+  {\poppagedimensions
+   \adaptpagedimensions}
+
+\def\reportpagedimensions
+  {\ifx\poppagedimensions\relax \else
+     \space\the\dimexpr\@@zaheight\relax\space-\space
+   \fi
+   \realfolio}
+
+\def\dodoadaptlayout[#1]%
+  {\getparameters[\??za][\c!height=,\c!lines=0,#1]%
+   \pushpagedimensions
+   \ifcase\@@zalines\relax
+     \showmessage\m!layouts1{\@@zaheight,\realfolio}%
+   \else
+     \showmessage\m!layouts1{\@@zalines\space\v!lines,\realfolio}%
+     \def\@@zaheight{\@@zalines\openlineheight}%
+   \fi
+   \doifelse\@@zaheight\v!max
+     {\balancedimensions\textheight\footerheight\footerheight}
+     {\balancedimensions\textheight\footerheight\@@zaheight}%
+   \ifdim\footerheight<\zeropoint
+     \global\advance\textheight \footerheight
+     \global\footerheight\zeropoint
+     \global\xdef\@@zaheight{\layoutparameter\c!footer\space(\v!max)}%
+   \fi
+   \setvsize
+   \global\pagegoal\vsize  % nog corrigeren voor insertions ?
+   \recalculatebackgrounds
+   \global\let\pushpagedimensions\relax
+   \global\let\poppagedimensions\dopoppagedimensions}
+
+\def\doadaptlayout[#1][#2]%
+  {\doifelsenothing{#2}
+     {\dodoadaptlayout[#1]}
+     {\def\docommand##1%
+        {\addtocommalist{##1}\adaptedpages
+         \setgvalue{\??za##1}{\dodoadaptlayout[#2]}}%
+      \processcommalist[#1]\docommand
+      \adaptpagedimensions}}
+
+\def\adaptlayout
+  {\dodoubleempty\doadaptlayout}
+
+% describe interface
+
+%D Centering the paper area on the print area is determined
+%D by the \type {top}, \type {bottom}, \type {left} and \type
+%D {right} parameters.
+
+\def\centerpagebox#1%
+  {\printpaperwidth \paperscale\printpaperwidth
+   \printpaperheight\paperscale\printpaperheight
+   \setbox#1\vbox to \printpaperheight
+     {\@@pptop
+      \hbox to \printpaperwidth
+        {\ifdoublesidedprint
+           \doifbothsides
+             {\@@ppleft \box#1\@@ppright}
+             {\@@ppleft \box#1\@@ppright}
+             {\@@ppright\box#1\@@ppleft }%
+         \else
+              \@@ppleft \box#1\@@ppright
+         \fi}%
+      \par
+      \@@ppbottom}}
+
+\def\offsetprintbox#1%
+  {\ifdim\topoffset=\zeropoint % \relax
+     \ifdim\backoffset=\zeropoint
+       \donefalse
+     \else
+       \donetrue
+     \fi
+   \else
+     \donetrue
+   \fi
+   \ifdone
+     \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
+     \setbox#1\vbox
+       {\offinterlineskip
+        \vskip\topoffset
+        \hskip\doifbothsides\backoffset\backoffset{-\backoffset}%
+        \box#1}%
+     \next
+   \fi}
+
+\def\replicatepagebox#1%
+  {\ifnum\@@lynx>\plusone
+     \donetrue
+   \else\ifnum\@@lyny>\plusone
+     \donetrue
+   \else
+     \donefalse
+   \fi\fi
+   \ifdone
+     \setbox#1\vbox
+       {\offinterlineskip
+        \dorecurse\@@lyny
+          {\hbox{\dorecurse\@@lynx{\copy#1\hskip\@@lydx}\unskip}%
+           \vskip\@@lydy}
+        \unskip}%
+   \fi}
+
+\def\orientpagebodybox#1#2#3%
+  {\ifnum#2#3>\zerocount
+     \setbox#1\vbox
+       {\edef\somerotation{\ifdoublesided\ifodd\realpageno#2\else#3\fi\else#2\fi}%
+        \dorotatebox\somerotation\hbox{\box#1}}%
+   \fi}
+
+\def\orientpaperbox#1%
+  {\orientpagebodybox{#1}\paperorientation\paperreverse}
+
+\def\orientprintbox#1%
+  {\orientpagebodybox{#1}\printorientation\printreverse}
+
+\def\mirrorpagebodybox#1#2%
+  {\ifcase#2\or
+     \setbox#1\vbox{\domirrorbox\vbox{\box#1}}%
+   \fi}
+
+\def\mirrorpaperbox#1%
+  {\mirrorpagebodybox{#1}\papermirror}
+
+\def\mirrorprintbox#1%
+  {\mirrorpagebodybox{#1}\printmirror}
+
+\def\scalepagebox#1%
+  {\ifdim\@@lyscale\points=\onepoint \else
+     \setbox#1\vbox{\scale[\c!sx=\@@lyscale,\c!sy=\@@lyscale]{\box#1}}%
+     \paperwidth \@@lyscale\paperwidth
+     \paperheight\@@lyscale\paperheight
+   \fi}
+
+\def\negateprintbox#1%
+  {\ifnegateprintbox
+     \negatecolorbox{#1}%
+   \fi}
+
+\def\pagecutmarksymbol    {\the\realpageno}
+\def\pagecutmarklength    {.5cm}
+\let\pagecutmarktoptext    \empty
+\let\pagecutmarkbottomtext \empty
+
+\def\extrapagecutmarkbottomtext
+  {\rlap{\jobname}\hfill\currentdate\space-\space\currenttime\hfill\llap{\realfolio}}
+
+\def\makepagecutbox % #1
+  {\let\cutmarksymbol    \pagecutmarksymbol
+   \let\cutmarklength    \pagecutmarklength
+   \let\cutmarktoptext   \pagecutmarktoptext
+   \let\cutmarkbottomtext\pagecutmarkbottomtext
+   \makecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!on}%
+  {\makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!page}% only at outer when nx/ny > 0
+  {\makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!empty}%
+  {\let\pagecutmarksymbol\empty
+   \let\pagecutmarktoptext\empty
+   \let\pagecutmarkbottomtext\empty
+   \makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!text}%
+  {\let\pagecutmarksymbol\empty
+   \let\pagecutmarkbottomtext\extrapagecutmarkbottomtext
+   \makepagecutbox}
+
+\setvalue{\??ly:c:\c!marking:\v!color}%
+  {\doaddpagecolormarks\colormarkbox}
+
+\setvalue{\??ly:c:\c!marking:\v!screen}%
+  {\doaddpagecolormarks\rastermarkbox}
+
+\letvalue{\??ly:c:\c!marking:\v!unknown}\gobbleoneargument
+\letvalue{\??ly:n:\c!marking:\v!unknown}\gobbleoneargument
+
+% \def\addpagecutmarks  {\executeifdefined{\??ly:n:\c!marking:\@@lymarking}\gobbleoneargument}
+% \def\addpagecolormarks{\executeifdefined{\??ly:c:\c!marking:\@@lymarking}\gobbleoneargument}
+
+\def\addpagecutmarks  {\expandcheckedcsname{\??ly:n:\c!marking:}\@@lymarking\s!unknown}
+\def\addpagecolormarks{\expandcheckedcsname{\??ly:c:\c!marking:}\@@lymarking\s!unknown}
+
+\def\doaddpagecolormarks#1#2%
+  {\makepagecutbox{#2}%
+   \ifnum\horizontalcutmarks>\plustwo \chardef\colormarkoffset\plusfour \fi
+   \ifnum\verticalcutmarks  >\plustwo \chardef\colormarkoffset\plusfour \fi
+   #1{#2}}
+
+% NOG EENS NAGAAN WANNEER NU GLOBAL EN WANNEER NIET
+
+\ifx\doifelselayoutsomeline\undefined % defined in page-txt
+    \let\doifelselayoutsomeline\secondofthreearguments
+\fi
+
+\def\compensatevsizeheader             {\advance\textheight-\dimexpr\headerheight+\headerdistance\relax}
+\def\compensatevsizefooter             {\advance\textheight-\dimexpr\footerheight+\footerdistance\relax}
+\def\globalcompensatevsizeheader{\global\advance\textheight-\dimexpr\headerheight+\headerdistance\relax}
+\def\globalcompensatevsizefooter{\global\advance\textheight-\dimexpr\footerheight+\footerdistance\relax}
+
+\def\compensatevsizeheaderzero{\headerheight\zeropoint\setlayoutdistances}
+\def\compensatevsizefooterzero{\footerheight\zeropoint\setlayoutdistances}
+
+\def\calculatevsizes
+  {\textheight\makeupheight
+   \doifelselayoutsomeline\v!header\compensatevsizeheader\donothing
+   \doifelselayoutsomeline\v!footer\compensatevsizefooter\donothing
+   \setvsizemodes
+   \resetglobal
+   \setvsize}
+
+\def\calculateglobalvsizes
+  {\global\textheight\makeupheight
+   \doifelselayoutsomeline\v!header\globalcompensatevsizeheader\donothing
+   \doifelselayoutsomeline\v!footer\globalcompensatevsizefooter\donothing
+   \setvsizemodes
+   \setvsize}
+
+\def\setvsizemodes
+  {\ifzeropt\headerheight
+     \resetsystemmode\v!header
+   \else
+     \setsystemmode\v!header
+   \fi
+   \ifzeropt\footerheight
+     \resetsystemmode\v!footer
+   \else
+     \setsystemmode\v!footer
+   \fi}
+
+\def\calculatereducedvsizes
+  {\textheight\makeupheight
+   \doifelselayoutsomeline\v!header\compensatevsizeheader\compensatevsizeheaderzero
+   \doifelselayoutsomeline\v!footer\compensatevsizefooter\compensatevsizefooterzero}
+
+\newdimen\innermakeupwidth  % special purpose
+\newdimen\innermakeupmargin % special purpose
+
+\chardef\innermakeupcompensation\plusone
+
+\def\compensatedinnermakeupmargin
+  {\dimexpr\ifnum\innermakeupcompensation=\plusone+\innermakeupmargin\else\zeropoint\fi\relax}
+
+\def\freezetextwidth      % \makeupwidth may be set to \textwidth
+  {\textwidth\makeupwidth % which is a tricky but valid value
+   \doifsomething{\layoutparameter\c!textwidth}
+     {\textwidth\layoutparameter\c!textwidth}%         % local
+   \global\innermakeupwidth\textwidth
+   \doifelsenothing{\layoutparameter\c!textmargin}
+     {\global\innermakeupmargin\zeropoint}
+     {\global\innermakeupmargin\layoutparameter\c!textmargin}%
+   \global\advance\innermakeupwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax
+   \advance\textwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax}   % local
+
+\def\calculatehsizes
+  {\freezetextwidth
+   \sethsize}
+
+% De onderstaande macro voert commando's uit, afhankelijk van
+% het karakter van het paginanummer.
+%
+% \doifoddpageelse{then-commando}{else-commando}
+
+%D When we start at an even page, we need to swap the layout
+%D differently. We cannot adapt the real page number, since
+%D it is used in cross referencing. The next switch is set
+%D when we start at an even page.
+
+\newif\ifshiftedrealpageno
+
+% We could use nested if here plu ssone \@EAEAEA's but but the
+% next variant has less expansion which is nicer in tracing.
+
+\def\doifoddpageelse   {\ifshiftedrealpageno\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}
+
+\let\doifonevenpaginaelse\doifoddpageelse
+
+\def\redoifoddpageelse#1{\doifoddpageelse}
+
+\def\doifbothsidesoverruled
+  {\ifdoublesided
+     \expandafter\redoifoddpageelse
+   \else
+     \expandafter\firstofthreearguments
+   \fi}
+
+\def\doifbothsides% #1 #2 #3
+  {\ifdoublesided
+     \expandafter\doifbothsidesindeed
+   \else
+     \expandafter\firstofthreearguments
+   \fi}
+
+\def\doifbothsidesindeed
+  {\ifsinglesided
+     \expandafter\firstofthreearguments
+   \else
+     \expandafter\redoifoddpageelse
+   \fi}
+
+\def\settexthoffset
+  {\texthoffset\doifbothsides\backspace\backspace{\dimexpr\paperwidth-\backspace-\makeupwidth\relax}}
+
+\def\goleftonpage
+  {\hskip-\dimexpr\leftmargindistance+\leftmarginwidth+\leftedgedistance+\leftedgewidth\relax}
+
+\def\doifmarginswapelse#1#2%
+  {\doifbothsides{#1}{#1}{#2}}
+
+\def\swapmargins
+  {\doifmarginswapelse\relax\doswapmargins}
+
+\def\doswapmargins
+  {\let\swapmargins  \relax % to prevent local swapping
+   \let\doswapmargins\relax % to prevent local swapping
+   \the\everyswapmargins}
+
+\def\rightorleftpageaction
+  {\ifdoublesided
+     \expandafter\rightorleftpageactionindeed
+   \else
+     \expandafter\firstoftwoarguments
+   \fi}
+
+\def\rightorleftpageactionindeed
+  {\ifsinglesided
+     \expandafter\firstoftwoarguments
+   \else
+     \expandafter\doifoddpageelse
+   \fi}
+
+\def\outermarginwidth   {\rightorleftpageaction\rightmarginwidth   \leftmarginwidth }
+\def\innermarginwidth   {\rightorleftpageaction\leftmarginwidth    \rightmarginwidth}
+\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance }
+\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance}
+
+\def\outeredgewidth     {\rightorleftpageaction\rightedgewidth   \leftedgewidth }
+\def\inneredgewidth     {\rightorleftpageaction\leftedgewidth    \rightedgewidth}
+\def\outeredgedistance  {\rightorleftpageaction\rightedgedistance\leftedgedistance }
+\def\inneredgedistance  {\rightorleftpageaction\leftedgedistance \rightedgedistance}
+
+\def\outerspacewidth    {\rightorleftpageaction\cutspace \backspace}
+\def\innerspacewidth    {\rightorleftpageaction\backspace\cutspace }
+
+\def\leftmargintotal    {\dimexpr\leftmarginwidth +\leftmargindistance \relax}
+\def\rightmargintotal   {\dimexpr\rightmarginwidth+\rightmargindistance\relax}
+\def\leftedgetotal      {\dimexpr\leftedgewidth   +\leftedgedistance   \relax}
+\def\rightedgetotal     {\dimexpr\rightedgewidth  +\rightedgedistance  \relax}
+
+\def\leftsidetotal      {\dimexpr\leftmarginwidth +\leftedgetotal \relax}
+\def\rightsidetotal     {\dimexpr\rightmarginwidth+\rightedgetotal\relax}
+\def\leftcombitotal     {\dimexpr\leftmargintotal +\leftedgetotal \relax}
+\def\rightcombitotal    {\dimexpr\rightmargintotal+\rightedgetotal\relax}
+
+\def\innermargintotal   {\dimexpr\innermarginwidth+\innermargindistance\relax}
+\def\outermargintotal   {\dimexpr\outermarginwidth+\outermargindistance\relax}
+\def\inneredgetotal     {\dimexpr\inneredgewidth  +\inneredgedistance  \relax}
+\def\outeredgetotal     {\dimexpr\outeredgewidth  +\outeredgedistance  \relax}
+
+\def\innercombitotal    {\dimexpr\innermargintotal+\inneredgetotal\relax}
+\def\outercombitotal    {\dimexpr\outermargintotal+\outeredgetotal\relax}
+\def\innersidetotal     {\dimexpr\innermarginwidth+\inneredgetotal\relax}
+\def\outersidetotal     {\dimexpr\outermarginwidth+\outeredgetotal\relax}
+
+%D \macros
+%D   {startlocallayout}
+%D
+%D These macros should be used with care. They permit local
+%D layouts (as used in fitting pages, see \type {page-app.tex}).
+
+%D This is kind of obsolete now that we have \type
+%D {\definelayout}, so this hack will disappear in future
+%D versions.
+
+\def\startlocallayout
+  {\globalpushmacro\restorepapersize
+   \globalpushmacro\currentlayout}
+
+\def\stoplocallayout
+  {\globalpopmacro\currentlayout
+   \globalpopmacro\restorepapersize
+   \restorepapersize
+   \setuplayout}
+
+%D \macros
+%D   {showprint, showframe, showlayout, showsetups}
+%D
+%D We predefine a couple of tracing macros.
+%D
+%D \showsetup{showprint}
+%D \showsetup{showframe}
+%D \showsetup{showlayout}
+%D \showsetup{showsetups}
+%D %showsetup{showmargins}
+
+\fetchruntimecommand \showprint   {page-run.mkii}
+\fetchruntimecommand \showframe   {page-run.mkii}
+\fetchruntimecommand \showlayout  {page-run.mkii}
+\fetchruntimecommand \showsetups  {page-run.mkii}
+\fetchruntimecommand \showmargins {page-run.mkii}
+
+%D The default dimensions are quite old and will not change.
+%D The funny fractions were introduced when we went from fixed
+%D dimensions to relative ones. Since \CONTEXT\ is a dutch
+%D package, the dimensions are based on the metric system. The
+%D asymmetrical layout is kind of handy for short
+%D quick||and||dirty stapled documents.
+%D
+%D Although valid, it is not a real good idea to use
+%D dimensions based on the \type {em} unit. First of all,
+%D since there are no fonts loaded yet, this dimension makes
+%D no sense, and second, you would loose track of values,
+%D since they could change while going to a new page,
+%D depending on the current font setting.
+
+\setuplayout
+  [             \c!topspace=.08417508418\paperheight,  %  2.5cm
+                     \c!top=\zeropoint,
+             \c!topdistance=\zeropoint,
+                  \c!header=.06734006734\paperheight,  %  2.0cm
+          \c!headerdistance=\zeropoint,
+                  \c!height=.84175084175\paperheight,  % 25.0cm
+          \c!footerdistance=\layoutparameter\c!headerdistance,
+                  \c!footer=.06734006734\paperheight,  %  2.0cm
+          \c!bottomdistance=\layoutparameter\c!topdistance,
+                  \c!bottom=\zeropoint,
+               \c!backspace=.11904761905\paperwidth, %  2.5cm
+                    \c!edge=\zeropoint,
+            \c!edgedistance=\layoutparameter\c!margindistance,
+                  \c!margin=.12649983170\paperwidth, %  snijwit-2*afstand
+          \c!margindistance=.02008341748\paperwidth, %  12.0pt
+                \c!leftedge=\layoutparameter\c!edge,
+        \c!leftedgedistance=\layoutparameter\c!edgedistance,
+              \c!leftmargin=\layoutparameter\c!margin,
+      \c!leftmargindistance=\layoutparameter\c!margindistance,
+                   \c!width=.71428571429\paperwidth, %  15.0cm
+     \c!rightmargindistance=\layoutparameter\c!margindistance,
+             \c!rightmargin=\layoutparameter\c!margin,
+       \c!rightedgedistance=\layoutparameter\c!edgedistance,
+               \c!rightedge=\layoutparameter\c!edge,
+               \c!veroffset=\zeropoint,
+             \c!bottomspace=\zeropoint,
+               \c!horoffset=\zeropoint,
+                \c!cutspace=\zeropoint,
+               \c!textwidth=, % dangerous option -> centered / local
+              \c!textmargin=, % dangerous option -> both sides
+            \c!textdistance=\zeropoint, % shift down on grid
+                   \c!style=,
+                   \c!color=,
+                 \c!marking=\v!off,
+                \c!location=, % \v!singlesided, but empty is signal
+                   \c!scale=1,
+                      \c!nx=1,
+                      \c!ny=1,
+                      \c!dx=\zeropoint,
+                      \c!dy=\zeropoint,
+                    \c!grid=\v!no,
+                  \c!preset=,
+                  \c!setups=\systemsetupsprefix\s!default,
+              \c!clipoffset=\zeropoint,
+                   \c!lines=0,
+                   \c!paper=, % for foxet
+                    \c!page=, % for foxet
+                 \c!columns=1,
+          \c!columndistance=\zeropoint]
+
+%D First we define a whole range of (DIN) papersizes,
+%D of which the A-series makes most sense. We enable checking.
+
+%D We also set some of the parameters that will be used when
+%D positioning the typeset paper onto the print paper.
+
+\setuppaper % (size) % only used in XY imposition
+  [\c!width=\zeropoint,
+   \c!height=\zeropoint,
+   \c!topspace=\zeropoint,
+   \c!backspace=\zeropoint,
+   \c!dx=\zeropoint,
+   \c!dy=\zeropoint,
+   \c!nx=1,
+   \c!ny=1,
+   \c!method=\v!normal]
+
+\setuppapersize
+  [\c!option=\v!max,
+   \c!top=,
+   \c!bottom=\vss,
+   \c!left=,
+   \c!right=\hss]
+
+\definepapersize [A0]  [\c!width=841mm,\c!height=1189mm]
+\definepapersize [A1]  [\c!width=594mm,\c!height=841mm]
+\definepapersize [A2]  [\c!width=420mm,\c!height=594mm]
+\definepapersize [A3]  [\c!width=297mm,\c!height=420mm]
+\definepapersize [A4]  [\c!width=210mm,\c!height=297mm]
+\definepapersize [A5]  [\c!width=148mm,\c!height=210mm]
+\definepapersize [A6]  [\c!width=105mm,\c!height=148mm]
+\definepapersize [A7]  [\c!width=74mm,\c!height=105mm]
+\definepapersize [A8]  [\c!width=52mm,\c!height=74mm]
+\definepapersize [A9]  [\c!width=37mm,\c!height=52mm]
+\definepapersize [A10] [\c!width=26mm,\c!height=37mm]
+
+\definepapersize [B0]  [\c!width=1000mm,\c!height=1414mm]
+\definepapersize [B1]  [\c!width=707mm,\c!height=1000mm]
+\definepapersize [B2]  [\c!width=500mm,\c!height=707mm]
+\definepapersize [B3]  [\c!width=353mm,\c!height=500mm] % [\c!width=354mm,\c!height=500mm]
+\definepapersize [B4]  [\c!width=250mm,\c!height=353mm] % [\c!width=250mm,\c!height=354mm]
+\definepapersize [B5]  [\c!width=176mm,\c!height=250mm] % [\c!width=177mm,\c!height=250mm]
+\definepapersize [B6]  [\c!width=125mm,\c!height=176mm] % [\c!width=125mm,\c!height=177mm]
+\definepapersize [B7]  [\c!width=88mm,\c!height=125mm]
+\definepapersize [B8]  [\c!width=62mm,\c!height=88mm]   % [\c!width=63mm,\c!height=88mm]
+\definepapersize [B9]  [\c!width=44mm,\c!height=62mm]   % [\c!width=44mm,\c!height=63mm]
+\definepapersize [B10] [\c!width=31mm,\c!height=44mm]
+
+\definepapersize [C0]  [\c!width=917mm,\c!height=1297mm]
+\definepapersize [C1]  [\c!width=648mm,\c!height=917mm] % [\c!width=649mm,\c!height=917mm]
+\definepapersize [C2]  [\c!width=458mm,\c!height=648mm] % [\c!width=459mm,\c!height=649mm]
+\definepapersize [C3]  [\c!width=324mm,\c!height=458mm] % [\c!width=324mm,\c!height=459mm]
+\definepapersize [C4]  [\c!width=229mm,\c!height=324mm]
+\definepapersize [C5]  [\c!width=162mm,\c!height=229mm]
+\definepapersize [C6]  [\c!width=114mm,\c!height=162mm] % [\c!width=115mm,\c!height=162mm]
+\definepapersize [C7]  [\c!width=81mm,\c!height=114mm]  % [\c!width=81mm,\c!height=115mm]
+\definepapersize [C8]  [\c!width=57mm,\c!height=81mm]
+\definepapersize [C9]  [\c!width=40mm,\c!height=57mm]
+\definepapersize [C10] [\c!width=28mm,\c!height=40mm]
+
+%D Per August 2004 the rounding of some (seldom used) sizes
+%D were corrected top the latest DIN specifications. Peter
+%D Rolf came up with these and a few more missing sizes.
+%D Watch out: spaces and slashes!
+
+\definepapersize [4 A0]  [\c!width=1682mm,\c!height=2378mm]
+\definepapersize [2 A0]  [\c!width=1189mm,\c!height=1682mm]
+\definepapersize [C6/C5] [\c!width=114mm,\c!height=229mm]
+
+%D Because there are no standardized screen sizes, we define
+%D a bunch of sizes with $4:3$ ratios. The \type {S6} size is
+%D nearly as wide as a sheet of \type {A4} paper.
+
+\definepapersize [S3] [\c!width=300pt,\c!height=225pt]
+\definepapersize [S4] [\c!width=400pt,\c!height=300pt]
+\definepapersize [S5] [\c!width=500pt,\c!height=375pt]
+\definepapersize [S6] [\c!width=600pt,\c!height=450pt]
+\definepapersize [S8] [\c!width=800pt,\c!height=600pt]
+\definepapersize [SW] [\c!width=800pt,\c!height=450pt]
+\definepapersize [SM] [\c!width=720pt,\c!height=450pt]
+
+%D These are handy too:
+
+\definepapersize [S33] [\c!width=300pt,\c!height=300pt]
+\definepapersize [S44] [\c!width=400pt,\c!height=400pt]
+\definepapersize [S55] [\c!width=500pt,\c!height=500pt]
+\definepapersize [S66] [\c!width=600pt,\c!height=600pt]
+
+%D One may wonder if \TEX\ should be used for typesetting
+%D \CDROM\ covers, but it does not hurt to have the paper size
+%D ready.
+
+\definepapersize [CD] [\c!width=120mm,\c!height=120mm]
+
+%D The next series is for our English speaking friends who
+%D decided to stick to non metric values. Thanks to Nelson
+%D Beebe for completing the inch based list.
+
+\definepapersize [letter]    [\c!width=8.5in,\c!height=11in]
+\definepapersize [ledger]    [\c!width=11in,\c!height=17in]
+\definepapersize [tabloid]   [\c!width=17in,\c!height=11in]
+
+\definepapersize [legal]     [\c!width=8.5in,\c!height=14in]
+\definepapersize [folio]     [\c!width=8.5in,\c!height=13in]
+\definepapersize [executive] [\c!width=7.25in,\c!height=10.5in]
+
+\definepapersize [A] [\c!width=8.5in,\c!height=11in] % 1 sheet
+\definepapersize [B] [\c!width=11in,\c!height=17in]  % 2 sheets
+\definepapersize [C] [\c!width=17in,\c!height=22in]  % 4 sheets
+
+%D The next set is for Tobias Burnus, who gave me the sizes.
+
+\definepapersize [envelope 9]  [\c!width=8.88in,\c!height=3.88in]
+\definepapersize [envelope 10] [\c!width=9.5in,\c!height=4.13in]
+\definepapersize [envelope 11] [\c!width=10.38in,\c!height=4.5in]
+\definepapersize [envelope 12] [\c!width=11.0in,\c!height=4.75in]
+\definepapersize [envelope 14] [\c!width=11.5in,\c!height=5.0in]
+\definepapersize [monarch]     [\c!width=7.5in,\c!height=3.88in]
+\definepapersize [check]       [\c!width=8.58in,\c!height=3.88in]
+\definepapersize [DL]          [\c!width=110mm,\c!height=220mm] % [\c!width=220mm,\c!height=110mm]
+\definepapersize [E4]          [\c!width=280mm,\c!height=400mm]
+
+%D The next three sets are supplied by Taco:
+
+\definepapersize [RA0]  [\c!width=860mm,\c!height=1220mm]
+\definepapersize [RA1]  [\c!width=610mm,\c!height=860mm]
+\definepapersize [RA2]  [\c!width=430mm,\c!height=610mm]
+\definepapersize [RA3]  [\c!width=305mm,\c!height=430mm]
+\definepapersize [RA4]  [\c!width=215mm,\c!height=305mm]
+
+%D ISO SRA (supplementary raw A) sizes:
+
+\definepapersize [SRA0]  [\c!width=900mm,\c!height=1280mm]
+\definepapersize [SRA1]  [\c!width=640mm,\c!height=900mm]
+\definepapersize [SRA2]  [\c!width=450mm,\c!height=640mm]
+\definepapersize [SRA3]  [\c!width=320mm,\c!height=450mm]
+\definepapersize [SRA4]  [\c!width=225mm,\c!height=320mm]
+
+%D Swedish thesis formats:
+
+\definepapersize [G5]  [\c!width=169mm,\c!height=239mm]
+\definepapersize [E5]  [\c!width=155mm,\c!height=220mm]
+
+%D Industry invention:
+
+\definepapersize [A3plus] [\c!width=329mm,\c!height=483mm]
+
+%D We can now default to a reasonable size. We match the print
+%D paper size with the typeset paper size. This setting should
+%D come after the first layout specification (already done).
+
+\setuppapersize
+  [A4][A4]
+
+%D A few goodies:
+
+\definepapersize
+  [oversized]
+  [ \c!width=\dimexpr\paperwidth +1.5cm\relax,
+   \c!height=\dimexpr\paperheight+1.5cm\relax]
+
+\definepapersize
+  [doublesized]
+  [ \c!width=\dimexpr \paperwidth \relax,
+   \c!height=\dimexpr2\paperheight\relax]
+
+\definepapersize
+  [doubleoversized]
+  [ \c!width=\dimexpr \paperheight+1.5cm\relax,
+   \c!height=\dimexpr2\paperwidth +1.5cm\relax]
+
+%D For orthogonality:
+
+\definepapersize
+  [undersized]
+  [ \c!width=\dimexpr\paperwidth -1.5cm\relax,
+   \c!height=\dimexpr\paperheight-1.5cm\relax]
+
+\definelayout
+  [\v!page]
+  [\c!backspace=\zeropoint,
+   \c!cutspace=\zeropoint,
+   \c!topspace=\zeropoint,
+   \c!bottomspace=\zeropoint,
+   \c!margin=\zeropoint,
+   \c!edge=\zeropoint,
+   \c!header=\zeropoint,
+   \c!footer=\zeropoint,
+   \c!top=\zeropoint,
+   \c!bottom=\zeropoint,
+   \c!leftmargin=\zeropoint,
+   \c!rightmargin=\zeropoint,
+   \c!leftedge=\zeropoint,
+   \c!rightedge=\zeropoint,
+   \c!textdistance=\zeropoint,
+   \c!width=\v!middle,
+   \c!height=\v!middle,
+   \c!lines=0,
+   \c!grid=\v!no]
+
+\definelayout
+  [\v!middle]
+  [\c!width=\v!middle,
+   \c!height=\v!middle]
+
+\protect \endinput
diff --git a/tex/context/base/page-lay.tex b/tex/context/base/page-lay.tex
deleted file mode 100644
index c8525643f..000000000
--- a/tex/context/base/page-lay.tex
+++ /dev/null
@@ -1,1429 +0,0 @@
-%D \module
-%D   [       file=page-lay,
-%D        version=2000.10.20, % copied from main-001
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Layout Specification,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Layout Specification}
-
-%D This module is now etex dependent.
-
-% to be translated into english
-
-% hoofdhoogte wordt bij status=hoog niet aangepast op outer
-% level, wel binnen bepaalde berekeningen
-
-%D Before you start wondering why some of the page related
-%D modules skip upward or left in order to place elements, you
-%D must realize that the reference point is the top left
-%D corner of the main typesetting area. One reason for this
-%D choice is that it suited some viewers that displayed page
-%D areas. Another reason is that margins, edges and top and
-%D bottom areas are kind of virtual, while the header, text
-%D and footer areas normally determine the text flow.
-
-\unprotect
-
-%D First we get rid of the funny \TEX\ offset defaults of one
-%D inch by setting them to zero.
-
-\voffset = 0pt % setting this to -1in let's go metapost crazy
-\hoffset = 0pt % setting this to -1in let's go metapost crazy
-
-%D The dimensions related to layout areas are represented by
-%D real dimensions.
-
-\newdimen\paperheight          \paperheight          = 297mm
-\newdimen\paperwidth           \paperwidth           = 210mm
-
-\newdimen\printpaperheight     \printpaperheight     = \paperheight
-\newdimen\printpaperwidth      \printpaperwidth      = \paperwidth
-
-\newdimen\makeupheight                               % calculated
-\newdimen\makeupwidth                                % calculated
-
-\newdimen\textheight                                 % calculated
-\newdimen\textwidth                                  % calculated
-
-\newdimen\topspace             \topspace             = 2cm
-\newdimen\backspace            \backspace            = \topspace
-\newdimen\cutspace             \cutspace             = 0pt
-\newdimen\bottomspace          \bottomspace          = 0pt
-
-\newdimen\headerheight         \headerheight         = 2cm
-\newdimen\footerheight         \footerheight         = \headerheight
-
-\newdimen\topoffset            \topoffset            = 0pt
-\newdimen\backoffset           \backoffset           = \topoffset
-
-\newdimen\leftmarginwidth      \leftmarginwidth      = 3cm
-\newdimen\rightmarginwidth     \rightmarginwidth     = \leftmarginwidth
-
-\newdimen\leftedgewidth        \leftedgewidth        = 3cm
-\newdimen\rightedgewidth       \rightedgewidth       = \leftedgewidth
-
-\newdimen\topheight            \topheight            = 0cm
-\newdimen\bottomheight         \bottomheight         = \topheight
-
-\newcount\layoutlines          \layoutlines          = 0
-\newcount\layoutcolumns        \layoutcolumns        = 0
-\newdimen\layoutcolumndistance \layoutcolumndistance = 0pt
-\newdimen\layoutcolumnwidth    \layoutcolumnwidth    = 0pt
-
-%D We can save some tokens and fuzzy parameters by using a
-%D symbolic name for the current set of layout parameters.
-
-\let\currentlayout\empty
-
-\def\layoutparameter#1%
-  {\csname\??ly\ifcsname
-     \??ly\currentlayout#1\endcsname\currentlayout
-   \fi#1\endcsname}
-
-\def\namedlayoutparameter#1#2%
-  {\csname\??ly\ifcsname\??ly            #1#2\endcsname#1\else
-               \ifcsname\??ly\currentlayout#2\endcsname\currentlayout
-   \fi\fi#2\endcsname}
-
-%D Beause normal \TEX\ has at most 256 dimensions (of which a
-%D substantial part is already in use), we provide a way to
-%D generate a format with macro based alternatives. For a long
-%D time, this used to be the default case. Beware: only fixed
-%D dimensions can be used in calculations! By the way, the
-%D gain in speed can hardly be called impressive and is roughly
-%D 1 second on a 35 second run of 850 empty pages with a
-%D couple of backgrounds only (which is far less than one
-%D percent on a normal document).
-
-%D The next series of dimensions are complemented by left
-%D and rights ones.
-
-\newdimen \margindistance
-\newdimen \edgedistance
-\newdimen \marginwidth
-\newdimen \edgewidth
-
-%D Because a distance does not really makes sense when there
-%D is no area, we use a zero distance in case there is no
-%D area.
-
-\def\layoutdistance#1#2%
-  {\ifdim\zeropoint<#1\layoutparameter#2\else\zeropoint\fi}
-
-%D The horizontal distances are:
-
-\newdimen \leftedgedistance
-\newdimen \rightedgedistance
-\newdimen \leftmargindistance
-\newdimen \rightmargindistance
-
-%D The vertical distances are:
-
-\newdimen \topdistance
-\newdimen \headerdistance
-\newdimen \footerdistance
-\newdimen \bottomdistance
-
-%D We need to calculate the extra distances:
-
-\def\setlayoutdimensions
-  {\global\marginwidth        \layoutparameter\c!margin
-   \global\edgewidth          \layoutparameter\c!edge
-   \global\margindistance     \layoutparameter\c!margindistance
-   \global\edgedistance       \layoutparameter\c!edgedistance
-   \global\leftedgedistance   \layoutdistance \leftedgewidth    \c!leftedgedistance
-   \global\rightedgedistance  \layoutdistance \rightedgewidth   \c!rightedgedistance
-   \global\leftmargindistance \layoutdistance \leftmarginwidth  \c!leftmargindistance
-   \global\rightmargindistance\layoutdistance \rightmarginwidth \c!rightmargindistance
-   \global\topdistance        \layoutdistance \topheight        \c!topdistance
-   \global\headerdistance     \layoutdistance \headerheight     \c!headerdistance
-   \global\footerdistance     \layoutdistance \footerheight     \c!footerdistance
-   \global\bottomdistance     \layoutdistance \bottomheight     \c!bottomdistance}
-
-\def\setlayoutdistances % local in \setreducedvsize
-  {\headerdistance\layoutdistance\headerheight\c!headerdistance
-   \footerdistance\layoutdistance\footerheight\c!footerdistance}
-
-% these are wrong in the running text, assumes some swapping, needs a cleanup
-
-\def\outermarginwidth   {\rightorleftpageaction\rightmarginwidth   \leftmarginwidth }
-\def\innermarginwidth   {\rightorleftpageaction\leftmarginwidth    \rightmarginwidth}
-\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance }
-\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance}
-
-\def\outeredgewidth     {\rightorleftpageaction\rightedgewidth   \leftedgewidth }
-\def\inneredgewidth     {\rightorleftpageaction\leftedgewidth    \rightedgewidth}
-\def\outeredgedistance  {\rightorleftpageaction\rightedgedistance\leftedgedistance }
-\def\inneredgedistance  {\rightorleftpageaction\leftedgedistance \rightedgedistance}
-
-\def\outerspacewidth    {\rightorleftpageaction\cutspace\backspace}
-\def\innerspacewidth    {\rightorleftpageaction\backspace\cutspace}
-
-\newtoks\extralayoutcalculations \def\calculatelayoutextras{\the\extralayoutcalculations}
-
-% \appendtoks
-%   non etex calculations used to go here
-% \to \extralayoutcalculations
-
-\newtoks\everyswapmargins % watch the order !
-
-\appendtoks
-   \swapdimens\leftmargindistance\rightmargindistance
-   \swapdimens\leftedgedistance  \rightedgedistance
-   \swapdimens\leftmarginwidth   \rightmarginwidth
-   \swapdimens\leftedgewidth     \rightedgewidth
-\to \everyswapmargins
-
-\appendtoks
-  \swapmacros\leftmargintotal \rightmargintotal
-  \swapmacros\leftedgetotal   \rightedgetotal
-  \swapmacros\leftsidetotal   \rightsidetotal
-  \swapmacros\leftcombitotal  \rightcombitotal
-  \swapmacros\innermargintotal\outermargintotal
-  \swapmacros\inneredgetotal  \outeredgetotal
-  \swapmacros\innercombitotal \outercombitotal
-  \swapmacros\innersidetotal  \outersidetotal
-\to \everyswapmargins
-
-%D \macros
-%D   {definepapersize}
-%D
-%D Before we start calculating layout dimensions, we will
-%D first take care of paper sizes. The first argument can be
-%D either an assignment (for defaults) or an identifier, in
-%D which case the second argument is an assignment.
-%D
-%D \showsetup{definepapersize}
-
-\def\definepapersize
-  {\dodoubleempty\dodefinepapersize}
-
-\def\definepapersize
-  {\dotripleempty\dodefinepapersize}
-
-\def\dodefinepapersize[#1][#2][#3]%
-  {\ifsecondargument
-     \doifsomething{#1} % to be sure
-       {\doifassignmentelse{#2}
-          {\getparameters
-             [\??pp#1] % geen \c!scale, scheelt hash ruimte
-             [\c!width=\@@ppwidth,\c!height=\@@ppheight,\c!offset=\@@ppoffset,#2]}
-          {\setvalue{\??pp:1:#1}{#2}%
-           \setvalue{\??pp:2:#1}{#3}}}%
-   \else
-     \getparameters[\??pp][#1]%
-     \setuppapersize % hm. this will freeze !
-   \fi}
-
-%D For the moment we need to fake this macro.
-
-\ifx\setuppapersize\undefined
-  \let\setuppapersize\relax
-\fi
-
-%D We set the defaults to the dimensions of an A4 sheet of
-%D paper.
-
-\definepapersize
-  [\c!width=210mm,\c!height=297mm,\c!offset=\!!zeropoint]
-
-%D Yet undocumented, let's see if it gets noticed.
-%D
-%D \starttyping
-%D \definepapersize[main] [A4]          [A4]
-%D \definepapersize[extra][A4,landscape][A4,landscape]
-%D
-%D \starttext
-%D     \setuppapersize[main]
-%D     Page 1. \page
-%D     Page 2. \page
-%D     \setuppapersize[extra]
-%D     Page 2 \page
-%D     \setuppapersize[main]
-%D     Page 3. \page
-%D     Page 4. \page
-%D     \adaptpapersize[extra]
-%D     Page 5. \page
-%D     Page 6. \page
-%D \stoptext
-%D \stoptyping
-
-%D \macros
-%D   {setuppaper,setuppapersize}
-%D
-%D When setting up the papersize on which to typeset and
-%D print, we can also determine some more characteristics.
-%D
-%D \showsetup{setuppapersize}
-%D
-%D We keep track of these features with the following
-%D variables.
-
-\chardef\papermirror     =0  \chardef\printmirror     =0
-\chardef\paperorientation=0  \chardef\printorientation=0 % beware: later no chardef
-\chardef\paperreverse    =0  \chardef\printreverse    =0
-\chardef\paperlandscape  =0  \chardef\printlandscape  =0
-
-\let\papersize\empty \let\printpapersize\empty
-
-\def\paperscale{1} \newif\ifnegateprintbox
-
-\def\setuppaper[#1]%
-  {\getparameters[\??pp][\c!paper=,\c!page=,#1]%
-   \edef\@@ppxy{\the\numexpr\@@ppnx*\@@ppny\relax}%
-   \doifelsenothing\@@pppage
-     {\doifelsenothing\@@pppaper
-        {} % {\setuppapersize} % added, removed, no need for, too tricky, mag-01 (fixed by freezing pp's)
-        {\dodosetuppapersize[\papersize][\@@pppaper]}}
-     {\doifelsenothing\@@pppaper
-        {\dodosetuppapersize[\@@pppage][\printpapersize]}
-        {\dodosetuppapersize[\@@pppage][\@@pppaper]}}}
-
-\def\setuppapersize
-  {\dodoubleempty\dosetuppapersize}
-
-\def\dosetuppapersize[#1][#2]%
-  {\doifassignmentelse{#1}
-     {\setuppaper[#1]}
-     {\doifelsenothing{#2}
-        {\expanded{\dodosetuppapersize
-           [\executeifdefined{\??pp:1:#1}{#1}]%
-           [\executeifdefined{\??pp:2:#1}{}]}}
-        {\doifassignmentelse{#2}
-           {\getparameters[\??pp\executeifdefined{\??pp:1:#1}{#1}][#2]}
-           {\expanded{\dodosetuppapersize
-              [\executeifdefined{\??pp:1:#1}{#1}]%
-              [\executeifdefined{\??pp:1:#2}{#2}]}}}}}
-
-\let\reinstatepapersize\relax
-
-\def\adaptpapersize
-  {\global\let\reinstatepapersize\restorepapersize
-   \setuppapersize}
-
-\appendtoks
-  \reinstatepapersize
-  \global\let\reinstatepapersize\relax
-\to \everyaftershipout
-
-\def\dodosetuppapersize[#1][#2]%
-  {\ifsecondargument
-     \expanded{\dododosetuppapersize[#1][#2]}%
-     \calculatehsizes
-     \calculatevsizes
-     \recalculatelogos
-     \recalculatebackgrounds
-     \recalculatelayout
-   \else\iffirstargument
-     \setuppapersize[#1][#2]%
-   \else\ifx\papersize\undefined\else
-     \restorepapersize
-   \fi\fi\fi}
-
-% dimen freeze is a bit tricky, but catches local redundant calls
-% with values where e.g width is defined in terms of \paperwidth
-
-\def\dododosetuppapersize[#1][#2]%
-  {\xdef\restorepapersize{\noexpand\setuppapersize[#1][#2]}%
-   \dosetuppaperorientation{#1}\paperlandscape\paperorientation\paperreverse\papermirror
-   \dosetuppaperorientation{#2}\printlandscape\printorientation\printreverse\printmirror
-   \def\docommand##1%
-     {\doifsomething{##1}{\doifdefined{\??pp##1\c!width}
-        {\global\paperwidth \getvalue{\??pp##1\c!width}%
-         \global\paperheight\getvalue{\??pp##1\c!height}%
-\ifinpagebody
-  \setevalue{\??pp##1\c!height}{\the\paperheight}%
-  \setevalue{\??pp##1\c!width }{\the\paperwidth }%
-\fi
-         \calculatepaperoffsets{##1}%
-         \xdef\papersize{##1}}}}%
-   \processcommacommand[#1]\docommand
-   \doifdefinedelse{\??pp#1\c!scale}
-     {\edef\paperscale{\getvalue{\??pp#1\c!scale}}}
-     {\edef\paperscale{1}}%
-   \def\docommand##1%
-     {\doifsomething{##1}{\doifdefined{\??pp##1\c!width}
-        {\global\printpaperwidth \getvalue{\??pp##1\c!width}%
-         \global\printpaperheight\getvalue{\??pp##1\c!height}%
-\ifinpagebody
-  \setevalue{\??pp##1\c!height}{\the\printpaperheight}%
-  \setevalue{\??pp##1\c!width }{\the\printpaperwidth}%
-\fi
-         \xdef\printpapersize{##1}}}}%
-   \processcommacommand[#2]\docommand
-   \global\setdimentoatleast\paperwidth      \onepoint
-   \global\setdimentoatleast\paperheight     \onepoint
-   \global\setdimentoatleast\printpaperwidth \onepoint
-   \global\setdimentoatleast\printpaperheight\onepoint
-   \ifcase\paperlandscape\else
-     \doglobal\swapdimens\paperwidth\paperheight
-   \fi
-   \ifcase\printlandscape\else
-     \doglobal\swapdimens\printpaperwidth\printpaperheight
-   \fi
-   % this check can be confusing, so we've added the possibility
-   % to bypass this test: \setuppapersize[option=fit]
-   \doif\@@ppoption\v!max % \v!fit is
-     {\bgroup
-      % we need to pre-swap else we get the wrong paper size
-      \ifcase\paperorientation\else
-        \doifinset\paperorientation{90,270}{\swapdimens\paperwidth\paperheight}%
-      \fi
-      \ifcase\printorientation\else
-        \doifinset\printorientation{90,270}{\swapdimens\printpaperwidth\printpaperheight}%
-      \fi
-      \ifdim\paperheight>\printpaperheight
-        \global\printpaperheight\paperheight
-        \writestatus\m!systems{print height forced to paper height}%
-      \fi
-      \ifdim\paperwidth>\printpaperwidth
-        \global\printpaperwidth\paperwidth
-        \writestatus\m!systems{print width forced to paper width}%
-      \fi
-      \egroup}}
-
-\def\dosetuppaperorientation#1#2#3#4#5%
-  {\global\chardef#2\zerocount
-   \global\chardef#5\zerocount
-   \globallet#3\!!zerocount
-   \globallet#4\!!zerocount
-   \global\negateprintboxfalse
-   \processallactionsinset
-     [#1]
-     [ \v!landscape=>\global\chardef#2\plusone,
-        \v!mirrored=>\global\chardef#5\plusone,
-         \v!rotated=>\gdef#3{90}\gdef#4{270},
-        \v!negative=>\global\negateprintboxtrue,
-                 90=>\gdef#3{90}\gdef#4{270},
-                180=>\gdef#3{180}\gdef#4{0},
-                270=>\gdef#3{270}\gdef#4{90}]}
-
-\ifx\calculatepaperoffsets\undefined
-
-  \def\calculatepaperoffsets#1%
-    {\scratchdimen\getvalue{\??pp#1\c!offset}%
-     \global\advance\paperwidth -2\scratchdimen
-     \global\advance\paperheight-2\scratchdimen}
-
-\fi
-
-\let\restorepapersize\relax
-
-\def\checkforems[#1]%
-  {\def\docommand##1%
-     {\beforesplitstring##1\at em\to\asciia
-      \doifnot\asciia{##1}
-        {\aftersplitstring\asciia\at=\to\asciia
-         \doifsomething\asciia
-           {\showmessage\m!systems{10}{##1}}}}%
-   \processcommalist[#1]\docommand}
-
-\ifx\setups\undefined \def\setups[#1]{\setdefaultpenalties} \fi
-
-% \newtoks \everybeforelayout \relax
-% \newtoks \everyafterlayout  \relax
-
-\def\recalculatelayout
-  {\doifsomething{\layoutparameter\c!page\layoutparameter\c!paper}
-     {\expanded{\dododosetuppapersize[\layoutparameter\c!page][\layoutparameter\c!paper]}}%
-   \dorecalculatelayout}
-
-\def\dorecalculatelayout
-  {%\the\everybeforelayout
-   \setups[\layoutparameter\c!preset]%
-   \global\leftmarginwidth \layoutparameter\c!leftmargin
-   \global\rightmarginwidth\layoutparameter\c!rightmargin
-   \global\leftedgewidth   \layoutparameter\c!leftedge
-   \global\rightedgewidth  \layoutparameter\c!rightedge
-   \global\headerheight    \layoutparameter\c!header
-   \global\footerheight    \layoutparameter\c!footer
-   \global\bottomheight    \layoutparameter\c!bottom
-   \global\topheight       \layoutparameter\c!top
-   \global\backspace       \layoutparameter\c!backspace
-   \global\topspace        \layoutparameter\c!topspace
-   \setlayoutdimensions % the rest of the `dimensions'
-   \doifelse\@@lygrid\v!yes\gridsnappingtrue\gridsnappingfalse
-   \ifgridsnapping
-     \setsystemmode\v!grid
-   \else
-     \resetsystemmode\v!grid
-   \fi
-   \setups[\layoutparameter\c!setups]% depends on gridsnapping !
-   \simplesetupwhitespace
-   \simplesetupblank
-   \global\cutspace\layoutparameter\c!cutspace
-   \relax
-   \doifelse{\layoutparameter\c!width}\v!middle
-     {\ifdim\cutspace=\zeropoint
-        \global\cutspace\backspace
-      \fi
-      \global\makeupwidth\dimexpr\paperwidth-\backspace-\cutspace\relax}
-     {\doifelse{\layoutparameter\c!width}\v!fit
-        {\ifdim\cutspace=\zeropoint
-           \global\cutspace\backspace
-         \fi
-         \global\makeupwidth\dimexpr\paperwidth-\cutspace\relax
-         \scratchdimen\dimexpr\backspace
-           -\leftedgewidth  -\leftedgedistance
-           -\leftmarginwidth-\leftmargindistance\relax
-         \ifdim\scratchdimen<\zeropoint
-           \scratchdimen\zeropoint
-         \fi
-         \global\advance\makeupwidth\dimexpr
-           -\rightmargindistance-\rightmarginwidth
-           -\rightedgedistance  -\rightedgewidth
-           -\scratchdimen\relax}
-        {\global\makeupwidth\layoutparameter\c!width\relax
-         \ifdim\cutspace=\zeropoint
-           \global\cutspace\dimexpr\paperwidth-\makeupwidth-\backspace\relax
-        % \else
-            % A kind of inconsistent specification, but used
-            % in for instance s-pre-19.tex; the cutspace is
-            % used only for determining some kind of right
-            % margin; don't use this in doublesided mode
-         \fi}}%
-   \scratchdimen\layoutparameter\c!bottomspace\relax
-  %\ifdim\scratchdimen=\zeropoint
-  %  \scratchdimen\topspace
-  %\fi
-   \global\bottomspace\layoutparameter\c!bottomspace\relax
-   \global\layoutlines0\number\layoutparameter\c!lines\relax % may be empty
-   \ifcase\layoutlines
-     \doifelse{\layoutparameter\c!height}\v!middle
-       {\ifdim\bottomspace=\zeropoint
-          \global\bottomspace\topspace
-        \fi
-        \global\makeupheight\dimexpr\paperheight-\topspace-\bottomspace\relax}
-       {\doifelse{\layoutparameter\c!height}\v!fit
-          {\ifdim\bottomspace=\zeropoint
-            \global\bottomspace\topspace
-           \fi
-           \global\makeupheight\dimexpr\paperheight-\bottomspace\relax
-           \scratchdimen\dimexpr\topspace-\topheight-\topdistance\relax
-           \ifdim\scratchdimen<\zeropoint
-             \scratchdimen\zeropoint
-           \fi
-           \global\advance\makeupheight\dimexpr-\bottomdistance-\bottomheight-\scratchdimen\relax}
-          {\global\makeupheight\layoutparameter\c!height\relax
-           \ifdim\bottomspace=\zeropoint
-             \global\bottomspace\dimexpr\paperheight-\makeupheight-\topspace\relax
-           \else
-             % inconsistent specification
-           \fi}}%
-   \else
-     % beware, when the bodyfont changes (switched) this will change as well; implementing
-     % a global lineheight is tricky: should we take the bodyfont interlinespace or the one set
-     % independent of the bodyfont (before or after a layout spec); way too fuzzy, so we
-     % stick to the current method (after a night of experimenting ...2003/10/13)
-     \global\makeupheight\dimexpr
-        \layoutparameter\c!lines\lineheight-\strutheight+\topskip+
-        \headerdistance+\headerheight+\footerdistance+\footerheight\relax
-   \fi
-   \backoffset\layoutparameter\c!horoffset
-   \topoffset \layoutparameter\c!veroffset
-   \global\setdimentoatleast\makeupwidth\onepoint
-   \global\setdimentoatleast\makeupheight \onepoint
-   % \checkcurrentlayout % here ?
-   % \the\everyafterlayout
-   \calculatelayoutextras
-   \calculatehsizes
-   \calculatevsizes
-   \calculatepseudocolumns
-   \checkgridsnapping
-   \recalculatelogos
-   \recalculatebackgrounds}
-
-\def\calculatepseudocolumns
-  {\global\layoutcolumns\layoutparameter\c!columns
-   \global\layoutcolumndistance\layoutparameter\c!columndistance
-   \global\layoutcolumnwidth\dimexpr\makeupwidth-\layoutcolumns\layoutcolumndistance+\layoutcolumndistance\relax
-   \global\divide\layoutcolumnwidth\layoutcolumns
-   \dorecurse\layoutcolumns
-     {\setxvalue{\??ly:c:\recurselevel}%
-        {\the\numexpr\recurselevel-\plusone\relax\dimexpr\layoutcolumnwidth+\layoutcolumndistance\relax}}}
-
-%\dorecurse\layoutcolumns
-%  {\setxvalue{\??ly:c:\recurselevel}{\the\dimexpr
-%     (\numexpr(\recurselevel-1)\dimexpr(\layoutcolumnwidth+\layoutcolumndistance))}}
-
-\def\layoutcolumnoffset#1%
-  {\executeifdefined{\??ly:c:#1}\!!zeropoint}
-
-\def\checklayout
-  {\ifdim\makeupheight=\layoutlines\lineheight \else \recalculatelayout \fi}
-
-\appendtoks \checklayout \to \everystarttext
-
-% document:
-%
-% \setuplayout[odd][state=stop] \setuplayout[even][state=stop] \setuplayout[page]
-%
-% \startstandardmakeup[page=blank] ... \stopstandardmakeup
-
-\def\changetolayout#1%
-  {%\writestatus\m!layouts{changing to layout #1}%
-   \xdef\currentlayout{#1}\recalculatelayout}
-
-\def\checkcurrentoddlayout
-  {\ifcsname\??ly\v!odd\c!state\endcsname
-     \doifvalue{\??ly\v!odd\c!state}\v!start{\changetolayout\v!odd}%
-   \fi}
-
-\def\checkcurrentevenlayout
-  {\ifcsname\??ly\v!even\c!state\endcsname
-     \doifvalue{\??ly\v!even\c!state}\v!start{\changetolayout\v!even}%
-   \fi}
-
-\ifx\lastpage\undefined \def\lastpage{1} \fi
-
-\def\reverserealfolio
-  {\ifnum\lastpage>\plusone
-     \ifnum\lastpage=\realfolio
-       \v!last
-     \else\ifnum\plusone=\realfolio
-       \v!first
-     \else
-       \the\numexpr\realfolio-\lastpage\relax
-     \fi\fi
-   \else
-     \!!zerocount
-   \fi}
-
-\def\checkcurrentlayout % public and used in naw, so keep this name
-  {\ifcsname\??ly\realfolio\c!state\endcsname
-     \doifvalue{\??ly\realfolio\c!state}\v!start{\changetolayout\realfolio}%
-   \else\ifcsname\??ly\reverserealfolio\c!state\endcsname
-     \doifvalue{\??ly\reverserealfolio\c!state}\v!start{\changetolayout\reverserealfolio}%
-   \else\ifcsname\??ly\v!current\c!state\endcsname
-     \changetolayout\v!current % no start test ?
-   \else
-     \doifoddpageelse\checkcurrentoddlayout\checkcurrentevenlayout
-   \fi\fi\fi}
-
-% testcase
-%
-% \setuppagenumbering[alternative=doublesided]
-%
-% \setuplayout         [width=11cm]
-% \definelayout [odd]  [backspace=1cm]
-% \definelayout [even] [backspace=4cm]
-% \definelayout [5]    [backspace=5cm]
-% \definelayout [6]    [backspace=5cm]
-% \definelayout [-2]   [backspace=0cm,cutspace=0cm]
-% \definelayout [last] [backspace=0cm,cutspace=0cm]
-%
-% \checkcurrentlayout \showframe
-%
-% \starttext
-%     \dorecurse{20} {\input knuth \endgraf \input tufte \endgraf}
-% \stoptext
-
-%appendtoks \checkcurrentlayout \to \everyaftershipout % no
-\appendtoks \checkcurrentlayout \to \everystarttext
-
-\appendtoks
-  \dochecknextlayout
-\to \everyaftershipout
-
-% \def\dochecknextlayout
-%   {\ifx\currentlayout\v!current
-%      % prevent redundant calculations
-%    \else
-%      \globallet\currentlayout\empty
-%      \global\letbeundefined{\??ly\v!current\c!state}%
-%      \checkcurrentlayout
-%    \fi}
-%
-% this breaks after a standardmakeup
-
-\def\dochecknextlayout{\checkcurrentlayout}
-
-\newif\ifdoublesidedprint
-
-\def\presetcenterpagebox % in \setuplayout !!!!!!!!!!!!!!!!
-  {\doublesidedprintfalse
-   \ExpandFirstAfter\processallactionsinset
-     [\@@lylocation]
-     [     \v!middle=>{\setuppapersize[\c!left=\hss,\c!right=\hss,\c!top=\vss,\c!bottom=\vss]},
-             \v!left=>{\setuppapersize[\c!left=,\c!right=\hss]},
-            \v!right=>{\setuppapersize[\c!left=\hss,\c!right=]},
-           \v!bottom=>{\setuppapersize[\c!top=\vss,\c!bottom=]},
-              \v!top=>{\setuppapersize[\c!top=,\c!bottom=\vss]},%
-      \v!doublesided=>\doublesidedprinttrue,
-      \v!singlesided=>\doublesidedprintfalse]}
-
-\def\definelayout
-  {\dodoubleargument\dodefinelayout}
-
-\def\dodefinelayout[#1][#2]%
-  {\getparameters[\??ly#1][\c!state=\v!start,#2]}
-
-\def\dodosetuplayout[#1][#2]%
-  {\ConvertToConstant\doifnot{#2}\v!reset % #2 ?
-     {\getparameters[\??ly#1][#2]%
-      \checkforems[#2]}}
-
-% global needed for non-doublesided standardmakeup
-
-\def\dosetuplayout[#1][#2]%
-  {\globallet\currentlayout\empty % new, global
-   \ifsecondargument
-     \dodosetuplayout[#1][#2]%
-   \else\iffirstargument
-     \doifassignmentelse{#1}
-       {\dodosetuplayout[][#1]}
-       {\doifnot{#1}\v!reset{\xdef\currentlayout{#1}}}% new, global
-   \fi\fi
-   \recalculatelayout
-   \checkcurrentlayout % here ?
-   \presetcenterpagebox}
-
-\def\setuplayout
-  {\dodoubleempty\dosetuplayout}
-
-\let\@@zaheight=\!!zeropoint
-
-\def\dopushpagedimensions
-  {\xdef\oldtextheight  {\the\textheight  }%
-   \xdef\oldfooterheight{\the\footerheight}%
-   \global\let\@@zaheight\@@zaheight}
-
-\def\dopoppagedimensions
-  {\global\textheight  \oldtextheight
-   \global\footerheight\oldfooterheight
-   \recalculatelayout
-   \global\let\pushpagedimensions\dopushpagedimensions
-   \global\let\poppagedimensions\relax}
-
-\let\poppagedimensions  = \relax
-\let\pushpagedimensions = \dopushpagedimensions
-
-% Elke \csname ... \endcsname wordt ook aangemaakt, dus ook
-% in een test met \doifdefined. Bij veel bladzijden kan dit
-% te veel macro's kosten. Vandaar de set \adaptedpages. Het
-% kost tijd, maar scheelt macro's.
-
-\let\adaptedpages\empty
-
-\def\adaptpagedimensions
-  {\ifx\adaptedpages\empty\else
-     \rawdoifinsetelse\realfolio\adaptedpages
-       {\getvalue{\??za\realfolio}%
-        \letbeundefined{\??za\realfolio}}
-       \donothing
-   \fi}
-
-\def\checkpagedimensions
-  {\poppagedimensions
-   \adaptpagedimensions}
-
-\def\reportpagedimensions
-  {\ifx\poppagedimensions\relax \else
-     \space\the\dimexpr\@@zaheight\relax\space-\space
-   \fi
-   \realfolio}
-
-\def\dodoadaptlayout[#1]%
-  {\getparameters[\??za][\c!height=,\c!lines=0,#1]%
-   \pushpagedimensions
-   \ifcase\@@zalines\relax
-     \showmessage\m!layouts1{\@@zaheight,\realfolio}%
-   \else
-     \showmessage\m!layouts1{\@@zalines\space\v!lines,\realfolio}%
-     \def\@@zaheight{\@@zalines\openlineheight}%
-   \fi
-   \doifelse\@@zaheight\v!max
-     {\balancedimensions\textheight\footerheight\footerheight}
-     {\balancedimensions\textheight\footerheight\@@zaheight}%
-   \ifdim\footerheight<\zeropoint
-     \global\advance\textheight \footerheight
-     \global\footerheight\zeropoint
-     \global\xdef\@@zaheight{\layoutparameter\c!footer\space(\v!max)}%
-   \fi
-   \setvsize
-   \global\pagegoal\vsize  % nog corrigeren voor insertions ?
-   \recalculatelogos
-   \recalculatebackgrounds
-   \global\let\pushpagedimensions\relax
-   \global\let\poppagedimensions\dopoppagedimensions}
-
-\def\doadaptlayout[#1][#2]%
-  {\doifelsenothing{#2}
-     {\dodoadaptlayout[#1]}
-     {\def\docommand##1%
-        {\addtocommalist{##1}\adaptedpages
-         \setgvalue{\??za##1}{\dodoadaptlayout[#2]}}%
-      \processcommalist[#1]\docommand
-      \adaptpagedimensions}}
-
-\def\adaptlayout
-  {\dodoubleempty\doadaptlayout}
-
-% describe interface
-
-%D Centering the paper area on the print area is determined
-%D by the \type {top}, \type {bottom}, \type {left} and \type
-%D {right} parameters.
-
-\def\centerpagebox#1%
-  {\printpaperwidth \paperscale\printpaperwidth
-   \printpaperheight\paperscale\printpaperheight
-   \setbox#1\vbox to \printpaperheight
-     {\@@pptop
-      \hbox to \printpaperwidth
-        {\ifdoublesidedprint
-           \doifbothsides
-             {\@@ppleft \box#1\@@ppright}
-             {\@@ppleft \box#1\@@ppright}
-             {\@@ppright\box#1\@@ppleft }%
-         \else
-              \@@ppleft \box#1\@@ppright
-         \fi}%
-      \par
-      \@@ppbottom}}
-
-\def\offsetprintbox#1%
-  {\ifdim\topoffset=\zeropoint % \relax
-     \ifdim\backoffset=\zeropoint
-       \donefalse
-     \else
-       \donetrue
-     \fi
-   \else
-     \donetrue
-   \fi
-   \ifdone
-     \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
-     \setbox#1\vbox
-       {%\forgetall
-        \offinterlineskip
-        \vskip\topoffset
-        \doifbothsides{\hskip\backoffset}{\hskip\backoffset}{\hskip-\backoffset}%
-        \box#1}%
-     \next
-   \fi}
-
-\def\replicatepagebox#1%
-  {\ifnum\@@lynx>\plusone
-     \donetrue
-   \else\ifnum\@@lyny>\plusone
-     \donetrue
-   \else
-     \donefalse
-   \fi\fi
-   \ifdone
-     \setbox#1\vbox
-       {%\forgetall
-        \offinterlineskip
-        \dorecurse\@@lyny
-          {\hbox{\dorecurse\@@lynx{\copy#1\hskip\@@lydx}\unskip}%
-           \vskip\@@lydy}
-        \unskip}%
-   \fi}
-
-\def\orientpagebodybox#1#2#3%
-  {\ifnum#2#3>\zerocount
-     \setbox#1\vbox
-       {\edef\somerotation{\ifdoublesided\ifodd\realpageno#2\else#3\fi\else#2\fi}%
-        \dorotatebox\somerotation\hbox{\box#1}}%
-   \fi}
-
-\def\orientpaperbox#1%
-  {\orientpagebodybox{#1}\paperorientation\paperreverse}
-
-\def\orientprintbox#1%
-  {\orientpagebodybox{#1}\printorientation\printreverse}
-
-\def\mirrorpagebodybox#1#2%
-  {\ifcase#2\or
-     \setbox#1\vbox
-       {\domirrorbox\vbox{\box#1}}%
-   \fi}
-
-\def\mirrorpaperbox#1%
-  {\mirrorpagebodybox{#1}\papermirror}
-
-\def\mirrorprintbox#1%
-  {\mirrorpagebodybox{#1}\printmirror}
-
-\def\scalepagebox#1%
-  {\ifdim\@@lyscale\points=\onepoint \else
-     \setbox#1\vbox
-       {\scale[\c!sx=\@@lyscale,\c!sy=\@@lyscale]{\box#1}}%
-     \paperwidth\@@lyscale\paperwidth
-     \paperheight \@@lyscale\paperheight
-   \fi}
-
-\def\negateprintbox#1%
-  {\ifnegateprintbox
-     \negatecolorbox{#1}%
-   \fi}
-
-\def\pagecutmarksymbol    {\the\realpageno}
-\def\pagecutmarklength    {.5cm}
-\let\pagecutmarktoptext    \empty
-\let\pagecutmarkbottomtext \empty
-
-\def\extrapagecutmarkbottomtext
-  {\rlap{\jobname}\hfill\currentdate\space-\space\currenttime\hfill\llap{\realfolio}}
-
-\def\makepagecutbox % #1
-  {\let\cutmarksymbol    \pagecutmarksymbol
-   \let\cutmarklength    \pagecutmarklength
-   \let\cutmarktoptext   \pagecutmarktoptext
-   \let\cutmarkbottomtext\pagecutmarkbottomtext
-   \makecutbox}
-
-\setvalue{\??ly:n:\c!marking:\v!on}%
-  {\makepagecutbox}
-
-\setvalue{\??ly:n:\c!marking:\v!page}% only at outer when nx/ny > 0
-  {\makepagecutbox}
-
-\setvalue{\??ly:n:\c!marking:\v!empty}%
-  {\let\pagecutmarksymbol\empty
-   \let\pagecutmarktoptext\empty
-   \let\pagecutmarkbottomtext\empty
-   \makepagecutbox}
-
-\setvalue{\??ly:n:\c!marking:\v!text}%
-  {\let\pagecutmarksymbol\empty
-   \let\pagecutmarkbottomtext\extrapagecutmarkbottomtext
-   \makepagecutbox}
-
-\setvalue{\??ly:c:\c!marking:\v!color}%
-  {\doaddpagecolormarks\colormarkbox}
-
-\setvalue{\??ly:c:\c!marking:\v!screen}%
-  {\doaddpagecolormarks\rastermarkbox}
-
-\def\addpagecutmarks % #1
-  {\executeifdefined{\??ly:n:\c!marking:\@@lymarking}\gobbleoneargument}
-
-\def\addpagecolormarks % #1
-  {\executeifdefined{\??ly:c:\c!marking:\@@lymarking}\gobbleoneargument}
-
-\def\doaddpagecolormarks#1#2%
-  {\makepagecutbox{#2}%
-   \ifnum\horizontalcutmarks>2 \chardef\colormarkoffset4 \fi
-   \ifnum\verticalcutmarks  >2 \chardef\colormarkoffset4 \fi
-   #1{#2}}
-
-% NOG EENS NAGAAN WANNEER NU GLOBAL EN WANNEER NIET
-
-\ifx\doifelselayoutsomeline\undefined % defined in page-txt
-    \let\doifelselayoutsomeline\secondofthreearguments
-\fi
-
-\def\calculatevsizes % global needed in \recalculatelayoutregel
-  {\redoglobal\textheight\makeupheight
-   \doifelselayoutsomeline \v!header
-     {\redoglobal\advance\textheight-\dimexpr\headerheight+\headerdistance\relax}%
-     \donothing
-   \doifelselayoutsomeline \v!footer
-     {\redoglobal\advance\textheight-\dimexpr\footerheight+\footerdistance\relax}%
-     \donothing
-   \ifzeropt\headerheight
-     \resetsystemmode\v!header
-   \else
-     \setsystemmode\v!header
-   \fi
-   \ifzeropt\footerheight
-     \resetsystemmode\v!footer
-   \else
-     \setsystemmode\v!footer
-   \fi
-   \resetglobal
-   \setvsize}
-
-\def\calculatereducedvsizes
-  {\textheight\makeupheight
-   \doifelselayoutsomeline \v!header
-     {\advance\textheight-\dimexpr\headerheight+\headerdistance\relax}%
-     {\headerheight\zeropoint
-      \setlayoutdistances}%
-   \doifelselayoutsomeline \v!footer
-     {\advance\textheight-\dimexpr\footerheight+\footerdistance\relax}%
-     {\footerheight\zeropoint
-      \setlayoutdistances}}
-
-\newdimen\innermakeupwidth  % special purpose
-\newdimen\innermakeupmargin % special purpose
-
-\chardef\innermakeupcompensation\plusone
-
-\def\compensatedinnermakeupmargin
-  {\dimexpr\ifnum\innermakeupcompensation=\plusone+\innermakeupmargin\else\zeropoint\fi\relax}
-
-\def\freezetextwidth      % \makeupwidth may be set to \textwidth
-  {\textwidth\makeupwidth % which is a tricky but valid value
-   \doifsomething{\layoutparameter\c!textwidth}
-     {\textwidth\layoutparameter\c!textwidth}%         % local
-   \global\innermakeupwidth\textwidth
-   \doifelsenothing{\layoutparameter\c!textmargin}
-     {\global\innermakeupmargin\zeropoint}
-     {\global\innermakeupmargin\layoutparameter\c!textmargin}%
-   \global\advance\innermakeupwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax
-   \advance\textwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax}   % local
-
-\def\calculatehsizes
-  {\freezetextwidth
-   \sethsize}
-
-% De onderstaande macro voert commando's uit, afhankelijk van
-% het karakter van het paginanummer.
-%
-% \doifoddpageelse{then-commando}{else-commando}
-
-%D When we start at an even page, we need to swap the layout
-%D differently. We cannot adapt the real page number, since
-%D it is used in cross referencing. The next switch is set
-%D when we start at an even page.
-
-\newif\ifshiftedrealpageno
-
-% \def\doifoddpageelse#1#2%
-%   {\ifshiftedrealpageno
-%      \ifodd\realpageno#2\else#1\fi
-%    \else
-%      \ifodd\realpageno#1\else#2\fi
-%    \fi}
-
-\def\doifoddpageelse
-  {\ifshiftedrealpageno
-     \ifodd\realpageno
-       \@EAEAEA\secondoftwoarguments
-     \else
-       \@EAEAEA\firstoftwoarguments
-     \fi
-   \else
-     \ifodd\realpageno
-       \@EAEAEA\firstoftwoarguments
-     \else
-       \@EAEAEA\secondoftwoarguments
-     \fi
-   \fi}
-
-\let\doifonevenpaginaelse\doifoddpageelse
-
-% what are those \relax'es doing there?
-
-% \def\doifbothsidesoverruled#1#2#3%
-%   {\ifdoublesided
-%      \doifoddpageelse{#2}{#3}\relax
-%    \else
-%      #1\relax
-%    \fi}
-
-% \def\doifbothsides#1#2#3%
-%   {\ifdoublesided
-%      \ifsinglesided
-%        #1\relax
-%      \else
-%        \doifoddpageelse{#2}{#3}\relax
-%      \fi
-%    \else
-%      #1\relax
-%    \fi}
-
-\def\redoifoddpageelse#1{\doifoddpageelse}
-
-\def\doifbothsidesoverruled
-  {\ifdoublesided
-     \@EA\redoifoddpageelse
-   \else
-     \@EA\firstofthreearguments
-   \fi}
-
-\def\doifbothsides
-  {\ifdoublesided
-     \ifsinglesided
-       \@EAEAEA\firstofthreearguments
-     \else
-       \@EAEAEA\redoifoddpageelse
-     \fi
-   \else
-     \@EA\firstofthreearguments
-   \fi}
-
-\newdimen\texthoffset
-
-\def\settexthoffset
-  {\doifbothsides
-     {\texthoffset\backspace}
-     {\texthoffset\backspace}
-     {\texthoffset\dimexpr\paperwidth-\backspace-\makeupwidth\relax}}
-
-\def\goleftonpage
-  {\hskip-\dimexpr\leftmargindistance+\leftmarginwidth+\leftedgedistance+\leftedgewidth\relax}
-
-\def\doifmarginswapelse#1#2%
-  {\doifbothsides{#1}{#1}{#2}}
-
-\def\swapmargins
-  {\doifmarginswapelse\relax\doswapmargins}
-
-\def\doswapmargins
-  {\let\swapmargins  \relax % to prevent local swapping
-   \let\doswapmargins\relax % to prevent local swapping
-   \the\everyswapmargins}
-
-\def\rightorleftpageaction
-  {\ifdoublesided
-     \ifsinglesided
-       \@EAEAEA\firstoftwoarguments
-     \else
-       \@EAEAEA\doifoddpageelse
-     \fi
-   \else
-     \@EA\firstoftwoarguments
-   \fi}
-
-\def\outermarginwidth   {\rightorleftpageaction\rightmarginwidth   \leftmarginwidth }
-\def\innermarginwidth   {\rightorleftpageaction\leftmarginwidth    \rightmarginwidth}
-\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance }
-\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance}
-
-\def\outeredgewidth     {\rightorleftpageaction\rightedgewidth   \leftedgewidth }
-\def\inneredgewidth     {\rightorleftpageaction\leftedgewidth    \rightedgewidth}
-\def\outeredgedistance  {\rightorleftpageaction\rightedgedistance\leftedgedistance }
-\def\inneredgedistance  {\rightorleftpageaction\leftedgedistance \rightedgedistance}
-
-\def\outerspacewidth    {\rightorleftpageaction\cutspace \backspace }
-\def\innerspacewidth    {\rightorleftpageaction\backspace\cutspace}
-
-\def\leftmargintotal    {\dimexpr\leftmarginwidth +\leftmargindistance \relax}
-\def\rightmargintotal   {\dimexpr\rightmarginwidth+\rightmargindistance\relax}
-\def\leftedgetotal      {\dimexpr\leftedgewidth   +\leftedgedistance   \relax}
-\def\rightedgetotal     {\dimexpr\rightedgewidth  +\rightedgedistance  \relax}
-
-\def\leftsidetotal      {\dimexpr\leftmarginwidth +\leftedgetotal \relax}
-\def\rightsidetotal     {\dimexpr\rightmarginwidth+\rightedgetotal\relax}
-\def\leftcombitotal     {\dimexpr\leftmargintotal +\leftedgetotal \relax}
-\def\rightcombitotal    {\dimexpr\rightmargintotal+\rightedgetotal\relax}
-
-\def\innermargintotal   {\dimexpr\innermarginwidth+\innermargindistance\relax}
-\def\outermargintotal   {\dimexpr\outermarginwidth+\outermargindistance\relax}
-\def\inneredgetotal     {\dimexpr\inneredgewidth  +\inneredgedistance  \relax}
-\def\outeredgetotal     {\dimexpr\outeredgewidth  +\outeredgedistance  \relax}
-
-\def\innercombitotal    {\dimexpr\innermargintotal+\inneredgetotal\relax}
-\def\outercombitotal    {\dimexpr\outermargintotal+\outeredgetotal\relax}
-\def\innersidetotal     {\dimexpr\innermarginwidth+\inneredgetotal\relax}
-\def\outersidetotal     {\dimexpr\outermarginwidth+\outeredgetotal\relax}
-
-%D \macros
-%D   {startlocallayout}
-%D
-%D These macros should be used with care. They permit local
-%D layouts (as used in fitting pages, see \type {page-app.tex}).
-
-%D This is kind of obsolete now that we have \type
-%D {\definelayout}, so this hack will disappear in future
-%D versions.
-
-\def\startlocallayout
-  {\globalpushmacro\restorepapersize
-   \globalpushmacro\currentlayout}
-
-\def\stoplocallayout
-  {\globalpopmacro\currentlayout
-   \globalpopmacro\restorepapersize
-   \restorepapersize
-   \setuplayout}
-
-%D \macros
-%D   {showprint, showframe, showlayout, showsetups}
-%D
-%D We predefine a couple of tracing macros.
-%D
-%D \showsetup{showprint}
-%D \showsetup{showframe}
-%D \showsetup{showlayout}
-%D \showsetup{showsetups}
-%D %showsetup{showmargins}
-
-\fetchruntimecommand \showprint   {page-run}
-\fetchruntimecommand \showframe   {page-run}
-\fetchruntimecommand \showlayout  {page-run}
-\fetchruntimecommand \showsetups  {page-run}
-\fetchruntimecommand \showmargins {page-run}
-
-%D The default dimensions are quite old and will not change.
-%D The funny fractions were introduced when we went from fixed
-%D dimensions to relative ones. Since \CONTEXT\ is a dutch
-%D package, the dimensions are based on the metric system. The
-%D asymmetrical layout is kind of handy for short
-%D quick||and||dirty stapled documents.
-%D
-%D Although valid, it is not a real good idea to use
-%D dimensions based on the \type {em} unit. First of all,
-%D since there are no fonts loaded yet, this dimension makes
-%D no sense, and second, you would loose track of values,
-%D since they could change while going to a new page,
-%D depending on the current font setting.
-
-\setuplayout
-  [             \c!topspace=.08417508418\paperheight,  %  2.5cm
-                     \c!top=\!!zeropoint,
-             \c!topdistance=\!!zeropoint,
-                  \c!header=.06734006734\paperheight,  %  2.0cm
-          \c!headerdistance=\!!zeropoint,
-                  \c!height=.84175084175\paperheight,  % 25.0cm
-          \c!footerdistance=\layoutparameter\c!headerdistance,
-                  \c!footer=.06734006734\paperheight,  %  2.0cm
-          \c!bottomdistance=\layoutparameter\c!topdistance,
-                  \c!bottom=\!!zeropoint,
-               \c!backspace=.11904761905\paperwidth, %  2.5cm
-                    \c!edge=\!!zeropoint,
-            \c!edgedistance=\layoutparameter\c!margindistance,
-                  \c!margin=.12649983170\paperwidth, %  snijwit-2*afstand
-          \c!margindistance=.02008341748\paperwidth, %  12.0pt
-                \c!leftedge=\layoutparameter\c!edge,
-        \c!leftedgedistance=\layoutparameter\c!edgedistance,
-              \c!leftmargin=\layoutparameter\c!margin,
-      \c!leftmargindistance=\layoutparameter\c!margindistance,
-                   \c!width=.71428571429\paperwidth, %  15.0cm
-     \c!rightmargindistance=\layoutparameter\c!margindistance,
-             \c!rightmargin=\layoutparameter\c!margin,
-       \c!rightedgedistance=\layoutparameter\c!edgedistance,
-               \c!rightedge=\layoutparameter\c!edge,
-               \c!veroffset=\!!zeropoint,
-             \c!bottomspace=\!!zeropoint,
-               \c!horoffset=\!!zeropoint,
-                \c!cutspace=\!!zeropoint,
-               \c!textwidth=, % dangerous option -> centered / local
-              \c!textmargin=, % dangerous option -> both sides
-            \c!textdistance=\!!zeropoint, % shift down on grid
-                   \c!style=,
-                   \c!color=,
-                 \c!marking=\v!off,
-                \c!location=, % \v!singlesided, but empty is signal
-                   \c!scale=1,
-                      \c!nx=1,
-                      \c!ny=1,
-                      \c!dx=\!!zeropoint,
-                      \c!dy=\!!zeropoint,
-                    \c!grid=\v!no,
-                  \c!preset=,
-                  \c!setups=\systemsetupsprefix\s!default,
-              \c!clipoffset=\!!zeropoint,
-                   \c!lines=0,
-                   \c!paper=, % for foxet
-                    \c!page=, % for foxet
-                 \c!columns=1,
-          \c!columndistance=\!!zeropoint]
-
-%D First we define a whole range of (DIN) papersizes,
-%D of which the A-series makes most sense. We enable checking.
-
-%D We also set some of the parameters that will be used when
-%D positioning the typeset paper onto the print paper.
-
-\setuppaper % (size) % only used in XY imposition
-  [\c!width=\zeropoint,
-   \c!height=\zeropoint,
-   \c!topspace=\zeropoint,
-   \c!backspace=\zeropoint,
-   \c!dx=\zeropoint,
-   \c!dy=\zeropoint,
-   \c!nx=1,
-   \c!ny=1,
-   \c!method=\v!normal]
-
-\setuppapersize
-  [\c!option=\v!max,
-   \c!top=,
-   \c!bottom=\vss,
-   \c!left=,
-   \c!right=\hss]
-
-\definepapersize [A0]  [\c!width=841mm,\c!height=1189mm]
-\definepapersize [A1]  [\c!width=594mm,\c!height=841mm]
-\definepapersize [A2]  [\c!width=420mm,\c!height=594mm]
-\definepapersize [A3]  [\c!width=297mm,\c!height=420mm]
-\definepapersize [A4]  [\c!width=210mm,\c!height=297mm]
-\definepapersize [A5]  [\c!width=148mm,\c!height=210mm]
-\definepapersize [A6]  [\c!width=105mm,\c!height=148mm]
-\definepapersize [A7]  [\c!width=74mm,\c!height=105mm]
-\definepapersize [A8]  [\c!width=52mm,\c!height=74mm]
-\definepapersize [A9]  [\c!width=37mm,\c!height=52mm]
-\definepapersize [A10] [\c!width=26mm,\c!height=37mm]
-
-\definepapersize [B0]  [\c!width=1000mm,\c!height=1414mm]
-\definepapersize [B1]  [\c!width=707mm,\c!height=1000mm]
-\definepapersize [B2]  [\c!width=500mm,\c!height=707mm]
-\definepapersize [B3]  [\c!width=353mm,\c!height=500mm] % [\c!width=354mm,\c!height=500mm]
-\definepapersize [B4]  [\c!width=250mm,\c!height=353mm] % [\c!width=250mm,\c!height=354mm]
-\definepapersize [B5]  [\c!width=176mm,\c!height=250mm] % [\c!width=177mm,\c!height=250mm]
-\definepapersize [B6]  [\c!width=125mm,\c!height=176mm] % [\c!width=125mm,\c!height=177mm]
-\definepapersize [B7]  [\c!width=88mm,\c!height=125mm]
-\definepapersize [B8]  [\c!width=62mm,\c!height=88mm]   % [\c!width=63mm,\c!height=88mm]
-\definepapersize [B9]  [\c!width=44mm,\c!height=62mm]   % [\c!width=44mm,\c!height=63mm]
-\definepapersize [B10] [\c!width=31mm,\c!height=44mm]
-
-\definepapersize [C0]  [\c!width=917mm,\c!height=1297mm]
-\definepapersize [C1]  [\c!width=648mm,\c!height=917mm] % [\c!width=649mm,\c!height=917mm]
-\definepapersize [C2]  [\c!width=458mm,\c!height=648mm] % [\c!width=459mm,\c!height=649mm]
-\definepapersize [C3]  [\c!width=324mm,\c!height=458mm] % [\c!width=324mm,\c!height=459mm]
-\definepapersize [C4]  [\c!width=229mm,\c!height=324mm]
-\definepapersize [C5]  [\c!width=162mm,\c!height=229mm]
-\definepapersize [C6]  [\c!width=114mm,\c!height=162mm] % [\c!width=115mm,\c!height=162mm]
-\definepapersize [C7]  [\c!width=81mm,\c!height=114mm]  % [\c!width=81mm,\c!height=115mm]
-\definepapersize [C8]  [\c!width=57mm,\c!height=81mm]
-\definepapersize [C9]  [\c!width=40mm,\c!height=57mm]
-\definepapersize [C10] [\c!width=28mm,\c!height=40mm]
-
-%D Per August 2004 the rounding of some (seldom used) sizes
-%D were corrected top the latest DIN specifications. Peter
-%D Rolf came up with these and a few more missing sizes.
-%D Watch out: spaces and slashes!
-
-\definepapersize [4 A0]  [\c!width=1682mm,\c!height=2378mm]
-\definepapersize [2 A0]  [\c!width=1189mm,\c!height=1682mm]
-\definepapersize [C6/C5] [\c!width=114mm,\c!height=229mm]
-
-%D Because there are no standardized screen sizes, we define
-%D a bunch of sizes with $4:3$ ratios. The \type {S6} size is
-%D nearly as wide as a sheet of \type {A4} paper.
-
-\definepapersize [S3] [\c!width=300pt,\c!height=225pt]
-\definepapersize [S4] [\c!width=400pt,\c!height=300pt]
-\definepapersize [S5] [\c!width=500pt,\c!height=375pt]
-\definepapersize [S6] [\c!width=600pt,\c!height=450pt]
-\definepapersize [S8] [\c!width=800pt,\c!height=600pt]
-\definepapersize [SW] [\c!width=800pt,\c!height=450pt]
-\definepapersize [SM] [\c!width=720pt,\c!height=450pt]
-
-%D These are handy too:
-
-\definepapersize [S33] [\c!width=300pt,\c!height=300pt]
-\definepapersize [S44] [\c!width=400pt,\c!height=400pt]
-\definepapersize [S55] [\c!width=500pt,\c!height=500pt]
-\definepapersize [S66] [\c!width=600pt,\c!height=600pt]
-
-%D One may wonder if \TEX\ should be used for typesetting
-%D \CDROM\ covers, but it does not hurt to have the paper size
-%D ready.
-
-\definepapersize [CD] [\c!width=120mm,\c!height=120mm]
-
-%D The next series is for our English speaking friends who
-%D decided to stick to non metric values. Thanks to Nelson
-%D Beebe for completing the inch based list.
-
-\definepapersize [letter]    [\c!width=8.5in,\c!height=11in]
-\definepapersize [ledger]    [\c!width=11in,\c!height=17in]
-\definepapersize [tabloid]   [\c!width=17in,\c!height=11in]
-
-\definepapersize [legal]     [\c!width=8.5in,\c!height=14in]
-\definepapersize [folio]     [\c!width=8.5in,\c!height=13in]
-\definepapersize [executive] [\c!width=7.25in,\c!height=10.5in]
-
-\definepapersize [A] [\c!width=8.5in,\c!height=11in] % 1 sheet
-\definepapersize [B] [\c!width=11in,\c!height=17in]  % 2 sheets
-\definepapersize [C] [\c!width=17in,\c!height=22in]  % 4 sheets
-
-%D The next set is for Tobias Burnus, who gave me the sizes.
-
-\definepapersize [envelope 9]  [\c!width=8.88in,\c!height=3.88in]
-\definepapersize [envelope 10] [\c!width=9.5in,\c!height=4.13in]
-\definepapersize [envelope 11] [\c!width=10.38in,\c!height=4.5in]
-\definepapersize [envelope 12] [\c!width=11.0in,\c!height=4.75in]
-\definepapersize [envelope 14] [\c!width=11.5in,\c!height=5.0in]
-\definepapersize [monarch]     [\c!width=7.5in,\c!height=3.88in]
-\definepapersize [check]       [\c!width=8.58in,\c!height=3.88in]
-\definepapersize [DL]          [\c!width=110mm,\c!height=220mm] % [\c!width=220mm,\c!height=110mm]
-\definepapersize [E4]          [\c!width=280mm,\c!height=400mm]
-
-%D The next three sets are supplied by Taco:
-
-\definepapersize [RA0]  [\c!width=860mm,\c!height=1220mm]
-\definepapersize [RA1]  [\c!width=610mm,\c!height=860mm]
-\definepapersize [RA2]  [\c!width=430mm,\c!height=610mm]
-\definepapersize [RA3]  [\c!width=305mm,\c!height=430mm]
-\definepapersize [RA4]  [\c!width=215mm,\c!height=305mm]
-
-%D ISO SRA (supplementary raw A) sizes:
-
-\definepapersize [SRA0]  [\c!width=900mm,\c!height=1280mm]
-\definepapersize [SRA1]  [\c!width=640mm,\c!height=900mm]
-\definepapersize [SRA2]  [\c!width=450mm,\c!height=640mm]
-\definepapersize [SRA3]  [\c!width=320mm,\c!height=450mm]
-\definepapersize [SRA4]  [\c!width=225mm,\c!height=320mm]
-
-%D Swedish thesis formats:
-
-\definepapersize [G5]  [\c!width=169mm,\c!height=239mm]
-\definepapersize [E5]  [\c!width=155mm,\c!height=220mm]
-
-%D Industry invention:
-
-\definepapersize [A3plus] [\c!width=329mm,\c!height=483mm]
-
-%D We can now default to a reasonable size. We match the print
-%D paper size with the typeset paper size. This setting should
-%D come after the first layout specification (already done).
-
-\setuppapersize
-  [A4][A4]
-
-%D A few goodies:
-
-\definepapersize
-  [oversized]
-  [ \c!width=\dimexpr\paperwidth +1.5cm\relax,
-   \c!height=\dimexpr\paperheight+1.5cm\relax]
-
-\definepapersize
-  [doublesized]
-  [ \c!width=\dimexpr \paperwidth \relax,
-   \c!height=\dimexpr2\paperheight\relax]
-
-\definepapersize
-  [doubleoversized]
-  [ \c!width=\dimexpr \paperheight+1.5cm\relax,
-   \c!height=\dimexpr2\paperwidth +1.5cm\relax]
-
-%D For orthogonality:
-
-\definepapersize
-  [undersized]
-  [ \c!width=\dimexpr\paperwidth -1.5cm\relax,
-   \c!height=\dimexpr\paperheight-1.5cm\relax]
-
-\definelayout
-  [\v!page]
-  [\c!backspace=\zeropoint,
-   \c!cutspace=\zeropoint,
-   \c!topspace=\zeropoint,
-   \c!bottomspace=\zeropoint,
-   \c!margin=\zeropoint,
-   \c!edge=\zeropoint,
-   \c!header=\zeropoint,
-   \c!footer=\zeropoint,
-   \c!top=\zeropoint,
-   \c!bottom=\zeropoint,
-   \c!leftmargin=\zeropoint,
-   \c!rightmargin=\zeropoint,
-   \c!leftedge=\zeropoint,
-   \c!rightedge=\zeropoint,
-   \c!textdistance=\zeropoint,
-   \c!width=\v!middle,
-   \c!height=\v!middle,
-   \c!lines=0,
-   \c!grid=\v!no]
-
-\definelayout
-  [\v!middle]
-  [\c!width=\v!middle,
-   \c!height=\v!middle]
-
-\protect \endinput
diff --git a/tex/context/base/page-lin.mkiv b/tex/context/base/page-lin.mkiv
index ad84fc8b2..c82d4d520 100644
--- a/tex/context/base/page-lin.mkiv
+++ b/tex/context/base/page-lin.mkiv
@@ -99,7 +99,8 @@
   {\dontleavehmode\begingroup
    \global\advance\linerefcounter\plusone
    \dosetattribute{line-reference}\linerefcounter
-   #3\rawtextreference\s!lin{#2}{\noexpand\ctxlua{tex.sprint(nodes.lines.number(\the\linerefcounter))}}%
+   % this will change and is troublesome anyway
+   #3\textreference[#2]{\noexpand\ctxlua{tex.sprint(nodes.lines.number(\the\linerefcounter))}}%
    \endgroup}
 
 \def\mkstartlinereference#1{\mksomelinereference{#1}{lr:b:#1}{}\ignorespaces}
@@ -391,8 +392,8 @@
       \doifreferencefoundelse{lr:e:#1}
         {\let\tline\currenttextreference
          \ifx\fline\tline#2\else#3\fi}
-        {#2}}
-     {#2}}
+        {\unknownreference{#1}#2}}
+     {\unknownreference{#1}#2}}
 
 \def\inline#1[#2]%
   {\doifelsenothing{#1}
diff --git a/tex/context/base/page-log.mkii b/tex/context/base/page-log.mkii
new file mode 100644
index 000000000..18c7991b1
--- /dev/null
+++ b/tex/context/base/page-log.mkii
@@ -0,0 +1,202 @@
+%D \module
+%D   [       file=page-log, % moved here from main-001
+%D        version=1997.03.31,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Logos,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Logos}
+
+\unprotect
+
+%D Although logos can conveniently be implemented on top of
+%D background and text areas, we provide a dedicated mechanism
+%D here. One reason is that such a separate mechanism cannot
+%D interfere with the other ones, but an even more important
+%D reason is that logos are kind of special in the sense that
+%D they have a short life span and may change after the first
+%D page.
+
+%D \macros
+%D  {recalculatelogos,addlogobackground}
+%D
+%D The interface to the other low level page building routines
+%D is provided by a macro that signals changes in layout
+%D specifications:
+%D
+%D \starttyping
+%D \recalculatelogos
+%D \stoptyping
+%D
+%D as well as a simple placement macro:
+%D
+%D \starttyping
+%D \addlogobackground 
+%D \stoptyping
+%D
+%D In no way the following boolean switch should be used
+%D directly.
+
+\newif\ifnewlogos
+
+\def\recalculatelogos
+  {\global\newlogostrue}
+
+%D The current state of logos is registered in a status
+%D variable \type {\logostatus}.
+%D
+%D \starttabulate[|l|l|l|]
+%D \NC 0 \NC don't place              \NC remains 0 \NC \NR
+%D \NC 1 \NC place now                \NC remains 1 \NC \NR
+%D \NC 2 \NC calulate and place       \NC becomes 1 \NC \NR
+%D \NC 3 \NC calculate and place once \NC becomes 2 \NC \NR
+%D \stoptabulate
+
+\chardef\logostatus=0
+
+\def\addlogobackground#1% todo: dimension spec
+  {\ifcase\logostatus \else
+     \ifcase\logostatus
+       % no logos to take care of
+     \or % 1
+       \ifnewlogos
+         \chardef\logostatus2
+         \setlogoboxes
+         \chardef\logostatus1
+         \global\newlogosfalse
+       \fi
+     \or % 2
+       \setlogoboxes
+       \chardef\logostatus1
+     \or % 3
+       \setlogoboxes
+       \global\chardef\logostatus2
+     \fi
+     \setbox#1\vbox
+       {\offinterlineskip
+        \doifmarginswapelse
+          {\copy\leftlogos}
+          {\copy\rightlogos}
+        \box#1}%
+   \fi}
+
+%D For efficiency reasons (and since logos seldom change inside
+%D a document) we can save the left and right hand (or first
+%D and following page) logos in boxes. The areas are slightly
+%D different from the ones used in backgrounds and text
+%D placement, but still related to the page layout. The {\em
+%D left} and {\em right edge}, as well as {\em top} and {\em
+%D bottom} touch the bounding box of the paper and are
+%D therefore not the sams as their background adn text
+%D counterparts. In addition there are {\em left}, {\em right}
+%D and {\em middle} areas as well as a {\em page} one.
+
+\newbox\leftlogos
+\newbox\rightlogos
+
+\def\setlogoboxes
+  {\showmessage\m!layouts7\empty
+   \dosetlogobox\leftlogos\relax
+   \ifdoublesided
+     \dosetlogobox\rightlogos\doswapmargins
+   \fi}
+
+\def\dosetlogobox#1#2%
+  {\global\setbox#1\vbox to \paperheight
+     {\dontcomplain           % needed here ?
+      \calculatereducedvsizes % needed here ?
+      \offinterlineskip
+      #2\relax
+      \vskip-\topspace
+      \dodosetlogobox\v!top\blap
+      \vskip\topspace
+      \dodosetlogobox\v!header\blap
+      \vskip\dimexpr\headerheight+\headerdistance\relax
+      \dodosetlogobox\v!text\blap
+      \vskip\dimexpr\textheight+\footerdistance+\footerheight\relax
+      \dodosetlogobox\v!footer \tlap
+      \vfilll
+      \dodosetlogobox\v!bottom\tlap
+      \vskip\topspace}
+  \smashbox#1}
+
+\def\dodosetlogobox#1#2%
+  {\hbox % width equals \makeupwidth
+     {\def\docommand##1%
+        {\donefalse
+         \ifnum\logostatus=3 \ExpandBothAfter
+           \doifinset{\getvalue{\??lo#1##1}}\requestedlogos\donetrue
+         \else
+           \doifvalue{\??lo#1##1\c!state}\v!start\donetrue
+         \fi
+         \ifdone
+           #2{\hbox{\getvalue{\??lo#1##1\c!command}}}%
+         \fi}%
+      \def\dodocommand##1##2##3##4##5##6%
+        {\hsmash
+           {\hskip-\texthoffset
+            \hbox to \paperwidth
+              {\rlap{\docommand##1}\hss\llap{\docommand##6}}%
+            \hskip-\paperwidth
+            \hbox to \paperwidth
+              {\hskip\texthoffset
+               \hskip-\leftmarginwidth
+               \hskip-\leftmargindistance
+               \hbox to \leftmarginwidth{\docommand##2\hss}%
+               \hskip\leftmargindistance
+               \hbox to \makeupwidth{\docommand##3\hss\docommand##4}%
+               \hskip\rightmargindistance
+               \hbox to \rightmarginwidth{\hss\docommand##5}%
+               \hfill}}}%
+      \normalbaselines
+      \settexthoffset
+      \hsmash
+        {\hbox to \makeupwidth{\hss\docommand\c!middle\hss}}%
+      \hsmash
+        {\hskip-\texthoffset
+         \hbox to \paperwidth{\docommand\v!page\hss}}%
+      \swapmargins
+      \doifbothsidesoverruled
+        {\dodocommand
+          \v!leftedge \v!leftmargin  \v!left
+          \v!right     \v!rightmargin \v!rightedge}
+        {\dodocommand
+          \v!leftedge \v!leftmargin  \v!left
+          \v!right     \v!rightmargin \v!rightedge}
+        {\dodocommand
+          \v!rightedge \v!rightmargin \v!right
+          \v!left       \v!leftmargin  \v!leftedge}}}
+
+%D The user interface is relatively simple and provides
+%D macros for assigning logos to logo areas as well as
+%D forcing placement.
+%D
+%D \showsetup{definelogo}
+%D \showsetup{placelogos}
+
+\let\definedlogos  \empty
+\let\requestedlogos\empty
+
+\long\def\dodefinelogo[#1][#2][#3][#4]%
+  {\addtocommalist{#1}\definedlogos
+   \long\setvalue{\??lo#2#3}{#1}%
+   \getparameters[\??lo#2#3][#4]%
+   \global\chardef\logostatus2 }
+
+\def\definelogo
+  {\doquadrupleargument\dodefinelogo}
+
+\def\placelogos
+  {\dosingleempty\doplacelogos}
+
+\def\doplacelogos[#1]%
+  {\xdef\requestedlogos{\iffirstargument#1\else\definedlogos\fi}%
+   \global\chardef\logostatus3 }
+
+\protect \endinput
diff --git a/tex/context/base/page-log.tex b/tex/context/base/page-log.tex
deleted file mode 100644
index e52c36288..000000000
--- a/tex/context/base/page-log.tex
+++ /dev/null
@@ -1,218 +0,0 @@
-%D \module
-%D   [       file=page-log, % moved here from main-001
-%D        version=1997.03.31,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Logos,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Logos}
-
-\unprotect
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-%D Although logos can conveniently be implemented on top of
-%D background and text areas, we provide a dedicated mechanism
-%D here. One reason is that such a separate mechanism cannot
-%D interfere with the other ones, but an even more important
-%D reason is that logos are kind of special in the sense that
-%D they have a short life span and may change after the first
-%D page.
-
-%D \macros
-%D  {recalculatelogos,addlogobackground}
-%D
-%D The interface to the other low level page building routines
-%D is provided by a macro that signals changes in layout
-%D specifications:
-%D
-%D \starttyping
-%D \recalculatelogos
-%D \stoptyping
-%D
-%D as well as a simple placement macro:
-%D
-%D \starttyping
-%D \addlogobackground 
-%D \stoptyping
-%D
-%D In no way the following boolean switch should be used
-%D directly.
-
-\newif\ifnewlogos
-
-\def\recalculatelogos
-  {\global\newlogostrue}
-
-%D The current state of logos is registered in a status
-%D variable \type {\logostatus}.
-%D
-%D \starttabulate[|l|l|l|]
-%D \NC 0 \NC don't place              \NC remains 0 \NC \NR
-%D \NC 1 \NC place now                \NC remains 1 \NC \NR
-%D \NC 2 \NC calulate and place       \NC becomes 1 \NC \NR
-%D \NC 3 \NC calculate and place once \NC becomes 2 \NC \NR
-%D \stoptabulate
-
-\chardef\logostatus=0
-
-\def\addlogobackground#1% todo: dimension spec
-  {\ifcase\logostatus \else
-     \ifcase\logostatus
-       % no logos to take care of
-     \or % 1
-       \ifnewlogos
-         \chardef\logostatus2
-         \setlogoboxes
-         \chardef\logostatus1
-         \global\newlogosfalse
-       \fi
-     \or % 2
-       \setlogoboxes
-       \chardef\logostatus1
-     \or % 3
-       \setlogoboxes
-       \global\chardef\logostatus2
-     \fi
-     \setbox#1\vbox
-       {\offinterlineskip
-        \doifmarginswapelse
-          {\copy\leftlogos}
-          {\copy\rightlogos}
-        \box#1}%
-   \fi}
-
-%D For efficiency reasons (and since logos seldom change inside
-%D a document) we can save the left and right hand (or first
-%D and following page) logos in boxes. The areas are slightly
-%D different from the ones used in backgrounds and text
-%D placement, but still related to the page layout. The {\em
-%D left} and {\em right edge}, as well as {\em top} and {\em
-%D bottom} touch the bounding box of the paper and are
-%D therefore not the sams as their background adn text
-%D counterparts. In addition there are {\em left}, {\em right}
-%D and {\em middle} areas as well as a {\em page} one.
-
-\newbox\leftlogos
-\newbox\rightlogos
-
-\def\setlogoboxes
-  {\showmessage\m!layouts7\empty
-   \dosetlogobox\leftlogos\relax
-   \ifdoublesided
-     \dosetlogobox\rightlogos\doswapmargins
-   \fi}
-
-\def\dosetlogobox#1#2%
-  {\global\setbox#1\vbox to \paperheight
-     {\dontcomplain           % needed here ?
-      \calculatereducedvsizes % needed here ?
-      \offinterlineskip
-      #2\relax
-      \vskip-\topspace
-      \dodosetlogobox\v!top\blap
-      \vskip\topspace
-      \dodosetlogobox\v!header\blap
-      \vskip\dimexpr\headerheight+\headerdistance\relax
-      \dodosetlogobox\v!text\blap
-      \vskip\dimexpr\textheight+\footerdistance+\footerheight\relax
-      \dodosetlogobox\v!footer \tlap
-      \vfilll
-      \dodosetlogobox\v!bottom\tlap
-      \vskip\topspace}
-  \smashbox#1}
-
-\def\dodosetlogobox#1#2%
-  {\hbox % width equals \makeupwidth
-     {\def\docommand##1%
-        {\donefalse
-         \ifnum\logostatus=3 \ExpandBothAfter
-           \doifinset{\getvalue{\??lo#1##1}}\requestedlogos\donetrue
-         \else
-           \doifvalue{\??lo#1##1\c!state}\v!start\donetrue
-         \fi
-         \ifdone
-           #2{\hbox{\getvalue{\??lo#1##1\c!command}}}%
-         \fi}%
-      \def\dodocommand##1##2##3##4##5##6%
-        {\hsmash
-           {\hskip-\texthoffset
-            \hbox to \paperwidth
-              {\rlap{\docommand##1}\hss\llap{\docommand##6}}%
-            \hskip-\paperwidth
-            \hbox to \paperwidth
-              {\hskip\texthoffset
-               \hskip-\leftmarginwidth
-               \hskip-\leftmargindistance
-               \hbox to \leftmarginwidth{\docommand##2\hss}%
-               \hskip\leftmargindistance
-               \hbox to \makeupwidth{\docommand##3\hss\docommand##4}%
-               \hskip\rightmargindistance
-               \hbox to \rightmarginwidth{\hss\docommand##5}%
-               \hfill}}}%
-      \normalbaselines
-      \settexthoffset
-      \hsmash
-        {\hbox to \makeupwidth{\hss\docommand\c!middle\hss}}%
-      \hsmash
-        {\hskip-\texthoffset
-         \hbox to \paperwidth{\docommand\v!page\hss}}%
-      \swapmargins
-      \doifbothsidesoverruled
-        {\dodocommand
-          \v!leftedge \v!leftmargin  \v!left
-          \v!right     \v!rightmargin \v!rightedge}
-        {\dodocommand
-          \v!leftedge \v!leftmargin  \v!left
-          \v!right     \v!rightmargin \v!rightedge}
-        {\dodocommand
-          \v!rightedge \v!rightmargin \v!right
-          \v!left       \v!leftmargin  \v!leftedge}}}
-
-%D The user interface is relatively simple and provides
-%D macros for assigning logos to logo areas as well as
-%D forcing placement.
-%D
-%D \showsetup{definelogo}
-%D \showsetup{placelogos}
-
-\let\definedlogos  \empty
-\let\requestedlogos\empty
-
-\long\def\dodefinelogo[#1][#2][#3][#4]%
-  {\addtocommalist{#1}\definedlogos
-   \long\setvalue{\??lo#2#3}{#1}%
-   \getparameters[\??lo#2#3][#4]%
-   \global\chardef\logostatus2 }
-
-\def\definelogo
-  {\doquadrupleargument\dodefinelogo}
-
-\def\placelogos
-  {\dosingleempty\doplacelogos}
-
-\def\doplacelogos[#1]%
-  {\xdef\requestedlogos{\iffirstargument#1\else\definedlogos\fi}%
-   \global\chardef\logostatus3 }
-
-\protect \endinput
diff --git a/tex/context/base/page-mak.mkii b/tex/context/base/page-mak.mkii
new file mode 100644
index 000000000..040feb1d2
--- /dev/null
+++ b/tex/context/base/page-mak.mkii
@@ -0,0 +1,234 @@
+%D \module
+%D   [       file=page-mak, % copied from main-001,
+%D        version=1997.03.31,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Simple MakeUp,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / MakeUp}
+
+\unprotect
+
+%D \macros
+%D   {definemakeup, setupmakeup, startmakeup}
+%D
+%D A makeup is a separate page, like a title page or colofon.
+%D There is one standard makeup page, but you can define more
+%D if needed.
+%D
+%D \starttyping
+%D \startstandardmakeup
+%D   My Fancy Title
+%D \stopstandardmakeup
+%D \stoptyping
+%D
+%D The associated commands are:
+%D
+%D \showsetup{definemakeup}
+%D \showsetup{setupmakeup}
+%D \showsetup{startmakeup}
+
+\def\definemakeup
+  {\dodoubleargument\dodefinemakeup}
+
+\def\dodefinemakeup[#1][#2]%
+  {\getparameters
+     [\??do#1]%
+     [\c!width=\innermakeupwidth,  % example in manual / was \makeupwidth
+      \c!height=\textheight,       % example in manual
+      \c!voffset=\!!zeropoint,     % example in manual
+      \c!hoffset=\!!zeropoint,     % example in manual
+      \c!commands=,
+      \c!setups=,
+      \c!page=\v!right,
+      \c!doublesided=\v!empty,
+      \c!before=,
+      \c!top=\vss,
+      \c!bottom=\vss,
+      \c!after=,
+      \c!bottomstate=\v!normal,
+      \c!topstate=\v!normal,
+      \c!textstate=\v!normal,
+      \c!headerstate=\v!stop,
+      \c!footerstate=\v!stop,
+      \c!pagestate=\v!stop, % in manual ! ! !
+      \c!color=,
+      \c!align=,
+      #2]%
+   \setvalue{\e!start#1\e!makeup}{\startmakeup[#1]}%
+   \setvalue{\e!stop #1\e!makeup}{\stopmakeup}}
+
+\def\setupmakeup
+  {\dodoubleargument\dosetupmakeup}
+
+\def\dosetupmakeup[#1]%
+  {\getparameters[\??do#1]}
+
+%D This will save us some 375 bytes in the format file.
+
+\def\makeupparameter#1{\getvalue{\??do\currentmakeup#1}}
+
+%D The \type{\start}||\type{\stop} macros are used for both
+%D the direct and indirect way. The parameterless call will
+%D build a simple box.
+
+\newtoks\everymakeup
+
+\appendtoks \postponemarks \to \everymakeup
+
+\let\currentmakeup\empty
+
+\def\startmakeup
+  {\dodoubleempty\dostartmakeup}
+
+\def\dostartmakeup[#1][#2]%
+  {\bgroup
+   \edef\currentmakeup{#1}%
+   \the\everymakeup
+   \iffirstargument
+     \setupmakeup[\currentmakeup][#2]%
+     \let\stopmakeup\dodostopmakeup
+     \expandafter   \dodostartmakeup
+   \else
+     \let\stopmakeup\donostopmakeup
+     \expandafter   \donostartmakeup
+   \fi}
+
+%D The simple case:
+
+\def\donostartmakeup % textwidth ?
+  {\page
+   \setupheader[\c!state=\v!empty]%
+   \setupfooter[\c!state=\v!empty]%
+   \setsystemmode\v!makeup
+   \vbox to \textheight\bgroup\hsize\textwidth}
+
+\def\donostopmakeup
+  {\egroup
+   \flushmarks % new, here, else empty pages
+   \page
+   \egroup}
+
+%D The normal one:
+
+\newbox\makeupbox
+
+\def\dodostartmakeup
+  {\doifvaluesomething{\??do\currentmakeup\c!page}
+     {\ExpandFirstAfter\page[\makeupparameter\c!page]}%
+   \pagetype[\currentmakeup]%
+   \setsystemmode\v!makeup
+   \setupmakeuplayout
+   \makeupparameter\c!commands % hm, what is this one doing here ?
+   \startregistercolor[\makeupparameter\c!color]%
+   \forgetall % else indented flush
+   \global\setbox\makeupbox\vbox to \makeupparameter\c!height
+     \bgroup
+%        \forgetall
+       \setups[\makeupparameter\c!setups]%
+       \hsize\makeupparameter\c!width
+       \doifsomething{\makeupparameter\c!align}
+         {\setupalign[\makeupparameter\c!align]}%
+       \makeupparameter\c!top}
+
+\def\dodostopmakeup
+  {\endgraf
+   \makeupparameter\c!bottom
+   \egroup
+   \flushmarks % new, here, else empty pages
+   \stopregistercolor
+   \doflushmakeup
+   \egroup
+   \calculatehsizes
+   \calculatevsizes}
+
+%D Selective page processing is handled here. (Why?)
+
+\def\doflushmakeup
+  {\ifprocessingpages
+     \ifpageselected
+       \doshipoutmakeup
+     \fi
+   \else
+     \ifpageselected \else
+       \doshipoutmakeup
+     \fi
+   \fi
+   \ifselectingpages
+     \global\pageselectedfalse
+   \fi}
+
+% \def\pushpagestate{\globalpushmacro\@@pnstate}
+% \def\poppagestate {\globalpopmacro \@@pnstate}
+
+\def\doshipoutmakeup
+  {\pushpagestate % new
+   \makeupparameter\c!before
+   \setbox\makeupbox\vbox{\hbox{\color[\makeupparameter\c!color]{\box\makeupbox}}}%
+   % \ifgridsnapping
+   % new per 22/6/2006
+     \ifdim\ht\makeupbox>\vsize
+       \ht\makeupbox\vsize
+     \fi
+   % \fi
+   \box\makeupbox
+   \setuppagenumber[\c!state=\makeupparameter\c!pagestate]%
+   \setupmakeuplayout
+   \page
+   \makeupparameter\c!after
+   \relax % voor fi
+   \ifdoublesided \ifodd\realpageno\else
+     \processaction
+       [\makeupparameter\c!doublesided]
+       [  \v!yes=>\null
+                  \page,
+        \v!empty=>{\setupmakeuplayout
+                  \page[\v!blank]%
+                  \null
+                  \page}]%
+   \fi \fi
+   \poppagestate} % new
+
+%D The text surrounding the main body text can be influenced
+%D by setting their associated status variables. The
+%D connection between them is made by the following macro
+
+\def\setupmakeuplayout
+  {\setupfooter[\c!state=\makeupparameter\c!footerstate]%
+   \setupheader[\c!state=\makeupparameter\c!headerstate]%
+   \setuptext  [\c!state=\makeupparameter\c!textstate]%
+   \setupbottom[\c!state=\makeupparameter\c!bottomstate]%
+   \setuptop   [\c!state=\makeupparameter\c!topstate]%
+   % this is needed, but no \setuplayout here; fails in texexec --fig=c
+   \recalculatelayout}
+
+%D The standard page template is defined as follows:
+
+\definemakeup
+  [\v!standard]
+  [\c!width=\innermakeupwidth,
+   \c!height=\textheight,
+   \c!voffset=\!!zeropoint,
+   \c!hoffset=\!!zeropoint,
+   \c!page=\v!right,
+   \c!doublesided=\v!empty]
+
+\definemakeup
+  [\v!text]
+  [\c!topstate=\v!start,
+   \c!headerstate=\v!start,
+   \c!textstate=\v!start,
+   \c!footerstate=\v!start,
+   \c!bottomstate=\v!start,
+   \c!doublesided=\v!no,
+   \c!page=\v!yes,
+   \c!top=\pseudostrut\ignorespaces,
+   \c!bottom=\obeydepth\vss]
+
+\protect \endinput
diff --git a/tex/context/base/page-mak.mkiv b/tex/context/base/page-mak.mkiv
new file mode 100644
index 000000000..45a1f1167
--- /dev/null
+++ b/tex/context/base/page-mak.mkiv
@@ -0,0 +1,233 @@
+%D \module
+%D   [       file=page-mak, % copied from main-001,
+%D        version=1997.03.31,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Simple MakeUp,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / MakeUp}
+
+\unprotect
+
+%D \macros
+%D   {definemakeup, setupmakeup, startmakeup}
+%D
+%D A makeup is a separate page, like a title page or colofon.
+%D There is one standard makeup page, but you can define more
+%D if needed.
+%D
+%D \starttyping
+%D \startstandardmakeup
+%D   My Fancy Title
+%D \stopstandardmakeup
+%D \stoptyping
+%D
+%D The associated commands are:
+%D
+%D \showsetup{definemakeup}
+%D \showsetup{setupmakeup}
+%D \showsetup{startmakeup}
+
+\def\definemakeup
+  {\dodoubleargument\dodefinemakeup}
+
+\def\dodefinemakeup[#1][#2]%
+  {\getparameters
+     [\??do#1]%
+     [\c!width=\innermakeupwidth,  % example in manual / was \makeupwidth
+      \c!height=\textheight,       % example in manual
+      \c!voffset=\!!zeropoint,     % example in manual
+      \c!hoffset=\!!zeropoint,     % example in manual
+      \c!commands=,
+      \c!setups=,
+      \c!page=\v!right,
+      \c!doublesided=\v!empty,
+      \c!before=,
+      \c!top=\vss,
+      \c!bottom=\vss,
+      \c!after=,
+      \c!bottomstate=\v!normal,
+      \c!topstate=\v!normal,
+      \c!textstate=\v!normal,
+      \c!headerstate=\v!stop,
+      \c!footerstate=\v!stop,
+      \c!pagestate=\v!stop, % in manual ! ! !
+      \c!color=,
+      \c!align=,
+      #2]%
+   \setvalue{\e!start#1\e!makeup}{\startmakeup[#1]}%
+   \setvalue{\e!stop #1\e!makeup}{\stopmakeup}}
+
+\def\setupmakeup
+  {\dodoubleargument\dosetupmakeup}
+
+\def\dosetupmakeup[#1]%
+  {\getparameters[\??do#1]}
+
+%D This will save us some 375 bytes in the format file.
+
+\def\makeupparameter#1{\getvalue{\??do\currentmakeup#1}}
+
+%D The \type{\start}||\type{\stop} macros are used for both
+%D the direct and indirect way. The parameterless call will
+%D build a simple box.
+
+\newtoks\everymakeup
+
+\appendtoks \postponemarks \to \everymakeup
+
+\let\currentmakeup\empty
+
+\def\startmakeup
+  {\dodoubleempty\dostartmakeup}
+
+\def\dostartmakeup[#1][#2]%
+  {\bgroup
+   \edef\currentmakeup{#1}%
+   \the\everymakeup
+   \iffirstargument
+     \setupmakeup[\currentmakeup][#2]%
+     \let\stopmakeup\dodostopmakeup
+     \expandafter   \dodostartmakeup
+   \else
+     \let\stopmakeup\donostopmakeup
+     \expandafter   \donostartmakeup
+   \fi}
+
+%D The simple case:
+
+\def\donostartmakeup % textwidth ?
+  {\page
+   \setupheader[\c!state=\v!empty]%
+   \setupfooter[\c!state=\v!empty]%
+   \setsystemmode\v!makeup
+   \vbox to \textheight\bgroup\hsize\textwidth}
+
+\def\donostopmakeup
+  {\egroup
+   \flushmarks % new, here, else empty pages
+   \page
+   \egroup}
+
+%D The normal one:
+
+\newbox\makeupbox
+
+\def\dodostartmakeup
+  {\doifvaluesomething{\??do\currentmakeup\c!page}
+     {\ExpandFirstAfter\page[\makeupparameter\c!page]}%
+   \pagetype[\currentmakeup]%
+   \setsystemmode\v!makeup
+   \setupmakeuplayout
+   \makeupparameter\c!commands % hm, what is this one doing here ?
+   \startregistercolor[\makeupparameter\c!color]%
+   \forgetall % else indented flush
+   \global\setbox\makeupbox\vbox to \makeupparameter\c!height
+     \bgroup
+       \setups[\makeupparameter\c!setups]%
+       \hsize\makeupparameter\c!width
+       \doifsomething{\makeupparameter\c!align}
+         {\setupalign[\makeupparameter\c!align]}%
+       \makeupparameter\c!top}
+
+\def\dodostopmakeup
+  {\endgraf
+   \makeupparameter\c!bottom
+   \egroup
+   \flushmarks % new, here, else empty pages
+   \stopregistercolor
+   \doflushmakeup
+   \egroup
+   \calculatehsizes
+   \calculatevsizes}
+
+%D Selective page processing is handled here. (Why?)
+
+\def\doflushmakeup
+  {\ifprocessingpages
+     \ifpageselected
+       \doshipoutmakeup
+     \fi
+   \else
+     \ifpageselected \else
+       \doshipoutmakeup
+     \fi
+   \fi
+   \ifselectingpages
+     \global\pageselectedfalse
+   \fi}
+
+% \def\pushpagestate{\globalpushmacro\@@pnstate}
+% \def\poppagestate {\globalpopmacro \@@pnstate}
+
+\def\doshipoutmakeup
+  {\pushpagestate % new
+   \makeupparameter\c!before
+   \setbox\makeupbox\vbox{\hbox{\color[\makeupparameter\c!color]{\box\makeupbox}}}%
+   % \ifgridsnapping
+   % new per 22/6/2006
+     \ifdim\ht\makeupbox>\vsize
+       \ht\makeupbox\vsize
+     \fi
+   % \fi
+   \box\makeupbox
+   \setuppagenumber[\c!state=\makeupparameter\c!pagestate]%
+   \setupmakeuplayout
+   \page
+   \makeupparameter\c!after
+   \relax % voor fi
+   \ifdoublesided \ifodd\realpageno\else
+     \processaction
+       [\makeupparameter\c!doublesided]
+       [  \v!yes=>\null
+                  \page,
+        \v!empty=>{\setupmakeuplayout
+                  \page[\v!blank]%
+                  \null
+                  \page}]%
+   \fi \fi
+   \poppagestate} % new
+
+%D The text surrounding the main body text can be influenced
+%D by setting their associated status variables. The
+%D connection between them is made by the following macro
+
+\def\setupmakeuplayout
+  {\setupfooter[\c!state=\makeupparameter\c!footerstate]%
+   \setupheader[\c!state=\makeupparameter\c!headerstate]%
+   \setuptext  [\c!state=\makeupparameter\c!textstate]%
+   \setupbottom[\c!state=\makeupparameter\c!bottomstate]%
+   \setuptop   [\c!state=\makeupparameter\c!topstate]%
+   % this is needed, but no \setuplayout here; fails in texexec --fig=c
+   \recalculatelayout}
+
+%D The standard page template is defined as follows:
+
+\definemakeup
+  [\v!standard]
+  [\c!width=\innermakeupwidth,
+   \c!height=\textheight,
+   \c!voffset=\!!zeropoint,
+   \c!hoffset=\!!zeropoint,
+   \c!page=\v!right,
+   \c!doublesided=\v!empty]
+
+\definemakeup
+  [\v!text]
+  [\c!topstate=\v!start,
+   \c!headerstate=\v!start,
+   \c!textstate=\v!start,
+   \c!footerstate=\v!start,
+   \c!bottomstate=\v!start,
+   \c!doublesided=\v!no,
+   \c!page=\v!yes,
+   \c!top=\pseudostrut\ignorespaces,
+   \c!bottom=\obeydepth\vss]
+
+\protect \endinput
diff --git a/tex/context/base/page-mak.tex b/tex/context/base/page-mak.tex
deleted file mode 100644
index 040feb1d2..000000000
--- a/tex/context/base/page-mak.tex
+++ /dev/null
@@ -1,234 +0,0 @@
-%D \module
-%D   [       file=page-mak, % copied from main-001,
-%D        version=1997.03.31,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Simple MakeUp,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / MakeUp}
-
-\unprotect
-
-%D \macros
-%D   {definemakeup, setupmakeup, startmakeup}
-%D
-%D A makeup is a separate page, like a title page or colofon.
-%D There is one standard makeup page, but you can define more
-%D if needed.
-%D
-%D \starttyping
-%D \startstandardmakeup
-%D   My Fancy Title
-%D \stopstandardmakeup
-%D \stoptyping
-%D
-%D The associated commands are:
-%D
-%D \showsetup{definemakeup}
-%D \showsetup{setupmakeup}
-%D \showsetup{startmakeup}
-
-\def\definemakeup
-  {\dodoubleargument\dodefinemakeup}
-
-\def\dodefinemakeup[#1][#2]%
-  {\getparameters
-     [\??do#1]%
-     [\c!width=\innermakeupwidth,  % example in manual / was \makeupwidth
-      \c!height=\textheight,       % example in manual
-      \c!voffset=\!!zeropoint,     % example in manual
-      \c!hoffset=\!!zeropoint,     % example in manual
-      \c!commands=,
-      \c!setups=,
-      \c!page=\v!right,
-      \c!doublesided=\v!empty,
-      \c!before=,
-      \c!top=\vss,
-      \c!bottom=\vss,
-      \c!after=,
-      \c!bottomstate=\v!normal,
-      \c!topstate=\v!normal,
-      \c!textstate=\v!normal,
-      \c!headerstate=\v!stop,
-      \c!footerstate=\v!stop,
-      \c!pagestate=\v!stop, % in manual ! ! !
-      \c!color=,
-      \c!align=,
-      #2]%
-   \setvalue{\e!start#1\e!makeup}{\startmakeup[#1]}%
-   \setvalue{\e!stop #1\e!makeup}{\stopmakeup}}
-
-\def\setupmakeup
-  {\dodoubleargument\dosetupmakeup}
-
-\def\dosetupmakeup[#1]%
-  {\getparameters[\??do#1]}
-
-%D This will save us some 375 bytes in the format file.
-
-\def\makeupparameter#1{\getvalue{\??do\currentmakeup#1}}
-
-%D The \type{\start}||\type{\stop} macros are used for both
-%D the direct and indirect way. The parameterless call will
-%D build a simple box.
-
-\newtoks\everymakeup
-
-\appendtoks \postponemarks \to \everymakeup
-
-\let\currentmakeup\empty
-
-\def\startmakeup
-  {\dodoubleempty\dostartmakeup}
-
-\def\dostartmakeup[#1][#2]%
-  {\bgroup
-   \edef\currentmakeup{#1}%
-   \the\everymakeup
-   \iffirstargument
-     \setupmakeup[\currentmakeup][#2]%
-     \let\stopmakeup\dodostopmakeup
-     \expandafter   \dodostartmakeup
-   \else
-     \let\stopmakeup\donostopmakeup
-     \expandafter   \donostartmakeup
-   \fi}
-
-%D The simple case:
-
-\def\donostartmakeup % textwidth ?
-  {\page
-   \setupheader[\c!state=\v!empty]%
-   \setupfooter[\c!state=\v!empty]%
-   \setsystemmode\v!makeup
-   \vbox to \textheight\bgroup\hsize\textwidth}
-
-\def\donostopmakeup
-  {\egroup
-   \flushmarks % new, here, else empty pages
-   \page
-   \egroup}
-
-%D The normal one:
-
-\newbox\makeupbox
-
-\def\dodostartmakeup
-  {\doifvaluesomething{\??do\currentmakeup\c!page}
-     {\ExpandFirstAfter\page[\makeupparameter\c!page]}%
-   \pagetype[\currentmakeup]%
-   \setsystemmode\v!makeup
-   \setupmakeuplayout
-   \makeupparameter\c!commands % hm, what is this one doing here ?
-   \startregistercolor[\makeupparameter\c!color]%
-   \forgetall % else indented flush
-   \global\setbox\makeupbox\vbox to \makeupparameter\c!height
-     \bgroup
-%        \forgetall
-       \setups[\makeupparameter\c!setups]%
-       \hsize\makeupparameter\c!width
-       \doifsomething{\makeupparameter\c!align}
-         {\setupalign[\makeupparameter\c!align]}%
-       \makeupparameter\c!top}
-
-\def\dodostopmakeup
-  {\endgraf
-   \makeupparameter\c!bottom
-   \egroup
-   \flushmarks % new, here, else empty pages
-   \stopregistercolor
-   \doflushmakeup
-   \egroup
-   \calculatehsizes
-   \calculatevsizes}
-
-%D Selective page processing is handled here. (Why?)
-
-\def\doflushmakeup
-  {\ifprocessingpages
-     \ifpageselected
-       \doshipoutmakeup
-     \fi
-   \else
-     \ifpageselected \else
-       \doshipoutmakeup
-     \fi
-   \fi
-   \ifselectingpages
-     \global\pageselectedfalse
-   \fi}
-
-% \def\pushpagestate{\globalpushmacro\@@pnstate}
-% \def\poppagestate {\globalpopmacro \@@pnstate}
-
-\def\doshipoutmakeup
-  {\pushpagestate % new
-   \makeupparameter\c!before
-   \setbox\makeupbox\vbox{\hbox{\color[\makeupparameter\c!color]{\box\makeupbox}}}%
-   % \ifgridsnapping
-   % new per 22/6/2006
-     \ifdim\ht\makeupbox>\vsize
-       \ht\makeupbox\vsize
-     \fi
-   % \fi
-   \box\makeupbox
-   \setuppagenumber[\c!state=\makeupparameter\c!pagestate]%
-   \setupmakeuplayout
-   \page
-   \makeupparameter\c!after
-   \relax % voor fi
-   \ifdoublesided \ifodd\realpageno\else
-     \processaction
-       [\makeupparameter\c!doublesided]
-       [  \v!yes=>\null
-                  \page,
-        \v!empty=>{\setupmakeuplayout
-                  \page[\v!blank]%
-                  \null
-                  \page}]%
-   \fi \fi
-   \poppagestate} % new
-
-%D The text surrounding the main body text can be influenced
-%D by setting their associated status variables. The
-%D connection between them is made by the following macro
-
-\def\setupmakeuplayout
-  {\setupfooter[\c!state=\makeupparameter\c!footerstate]%
-   \setupheader[\c!state=\makeupparameter\c!headerstate]%
-   \setuptext  [\c!state=\makeupparameter\c!textstate]%
-   \setupbottom[\c!state=\makeupparameter\c!bottomstate]%
-   \setuptop   [\c!state=\makeupparameter\c!topstate]%
-   % this is needed, but no \setuplayout here; fails in texexec --fig=c
-   \recalculatelayout}
-
-%D The standard page template is defined as follows:
-
-\definemakeup
-  [\v!standard]
-  [\c!width=\innermakeupwidth,
-   \c!height=\textheight,
-   \c!voffset=\!!zeropoint,
-   \c!hoffset=\!!zeropoint,
-   \c!page=\v!right,
-   \c!doublesided=\v!empty]
-
-\definemakeup
-  [\v!text]
-  [\c!topstate=\v!start,
-   \c!headerstate=\v!start,
-   \c!textstate=\v!start,
-   \c!footerstate=\v!start,
-   \c!bottomstate=\v!start,
-   \c!doublesided=\v!no,
-   \c!page=\v!yes,
-   \c!top=\pseudostrut\ignorespaces,
-   \c!bottom=\obeydepth\vss]
-
-\protect \endinput
diff --git a/tex/context/base/page-mar.mkii b/tex/context/base/page-mar.mkii
new file mode 100644
index 000000000..f7c5328f3
--- /dev/null
+++ b/tex/context/base/page-mar.mkii
@@ -0,0 +1,867 @@
+%D \module
+%D   [       file=page-mar, % moved here from main-001
+%D        version=1997.03.31,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Marginal Things,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Support for margin words is one of the reasons for writing
+%D \CONTEXT. Over time support for marginal content has been
+%D extended en enhanced. Therefore it's always good to watch
+%D out for unexpected side effects.
+
+\writestatus{loading}{ConTeXt Page Macros / Maginal Things}
+
+\unprotect
+
+%D There are three categories and their historically grown meaning is
+%D as follows:
+%D
+%D marginlines: these are flushed relative to the start of a line and
+%D need to be invoked there.
+%D
+%D marginwords: these can be issued in the text flow and will migrate
+%D sidewards; in spite of the name, it can be a paragraph of text as
+%D well, but normally it's words.
+%D
+%D margintexts: these can be set beforehand and are flushed at the
+%D next paragraph of text (of header)
+%D
+%D While these mechanisms were rather separated, they now are slightly
+%D more integrated. Instead of low level instances we now have a mechanism
+%D for defining additional ones.
+
+%D \macros
+%D   {inleftedge,inleftmargin,inrightmargin,inrightedge}
+%D
+%D The fast and clean way of putting things in the margin is
+%D using \type{\rlap} or \type{\llap}. Unfortunately these
+%D macro's don't handle indentation, left and right skips. We
+%D therefore embed them in some macro's that (force and)
+%D remove the indentation and restore it afterwards.
+
+\def\definemarginline
+  {\dodoubleargument\dodefinemarginline}
+
+\def\dodefinemarginline[#1][#2]%
+  {\getparameters
+     [\??im\??im#1]
+     [\c!location=\v!left,
+      \c!distance=\zeropoint,
+      \c!width=\leftmarginwidth,
+      \c!hoffset=\leftmargindistance,
+      \c!command=,
+      #2]%
+   \unexpanded\setvalue{#1}{\dohandlemarginline{#1}}}
+
+\def\marginlineparameter  #1{\csname\??im\??im\currentmarginline#1\endcsname}
+\def\marginlineexecuter #1#2{\executeifdefined{\??im\??im\currentmarginline#1}{#2}}
+
+\def\dohandlemarginline#1% #2
+  {\def\currentmarginline{#1}%
+   \csname\s!do\??im\??im\executeifdefined{\??im\??im#1\c!location}\v!left\endcsname{#1}} % {#2}
+
+\def\doleftmarginline#1#2% #1 is redundant (we can remove it when we group dohandlemarginline; maybe ...
+  {\pushindentation
+   \llap
+     {\def\currentmarginline{#1}%
+      \postsignalrightpage
+      \hsize\marginlineparameter\c!width\relax
+      \marginlineexecuter\c!command\firstofoneargument{#2}\relax
+      \hskip\dimexpr
+        +\leftskip
+        +\compensatedinnermakeupmargin
+        +\marginlineparameter\c!hoffset
+        +\marginlineparameter\c!distance
+      \relax}%
+   \popindentation
+   \ignorespaces}
+
+\def\dorightmarginline#1#2% #1 is redundant
+  {\pushindentation
+   \rlap
+     {\def\currentmarginline{#1}%
+      \postsignalrightpage
+      \hskip\dimexpr
+        +\hsize
+        -\rightskip
+        +\compensatedinnermakeupmargin
+        +\marginlineparameter\c!hoffset
+        +\marginlineparameter\c!distance
+      \relax
+      \hsize\marginlineparameter\c!width
+      \marginlineexecuter\c!command\firstofoneargument{#2}}%
+   \popindentation
+   \ignorespaces}
+
+\long\def\installmarginlinehandler#1#2{\setvalue{\s!do\??im\??im#1}{#2}}
+
+\installmarginlinehandler \v!left  {\doleftmarginline}
+\installmarginlinehandler \v!right {\dorightmarginline}
+\installmarginlinehandler \v!inner {\presignalrightpage\doifrightpageelse\doleftmarginline \dorightmarginline}
+\installmarginlinehandler \v!outer {\presignalrightpage\doifrightpageelse\dorightmarginline\doleftmarginline }
+
+\definemarginline[inleftmargin] [\c!location=\v!left, \c!width=\leftmarginwidth, \c!distance=\leftmargindistance, \c!hoffset=\zeropoint]
+\definemarginline[inrightmargin][\c!location=\v!right,\c!width=\rightmarginwidth,\c!distance=\rightmargindistance,\c!hoffset=\zeropoint]
+\definemarginline[inleftedge]   [\c!location=\v!left, \c!width=\leftedgewidth,   \c!distance=\leftedgedistance,   \c!hoffset=\leftmargintotal]
+\definemarginline[inrightedge]  [\c!location=\v!right,\c!width=\rightedgewidth,  \c!distance=\rightedgedistance,  \c!hoffset=\rightmargintotal]
+
+\definemarginline[inoutermargin][\c!location=\v!outer,\c!width=\outermarginwidth,\c!distance=\outermargindistance,\c!hoffset=\zeropoint]
+\definemarginline[ininnermargin][\c!location=\v!inner,\c!width=\innermarginwidth,\c!distance=\innermargindistance,\c!hoffset=\zeropoint]
+\definemarginline[inouteredge]  [\c!location=\v!outer,\c!width=\outeredgewidth,  \c!distance=\outeredgedistance,  \c!hoffset=\outermargintotal]
+\definemarginline[ininneredge]  [\c!location=\v!inner,\c!width=\inneredgewidth,  \c!distance=\inneredgedistance,  \c!hoffset=\innermargintotal]
+
+\definemarginline[atleftmargin] [\c!location=\v!left, \c!command=\lrlap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint]
+\definemarginline[atrightmargin][\c!location=\v!right,\c!command=\rllap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint]
+
+\ifx\lrlap\undefined \def\lrlap#1{\llap{\rlap{#1}}} \fi
+\ifx\rllap\undefined \def\rllap#1{\rlap{\llap{#1}}} \fi
+
+\def\lrlap#1{\llap{\rlap{#1}}}
+\def\rllap#1{\rlap{\hskip\hsize\llap{#1}}}
+
+%D We want to keep things efficient and therefore only handle
+%D situations like:
+%D
+%D \startbuffer
+%D                  \inleftedge    {fine} some text \par
+%D \strut           \inleftmargin  {fine} some text \par
+%D \noindent        \inrightmargin {fine} some text \par
+%D \noindent \strut \inrightedge   {fine} some text \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D which looks like:
+%D
+%D \bgroup
+%D \getbuffer
+%D \parindent 30pt
+%D \getbuffer
+%D \egroup
+%D
+%D A torture test:
+%D
+%D \starttyping
+%D \def\TestLine#1#2{\backgroundline[#1]{\strut\white\tttf#2~\recurselevel}}
+%D
+%D \startbuffer
+%D \inleftmargin {\TestLine{red}   {lm}}  test test test \par
+%D \inrightmargin{\TestLine{green} {rm}}  test test test \par
+%D \inleftedge   {\TestLine{red}   {le}}  test test test \par
+%D \inrightedge  {\TestLine{green} {re}}  test test test \par
+%D \inoutermargin{\TestLine{blue}  {om}}  test test test \par
+%D \ininnermargin{\TestLine{yellow}{im}}  test test test \par
+%D \inouteredge  {\TestLine{blue}  {oe}}  test test test \par
+%D \ininneredge  {\TestLine{yellow}{ie}}  test test test \par
+%D \atleftmargin {\TestLine{red}   {alm}} \hfill test    \par
+%D \atrightmargin{\TestLine{green} {arm}} test \hfill    \par
+%D \stopbuffer
+%D
+%D \dorecurse{40}\getbuffer \page
+%D \stoptyping
+
+%D New, yet undocumented:
+%D
+%D used for pascal:
+%D
+%D \starttyping
+%D \index {test} test \index {west} west \index {rest} rest
+%D
+%D \startnarrower
+%D \placeregister[index][alternative=b,command=\atleftmargin]
+%D \stopnarrower
+%D \stoptyping
+
+% todo: compensate distance when setuplayout[textwidth=..]
+% todo: generalize margin/edge model, now too much duplication
+
+%D The next bunch of macros looks messy which is due to its
+%D multi-purpose character.
+
+\chardef\margincontentdisplacement \zerocount
+\let    \margincontentdistance     \!!zeropoint
+\let    \margincontenthoffset      \!!zeropoint
+\def    \margincontentlines        {1}
+\def    \margincontenttag          {0}
+\let    \margincontentseparator    \empty
+\def    \margincontentstrutheight  {\strutht}
+
+\newcount\margincontentlevel
+\newdimen\margincontentheight
+
+\def\setupinmargin
+  {\dodoubleempty\dosetupinmargin}
+
+\def\dosetupinmargin[#1][#2]%
+  {\ifsecondargument
+     \processcommalist[#1]{\dodosetupinmargin[#2]}% becomes [#2]{##1}
+   \else
+     \getparameters[\??im][#1]%
+   \fi}
+
+% \def\dodosetupinmargin[#1]#2% [settings]{class}
+%   {\checkinmargin[#2]%
+%    \getparameters[\??im#2][#1]}
+
+\def\dodosetupinmargin[#1]#2% [settings]{class}
+  {\checkinmargin[#2]%
+   \getparameters[\??im#2][#1]%
+   % will become an \everyinmarginsetup thing
+   \ifcase\executeifdefined{\??im#2\c!sidemethod}{0}\else
+     \positioningtrue \positioningpartrue % global ?
+   \fi}
+
+\def\checkinmargin[#1]%
+  {\ifundefined{\??im#1\c!offset}% this offset is related to framed !
+     \addtocommalist{#1}\inmargintaglist
+     \presetmargintext[#1]%
+   \fi}
+
+\def\presetmargintext[#1]%
+  {\presetlocalframed
+     [\??im#1]%
+   \getparameters
+     [\??im#1]
+     [\c!frame=\v!off,
+      \c!offset=\v!overlay,
+      \c!line=1,
+      \c!separator=,
+      \c!width=\v!broad,
+      \c!distance=, % empty = signal
+      \c!hoffset=\zeropoint,
+      \c!style=\@@imstyle,
+      \c!color=\@@imcolor,
+      \c!strut=\@@imstrut,
+      \c!location=\@@imlocation,
+      \c!align=\@@imalign,
+      \c!before=\@@imbefore,
+      \c!after=\@@imafter]}
+
+\newdimen\naturalmargincontentheight
+
+\def\makemargintextblock#1#2#3% width l r content
+  {\bgroup
+   \forgetall % added, else problems with 'center' and nested itemize
+   \dontcomplain
+   \hsize\getvalue{\??im#1\c!width}\relax
+   \doifnumberelse\margincontenttag
+     {\ifcase\margincontenttag\relax
+        \edef\margincontenttag{#1}% first one is setups id as well
+      \fi}
+     \donothing
+   \doifnumberelse\margincontenttag
+     {\ifnum\margincontenttag>25 % to be translated
+        \writestatus\m!systems{potential margin stack overflow (\margincontenttag)}%
+      \fi}
+     \donothing
+   % we need to preserve {a,b,c} kind of settings
+   \let\margincontentalign#1%
+   \processallactionsinset
+     [\getvalue{\??im\margincontenttag\c!align}]
+     [     \v!yes=>\let\margincontentalign#1,
+            \v!no=>\let\margincontentalign\v!normal,
+         \v!inner=>\let\margincontentalign#1,
+         \v!outer=>\let\margincontentalign#2,
+          \v!left=>\let\margincontentalign\v!left,
+        \v!middle=>\let\margincontentalign\v!middle,
+         \v!right=>\let\margincontentalign\v!right]%
+   \doifvaluesomething{\??im\margincontenttag\c!align} % watch {} around set
+     {\edef\margincontentalign{{\getvalue{\??im\margincontenttag\c!align},\margincontentalign}}}%
+   %
+   \expanded{\getparameters[\??im\margincontenttag][\c!align=\margincontentalign]}%
+   %
+   \edef\margincontentstrut{\getvalue{\??im\margincontenttag\c!strut}}%
+   \savestrut %
+   \setbox\scratchbox\vbox\localframed
+     [\??im\margincontenttag]
+     [\c!strut=\v!no,\c!offset=\v!overlay] % strut handled internally
+     {\decrement\margincontentlines
+      \dorecurse\margincontentlines{\savedstrut\endgraf\nointerlineskip}% ! savedstrut
+      \@@imbefore
+      \dostartattributes{\??im\margincontenttag}\c!style\c!color\empty
+        \dosetupstrut[\margincontentstrut]% was: \setstrut % yes or no
+        \begstrut#3\endstrut\endgraf
+        \xdef\margincontentstrutheight{\the\strutht}% so that it's known outside the framed
+      \dostopattributes
+      \@@imafter}%
+   \global        \naturalmargincontentheight\ht\scratchbox
+   \global\advance\naturalmargincontentheight\dp\scratchbox
+   \doif\@@imstack\v!yes
+     {\def\overlappingmargin{-20\scaledpoint}% test value, maybe .25\strutboxdp, maybe configurable
+      \setbox\scratchbox\vbox{\stackeddown\vbox{\box\scratchbox}}}% new
+   \ht\scratchbox\strutht
+   \dp\scratchbox\strutdp % nieuw
+   \box\scratchbox
+   \egroup}
+
+%D The stacker permits constructs like:
+%D
+%D \starttyping
+%D \setupinmargin[stack=yes]
+%D
+%D \inleft{test 1}test\break
+%D \inleft{test 2}test\break
+%D \inleft{test 1}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2}
+%D \inleft{test 3}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2\endgraf test 3}
+%D \inleft{test 4}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2\endgraf test 3}
+%D \inleft{test 4\endgraf test 5\endgraf test 6}
+%D \inleft{test 7\endgraf test 8\endgraf test 9}
+%D \input tufte
+%D \stoptyping
+
+%D This approach permits us to implement a better mechanism
+%D later. We need the \type {\graphicvadjust} in order to
+%D handle:
+%D
+%D \starttyping
+%D \inleft{test} {\red \dorecurse{40}{test }\par}
+%D {\red \inleft{test} \dorecurse{40}{test }\par}
+%D \stoptyping
+%D
+%D The outer margin color is either black or color set as
+%D main text color.
+
+\newif\ifrightmargin % documenteren
+
+\ifx\dopositionmarginbox\undefined
+  \def\dopositionmarginbox#1{\graphicvadjust{\box#1}}
+\fi
+
+% watch out, margin dimensions are swapped locally (\swapmargins)
+
+% with \margincontentmethod one can control pagebreaks
+%
+% 0 no break
+% 1 each entry is one line
+% 2 only natural height
+% 3 also stack height
+
+\chardef\margincontentmethod  \plusthree % beware: 1 = old method
+\chardef\marginpagecheckmethod\plusone
+
+\def\margincontentextralines{1}        % old method, play safe
+\def\nofmargincontentlines  {0}
+
+\def\doplacemargintext#1#2#3#4%
+  {\dontcomplain
+   \strut
+   \doifsomething{#1}
+     {\def\margincontenttag{#1}}%
+   \doifinsetelse{\margincontenttag}{\v!left,\v!right} % ugly hack
+     {\let \margincontentdistance                                                      \empty     % signal
+      \let \margincontenthoffset                                                       \zeropoint}
+     {\edef\margincontentdistance{\executeifdefined{\??im\margincontenttag\c!distance }\empty    }% signal
+      \edef\margincontenthoffset {\executeifdefined{\??im\margincontenttag\c!hoffset  }\zeropoint}}%
+   \edef\margincontentlines      {\executeifdefined{\??im\margincontenttag\c!line     }\plusone  }%
+   \edef\margincontentseparator  {\executeifdefined{\??im\margincontenttag\c!separator}\donothing}%
+   \setbox\scratchbox\hbox{#4}% % todo: make sure that color stack works
+   \ifcase\margincontentmethod
+     \scratchdimen\zeropoint
+   \or % old method
+     \scratchdimen\ht\scratchbox
+     \advance\scratchdimen\dp\scratchbox
+   \or
+     \scratchdimen\naturalmargincontentheight
+   \or
+     \scratchdimen\naturalmargincontentheight
+     \ifx\laststackvmove\undefined\else\global\advance\scratchdimen\laststackvmove\fi
+   \fi
+   \ifdim\scratchdimen>\margincontentheight
+     \global\margincontentheight\scratchdimen
+   \fi
+   \setbox\scratchbox\hbox
+     {#2{\hskip#3\strut
+         \ifcase\margincontentdisplacement
+           % normal, move strutheight up
+           \scratchdimen\strutdp
+           \advance\scratchdimen \margincontentstrutheight
+           \advance\scratchdimen -\strutht
+           \raise\scratchdimen
+         \or
+           % low, obey vadjust
+         \fi
+         \box\scratchbox}}%
+   \ht\scratchbox\zeropoint
+   \dp\scratchbox\zeropoint
+   \gdef\margincontentstrutheight{\the\strutht}%
+  %\graphicvadjust{\box\scratchbox}}     % fails in high math lines, let it be
+  %\hbox{\lower\strutdp\box\scratchbox}} % alas, wrong lapping, therefore useless
+   \dopositionmarginbox\scratchbox}
+
+% \def\domarginblockskip#1%
+%   {\hskip\margincontenthoffset
+%    \hskip\compensatedinnermakeupmargin\relax
+%    \doifelsenothing\margincontentdistance
+%      {\hskip\getvalue{\??im#1\c!distance}}
+%      {\hskip\margincontentdistance}%
+%    \relax}
+
+\def\domarginblockskip#1%
+  {\doifelsenothing\margincontentdistance
+     {\hskip\dimexpr
+        +\margincontenthoffset
+        +\compensatedinnermakeupmargin
+        +\csname\??im#1\c!distance\endcsname
+      \relax}
+     {\dimexpr
+        +\margincontenthoffset
+        +\compensatedinnermakeupmargin
+        +\margincontentdistance
+      \relax}%
+   \relax}
+
+\def\doleftmarginblock#1#2%
+  {\doplacemargintext{#1}\llap\zeropoint
+     {\llap{\placemargincontentseparator}%
+      \makemargintextblock\v!left\v!right{#2}%
+      \domarginblockskip\v!left}}
+
+\def\dorightmarginblock#1#2%
+  {\doplacemargintext{#1}\rlap\hsize
+     {\hskip\textwidth\hskip-\hsize % new: hsize correction
+      \domarginblockskip\v!right
+      \makemargintextblock\v!right\v!left{#2}%
+      \rlap{\placemargincontentseparator}}}
+
+\def\placemargincontentseparator
+  {\ifnum\margincontentlevel>\zerocount
+     \ifx\margincontentseparator\empty\else
+       \bgroup
+       \scratchdimen\margincontentlines\lineheight
+       \advance\scratchdimen -\lineheight
+       \lower\scratchdimen\hbox{\margincontentseparator}%
+       \egroup
+     \fi
+   \fi}
+
+\newbox\marginconstructbox
+
+\def\doinmarginswapped#1#2#3#4%
+  {\iffirstsidefloatparagraph\nowhitespace\fi % zo laat mogelijk
+   \setbox\marginconstructbox\hbox\bgroup % prevents page break in the middle of construction
+     \startsignalrightpage
+       \doifswappedrightpageelse
+         {\rightmargintrue #2}
+         {\rightmarginfalse#1}
+         {#3}% setups
+         {#4}% content
+     \stopsignalrightpage
+   \egroup
+   \unhbox\marginconstructbox}
+
+% history made this a bit complicated, the +/- was needed before
+% we had enough mem/hash to do the page correction
+
+\edef\inmargintaglist{+,-,\v!low,\v!left,\v!right,\v!inner,\v!outer}
+
+% the old one:
+%
+% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+%   {\doifcommonelse{+,-,\v!laag}{#4}
+%      {\dodoinmargin[#1][#2][#3][#4][#5]}
+%      {\dodoinmargin[#1][#2][#3][][#4]}}
+%
+% an alternative:
+%
+% \letvalue{\??im\v!laag\c!offset}\empty
+% \letvalue{\??im      +\c!offset}\empty
+% \letvalue{\??im      -\c!offset}\empty
+%
+% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+%   {\doifnumberelse{#4}
+%      {\dodoinmargin[#1][#2][#3][#4][#5]}
+%      {\doifdefinedelse{\??im#4\c!offset}
+%         {\dodoinmargin[#1][#2][#3][#4][#5]}
+%         {\dodoinmargin[#1][#2][#3][][#4]}}}
+%
+% the problem is that we need to keep downward compatibility
+% with respect to the first argument thing a reference or a
+% directive; the alternative is to force users to pass a
+% directive along with a reference; anyhow, as long as one
+% does not use references that have the same name as a
+% directive we can use the (slow) alternative
+
+\def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+  {\expanded{\doifinsetelse{#4}{\inmargintaglist}}
+     {\dodoinmargin[#1][#2][#3][#4][#5]}
+     {\dodoinmargin[#1][#2][#3][][#4]}}
+
+\def\defineinmargin
+  {\doquadrupleempty\dodefineinmargin}
+
+\def\dodefineinmargin[#1][#2][#3][#4]%
+  {\doifassignmentelse{#4}
+     {\setupinmargin[#1][#4]%
+      \setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#1]}}
+     {\setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#4]}}}
+
+\defineinmargin [inleft]   [\v!left]       [\v!normal]   % takes left settings
+\defineinmargin [inright]  [\v!right]      [\v!normal]   % takes right settings
+\defineinmargin [ininner]  [\v!inner]      [\v!normal]   % takes left/right settings
+\defineinmargin [inouter]  [\v!outer]      [\v!normal]   % takes left/right settings
+\defineinmargin [inmargin] [\@@imlocation] [\v!normal]   % takes left/right settings
+\defineinmargin [inother]  [\@@imlocation] [\v!reverse]  % takes left/right settings
+
+\def\inothermargin{\inother}
+
+%D This permits definitions like:
+%D
+%D \starttyping
+%D \defineinmargin [SomePlace] [inner] [normal] [distance=1cm]
+%D \defineinmargin [SomePlace] [inner] [normal] [SomePlace]    \setupinmargin[SomePlace][distance=1cm]
+%D \defineinmargin [MyPlace]   [inner] [normal] [SomePlace]
+%D \defineinmargin [YourPlace] [inner] [normal] [SomePlace]
+%D \stoptyping
+%D
+%D A torture test:
+%D
+%D \starttyping
+%D \startbuffer
+%D \inleft       {\TestLine{red}    {l}} test test test \par
+%D \inright      {\TestLine{green}  {r}} test test test \par
+%D \inmargin     {\TestLine{blue}   {m}} test test test \par
+%D \inothermargin{\TestLine{yellow} {x}} test test test \par
+%D \ininner      {\TestLine{cyan}   {i}} test test test \par
+%D \inouter      {\TestLine{magenta}{o}} test test test \par
+%D \stopbuffer
+%D
+%D \dorecurse{80}\getbuffer \page
+%D \stoptyping
+%D
+%D and
+%D
+%D \starttyping
+%D \defineinmargin [InOuterA] [outer] [normal] [distance=0cm]
+%D \defineinmargin [InOuterB] [outer] [normal] [distance=1cm]
+%D \defineinmargin [InOuterC] [outer] [normal] [distance=2cm,line=2]
+%D
+%D \startbuffer
+%D \InOuterA{\TestLine{red}  {A}} test test test \par
+%D \InOuterB{\TestLine{green}{B}} test test test \par
+%D \InOuterC{\TestLine{blue} {C}} test test test \par
+%D \stopbuffer
+%D
+%D \dorecurse{80}\getbuffer \page
+%D
+%D \dorecurse{10}{\inleft {one} test \inleft {two} test } \page
+%D
+%D \start
+%D   \margintext {one} \margintext {two} \input thuan \par
+%D   \setupinmargin[1][line=3,distance=1cm]
+%D   \margintext [1]{one}
+%D   \margintext [2]{two}
+%D   \input thuan \page
+%D \stop
+%D
+%D \setupinmargin[3][location=inner,distance=1cm]
+%D \setupinmargin[4][location=outer,distance=2cm]
+%D
+%D % \setupinmargin[left] [line=2]
+%D % \setupinmargin[right][line=2]
+%D
+%D \dorecurse
+%D   {10}
+%D   {\margintext       {\kern3cm\TestLine{blue}{none}}
+%D    \margintext[3]    {\TestLine{darkgray}{3}}
+%D    \margintext[4]    {\TestLine{darkgray}{4}}
+%D    \margintext[left] {\TestLine{red}     {left}}
+%D    \margintext[right]{\TestLine{green}   {right}}
+%D    \margintext[inner]{\TestLine{cyan}    {inner}}
+%D    \margintext[outer]{\TestLine{magenta} {outer}}
+%D    \input thuan \endgraf}
+%D
+%D \dorecurse{10}{\margintext{test\\test\\test} \input thuan \endgraf}
+%D \stoptyping
+
+% Test case:
+%
+% \setuppagenumbering[alternative=doublesided] \setupwhitespace[medium]
+%
+% \placefigure[right]{}{\externalfigure[dummy][width=2cm]}
+% \input tufte \inothermargin{test} \input tufte
+
+% \def\dodoinmargin[#1][#2][#3][#4][#5]#6%
+%   {\bgroup
+%    \forgetall % otherwise sidefloat problems, added 2005/07/20, maybe dangerous
+%    \postponenotes % group is (somehow) needed
+%    \doifinsetelse\v!low{#4}
+%      {\chardef\margincontentdisplacement\plusone}
+%      {\chardef\margincontentdisplacement\zerocount}%
+%    \doif\v!reverse{#2}
+%      {\swapmacros\dorightmarginblock\doleftmarginblock}%
+%    \processaction
+%      [#1]
+%      [   \v!left=>\let\next\doleftmarginblock,  % no swapping
+%         \v!right=>\let\next\dorightmarginblock, % no swapping
+%         \v!inner=>\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock },
+%         \v!outer=>\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock},
+%       \s!unknown=>\ifdoublesided
+%                     \doifcommonelse{+,-}{#4}
+%                       {\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock }}
+%                       {\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock}}%
+%                   \else
+%                     \let\next\doleftmarginblock
+%                   \fi]%
+%    \next{#3}{#6}%
+%    \rawpagereference\s!mar{#5}% naar binnen ! ! ! !
+%    \flushnotes
+%    \egroup % don't forget the group
+%    \ignorespaces}
+
+% test first
+%
+% setupsystem[random=1235]
+%
+% \setupinmargin[left][sidemethod=3]
+% \dorecurse{10}{test \fakewords{20}{40} test \inleft{test\\test} test \fakewords{20}{40} \par}
+% \page
+% \setupinmargin[left][sidemethod=4]
+% \dorecurse{40}{test \fakewords{50}{80} test \inleft{test\\test} \par}
+% \page
+
+\def\dodoinmargin[#1][#2][#3][#4][#5]#6%
+  {\bgroup
+% \tracingall
+   % old stuff, a bit tricky, but now interfaced
+   \edef\currentmargincontent{#1}%
+   \chardef\marginrepositionmethod\executeifdefined{\??im\currentmargincontent\c!sidemethod }\plusone
+   \chardef\margincontentmethod   \executeifdefined{\??im\currentmargincontent\c!textmethod }\plusthree
+   \chardef\marginpagecheckmethod \executeifdefined{\??im\currentmargincontent\c!splitmethod}\plusone
+   % so far
+   \forgetall % otherwise sidefloat problems, added 2005/07/20, maybe dangerous
+   \postponenotes % group is (somehow) needed
+   \doifinsetelse\v!low{#4}
+     {\chardef\margincontentdisplacement\plusone}
+     {\chardef\margincontentdisplacement\zerocount}%
+   \doif\v!reverse{#2}
+     {\swapmacros\dorightmarginblock\doleftmarginblock}%
+   \processaction
+     [#1]
+     [   \v!left=>\let\next\doleftmarginblock,  % no swapping
+        \v!right=>\let\next\dorightmarginblock, % no swapping
+        \v!inner=>\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock },
+        \v!outer=>\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock},
+      \s!unknown=>\ifdoublesided
+                    \doifcommonelse{+,-}{#4}
+                      {\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock }}
+                      {\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock}}%
+                  \else
+                    \let\next\doleftmarginblock
+                  \fi]%
+   \next{#3}{#6}%
+   \rawpagereference\s!mar{#5}% naar binnen ! ! ! !
+   \flushnotes
+   \egroup % don't forget the group
+   \ignorespaces}
+
+% dit zijn voorlopig lokale commando's / vervallen
+%
+% \def\woordinmarge {\indentation\doquintupleempty\doinmargin[\@@implaats][\inleftmargin][\inrightmarge]}
+%
+% \def\woordinlinker {\inleftmargin  } % vervallen
+% \def\woordinrechter{\inrechtermarge} % vervallen
+
+% Some day: \definemarking[\v!margetitel]
+
+%D Now come the margin text collectors. The collected content is
+%D flushed at every paragraph by the following macro. Note for
+%D myself: here the location (plaats) is no longer a tag (number).
+
+% gone: \def\doflushmargincontent{\doinmargin[\@@implaats][\v!normaal][]} % + [#1][#2]{#3}}
+
+%D These are now all the same (long ago they had different
+%D implementations, somewhere in Sork time if I remember
+%D right).
+
+\def\margintext {\dodoubleempty\domargincontent}
+\def\marginword {\margintext}
+\def\margintitle{\margintext} % txt mark as well
+
+\newtoks\collectedmargintexts % so .. delayed!
+\chardef\margintextcollected  \zerocount
+
+\def\domargincontent[#1][#2]#3% we used to check for #2/#1 being number, no longer now
+  {\global\chardef\margintextcollected\plusone
+   \edef\margincontenttag{#1}%
+   \ifx\margincontenttag\empty
+     \global\advance\margincontentlevel\plusone
+     \edef\margincontenttag{\number\margincontentlevel}%
+   \fi
+   \checkinmargin[\margincontenttag]%
+   \doglobal \appendetoks
+     \noexpand \checkinmargin[\margincontenttag]%
+     \noexpand \doinmargin[\executeifdefined{\??im\margincontenttag\c!location}\@@imlocation][\v!normal][\margincontenttag][\margincontenttag][#2]%
+   \to \collectedmargintexts
+   \doglobal \appendtoks
+     {#3}%
+   \to \collectedmargintexts}
+
+\let\restoreinterlinepenalty\relax
+
+\def\flushmargincontents % plural
+  {\restoreinterlinepenalty % here?
+   \ifcase\margintextcollected\else     % called quite often, so we
+     \expandafter\doflushmargincontents % speed up the \fi scan by
+   \fi}                                 % using a \do..
+
+\def\doflushmargincontents % links + rechts
+  {\bgroup
+   \forgetall
+   \global\margincontentheight\zeropoint
+   \startsignalrightpage
+     \the\collectedmargintexts
+     \signalrightpage
+   \stopsignalrightpage
+   \resetmargincontent
+   % dirty tricks
+   \ifcase\margincontentmethod
+     \donefalse
+   \else\ifinsidecolumns % brrrr
+     \donetrue  % how fuzzy
+   \else\ifdim\margincontentheight>\lineheight\relax
+     \donetrue  % how dirty
+   \else
+     \donefalse % how needed
+   \fi\fi\fi
+   \savemargincontentlines
+   \ifdone
+     \advance\margincontentheight \margincontentextralines\lineheight
+     \ifdim\pagegoal>\pagetotal
+       \bgroup % preserve \margincontentheight
+       \advance\margincontentheight \pagetotal
+       \ifdim\margincontentheight>\pagegoal
+         \egroup
+         \ifcase\marginpagecheckmethod
+           % disabled
+         \or
+           \setmargincontentpenalties
+         \or
+           % potentially dangerous, maybe better a \goodbreak; the problem is that
+           % there can be a penalty there, which we then overload and we also introduce
+           % nasty side effects, so, we drop this option
+           % \vadjust pre {\page}%
+         \fi
+       \else
+         \egroup
+       \fi
+     \fi
+   \else % We need the above because interlinepenalties overrule vadjusted \nobreaks.
+     % a  bit dangerous
+     \vadjust{\nobreak}%
+   \fi
+   \egroup}
+
+\def\setmargincontentpenalties
+  {\getnoflines\margincontentheight
+   \keeplinestogether\noflines}
+
+\def\savemargincontentlines
+  {\bgroup
+   \advance\margincontentheight \margincontentextralines\lineheight % 1 by default
+   \getnoflines\margincontentheight
+   \xdef\nofmargincontentlines{\the\noflines}%
+   \egroup}
+
+\def\fillupmargincontentlines % etex ! ! !
+  {\endgraf
+   \begingroup
+   \scratchcounter\numexpr\nofmargincontentlines-\prevgraf\relax\relax
+   \ifnum\scratchcounter>\zerocount
+     \forgetall\dorecurse\scratchcounter{\nobreak\crlf}%
+   \fi
+   \endgroup}
+
+% Yet undocumented, for a manual flush in for instance headers.
+
+\def\resetmargincontent
+  {\global\margincontentlevel\zerocount
+   \global\chardef\margintextcollected\zerocount
+   \global\collectedmargintexts\emptytoks}
+
+% \def\placemargincontent
+%   {\ifcase\margintextcollected\else
+%      \bgroup
+%        \chardef\graphicvadjustmode\zerocount
+%        \doflushmargincontents
+%      \egroup
+%    \fi}
+%
+% font fix:
+
+\def\placemargincontent
+  {\ifcase\margintextcollected\else % was level check
+     \bgroup
+       \redoconvertfont % !!
+       \chardef\graphicvadjustmode\zerocount
+       \doflushmargincontents
+     \egroup
+   \fi}
+
+% For old times sake (i use it in project styles) we provide
+
+\def\placemargintexts {\placemargincontent}
+\def\resetmargetitels {\resetmargincontent}
+\def\margewoordpositie{\margewoord} % obsolete, now no longer range
+
+% but never use them yourself since they may disappear.
+
+\def\oplinker#1%
+  {\strut
+   \graphicvadjust
+     {\dontcomplain
+      \setbox\scratchbox\vtop{\forgetall\strut#1}%
+      \getboxheight\scratchdimen\of\box\scratchbox
+      \vskip-\scratchdimen % waarom stond hier een \ ?
+      \box\scratchbox}}
+
+\setupinmargin
+  [\c!style=\v!bold,
+   \c!color=,
+   \c!strut=\v!auto,
+   \c!location=\v!both,
+   \c!align=\v!inner,
+   \c!stack=\v!no,
+   \c!before=,
+   \c!after=]
+
+\setupinmargin
+  [\v!left]
+  [\c!distance=\leftmargindistance,
+   \c!width=\leftmarginwidth,
+  %\c!align=\v!left, % no
+   \c!location=\v!left]
+
+\setupinmargin
+  [\v!right]
+  [\c!distance=\rightmargindistance,
+   \c!width=\rightmarginwidth,
+  %\c!align=\v!right, % no
+   \c!location=\v!right]
+
+% bonus needed when [inner/outer] is used as tag
+
+\setupinmargin[\v!inner][\c!location=\v!inner,\c!align=\v!inner]
+\setupinmargin[\v!outer][\c!location=\v!outer,\c!align=\v!inner]
+
+% more efficient (5K less fotmat file)
+%
+% \letvalue{\??im\v!inner\c!location}\v!inner \letvalue{\??im\v!inner\c!align}\v!inner
+% \letvalue{\??im\v!outer\c!location}\v!outer \letvalue{\??im\v!outer\c!align}\v!inner
+
+\protect \endinput
diff --git a/tex/context/base/page-mar.mkiv b/tex/context/base/page-mar.mkiv
new file mode 100644
index 000000000..28f82efe5
--- /dev/null
+++ b/tex/context/base/page-mar.mkiv
@@ -0,0 +1,838 @@
+%D \module
+%D   [       file=page-mar, % moved here from main-001
+%D        version=1997.03.31,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Marginal Things,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Support for margin words is one of the reasons for writing
+%D \CONTEXT. Over time support for marginal content has been
+%D extended en enhanced. Therefore it's always good to watch
+%D out for unexpected side effects.
+
+\writestatus{loading}{ConTeXt Page Macros / Maginal Things}
+
+\unprotect
+
+%D There are three categories and their historically grown meaning is
+%D as follows:
+%D
+%D marginlines: these are flushed relative to the start of a line and
+%D need to be invoked there.
+%D
+%D marginwords: these can be issued in the text flow and will migrate
+%D sidewards; in spite of the name, it can be a paragraph of text as
+%D well, but normally it's words.
+%D
+%D margintexts: these can be set beforehand and are flushed at the
+%D next paragraph of text (of header)
+%D
+%D While these mechanisms were rather separated, they now are slightly
+%D more integrated. Instead of low level instances we now have a mechanism
+%D for defining additional ones.
+
+%D \macros
+%D   {inleftedge,inleftmargin,inrightmargin,inrightedge}
+%D
+%D The fast and clean way of putting things in the margin is
+%D using \type{\rlap} or \type{\llap}. Unfortunately these
+%D macro's don't handle indentation, left and right skips. We
+%D therefore embed them in some macro's that (force and)
+%D remove the indentation and restore it afterwards.
+
+\def\definemarginline
+  {\dodoubleargument\dodefinemarginline}
+
+\def\dodefinemarginline[#1][#2]%
+  {\getparameters
+     [\??im\??im#1]
+     [\c!location=\v!left,
+      \c!distance=\zeropoint,
+      \c!width=\leftmarginwidth,
+      \c!hoffset=\leftmargindistance,
+      \c!command=,
+      #2]%
+   \unexpanded\setvalue{#1}{\dohandlemarginline{#1}}}
+
+\def\marginlineparameter  #1{\csname\??im\??im\currentmarginline#1\endcsname}
+\def\marginlineexecuter #1#2{\executeifdefined{\??im\??im\currentmarginline#1}{#2}}
+
+\def\dohandlemarginline#1% #2
+  {\def\currentmarginline{#1}%
+   \csname\s!do\??im\??im\executeifdefined{\??im\??im#1\c!location}\v!left\endcsname{#1}} % {#2}
+
+\def\doleftmarginline#1#2% #1 is redundant (we can remove it when we group dohandlemarginline; maybe ...
+  {\pushindentation
+   \llap
+     {\def\currentmarginline{#1}%
+      \postsignalrightpage
+      \hsize\marginlineparameter\c!width\relax
+      \marginlineexecuter\c!command\firstofoneargument{#2}\relax
+      \hskip\dimexpr
+        +\leftskip
+        +\compensatedinnermakeupmargin
+        +\marginlineparameter\c!hoffset
+        +\marginlineparameter\c!distance
+      \relax}%
+   \popindentation
+   \ignorespaces}
+
+\def\dorightmarginline#1#2% #1 is redundant
+  {\pushindentation
+   \rlap
+     {\def\currentmarginline{#1}%
+      \postsignalrightpage
+      \hskip\dimexpr
+        +\hsize
+        -\rightskip
+        +\compensatedinnermakeupmargin
+        +\marginlineparameter\c!hoffset
+        +\marginlineparameter\c!distance
+      \relax
+      \hsize\marginlineparameter\c!width
+      \marginlineexecuter\c!command\firstofoneargument{#2}}%
+   \popindentation
+   \ignorespaces}
+
+\long\def\installmarginlinehandler#1#2{\setvalue{\s!do\??im\??im#1}{#2}}
+
+\installmarginlinehandler \v!left  {\doleftmarginline}
+\installmarginlinehandler \v!right {\dorightmarginline}
+\installmarginlinehandler \v!inner {\presignalrightpage\doifrightpageelse\doleftmarginline \dorightmarginline}
+\installmarginlinehandler \v!outer {\presignalrightpage\doifrightpageelse\dorightmarginline\doleftmarginline }
+
+\definemarginline[inleftmargin] [\c!location=\v!left, \c!width=\leftmarginwidth, \c!distance=\leftmargindistance, \c!hoffset=\zeropoint]
+\definemarginline[inrightmargin][\c!location=\v!right,\c!width=\rightmarginwidth,\c!distance=\rightmargindistance,\c!hoffset=\zeropoint]
+\definemarginline[inleftedge]   [\c!location=\v!left, \c!width=\leftedgewidth,   \c!distance=\leftedgedistance,   \c!hoffset=\leftmargintotal]
+\definemarginline[inrightedge]  [\c!location=\v!right,\c!width=\rightedgewidth,  \c!distance=\rightedgedistance,  \c!hoffset=\rightmargintotal]
+
+\definemarginline[inoutermargin][\c!location=\v!outer,\c!width=\outermarginwidth,\c!distance=\outermargindistance,\c!hoffset=\zeropoint]
+\definemarginline[ininnermargin][\c!location=\v!inner,\c!width=\innermarginwidth,\c!distance=\innermargindistance,\c!hoffset=\zeropoint]
+\definemarginline[inouteredge]  [\c!location=\v!outer,\c!width=\outeredgewidth,  \c!distance=\outeredgedistance,  \c!hoffset=\outermargintotal]
+\definemarginline[ininneredge]  [\c!location=\v!inner,\c!width=\inneredgewidth,  \c!distance=\inneredgedistance,  \c!hoffset=\innermargintotal]
+
+\definemarginline[atleftmargin] [\c!location=\v!left, \c!command=\lrlap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint]
+\definemarginline[atrightmargin][\c!location=\v!right,\c!command=\rllap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint]
+
+\ifx\lrlap\undefined \def\lrlap#1{\llap{\rlap{#1}}} \fi
+\ifx\rllap\undefined \def\rllap#1{\rlap{\llap{#1}}} \fi
+
+\def\lrlap#1{\llap{\rlap{#1}}}
+\def\rllap#1{\rlap{\hskip\hsize\llap{#1}}}
+
+%D We want to keep things efficient and therefore only handle
+%D situations like:
+%D
+%D \startbuffer
+%D                  \inleftedge    {fine} some text \par
+%D \strut           \inleftmargin  {fine} some text \par
+%D \noindent        \inrightmargin {fine} some text \par
+%D \noindent \strut \inrightedge   {fine} some text \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D which looks like:
+%D
+%D \bgroup
+%D \getbuffer
+%D \parindent 30pt
+%D \getbuffer
+%D \egroup
+%D
+%D A torture test:
+%D
+%D \starttyping
+%D \def\TestLine#1#2{\backgroundline[#1]{\strut\white\tttf#2~\recurselevel}}
+%D
+%D \startbuffer
+%D \inleftmargin {\TestLine{red}   {lm}}  test test test \par
+%D \inrightmargin{\TestLine{green} {rm}}  test test test \par
+%D \inleftedge   {\TestLine{red}   {le}}  test test test \par
+%D \inrightedge  {\TestLine{green} {re}}  test test test \par
+%D \inoutermargin{\TestLine{blue}  {om}}  test test test \par
+%D \ininnermargin{\TestLine{yellow}{im}}  test test test \par
+%D \inouteredge  {\TestLine{blue}  {oe}}  test test test \par
+%D \ininneredge  {\TestLine{yellow}{ie}}  test test test \par
+%D \atleftmargin {\TestLine{red}   {alm}} \hfill test    \par
+%D \atrightmargin{\TestLine{green} {arm}} test \hfill    \par
+%D \stopbuffer
+%D
+%D \dorecurse{40}\getbuffer \page
+%D \stoptyping
+
+%D New, yet undocumented:
+%D
+%D used for pascal:
+%D
+%D \starttyping
+%D \index {test} test \index {west} west \index {rest} rest
+%D
+%D \startnarrower
+%D \placeregister[index][alternative=b,command=\atleftmargin]
+%D \stopnarrower
+%D \stoptyping
+
+% todo: compensate distance when setuplayout[textwidth=..]
+% todo: generalize margin/edge model, now too much duplication
+
+%D The next bunch of macros looks messy which is due to its
+%D multi-purpose character.
+
+\chardef\margincontentdisplacement \zerocount
+\let    \margincontentdistance     \!!zeropoint
+\let    \margincontenthoffset      \!!zeropoint
+\def    \margincontentlines        {1}
+\def    \margincontenttag          {0}
+\let    \margincontentseparator    \empty
+\def    \margincontentstrutheight  {\strutht}
+
+\newcount\margincontentlevel
+\newdimen\margincontentheight
+
+\def\setupinmargin
+  {\dodoubleempty\dosetupinmargin}
+
+\def\dosetupinmargin[#1][#2]%
+  {\ifsecondargument
+     \processcommalist[#1]{\dodosetupinmargin[#2]}% becomes [#2]{##1}
+   \else
+     \getparameters[\??im][#1]%
+   \fi}
+
+% \def\dodosetupinmargin[#1]#2% [settings]{class}
+%   {\checkinmargin[#2]%
+%    \getparameters[\??im#2][#1]}
+
+\def\dodosetupinmargin[#1]#2% [settings]{class}
+  {\checkinmargin[#2]%
+   \getparameters[\??im#2][#1]%
+   % will become an \everyinmarginsetup thing
+   \ifcase\executeifdefined{\??im#2\c!sidemethod}{0}\else
+     \positioningtrue \positioningpartrue % global ?
+   \fi}
+
+\def\checkinmargin[#1]%
+  {\ifcsname\??im#1\c!offset\endcsname\else % this offset is related to framed !
+     \addtocommalist{#1}\inmargintaglist
+     \presetmargintext[#1]%
+   \fi}
+
+\def\presetmargintext[#1]%
+  {\presetlocalframed
+     [\??im#1]%
+   \getparameters
+     [\??im#1]
+     [\c!frame=\v!off,
+      \c!offset=\v!overlay,
+      \c!line=1,
+      \c!separator=,
+      \c!width=\v!broad,
+      \c!distance=, % empty = signal
+      \c!hoffset=\zeropoint,
+      \c!style=\@@imstyle,
+      \c!color=\@@imcolor,
+      \c!strut=\@@imstrut,
+      \c!location=\@@imlocation,
+      \c!align=\@@imalign,
+      \c!before=\@@imbefore,
+      \c!after=\@@imafter]}
+
+\newdimen\naturalmargincontentheight
+
+\def\makemargintextblock#1#2#3% width l r content
+  {\bgroup
+   \forgetall % added, else problems with 'center' and nested itemize
+   \dontcomplain
+   \hsize\getvalue{\??im#1\c!width}\relax
+   \doifnumberelse\margincontenttag
+     {\ifcase\margincontenttag\relax
+        \edef\margincontenttag{#1}% first one is setups id as well
+      \fi}
+     \donothing
+   \doifnumberelse\margincontenttag
+     {\ifnum\margincontenttag>25 % to be translated
+        \writestatus\m!systems{potential margin stack overflow (\margincontenttag)}%
+      \fi}
+     \donothing
+   % we need to preserve {a,b,c} kind of settings
+   \let\margincontentalign#1%
+   \processallactionsinset
+     [\getvalue{\??im\margincontenttag\c!align}]
+     [     \v!yes=>\let\margincontentalign#1,
+            \v!no=>\let\margincontentalign\v!normal,
+         \v!inner=>\let\margincontentalign#1,
+         \v!outer=>\let\margincontentalign#2,
+          \v!left=>\let\margincontentalign\v!left,
+        \v!middle=>\let\margincontentalign\v!middle,
+         \v!right=>\let\margincontentalign\v!right]%
+   \doifvaluesomething{\??im\margincontenttag\c!align} % watch {} around set
+     {\edef\margincontentalign{{\getvalue{\??im\margincontenttag\c!align},\margincontentalign}}}%
+   %
+   \expanded{\getparameters[\??im\margincontenttag][\c!align=\margincontentalign]}%
+   %
+   \edef\margincontentstrut{\getvalue{\??im\margincontenttag\c!strut}}%
+   \savestrut %
+   \setbox\scratchbox\vbox\localframed
+     [\??im\margincontenttag]
+     [\c!strut=\v!no,\c!offset=\v!overlay] % strut handled internally
+     {\decrement\margincontentlines
+      \dorecurse\margincontentlines{\savedstrut\endgraf\nointerlineskip}% ! savedstrut
+      \@@imbefore
+      \dostartattributes{\??im\margincontenttag}\c!style\c!color\empty
+        \dosetupstrut[\margincontentstrut]% was: \setstrut % yes or no
+        \begstrut#3\endstrut\endgraf
+        \xdef\margincontentstrutheight{\the\strutht}% so that it's known outside the framed
+      \dostopattributes
+      \@@imafter}%
+   \global        \naturalmargincontentheight\ht\scratchbox
+   \global\advance\naturalmargincontentheight\dp\scratchbox
+   \doif\@@imstack\v!yes
+     {\def\overlappingmargin{-20\scaledpoint}% test value, maybe .25\strutboxdp, maybe configurable
+      \setbox\scratchbox\vbox{\stackeddown\vbox{\box\scratchbox}}}% new
+   \ht\scratchbox\strutht
+   \dp\scratchbox\strutdp % nieuw
+   \box\scratchbox
+   \egroup}
+
+%D The stacker permits constructs like:
+%D
+%D \starttyping
+%D \setupinmargin[stack=yes]
+%D
+%D \inleft{test 1}test\break
+%D \inleft{test 2}test\break
+%D \inleft{test 1}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2}
+%D \inleft{test 3}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2\endgraf test 3}
+%D \inleft{test 4}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2\endgraf test 3}
+%D \inleft{test 4\endgraf test 5\endgraf test 6}
+%D \inleft{test 7\endgraf test 8\endgraf test 9}
+%D \input tufte
+%D \stoptyping
+
+%D This approach permits us to implement a better mechanism
+%D later. We need the \type {\graphicvadjust} in order to
+%D handle:
+%D
+%D \starttyping
+%D \inleft{test} {\red \dorecurse{40}{test }\par}
+%D {\red \inleft{test} \dorecurse{40}{test }\par}
+%D \stoptyping
+%D
+%D The outer margin color is either black or color set as
+%D main text color.
+
+\newif\ifrightmargin % documenteren
+
+\ifx\dopositionmarginbox\undefined
+  \def\dopositionmarginbox#1{\graphicvadjust{\box#1}}
+\fi
+
+% watch out, margin dimensions are swapped locally (\swapmargins)
+
+% with \margincontentmethod one can control pagebreaks
+%
+% 0 no break
+% 1 each entry is one line
+% 2 only natural height
+% 3 also stack height
+
+\chardef\margincontentmethod  \plusthree % beware: 1 = old method
+\chardef\marginpagecheckmethod\plusone
+
+\def\margincontentextralines{1}        % old method, play safe
+\def\nofmargincontentlines  {0}
+
+\def\doplacemargintext#1#2#3#4%
+  {\dontcomplain
+   \strut
+   \doifsomething{#1}
+     {\def\margincontenttag{#1}}%
+   \doifinsetelse{\margincontenttag}{\v!left,\v!right} % ugly hack
+     {\let \margincontentdistance                                                      \empty     % signal
+      \let \margincontenthoffset                                                       \zeropoint}
+     {\edef\margincontentdistance{\executeifdefined{\??im\margincontenttag\c!distance }\empty    }% signal
+      \edef\margincontenthoffset {\executeifdefined{\??im\margincontenttag\c!hoffset  }\zeropoint}}%
+   \edef\margincontentlines      {\executeifdefined{\??im\margincontenttag\c!line     }\plusone  }%
+   \edef\margincontentseparator  {\executeifdefined{\??im\margincontenttag\c!separator}\donothing}%
+   \setbox\scratchbox\hbox{#4}% % todo: make sure that color stack works
+   \ifcase\margincontentmethod
+     \scratchdimen\zeropoint
+   \or % old method
+     \scratchdimen\ht\scratchbox
+     \advance\scratchdimen\dp\scratchbox
+   \or
+     \scratchdimen\naturalmargincontentheight
+   \or
+     \scratchdimen\naturalmargincontentheight
+     \ifx\laststackvmove\undefined\else\global\advance\scratchdimen\laststackvmove\fi
+   \fi
+   \ifdim\scratchdimen>\margincontentheight
+     \global\margincontentheight\scratchdimen
+   \fi
+   \setbox\scratchbox\hbox
+     {#2{\hskip#3\strut
+         \ifcase\margincontentdisplacement
+           % normal, move strutheight up
+           \scratchdimen\strutdp
+           \advance\scratchdimen \margincontentstrutheight
+           \advance\scratchdimen -\strutht
+           \raise\scratchdimen
+         \or
+           % low, obey vadjust
+         \fi
+         \box\scratchbox}}%
+   \ht\scratchbox\zeropoint
+   \dp\scratchbox\zeropoint
+   \gdef\margincontentstrutheight{\the\strutht}%
+  %\graphicvadjust{\box\scratchbox}}     % fails in high math lines, let it be
+  %\hbox{\lower\strutdp\box\scratchbox}} % alas, wrong lapping, therefore useless
+   \dopositionmarginbox\scratchbox}
+
+% \def\domarginblockskip#1%
+%   {\hskip\margincontenthoffset
+%    \hskip\compensatedinnermakeupmargin\relax
+%    \doifelsenothing\margincontentdistance
+%      {\hskip\getvalue{\??im#1\c!distance}}
+%      {\hskip\margincontentdistance}%
+%    \relax}
+
+\def\domarginblockskip#1%
+  {\doifelsenothing\margincontentdistance
+     {\hskip\dimexpr
+        +\margincontenthoffset
+        +\compensatedinnermakeupmargin
+        +\csname\??im#1\c!distance\endcsname
+      \relax}
+     {\dimexpr
+        +\margincontenthoffset
+        +\compensatedinnermakeupmargin
+        +\margincontentdistance
+      \relax}%
+   \relax}
+
+\def\doleftmarginblock#1#2%
+  {\doplacemargintext{#1}\llap\zeropoint
+     {\llap{\placemargincontentseparator}%
+      \makemargintextblock\v!left\v!right{#2}%
+      \domarginblockskip\v!left}}
+
+\def\dorightmarginblock#1#2%
+  {\doplacemargintext{#1}\rlap\hsize
+     {\hskip\textwidth\hskip-\hsize % new: hsize correction
+      \domarginblockskip\v!right
+      \makemargintextblock\v!right\v!left{#2}%
+      \rlap{\placemargincontentseparator}}}
+
+\def\placemargincontentseparator
+  {\ifnum\margincontentlevel>\zerocount
+     \ifx\margincontentseparator\empty\else
+       \bgroup
+       \scratchdimen\margincontentlines\lineheight
+       \advance\scratchdimen -\lineheight
+       \lower\scratchdimen\hbox{\margincontentseparator}%
+       \egroup
+     \fi
+   \fi}
+
+\newbox\marginconstructbox
+
+\def\doinmarginswapped#1#2#3#4%
+  {\iffirstsidefloatparagraph\nowhitespace\fi % zo laat mogelijk
+   \setbox\marginconstructbox\hbox\bgroup % prevents page break in the middle of construction
+     \startsignalrightpage
+       \doifswappedrightpageelse
+         {\rightmargintrue #2}
+         {\rightmarginfalse#1}
+         {#3}% setups
+         {#4}% content
+     \stopsignalrightpage
+   \egroup
+   \unhbox\marginconstructbox}
+
+% history made this a bit complicated, the +/- was needed before
+% we had enough mem/hash to do the page correction
+
+\edef\inmargintaglist{+,-,\v!low,\v!left,\v!right,\v!inner,\v!outer}
+
+% the old one:
+%
+% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+%   {\doifcommonelse{+,-,\v!laag}{#4}
+%      {\dodoinmargin[#1][#2][#3][#4][#5]}
+%      {\dodoinmargin[#1][#2][#3][][#4]}}
+%
+% an alternative:
+%
+% \letvalue{\??im\v!laag\c!offset}\empty
+% \letvalue{\??im      +\c!offset}\empty
+% \letvalue{\??im      -\c!offset}\empty
+%
+% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+%   {\doifnumberelse{#4}
+%      {\dodoinmargin[#1][#2][#3][#4][#5]}
+%      {\doifdefinedelse{\??im#4\c!offset}
+%         {\dodoinmargin[#1][#2][#3][#4][#5]}
+%         {\dodoinmargin[#1][#2][#3][][#4]}}}
+%
+% the problem is that we need to keep downward compatibility
+% with respect to the first argument thing a reference or a
+% directive; the alternative is to force users to pass a
+% directive along with a reference; anyhow, as long as one
+% does not use references that have the same name as a
+% directive we can use the (slow) alternative
+
+\def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+  {\expanded{\doifinsetelse{#4}{\inmargintaglist}}
+     {\dodoinmargin[#1][#2][#3][#4][#5]}
+     {\dodoinmargin[#1][#2][#3][][#4]}}
+
+\def\defineinmargin
+  {\doquadrupleempty\dodefineinmargin}
+
+\def\dodefineinmargin[#1][#2][#3][#4]%
+  {\doifassignmentelse{#4}
+     {\setupinmargin[#1][#4]%
+      \setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#1]}}
+     {\setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#4]}}}
+
+\defineinmargin [inleft]   [\v!left]       [\v!normal]   % takes left settings
+\defineinmargin [inright]  [\v!right]      [\v!normal]   % takes right settings
+\defineinmargin [ininner]  [\v!inner]      [\v!normal]   % takes left/right settings
+\defineinmargin [inouter]  [\v!outer]      [\v!normal]   % takes left/right settings
+\defineinmargin [inmargin] [\@@imlocation] [\v!normal]   % takes left/right settings
+\defineinmargin [inother]  [\@@imlocation] [\v!reverse]  % takes left/right settings
+
+\def\inothermargin{\inother}
+
+%D This permits definitions like:
+%D
+%D \starttyping
+%D \defineinmargin [SomePlace] [inner] [normal] [distance=1cm]
+%D \defineinmargin [SomePlace] [inner] [normal] [SomePlace]    \setupinmargin[SomePlace][distance=1cm]
+%D \defineinmargin [MyPlace]   [inner] [normal] [SomePlace]
+%D \defineinmargin [YourPlace] [inner] [normal] [SomePlace]
+%D \stoptyping
+%D
+%D A torture test:
+%D
+%D \starttyping
+%D \startbuffer
+%D \inleft       {\TestLine{red}    {l}} test test test \par
+%D \inright      {\TestLine{green}  {r}} test test test \par
+%D \inmargin     {\TestLine{blue}   {m}} test test test \par
+%D \inothermargin{\TestLine{yellow} {x}} test test test \par
+%D \ininner      {\TestLine{cyan}   {i}} test test test \par
+%D \inouter      {\TestLine{magenta}{o}} test test test \par
+%D \stopbuffer
+%D
+%D \dorecurse{80}\getbuffer \page
+%D \stoptyping
+%D
+%D and
+%D
+%D \starttyping
+%D \defineinmargin [InOuterA] [outer] [normal] [distance=0cm]
+%D \defineinmargin [InOuterB] [outer] [normal] [distance=1cm]
+%D \defineinmargin [InOuterC] [outer] [normal] [distance=2cm,line=2]
+%D
+%D \startbuffer
+%D \InOuterA{\TestLine{red}  {A}} test test test \par
+%D \InOuterB{\TestLine{green}{B}} test test test \par
+%D \InOuterC{\TestLine{blue} {C}} test test test \par
+%D \stopbuffer
+%D
+%D \dorecurse{80}\getbuffer \page
+%D
+%D \dorecurse{10}{\inleft {one} test \inleft {two} test } \page
+%D
+%D \start
+%D   \margintext {one} \margintext {two} \input thuan \par
+%D   \setupinmargin[1][line=3,distance=1cm]
+%D   \margintext [1]{one}
+%D   \margintext [2]{two}
+%D   \input thuan \page
+%D \stop
+%D
+%D \setupinmargin[3][location=inner,distance=1cm]
+%D \setupinmargin[4][location=outer,distance=2cm]
+%D
+%D % \setupinmargin[left] [line=2]
+%D % \setupinmargin[right][line=2]
+%D
+%D \dorecurse
+%D   {10}
+%D   {\margintext       {\kern3cm\TestLine{blue}{none}}
+%D    \margintext[3]    {\TestLine{darkgray}{3}}
+%D    \margintext[4]    {\TestLine{darkgray}{4}}
+%D    \margintext[left] {\TestLine{red}     {left}}
+%D    \margintext[right]{\TestLine{green}   {right}}
+%D    \margintext[inner]{\TestLine{cyan}    {inner}}
+%D    \margintext[outer]{\TestLine{magenta} {outer}}
+%D    \input thuan \endgraf}
+%D
+%D \dorecurse{10}{\margintext{test\\test\\test} \input thuan \endgraf}
+%D \stoptyping
+
+% Test case:
+%
+% \setuppagenumbering[alternative=doublesided] \setupwhitespace[medium]
+%
+% \placefigure[right]{}{\externalfigure[dummy][width=2cm]}
+% \input tufte \inothermargin{test} \input tufte
+
+% test first
+%
+% setupsystem[random=1235]
+%
+% \setupinmargin[left][sidemethod=3]
+% \dorecurse{10}{test \fakewords{20}{40} test \inleft{test\\test} test \fakewords{20}{40} \par}
+% \page
+% \setupinmargin[left][sidemethod=4]
+% \dorecurse{40}{test \fakewords{50}{80} test \inleft{test\\test} \par}
+% \page
+
+\def\dodoinmargin[#1][#2][#3][#4][#5]#6%
+  {\bgroup
+   % old stuff, a bit tricky, but now interfaced
+   \edef\currentmargincontent{#1}%
+   \chardef\marginrepositionmethod\executeifdefined{\??im\currentmargincontent\c!sidemethod }\plusone
+   \chardef\margincontentmethod   \executeifdefined{\??im\currentmargincontent\c!textmethod }\plusthree
+   \chardef\marginpagecheckmethod \executeifdefined{\??im\currentmargincontent\c!splitmethod}\plusone
+   % so far
+   \forgetall % otherwise sidefloat problems, added 2005/07/20, maybe dangerous
+   \postponenotes % group is (somehow) needed
+   \doifinsetelse\v!low{#4}
+     {\chardef\margincontentdisplacement\plusone}
+     {\chardef\margincontentdisplacement\zerocount}%
+   \doif\v!reverse{#2}
+     {\swapmacros\dorightmarginblock\doleftmarginblock}%
+   \processaction
+     [#1]
+     [   \v!left=>\let\next\doleftmarginblock,  % no swapping
+        \v!right=>\let\next\dorightmarginblock, % no swapping
+        \v!inner=>\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock },
+        \v!outer=>\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock},
+      \s!unknown=>\ifdoublesided
+                    \doifcommonelse{+,-}{#4}
+                      {\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock }}
+                      {\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock}}%
+                  \else
+                    \let\next\doleftmarginblock
+                  \fi]%
+   \next{#3}{#6}%
+   \pagereference[#5]% naar binnen ! ! ! !
+   \flushnotes
+   \egroup % don't forget the group
+   \ignorespaces}
+
+% dit zijn voorlopig lokale commando's / vervallen
+%
+% \def\woordinmarge {\indentation\doquintupleempty\doinmargin[\@@implaats][\inleftmargin][\inrightmarge]}
+%
+% \def\woordinlinker {\inleftmargin  } % vervallen
+% \def\woordinrechter{\inrechtermarge} % vervallen
+
+% Some day: \definemarking[\v!margetitel]
+
+%D Now come the margin text collectors. The collected content is
+%D flushed at every paragraph by the following macro. Note for
+%D myself: here the location (plaats) is no longer a tag (number).
+
+% gone: \def\doflushmargincontent{\doinmargin[\@@implaats][\v!normaal][]} % + [#1][#2]{#3}}
+
+%D These are now all the same (long ago they had different
+%D implementations, somewhere in Sork time if I remember
+%D right).
+
+\def\margintext {\dodoubleempty\domargincontent}
+\def\marginword {\margintext}
+\def\margintitle{\margintext} % txt mark as well
+
+\newtoks\collectedmargintexts % so .. delayed!
+\chardef\margintextcollected  \zerocount
+
+\def\domargincontent[#1][#2]#3% we used to check for #2/#1 being number, no longer now
+  {\global\chardef\margintextcollected\plusone
+   \edef\margincontenttag{#1}%
+   \ifx\margincontenttag\empty
+     \global\advance\margincontentlevel\plusone
+     \edef\margincontenttag{\number\margincontentlevel}%
+   \fi
+   \checkinmargin[\margincontenttag]%
+   \doglobal \appendetoks
+     \noexpand \checkinmargin[\margincontenttag]%
+     \noexpand \doinmargin[\executeifdefined{\??im\margincontenttag\c!location}\@@imlocation][\v!normal][\margincontenttag][\margincontenttag][#2]%
+   \to \collectedmargintexts
+   \doglobal \appendtoks
+     {#3}%
+   \to \collectedmargintexts}
+
+\let\restoreinterlinepenalty\relax
+
+\def\flushmargincontents % plural
+  {\restoreinterlinepenalty % here?
+   \ifcase\margintextcollected\else     % called quite often, so we
+     \expandafter\doflushmargincontents % speed up the \fi scan by
+   \fi}                                 % using a \do..
+
+\def\doflushmargincontents % links + rechts
+  {\bgroup
+   \forgetall
+   \global\margincontentheight\zeropoint
+   \startsignalrightpage
+     \the\collectedmargintexts
+     \signalrightpage
+   \stopsignalrightpage
+   \resetmargincontent
+   % dirty tricks
+   \ifcase\margincontentmethod
+     \donefalse
+   \else\ifinsidecolumns % brrrr
+     \donetrue  % how fuzzy
+   \else\ifdim\margincontentheight>\lineheight\relax
+     \donetrue  % how dirty
+   \else
+     \donefalse % how needed
+   \fi\fi\fi
+   \savemargincontentlines
+   \ifdone
+     \advance\margincontentheight \margincontentextralines\lineheight
+     \ifdim\pagegoal>\pagetotal
+       \bgroup % preserve \margincontentheight
+       \advance\margincontentheight \pagetotal
+       \ifdim\margincontentheight>\pagegoal
+         \egroup
+         \ifcase\marginpagecheckmethod
+           % disabled
+         \or
+           \setmargincontentpenalties
+         \or
+           % potentially dangerous, maybe better a \goodbreak; the problem is that
+           % there can be a penalty there, which we then overload and we also introduce
+           % nasty side effects, so, we drop this option
+           % \vadjust pre {\page}%
+         \fi
+       \else
+         \egroup
+       \fi
+     \fi
+   \else % We need the above because interlinepenalties overrule vadjusted \nobreaks.
+     % a  bit dangerous
+     \vadjust{\nobreak}%
+   \fi
+   \egroup}
+
+\def\setmargincontentpenalties
+  {\getnoflines\margincontentheight
+   \keeplinestogether\noflines}
+
+\def\savemargincontentlines
+  {\bgroup
+   \advance\margincontentheight \margincontentextralines\lineheight % 1 by default
+   \getnoflines\margincontentheight
+   \xdef\nofmargincontentlines{\the\noflines}%
+   \egroup}
+
+\def\fillupmargincontentlines % etex ! ! !
+  {\endgraf
+   \begingroup
+   \scratchcounter\numexpr\nofmargincontentlines-\prevgraf\relax\relax
+   \ifnum\scratchcounter>\zerocount
+     \forgetall\dorecurse\scratchcounter{\nobreak\crlf}%
+   \fi
+   \endgroup}
+
+% Yet undocumented, for a manual flush in for instance headers.
+
+\def\resetmargincontent
+  {\global\margincontentlevel\zerocount
+   \global\chardef\margintextcollected\zerocount
+   \global\collectedmargintexts\emptytoks}
+
+% \def\placemargincontent
+%   {\ifcase\margintextcollected\else
+%      \bgroup
+%        \chardef\graphicvadjustmode\zerocount
+%        \doflushmargincontents
+%      \egroup
+%    \fi}
+%
+% font fix:
+
+\def\placemargincontent
+  {\ifcase\margintextcollected\else % was level check
+     \bgroup
+       \redoconvertfont % !!
+       \chardef\graphicvadjustmode\zerocount
+       \doflushmargincontents
+     \egroup
+   \fi}
+
+% For old times sake (i use it in project styles) we provide
+
+\def\placemargintexts {\placemargincontent}
+\def\resetmargetitels {\resetmargincontent}
+\def\margewoordpositie{\margewoord} % obsolete, now no longer range
+
+% but never use them yourself since they may disappear.
+
+\def\oplinker#1%
+  {\strut
+   \graphicvadjust
+     {\dontcomplain
+      \setbox\scratchbox\vtop{\forgetall\strut#1}%
+      \getboxheight\scratchdimen\of\box\scratchbox
+      \vskip-\scratchdimen % waarom stond hier een \ ?
+      \box\scratchbox}}
+
+\setupinmargin
+  [\c!style=\v!bold,
+   \c!color=,
+   \c!strut=\v!auto,
+   \c!location=\v!both,
+   \c!align=\v!inner,
+   \c!stack=\v!no,
+   \c!before=,
+   \c!after=]
+
+\setupinmargin
+  [\v!left]
+  [\c!distance=\leftmargindistance,
+   \c!width=\leftmarginwidth,
+  %\c!align=\v!left, % no
+   \c!location=\v!left]
+
+\setupinmargin
+  [\v!right]
+  [\c!distance=\rightmargindistance,
+   \c!width=\rightmarginwidth,
+  %\c!align=\v!right, % no
+   \c!location=\v!right]
+
+% bonus needed when [inner/outer] is used as tag
+
+\setupinmargin[\v!inner][\c!location=\v!inner,\c!align=\v!inner]
+\setupinmargin[\v!outer][\c!location=\v!outer,\c!align=\v!inner]
+
+% more efficient (5K less fotmat file)
+%
+% \letvalue{\??im\v!inner\c!location}\v!inner \letvalue{\??im\v!inner\c!align}\v!inner
+% \letvalue{\??im\v!outer\c!location}\v!outer \letvalue{\??im\v!outer\c!align}\v!inner
+
+\protect \endinput
diff --git a/tex/context/base/page-mar.tex b/tex/context/base/page-mar.tex
deleted file mode 100644
index f7c5328f3..000000000
--- a/tex/context/base/page-mar.tex
+++ /dev/null
@@ -1,867 +0,0 @@
-%D \module
-%D   [       file=page-mar, % moved here from main-001
-%D        version=1997.03.31,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Marginal Things,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Support for margin words is one of the reasons for writing
-%D \CONTEXT. Over time support for marginal content has been
-%D extended en enhanced. Therefore it's always good to watch
-%D out for unexpected side effects.
-
-\writestatus{loading}{ConTeXt Page Macros / Maginal Things}
-
-\unprotect
-
-%D There are three categories and their historically grown meaning is
-%D as follows:
-%D
-%D marginlines: these are flushed relative to the start of a line and
-%D need to be invoked there.
-%D
-%D marginwords: these can be issued in the text flow and will migrate
-%D sidewards; in spite of the name, it can be a paragraph of text as
-%D well, but normally it's words.
-%D
-%D margintexts: these can be set beforehand and are flushed at the
-%D next paragraph of text (of header)
-%D
-%D While these mechanisms were rather separated, they now are slightly
-%D more integrated. Instead of low level instances we now have a mechanism
-%D for defining additional ones.
-
-%D \macros
-%D   {inleftedge,inleftmargin,inrightmargin,inrightedge}
-%D
-%D The fast and clean way of putting things in the margin is
-%D using \type{\rlap} or \type{\llap}. Unfortunately these
-%D macro's don't handle indentation, left and right skips. We
-%D therefore embed them in some macro's that (force and)
-%D remove the indentation and restore it afterwards.
-
-\def\definemarginline
-  {\dodoubleargument\dodefinemarginline}
-
-\def\dodefinemarginline[#1][#2]%
-  {\getparameters
-     [\??im\??im#1]
-     [\c!location=\v!left,
-      \c!distance=\zeropoint,
-      \c!width=\leftmarginwidth,
-      \c!hoffset=\leftmargindistance,
-      \c!command=,
-      #2]%
-   \unexpanded\setvalue{#1}{\dohandlemarginline{#1}}}
-
-\def\marginlineparameter  #1{\csname\??im\??im\currentmarginline#1\endcsname}
-\def\marginlineexecuter #1#2{\executeifdefined{\??im\??im\currentmarginline#1}{#2}}
-
-\def\dohandlemarginline#1% #2
-  {\def\currentmarginline{#1}%
-   \csname\s!do\??im\??im\executeifdefined{\??im\??im#1\c!location}\v!left\endcsname{#1}} % {#2}
-
-\def\doleftmarginline#1#2% #1 is redundant (we can remove it when we group dohandlemarginline; maybe ...
-  {\pushindentation
-   \llap
-     {\def\currentmarginline{#1}%
-      \postsignalrightpage
-      \hsize\marginlineparameter\c!width\relax
-      \marginlineexecuter\c!command\firstofoneargument{#2}\relax
-      \hskip\dimexpr
-        +\leftskip
-        +\compensatedinnermakeupmargin
-        +\marginlineparameter\c!hoffset
-        +\marginlineparameter\c!distance
-      \relax}%
-   \popindentation
-   \ignorespaces}
-
-\def\dorightmarginline#1#2% #1 is redundant
-  {\pushindentation
-   \rlap
-     {\def\currentmarginline{#1}%
-      \postsignalrightpage
-      \hskip\dimexpr
-        +\hsize
-        -\rightskip
-        +\compensatedinnermakeupmargin
-        +\marginlineparameter\c!hoffset
-        +\marginlineparameter\c!distance
-      \relax
-      \hsize\marginlineparameter\c!width
-      \marginlineexecuter\c!command\firstofoneargument{#2}}%
-   \popindentation
-   \ignorespaces}
-
-\long\def\installmarginlinehandler#1#2{\setvalue{\s!do\??im\??im#1}{#2}}
-
-\installmarginlinehandler \v!left  {\doleftmarginline}
-\installmarginlinehandler \v!right {\dorightmarginline}
-\installmarginlinehandler \v!inner {\presignalrightpage\doifrightpageelse\doleftmarginline \dorightmarginline}
-\installmarginlinehandler \v!outer {\presignalrightpage\doifrightpageelse\dorightmarginline\doleftmarginline }
-
-\definemarginline[inleftmargin] [\c!location=\v!left, \c!width=\leftmarginwidth, \c!distance=\leftmargindistance, \c!hoffset=\zeropoint]
-\definemarginline[inrightmargin][\c!location=\v!right,\c!width=\rightmarginwidth,\c!distance=\rightmargindistance,\c!hoffset=\zeropoint]
-\definemarginline[inleftedge]   [\c!location=\v!left, \c!width=\leftedgewidth,   \c!distance=\leftedgedistance,   \c!hoffset=\leftmargintotal]
-\definemarginline[inrightedge]  [\c!location=\v!right,\c!width=\rightedgewidth,  \c!distance=\rightedgedistance,  \c!hoffset=\rightmargintotal]
-
-\definemarginline[inoutermargin][\c!location=\v!outer,\c!width=\outermarginwidth,\c!distance=\outermargindistance,\c!hoffset=\zeropoint]
-\definemarginline[ininnermargin][\c!location=\v!inner,\c!width=\innermarginwidth,\c!distance=\innermargindistance,\c!hoffset=\zeropoint]
-\definemarginline[inouteredge]  [\c!location=\v!outer,\c!width=\outeredgewidth,  \c!distance=\outeredgedistance,  \c!hoffset=\outermargintotal]
-\definemarginline[ininneredge]  [\c!location=\v!inner,\c!width=\inneredgewidth,  \c!distance=\inneredgedistance,  \c!hoffset=\innermargintotal]
-
-\definemarginline[atleftmargin] [\c!location=\v!left, \c!command=\lrlap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint]
-\definemarginline[atrightmargin][\c!location=\v!right,\c!command=\rllap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint]
-
-\ifx\lrlap\undefined \def\lrlap#1{\llap{\rlap{#1}}} \fi
-\ifx\rllap\undefined \def\rllap#1{\rlap{\llap{#1}}} \fi
-
-\def\lrlap#1{\llap{\rlap{#1}}}
-\def\rllap#1{\rlap{\hskip\hsize\llap{#1}}}
-
-%D We want to keep things efficient and therefore only handle
-%D situations like:
-%D
-%D \startbuffer
-%D                  \inleftedge    {fine} some text \par
-%D \strut           \inleftmargin  {fine} some text \par
-%D \noindent        \inrightmargin {fine} some text \par
-%D \noindent \strut \inrightedge   {fine} some text \par
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D which looks like:
-%D
-%D \bgroup
-%D \getbuffer
-%D \parindent 30pt
-%D \getbuffer
-%D \egroup
-%D
-%D A torture test:
-%D
-%D \starttyping
-%D \def\TestLine#1#2{\backgroundline[#1]{\strut\white\tttf#2~\recurselevel}}
-%D
-%D \startbuffer
-%D \inleftmargin {\TestLine{red}   {lm}}  test test test \par
-%D \inrightmargin{\TestLine{green} {rm}}  test test test \par
-%D \inleftedge   {\TestLine{red}   {le}}  test test test \par
-%D \inrightedge  {\TestLine{green} {re}}  test test test \par
-%D \inoutermargin{\TestLine{blue}  {om}}  test test test \par
-%D \ininnermargin{\TestLine{yellow}{im}}  test test test \par
-%D \inouteredge  {\TestLine{blue}  {oe}}  test test test \par
-%D \ininneredge  {\TestLine{yellow}{ie}}  test test test \par
-%D \atleftmargin {\TestLine{red}   {alm}} \hfill test    \par
-%D \atrightmargin{\TestLine{green} {arm}} test \hfill    \par
-%D \stopbuffer
-%D
-%D \dorecurse{40}\getbuffer \page
-%D \stoptyping
-
-%D New, yet undocumented:
-%D
-%D used for pascal:
-%D
-%D \starttyping
-%D \index {test} test \index {west} west \index {rest} rest
-%D
-%D \startnarrower
-%D \placeregister[index][alternative=b,command=\atleftmargin]
-%D \stopnarrower
-%D \stoptyping
-
-% todo: compensate distance when setuplayout[textwidth=..]
-% todo: generalize margin/edge model, now too much duplication
-
-%D The next bunch of macros looks messy which is due to its
-%D multi-purpose character.
-
-\chardef\margincontentdisplacement \zerocount
-\let    \margincontentdistance     \!!zeropoint
-\let    \margincontenthoffset      \!!zeropoint
-\def    \margincontentlines        {1}
-\def    \margincontenttag          {0}
-\let    \margincontentseparator    \empty
-\def    \margincontentstrutheight  {\strutht}
-
-\newcount\margincontentlevel
-\newdimen\margincontentheight
-
-\def\setupinmargin
-  {\dodoubleempty\dosetupinmargin}
-
-\def\dosetupinmargin[#1][#2]%
-  {\ifsecondargument
-     \processcommalist[#1]{\dodosetupinmargin[#2]}% becomes [#2]{##1}
-   \else
-     \getparameters[\??im][#1]%
-   \fi}
-
-% \def\dodosetupinmargin[#1]#2% [settings]{class}
-%   {\checkinmargin[#2]%
-%    \getparameters[\??im#2][#1]}
-
-\def\dodosetupinmargin[#1]#2% [settings]{class}
-  {\checkinmargin[#2]%
-   \getparameters[\??im#2][#1]%
-   % will become an \everyinmarginsetup thing
-   \ifcase\executeifdefined{\??im#2\c!sidemethod}{0}\else
-     \positioningtrue \positioningpartrue % global ?
-   \fi}
-
-\def\checkinmargin[#1]%
-  {\ifundefined{\??im#1\c!offset}% this offset is related to framed !
-     \addtocommalist{#1}\inmargintaglist
-     \presetmargintext[#1]%
-   \fi}
-
-\def\presetmargintext[#1]%
-  {\presetlocalframed
-     [\??im#1]%
-   \getparameters
-     [\??im#1]
-     [\c!frame=\v!off,
-      \c!offset=\v!overlay,
-      \c!line=1,
-      \c!separator=,
-      \c!width=\v!broad,
-      \c!distance=, % empty = signal
-      \c!hoffset=\zeropoint,
-      \c!style=\@@imstyle,
-      \c!color=\@@imcolor,
-      \c!strut=\@@imstrut,
-      \c!location=\@@imlocation,
-      \c!align=\@@imalign,
-      \c!before=\@@imbefore,
-      \c!after=\@@imafter]}
-
-\newdimen\naturalmargincontentheight
-
-\def\makemargintextblock#1#2#3% width l r content
-  {\bgroup
-   \forgetall % added, else problems with 'center' and nested itemize
-   \dontcomplain
-   \hsize\getvalue{\??im#1\c!width}\relax
-   \doifnumberelse\margincontenttag
-     {\ifcase\margincontenttag\relax
-        \edef\margincontenttag{#1}% first one is setups id as well
-      \fi}
-     \donothing
-   \doifnumberelse\margincontenttag
-     {\ifnum\margincontenttag>25 % to be translated
-        \writestatus\m!systems{potential margin stack overflow (\margincontenttag)}%
-      \fi}
-     \donothing
-   % we need to preserve {a,b,c} kind of settings
-   \let\margincontentalign#1%
-   \processallactionsinset
-     [\getvalue{\??im\margincontenttag\c!align}]
-     [     \v!yes=>\let\margincontentalign#1,
-            \v!no=>\let\margincontentalign\v!normal,
-         \v!inner=>\let\margincontentalign#1,
-         \v!outer=>\let\margincontentalign#2,
-          \v!left=>\let\margincontentalign\v!left,
-        \v!middle=>\let\margincontentalign\v!middle,
-         \v!right=>\let\margincontentalign\v!right]%
-   \doifvaluesomething{\??im\margincontenttag\c!align} % watch {} around set
-     {\edef\margincontentalign{{\getvalue{\??im\margincontenttag\c!align},\margincontentalign}}}%
-   %
-   \expanded{\getparameters[\??im\margincontenttag][\c!align=\margincontentalign]}%
-   %
-   \edef\margincontentstrut{\getvalue{\??im\margincontenttag\c!strut}}%
-   \savestrut %
-   \setbox\scratchbox\vbox\localframed
-     [\??im\margincontenttag]
-     [\c!strut=\v!no,\c!offset=\v!overlay] % strut handled internally
-     {\decrement\margincontentlines
-      \dorecurse\margincontentlines{\savedstrut\endgraf\nointerlineskip}% ! savedstrut
-      \@@imbefore
-      \dostartattributes{\??im\margincontenttag}\c!style\c!color\empty
-        \dosetupstrut[\margincontentstrut]% was: \setstrut % yes or no
-        \begstrut#3\endstrut\endgraf
-        \xdef\margincontentstrutheight{\the\strutht}% so that it's known outside the framed
-      \dostopattributes
-      \@@imafter}%
-   \global        \naturalmargincontentheight\ht\scratchbox
-   \global\advance\naturalmargincontentheight\dp\scratchbox
-   \doif\@@imstack\v!yes
-     {\def\overlappingmargin{-20\scaledpoint}% test value, maybe .25\strutboxdp, maybe configurable
-      \setbox\scratchbox\vbox{\stackeddown\vbox{\box\scratchbox}}}% new
-   \ht\scratchbox\strutht
-   \dp\scratchbox\strutdp % nieuw
-   \box\scratchbox
-   \egroup}
-
-%D The stacker permits constructs like:
-%D
-%D \starttyping
-%D \setupinmargin[stack=yes]
-%D
-%D \inleft{test 1}test\break
-%D \inleft{test 2}test\break
-%D \inleft{test 1}
-%D \input tufte
-%D \inleft{test 1}
-%D \inleft{test 2}
-%D \inleft{test 3}
-%D \input tufte
-%D \inleft{test 1}
-%D \inleft{test 2\endgraf test 3}
-%D \inleft{test 4}
-%D \input tufte
-%D \inleft{test 1}
-%D \inleft{test 2\endgraf test 3}
-%D \inleft{test 4\endgraf test 5\endgraf test 6}
-%D \inleft{test 7\endgraf test 8\endgraf test 9}
-%D \input tufte
-%D \stoptyping
-
-%D This approach permits us to implement a better mechanism
-%D later. We need the \type {\graphicvadjust} in order to
-%D handle:
-%D
-%D \starttyping
-%D \inleft{test} {\red \dorecurse{40}{test }\par}
-%D {\red \inleft{test} \dorecurse{40}{test }\par}
-%D \stoptyping
-%D
-%D The outer margin color is either black or color set as
-%D main text color.
-
-\newif\ifrightmargin % documenteren
-
-\ifx\dopositionmarginbox\undefined
-  \def\dopositionmarginbox#1{\graphicvadjust{\box#1}}
-\fi
-
-% watch out, margin dimensions are swapped locally (\swapmargins)
-
-% with \margincontentmethod one can control pagebreaks
-%
-% 0 no break
-% 1 each entry is one line
-% 2 only natural height
-% 3 also stack height
-
-\chardef\margincontentmethod  \plusthree % beware: 1 = old method
-\chardef\marginpagecheckmethod\plusone
-
-\def\margincontentextralines{1}        % old method, play safe
-\def\nofmargincontentlines  {0}
-
-\def\doplacemargintext#1#2#3#4%
-  {\dontcomplain
-   \strut
-   \doifsomething{#1}
-     {\def\margincontenttag{#1}}%
-   \doifinsetelse{\margincontenttag}{\v!left,\v!right} % ugly hack
-     {\let \margincontentdistance                                                      \empty     % signal
-      \let \margincontenthoffset                                                       \zeropoint}
-     {\edef\margincontentdistance{\executeifdefined{\??im\margincontenttag\c!distance }\empty    }% signal
-      \edef\margincontenthoffset {\executeifdefined{\??im\margincontenttag\c!hoffset  }\zeropoint}}%
-   \edef\margincontentlines      {\executeifdefined{\??im\margincontenttag\c!line     }\plusone  }%
-   \edef\margincontentseparator  {\executeifdefined{\??im\margincontenttag\c!separator}\donothing}%
-   \setbox\scratchbox\hbox{#4}% % todo: make sure that color stack works
-   \ifcase\margincontentmethod
-     \scratchdimen\zeropoint
-   \or % old method
-     \scratchdimen\ht\scratchbox
-     \advance\scratchdimen\dp\scratchbox
-   \or
-     \scratchdimen\naturalmargincontentheight
-   \or
-     \scratchdimen\naturalmargincontentheight
-     \ifx\laststackvmove\undefined\else\global\advance\scratchdimen\laststackvmove\fi
-   \fi
-   \ifdim\scratchdimen>\margincontentheight
-     \global\margincontentheight\scratchdimen
-   \fi
-   \setbox\scratchbox\hbox
-     {#2{\hskip#3\strut
-         \ifcase\margincontentdisplacement
-           % normal, move strutheight up
-           \scratchdimen\strutdp
-           \advance\scratchdimen \margincontentstrutheight
-           \advance\scratchdimen -\strutht
-           \raise\scratchdimen
-         \or
-           % low, obey vadjust
-         \fi
-         \box\scratchbox}}%
-   \ht\scratchbox\zeropoint
-   \dp\scratchbox\zeropoint
-   \gdef\margincontentstrutheight{\the\strutht}%
-  %\graphicvadjust{\box\scratchbox}}     % fails in high math lines, let it be
-  %\hbox{\lower\strutdp\box\scratchbox}} % alas, wrong lapping, therefore useless
-   \dopositionmarginbox\scratchbox}
-
-% \def\domarginblockskip#1%
-%   {\hskip\margincontenthoffset
-%    \hskip\compensatedinnermakeupmargin\relax
-%    \doifelsenothing\margincontentdistance
-%      {\hskip\getvalue{\??im#1\c!distance}}
-%      {\hskip\margincontentdistance}%
-%    \relax}
-
-\def\domarginblockskip#1%
-  {\doifelsenothing\margincontentdistance
-     {\hskip\dimexpr
-        +\margincontenthoffset
-        +\compensatedinnermakeupmargin
-        +\csname\??im#1\c!distance\endcsname
-      \relax}
-     {\dimexpr
-        +\margincontenthoffset
-        +\compensatedinnermakeupmargin
-        +\margincontentdistance
-      \relax}%
-   \relax}
-
-\def\doleftmarginblock#1#2%
-  {\doplacemargintext{#1}\llap\zeropoint
-     {\llap{\placemargincontentseparator}%
-      \makemargintextblock\v!left\v!right{#2}%
-      \domarginblockskip\v!left}}
-
-\def\dorightmarginblock#1#2%
-  {\doplacemargintext{#1}\rlap\hsize
-     {\hskip\textwidth\hskip-\hsize % new: hsize correction
-      \domarginblockskip\v!right
-      \makemargintextblock\v!right\v!left{#2}%
-      \rlap{\placemargincontentseparator}}}
-
-\def\placemargincontentseparator
-  {\ifnum\margincontentlevel>\zerocount
-     \ifx\margincontentseparator\empty\else
-       \bgroup
-       \scratchdimen\margincontentlines\lineheight
-       \advance\scratchdimen -\lineheight
-       \lower\scratchdimen\hbox{\margincontentseparator}%
-       \egroup
-     \fi
-   \fi}
-
-\newbox\marginconstructbox
-
-\def\doinmarginswapped#1#2#3#4%
-  {\iffirstsidefloatparagraph\nowhitespace\fi % zo laat mogelijk
-   \setbox\marginconstructbox\hbox\bgroup % prevents page break in the middle of construction
-     \startsignalrightpage
-       \doifswappedrightpageelse
-         {\rightmargintrue #2}
-         {\rightmarginfalse#1}
-         {#3}% setups
-         {#4}% content
-     \stopsignalrightpage
-   \egroup
-   \unhbox\marginconstructbox}
-
-% history made this a bit complicated, the +/- was needed before
-% we had enough mem/hash to do the page correction
-
-\edef\inmargintaglist{+,-,\v!low,\v!left,\v!right,\v!inner,\v!outer}
-
-% the old one:
-%
-% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
-%   {\doifcommonelse{+,-,\v!laag}{#4}
-%      {\dodoinmargin[#1][#2][#3][#4][#5]}
-%      {\dodoinmargin[#1][#2][#3][][#4]}}
-%
-% an alternative:
-%
-% \letvalue{\??im\v!laag\c!offset}\empty
-% \letvalue{\??im      +\c!offset}\empty
-% \letvalue{\??im      -\c!offset}\empty
-%
-% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
-%   {\doifnumberelse{#4}
-%      {\dodoinmargin[#1][#2][#3][#4][#5]}
-%      {\doifdefinedelse{\??im#4\c!offset}
-%         {\dodoinmargin[#1][#2][#3][#4][#5]}
-%         {\dodoinmargin[#1][#2][#3][][#4]}}}
-%
-% the problem is that we need to keep downward compatibility
-% with respect to the first argument thing a reference or a
-% directive; the alternative is to force users to pass a
-% directive along with a reference; anyhow, as long as one
-% does not use references that have the same name as a
-% directive we can use the (slow) alternative
-
-\def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
-  {\expanded{\doifinsetelse{#4}{\inmargintaglist}}
-     {\dodoinmargin[#1][#2][#3][#4][#5]}
-     {\dodoinmargin[#1][#2][#3][][#4]}}
-
-\def\defineinmargin
-  {\doquadrupleempty\dodefineinmargin}
-
-\def\dodefineinmargin[#1][#2][#3][#4]%
-  {\doifassignmentelse{#4}
-     {\setupinmargin[#1][#4]%
-      \setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#1]}}
-     {\setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#4]}}}
-
-\defineinmargin [inleft]   [\v!left]       [\v!normal]   % takes left settings
-\defineinmargin [inright]  [\v!right]      [\v!normal]   % takes right settings
-\defineinmargin [ininner]  [\v!inner]      [\v!normal]   % takes left/right settings
-\defineinmargin [inouter]  [\v!outer]      [\v!normal]   % takes left/right settings
-\defineinmargin [inmargin] [\@@imlocation] [\v!normal]   % takes left/right settings
-\defineinmargin [inother]  [\@@imlocation] [\v!reverse]  % takes left/right settings
-
-\def\inothermargin{\inother}
-
-%D This permits definitions like:
-%D
-%D \starttyping
-%D \defineinmargin [SomePlace] [inner] [normal] [distance=1cm]
-%D \defineinmargin [SomePlace] [inner] [normal] [SomePlace]    \setupinmargin[SomePlace][distance=1cm]
-%D \defineinmargin [MyPlace]   [inner] [normal] [SomePlace]
-%D \defineinmargin [YourPlace] [inner] [normal] [SomePlace]
-%D \stoptyping
-%D
-%D A torture test:
-%D
-%D \starttyping
-%D \startbuffer
-%D \inleft       {\TestLine{red}    {l}} test test test \par
-%D \inright      {\TestLine{green}  {r}} test test test \par
-%D \inmargin     {\TestLine{blue}   {m}} test test test \par
-%D \inothermargin{\TestLine{yellow} {x}} test test test \par
-%D \ininner      {\TestLine{cyan}   {i}} test test test \par
-%D \inouter      {\TestLine{magenta}{o}} test test test \par
-%D \stopbuffer
-%D
-%D \dorecurse{80}\getbuffer \page
-%D \stoptyping
-%D
-%D and
-%D
-%D \starttyping
-%D \defineinmargin [InOuterA] [outer] [normal] [distance=0cm]
-%D \defineinmargin [InOuterB] [outer] [normal] [distance=1cm]
-%D \defineinmargin [InOuterC] [outer] [normal] [distance=2cm,line=2]
-%D
-%D \startbuffer
-%D \InOuterA{\TestLine{red}  {A}} test test test \par
-%D \InOuterB{\TestLine{green}{B}} test test test \par
-%D \InOuterC{\TestLine{blue} {C}} test test test \par
-%D \stopbuffer
-%D
-%D \dorecurse{80}\getbuffer \page
-%D
-%D \dorecurse{10}{\inleft {one} test \inleft {two} test } \page
-%D
-%D \start
-%D   \margintext {one} \margintext {two} \input thuan \par
-%D   \setupinmargin[1][line=3,distance=1cm]
-%D   \margintext [1]{one}
-%D   \margintext [2]{two}
-%D   \input thuan \page
-%D \stop
-%D
-%D \setupinmargin[3][location=inner,distance=1cm]
-%D \setupinmargin[4][location=outer,distance=2cm]
-%D
-%D % \setupinmargin[left] [line=2]
-%D % \setupinmargin[right][line=2]
-%D
-%D \dorecurse
-%D   {10}
-%D   {\margintext       {\kern3cm\TestLine{blue}{none}}
-%D    \margintext[3]    {\TestLine{darkgray}{3}}
-%D    \margintext[4]    {\TestLine{darkgray}{4}}
-%D    \margintext[left] {\TestLine{red}     {left}}
-%D    \margintext[right]{\TestLine{green}   {right}}
-%D    \margintext[inner]{\TestLine{cyan}    {inner}}
-%D    \margintext[outer]{\TestLine{magenta} {outer}}
-%D    \input thuan \endgraf}
-%D
-%D \dorecurse{10}{\margintext{test\\test\\test} \input thuan \endgraf}
-%D \stoptyping
-
-% Test case:
-%
-% \setuppagenumbering[alternative=doublesided] \setupwhitespace[medium]
-%
-% \placefigure[right]{}{\externalfigure[dummy][width=2cm]}
-% \input tufte \inothermargin{test} \input tufte
-
-% \def\dodoinmargin[#1][#2][#3][#4][#5]#6%
-%   {\bgroup
-%    \forgetall % otherwise sidefloat problems, added 2005/07/20, maybe dangerous
-%    \postponenotes % group is (somehow) needed
-%    \doifinsetelse\v!low{#4}
-%      {\chardef\margincontentdisplacement\plusone}
-%      {\chardef\margincontentdisplacement\zerocount}%
-%    \doif\v!reverse{#2}
-%      {\swapmacros\dorightmarginblock\doleftmarginblock}%
-%    \processaction
-%      [#1]
-%      [   \v!left=>\let\next\doleftmarginblock,  % no swapping
-%         \v!right=>\let\next\dorightmarginblock, % no swapping
-%         \v!inner=>\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock },
-%         \v!outer=>\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock},
-%       \s!unknown=>\ifdoublesided
-%                     \doifcommonelse{+,-}{#4}
-%                       {\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock }}
-%                       {\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock}}%
-%                   \else
-%                     \let\next\doleftmarginblock
-%                   \fi]%
-%    \next{#3}{#6}%
-%    \rawpagereference\s!mar{#5}% naar binnen ! ! ! !
-%    \flushnotes
-%    \egroup % don't forget the group
-%    \ignorespaces}
-
-% test first
-%
-% setupsystem[random=1235]
-%
-% \setupinmargin[left][sidemethod=3]
-% \dorecurse{10}{test \fakewords{20}{40} test \inleft{test\\test} test \fakewords{20}{40} \par}
-% \page
-% \setupinmargin[left][sidemethod=4]
-% \dorecurse{40}{test \fakewords{50}{80} test \inleft{test\\test} \par}
-% \page
-
-\def\dodoinmargin[#1][#2][#3][#4][#5]#6%
-  {\bgroup
-% \tracingall
-   % old stuff, a bit tricky, but now interfaced
-   \edef\currentmargincontent{#1}%
-   \chardef\marginrepositionmethod\executeifdefined{\??im\currentmargincontent\c!sidemethod }\plusone
-   \chardef\margincontentmethod   \executeifdefined{\??im\currentmargincontent\c!textmethod }\plusthree
-   \chardef\marginpagecheckmethod \executeifdefined{\??im\currentmargincontent\c!splitmethod}\plusone
-   % so far
-   \forgetall % otherwise sidefloat problems, added 2005/07/20, maybe dangerous
-   \postponenotes % group is (somehow) needed
-   \doifinsetelse\v!low{#4}
-     {\chardef\margincontentdisplacement\plusone}
-     {\chardef\margincontentdisplacement\zerocount}%
-   \doif\v!reverse{#2}
-     {\swapmacros\dorightmarginblock\doleftmarginblock}%
-   \processaction
-     [#1]
-     [   \v!left=>\let\next\doleftmarginblock,  % no swapping
-        \v!right=>\let\next\dorightmarginblock, % no swapping
-        \v!inner=>\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock },
-        \v!outer=>\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock},
-      \s!unknown=>\ifdoublesided
-                    \doifcommonelse{+,-}{#4}
-                      {\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock }}
-                      {\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock}}%
-                  \else
-                    \let\next\doleftmarginblock
-                  \fi]%
-   \next{#3}{#6}%
-   \rawpagereference\s!mar{#5}% naar binnen ! ! ! !
-   \flushnotes
-   \egroup % don't forget the group
-   \ignorespaces}
-
-% dit zijn voorlopig lokale commando's / vervallen
-%
-% \def\woordinmarge {\indentation\doquintupleempty\doinmargin[\@@implaats][\inleftmargin][\inrightmarge]}
-%
-% \def\woordinlinker {\inleftmargin  } % vervallen
-% \def\woordinrechter{\inrechtermarge} % vervallen
-
-% Some day: \definemarking[\v!margetitel]
-
-%D Now come the margin text collectors. The collected content is
-%D flushed at every paragraph by the following macro. Note for
-%D myself: here the location (plaats) is no longer a tag (number).
-
-% gone: \def\doflushmargincontent{\doinmargin[\@@implaats][\v!normaal][]} % + [#1][#2]{#3}}
-
-%D These are now all the same (long ago they had different
-%D implementations, somewhere in Sork time if I remember
-%D right).
-
-\def\margintext {\dodoubleempty\domargincontent}
-\def\marginword {\margintext}
-\def\margintitle{\margintext} % txt mark as well
-
-\newtoks\collectedmargintexts % so .. delayed!
-\chardef\margintextcollected  \zerocount
-
-\def\domargincontent[#1][#2]#3% we used to check for #2/#1 being number, no longer now
-  {\global\chardef\margintextcollected\plusone
-   \edef\margincontenttag{#1}%
-   \ifx\margincontenttag\empty
-     \global\advance\margincontentlevel\plusone
-     \edef\margincontenttag{\number\margincontentlevel}%
-   \fi
-   \checkinmargin[\margincontenttag]%
-   \doglobal \appendetoks
-     \noexpand \checkinmargin[\margincontenttag]%
-     \noexpand \doinmargin[\executeifdefined{\??im\margincontenttag\c!location}\@@imlocation][\v!normal][\margincontenttag][\margincontenttag][#2]%
-   \to \collectedmargintexts
-   \doglobal \appendtoks
-     {#3}%
-   \to \collectedmargintexts}
-
-\let\restoreinterlinepenalty\relax
-
-\def\flushmargincontents % plural
-  {\restoreinterlinepenalty % here?
-   \ifcase\margintextcollected\else     % called quite often, so we
-     \expandafter\doflushmargincontents % speed up the \fi scan by
-   \fi}                                 % using a \do..
-
-\def\doflushmargincontents % links + rechts
-  {\bgroup
-   \forgetall
-   \global\margincontentheight\zeropoint
-   \startsignalrightpage
-     \the\collectedmargintexts
-     \signalrightpage
-   \stopsignalrightpage
-   \resetmargincontent
-   % dirty tricks
-   \ifcase\margincontentmethod
-     \donefalse
-   \else\ifinsidecolumns % brrrr
-     \donetrue  % how fuzzy
-   \else\ifdim\margincontentheight>\lineheight\relax
-     \donetrue  % how dirty
-   \else
-     \donefalse % how needed
-   \fi\fi\fi
-   \savemargincontentlines
-   \ifdone
-     \advance\margincontentheight \margincontentextralines\lineheight
-     \ifdim\pagegoal>\pagetotal
-       \bgroup % preserve \margincontentheight
-       \advance\margincontentheight \pagetotal
-       \ifdim\margincontentheight>\pagegoal
-         \egroup
-         \ifcase\marginpagecheckmethod
-           % disabled
-         \or
-           \setmargincontentpenalties
-         \or
-           % potentially dangerous, maybe better a \goodbreak; the problem is that
-           % there can be a penalty there, which we then overload and we also introduce
-           % nasty side effects, so, we drop this option
-           % \vadjust pre {\page}%
-         \fi
-       \else
-         \egroup
-       \fi
-     \fi
-   \else % We need the above because interlinepenalties overrule vadjusted \nobreaks.
-     % a  bit dangerous
-     \vadjust{\nobreak}%
-   \fi
-   \egroup}
-
-\def\setmargincontentpenalties
-  {\getnoflines\margincontentheight
-   \keeplinestogether\noflines}
-
-\def\savemargincontentlines
-  {\bgroup
-   \advance\margincontentheight \margincontentextralines\lineheight % 1 by default
-   \getnoflines\margincontentheight
-   \xdef\nofmargincontentlines{\the\noflines}%
-   \egroup}
-
-\def\fillupmargincontentlines % etex ! ! !
-  {\endgraf
-   \begingroup
-   \scratchcounter\numexpr\nofmargincontentlines-\prevgraf\relax\relax
-   \ifnum\scratchcounter>\zerocount
-     \forgetall\dorecurse\scratchcounter{\nobreak\crlf}%
-   \fi
-   \endgroup}
-
-% Yet undocumented, for a manual flush in for instance headers.
-
-\def\resetmargincontent
-  {\global\margincontentlevel\zerocount
-   \global\chardef\margintextcollected\zerocount
-   \global\collectedmargintexts\emptytoks}
-
-% \def\placemargincontent
-%   {\ifcase\margintextcollected\else
-%      \bgroup
-%        \chardef\graphicvadjustmode\zerocount
-%        \doflushmargincontents
-%      \egroup
-%    \fi}
-%
-% font fix:
-
-\def\placemargincontent
-  {\ifcase\margintextcollected\else % was level check
-     \bgroup
-       \redoconvertfont % !!
-       \chardef\graphicvadjustmode\zerocount
-       \doflushmargincontents
-     \egroup
-   \fi}
-
-% For old times sake (i use it in project styles) we provide
-
-\def\placemargintexts {\placemargincontent}
-\def\resetmargetitels {\resetmargincontent}
-\def\margewoordpositie{\margewoord} % obsolete, now no longer range
-
-% but never use them yourself since they may disappear.
-
-\def\oplinker#1%
-  {\strut
-   \graphicvadjust
-     {\dontcomplain
-      \setbox\scratchbox\vtop{\forgetall\strut#1}%
-      \getboxheight\scratchdimen\of\box\scratchbox
-      \vskip-\scratchdimen % waarom stond hier een \ ?
-      \box\scratchbox}}
-
-\setupinmargin
-  [\c!style=\v!bold,
-   \c!color=,
-   \c!strut=\v!auto,
-   \c!location=\v!both,
-   \c!align=\v!inner,
-   \c!stack=\v!no,
-   \c!before=,
-   \c!after=]
-
-\setupinmargin
-  [\v!left]
-  [\c!distance=\leftmargindistance,
-   \c!width=\leftmarginwidth,
-  %\c!align=\v!left, % no
-   \c!location=\v!left]
-
-\setupinmargin
-  [\v!right]
-  [\c!distance=\rightmargindistance,
-   \c!width=\rightmarginwidth,
-  %\c!align=\v!right, % no
-   \c!location=\v!right]
-
-% bonus needed when [inner/outer] is used as tag
-
-\setupinmargin[\v!inner][\c!location=\v!inner,\c!align=\v!inner]
-\setupinmargin[\v!outer][\c!location=\v!outer,\c!align=\v!inner]
-
-% more efficient (5K less fotmat file)
-%
-% \letvalue{\??im\v!inner\c!location}\v!inner \letvalue{\??im\v!inner\c!align}\v!inner
-% \letvalue{\??im\v!outer\c!location}\v!outer \letvalue{\??im\v!outer\c!align}\v!inner
-
-\protect \endinput
diff --git a/tex/context/base/page-mis.mkii b/tex/context/base/page-mis.mkii
new file mode 100644
index 000000000..bd029f896
--- /dev/null
+++ b/tex/context/base/page-mis.mkii
@@ -0,0 +1,268 @@
+%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 / Hans Hagen \& Ton Otten}]
+%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}
+
+\unprotect
+
+\newif\ifmargeblokken
+
+\def\dosetupmarginblocks[#1]%
+  {\getparameters[\??mb][#1]%
+   \doifelse\@@mbstate\v!start
+     {\showmessage\m!layouts4\empty
+      \margeblokkentrue
+      \let\somenextfloat\dosomenextfloat
+      \let\startmarginblock\dostartmarginblock
+      \let\stopmarginblock\dostopmarginblock}%
+     {\showmessage\m!layouts5\empty
+      \margeblokkenfalse
+      \def\somenextfloat[##1]%
+        {\someelsefloat[##1,\v!here]}%
+      \let\startmarginblock\dontstartmargeblok
+      \let\stopmarginblock\dontstopmargeblok}}
+
+\def\setupmarginblocks
+  {\dosingleargument\dosetupmarginblocks}
+
+\newbox\marginbox
+
+\def\dosomenextfloat[#1]%
+  {\global\setbox\marginbox\vbox
+     {\hsize\@@mbwidth
+      \unvcopy\marginbox
+      \ifvoid\marginbox\else\expandafter\@@mbinbetween\fi
+      \box\floatbox\filbreak}%
+   \ifdim\ht\marginbox>\textheight
+     \dosavefloatinfo
+   \else
+     \doinsertfloatinfo
+   \fi}
+
+\newbox\preparedmarginbox
+
+\def\reshapemargin
+  {\ifdim\ht\preparedmarginbox>\zeropoint
+     \beginofshapebox
+     \unvbox\preparedmarginbox
+     \endofshapebox
+     \reshapebox
+       {\box\shapebox}%
+     \setbox\preparedmarginbox\vbox to \textheight
+       {\@@mbtop
+        \flushshapebox
+        \@@mbbottom}%
+   \fi}
+
+\def\plaatsrechtermargeblok
+  {\hskip\rightmarginwidth}
+
+\def\plaatslinkermargeblok
+  {\hskip\leftmarginwidth}
+
+\def\checkmargeblokken
+  {\ifvoid\marginbox\else\docheckmargeblokken\fi}
+
+\def\docheckmargeblokken % erg inefficient
+  {\setbox\preparedmarginbox\vbox
+     {\forgetall
+      \splittopskip\topskip
+      \ifvoid\marginbox\else
+        \ifdim\ht\marginbox>\textheight
+          \vsplit\marginbox to \textheight
+        \else
+          \unvbox\marginbox
+        \fi
+      \fi}%
+   \reshapemargin
+   \setbox\preparedmarginbox\vbox
+      {\@@mbbefore\box\preparedmarginbox\@@mbafter}%
+   \def\rightmarginbox
+     {\def\plaatsrechtermargeblok
+        {\setbox\preparedmarginbox\hbox to \rightmarginwidth
+           {\@@mbleft\box\preparedmarginbox\@@mbright}%
+         \vsmashbox\preparedmarginbox
+         \box\preparedmarginbox}}%
+   \def\leftmarginbox
+     {\def\plaatslinkermargeblok
+        {\setbox\preparedmarginbox\hbox to \leftmarginwidth
+           {\@@mbright\box\preparedmarginbox\@@mbleft}%
+         \vsmashbox\preparedmarginbox
+         \box\preparedmarginbox}}%
+   \processaction % traag
+     [\@@mblocation]
+     [ \v!inmargin=>\doifbothsidesoverruled\rightmarginbox\rightmarginbox\leftmarginbox,
+         \v!middle=>\doifbothsidesoverruled\rightmarginbox\leftmarginbox\rightmarginbox,
+           \v!left=>\leftmarginbox,
+          \v!right=>\rightmarginbox,
+        \s!unknown=>\setbox\preparedmarginbox\hbox{}]}
+
+\def\dostartmarginblock % 2 maal \vbox ivm \unvbox elders
+  {\global\setbox\marginbox\vtop\bgroup\vbox\bgroup
+     \hsize\@@mbwidth
+     \ifvoid\marginbox\else
+       \unvbox\marginbox
+       \@@mbinbetween
+     \fi
+     \setupalign[\@@mbalign]%
+     \dostartattributes\??mb\c!style\c!color{}%
+     \begstrut\ignorespaces}
+
+\def\dostopmarginblock
+  {\unskip\endstrut
+   \dostopattributes
+   \egroup
+   \egroup}
+
+\def\dontstartmargeblok
+  {\@@mbbefore
+   \bgroup
+   \dostartattributes\??mb\c!style\c!color\empty}
+
+\def\dontstopmargeblok
+  {\dostopattributes
+   \egroup
+   \@@mbafter}
+
+\newcounter\nofpostponedblocks
+
+\newif\ifinpostponing
+
+\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
+
+\newtoks   \postponedpageblocks
+\newcounter\nofpostponedpageblocks
+
+% \ifinpostponing: handhaven, want gebruikt in stijlen ! ! ! ! !
+
+\def\flushpagefloats
+  {\doifoddpageelse
+     {\ifvoid\collectedleftpagefloats
+        \ifvoid\collectedrightpagefloats\else
+           \unvbox\collectedrightpagefloats
+           \page
+          %\the\everytopofpage
+        \fi
+      \fi}
+     {\ifvoid\collectedleftpagefloats\else
+        \unvbox\collectedleftpagefloats
+        \page
+       %\the\everytopofpage
+      \fi
+      \ifvoid\collectedrightpagefloats\else
+         \unvbox\collectedrightpagefloats
+         \page
+        %\the\everytopofpage
+      \fi}%
+   \ifvoid\collectedpagefloats\else
+     % message
+     \unvbox\collectedpagefloats
+   \fi}
+
+% \def\flushrestfloats
+%   {\doif{\floatsharedparameter\c!cache}\v!no\doflushfloats}
+
+% \let\flushrestfloats\relax
+
+\def\dopostponeblock
+  {\bgroup % new may 2004
+   \setsystemmode\v!postponing % new may 2004
+   \the\everytopofpage
+  %\flushrestfloats
+   \flushpagefloats
+   \donefalse
+   \ifinpostponing \else
+     \ifcase\nofpostponedblocks     \else \donetrue \fi
+     \ifcase\nofpostponedpageblocks \else \donetrue \fi
+   \fi
+   \ifdone
+     \bgroup % we need the color/font switch, else problems inside split verbatim
+     \setnormalcatcodes % postponing in verbatim
+     \pushpostponedpagecolor
+     \restoreglobalbodyfont                        % The \nof-test is
+     \global\pagetotal\zeropoint                   % recently added and
+     \global\inpostponingtrue                      % definitely needed else
+     \the\postponedpageblocks                      % we can loose or disorder
+     \dorecurse\nofpostponedblocks                 % floats; anyhow, this
+       {\getbuffer[pbuf-\recurselevel]}%           % mechanism is still
+     \doflushfloats % new but potential dangerous  % suboptimal and needs a
+     \doglobal\newcounter\nofpostponedblocks       % proper analysis
+     \global\inpostponingfalse
+     \poppostponedpagecolor
+     \egroup
+   \fi
+   \egroup} % new may 2004
+
+\def\getpostponedblock#1#2%
+  {\doif{#1}\realfolio{\getbuffer[rbuf-#2]}} % no \ifnum, avoid \fi
+
+% beware, \dosingleempty conflicts with buffers (feeds back the \par)
+
+\setvalue{\e!start\v!postponing}%
+  {\bgroup
+   \obeylines
+   \doifnextoptionalelse{\egroup\nodostartpostponing}{\egroup\dodostartpostponing}}
+
+\def\nodostartpostponing[#1]%
+  {\doglobal\increment\nofpostponedpageblocks
+   \bgroup % a little bit of misusing grouping
+   \doifinstring{+}{#1}\advance \realpageno#1\relax % ugly but efficient
+   \doglobal\appendetoks\noexpand\getpostponedblock
+     {\realfolio}{\nofpostponedpageblocks}\to\postponedpageblocks
+   \egroup
+   \showmessage\m!layouts3\nofpostponedpageblocks
+   \dostartbuffer[rbuf-\nofpostponedpageblocks]%
+     [\e!start\v!postponing][\e!stop\v!postponing]}
+
+\def\dodostartpostponing
+  {\doglobal\increment\nofpostponedblocks
+   \showmessage\m!layouts3\nofpostponedblocks
+   \expanded{\dostartbuffer[pbuf-\nofpostponedblocks][\e!start\v!postponing][\e!stop\v!postponing]}}
+
+% Setups:
+
+\setupmarginblocks
+  [\c!state=\v!start,
+   \c!location=\v!inmargin,
+   \c!width=\rightmarginwidth,
+   \c!style=,
+   \c!color=,
+   \c!align=,
+   \c!left=,
+   \c!right=,
+   \c!top=,
+   \c!inbetween=\blank,
+   \c!bottom=\vfill,
+   \c!before=,
+   \c!after=]
+
+\protect \endinput
diff --git a/tex/context/base/page-mis.mkiv b/tex/context/base/page-mis.mkiv
new file mode 100644
index 000000000..a620835e4
--- /dev/null
+++ b/tex/context/base/page-mis.mkiv
@@ -0,0 +1,266 @@
+%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 / Hans Hagen \& Ton Otten}]
+%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}
+
+\unprotect
+
+\newif\ifmargeblokken
+
+\def\dosetupmarginblocks[#1]%
+  {\getparameters[\??mb][#1]%
+   \doifelse\@@mbstate\v!start
+     {\showmessage\m!layouts4\empty
+      \margeblokkentrue
+      \let\somenextfloat\dosomenextfloat
+      \let\startmarginblock\dostartmarginblock
+      \let\stopmarginblock\dostopmarginblock}%
+     {\showmessage\m!layouts5\empty
+      \margeblokkenfalse
+      \def\somenextfloat[##1]%
+        {\someelsefloat[##1,\v!here]}%
+      \let\startmarginblock\dontstartmargeblok
+      \let\stopmarginblock\dontstopmargeblok}}
+
+\def\setupmarginblocks
+  {\dosingleargument\dosetupmarginblocks}
+
+\newbox\marginbox
+
+\def\dosomenextfloat[#1]%
+  {\global\setbox\marginbox\vbox
+     {\hsize\@@mbwidth
+      \unvcopy\marginbox
+      \ifvoid\marginbox\else\expandafter\@@mbinbetween\fi
+      \box\floatbox\filbreak}%
+   \ifdim\ht\marginbox>\textheight
+     \dosavefloatinfo
+   \else
+     \doinsertfloatinfo
+   \fi}
+
+\newbox\preparedmarginbox
+
+\def\reshapemargin
+  {\ifdim\ht\preparedmarginbox>\zeropoint
+     \beginofshapebox
+     \unvbox\preparedmarginbox
+     \endofshapebox
+     \reshapebox
+       {\box\shapebox}%
+     \setbox\preparedmarginbox\vbox to \textheight
+       {\@@mbtop
+        \flushshapebox
+        \@@mbbottom}%
+   \fi}
+
+\def\plaatsrechtermargeblok
+  {\hskip\rightmarginwidth}
+
+\def\plaatslinkermargeblok
+  {\hskip\leftmarginwidth}
+
+\def\checkmargeblokken
+  {\ifvoid\marginbox\else\docheckmargeblokken\fi}
+
+\def\docheckmargeblokken % erg inefficient
+  {\setbox\preparedmarginbox\vbox
+     {\forgetall
+      \splittopskip\topskip
+      \ifvoid\marginbox\else
+        \ifdim\ht\marginbox>\textheight
+          \vsplit\marginbox to \textheight
+        \else
+          \unvbox\marginbox
+        \fi
+      \fi}%
+   \reshapemargin
+   \setbox\preparedmarginbox\vbox
+      {\@@mbbefore\box\preparedmarginbox\@@mbafter}%
+   \def\rightmarginbox
+     {\def\plaatsrechtermargeblok
+        {\setbox\preparedmarginbox\hbox to \rightmarginwidth
+           {\@@mbleft\box\preparedmarginbox\@@mbright}%
+         \vsmashbox\preparedmarginbox
+         \box\preparedmarginbox}}%
+   \def\leftmarginbox
+     {\def\plaatslinkermargeblok
+        {\setbox\preparedmarginbox\hbox to \leftmarginwidth
+           {\@@mbright\box\preparedmarginbox\@@mbleft}%
+         \vsmashbox\preparedmarginbox
+         \box\preparedmarginbox}}%
+   \processaction % traag
+     [\@@mblocation]
+     [ \v!inmargin=>\doifbothsidesoverruled\rightmarginbox\rightmarginbox\leftmarginbox,
+         \v!middle=>\doifbothsidesoverruled\rightmarginbox\leftmarginbox\rightmarginbox,
+           \v!left=>\leftmarginbox,
+          \v!right=>\rightmarginbox,
+        \s!unknown=>\setbox\preparedmarginbox\hbox{}]}
+
+\def\dostartmarginblock % 2 maal \vbox ivm \unvbox elders
+  {\global\setbox\marginbox\vtop\bgroup\vbox\bgroup
+     \hsize\@@mbwidth
+     \ifvoid\marginbox\else
+       \unvbox\marginbox
+       \@@mbinbetween
+     \fi
+     \setupalign[\@@mbalign]%
+     \dostartattributes\??mb\c!style\c!color{}%
+     \begstrut\ignorespaces}
+
+\def\dostopmarginblock
+  {\unskip\endstrut
+   \dostopattributes
+   \egroup
+   \egroup}
+
+\def\dontstartmargeblok
+  {\@@mbbefore
+   \bgroup
+   \dostartattributes\??mb\c!style\c!color\empty}
+
+\def\dontstopmargeblok
+  {\dostopattributes
+   \egroup
+   \@@mbafter}
+
+\newcounter\nofpostponedblocks
+
+\newif\ifinpostponing
+
+\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
+
+\newtoks   \postponedpageblocks
+\newcounter\nofpostponedpageblocks
+
+% \ifinpostponing: handhaven, want gebruikt in stijlen ! ! ! ! !
+
+\def\flushpagefloats
+  {\doifoddpageelse
+     {\ifvoid\collectedleftpagefloats
+        \ifvoid\collectedrightpagefloats\else
+           \unvbox\collectedrightpagefloats
+           \page
+          %\the\everytopofpage
+        \fi
+      \fi}
+     {\ifvoid\collectedleftpagefloats\else
+        \unvbox\collectedleftpagefloats
+        \page
+       %\the\everytopofpage
+      \fi
+      \ifvoid\collectedrightpagefloats\else
+         \unvbox\collectedrightpagefloats
+         \page
+        %\the\everytopofpage
+      \fi}%
+   \ifvoid\collectedpagefloats\else
+     % message
+     \unvbox\collectedpagefloats
+   \fi}
+
+% \def\flushrestfloats
+%   {\doif{\floatsharedparameter\c!cache}\v!no\doflushfloats}
+
+% \let\flushrestfloats\relax
+
+\def\dopostponeblock
+  {\bgroup % new may 2004
+   \setsystemmode\v!postponing % new may 2004
+   \the\everytopofpage
+  %\flushrestfloats
+   \flushpagefloats
+   \donefalse
+   \ifinpostponing \else
+     \ifcase\nofpostponedblocks     \else \donetrue \fi
+     \ifcase\nofpostponedpageblocks \else \donetrue \fi
+   \fi
+   \ifdone
+     \bgroup % we need the color/font switch, else problems inside split verbatim
+     \setnormalcatcodes % postponing in verbatim
+     \restoreglobalbodyfont                        % The \nof-test is
+     \global\pagetotal\zeropoint                   % recently added and
+     \global\inpostponingtrue                      % definitely needed else
+     \the\postponedpageblocks                      % we can loose or disorder
+     \dorecurse\nofpostponedblocks                 % floats; anyhow, this
+       {\getbuffer[pbuf-\recurselevel]}%           % mechanism is still
+     \doflushfloats % new but potential dangerous  % suboptimal and needs a
+     \doglobal\newcounter\nofpostponedblocks       % proper analysis
+     \global\inpostponingfalse
+     \egroup
+   \fi
+   \egroup} % new may 2004
+
+\def\getpostponedblock#1#2%
+  {\doif{#1}\realfolio{\getbuffer[rbuf-#2]}} % no \ifnum, avoid \fi
+
+% beware, \dosingleempty conflicts with buffers (feeds back the \par)
+
+\setvalue{\e!start\v!postponing}%
+  {\bgroup
+   \obeylines
+   \doifnextoptionalelse{\egroup\nodostartpostponing}{\egroup\dodostartpostponing}}
+
+\def\nodostartpostponing[#1]%
+  {\doglobal\increment\nofpostponedpageblocks
+   \bgroup % a little bit of misusing grouping
+   \doifinstring{+}{#1}\advance \realpageno#1\relax % ugly but efficient
+   \doglobal\appendetoks\noexpand\getpostponedblock
+     {\realfolio}{\nofpostponedpageblocks}\to\postponedpageblocks
+   \egroup
+   \showmessage\m!layouts3\nofpostponedpageblocks
+   \dostartbuffer[rbuf-\nofpostponedpageblocks]%
+     [\e!start\v!postponing][\e!stop\v!postponing]}
+
+\def\dodostartpostponing
+  {\doglobal\increment\nofpostponedblocks
+   \showmessage\m!layouts3\nofpostponedblocks
+   \expanded{\dostartbuffer[pbuf-\nofpostponedblocks][\e!start\v!postponing][\e!stop\v!postponing]}}
+
+% Setups:
+
+\setupmarginblocks
+  [\c!state=\v!start,
+   \c!location=\v!inmargin,
+   \c!width=\rightmarginwidth,
+   \c!style=,
+   \c!color=,
+   \c!align=,
+   \c!left=,
+   \c!right=,
+   \c!top=,
+   \c!inbetween=\blank,
+   \c!bottom=\vfill,
+   \c!before=,
+   \c!after=]
+
+\protect \endinput
diff --git a/tex/context/base/page-mis.tex b/tex/context/base/page-mis.tex
deleted file mode 100644
index bd029f896..000000000
--- a/tex/context/base/page-mis.tex
+++ /dev/null
@@ -1,268 +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 / Hans Hagen \& Ton Otten}]
-%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}
-
-\unprotect
-
-\newif\ifmargeblokken
-
-\def\dosetupmarginblocks[#1]%
-  {\getparameters[\??mb][#1]%
-   \doifelse\@@mbstate\v!start
-     {\showmessage\m!layouts4\empty
-      \margeblokkentrue
-      \let\somenextfloat\dosomenextfloat
-      \let\startmarginblock\dostartmarginblock
-      \let\stopmarginblock\dostopmarginblock}%
-     {\showmessage\m!layouts5\empty
-      \margeblokkenfalse
-      \def\somenextfloat[##1]%
-        {\someelsefloat[##1,\v!here]}%
-      \let\startmarginblock\dontstartmargeblok
-      \let\stopmarginblock\dontstopmargeblok}}
-
-\def\setupmarginblocks
-  {\dosingleargument\dosetupmarginblocks}
-
-\newbox\marginbox
-
-\def\dosomenextfloat[#1]%
-  {\global\setbox\marginbox\vbox
-     {\hsize\@@mbwidth
-      \unvcopy\marginbox
-      \ifvoid\marginbox\else\expandafter\@@mbinbetween\fi
-      \box\floatbox\filbreak}%
-   \ifdim\ht\marginbox>\textheight
-     \dosavefloatinfo
-   \else
-     \doinsertfloatinfo
-   \fi}
-
-\newbox\preparedmarginbox
-
-\def\reshapemargin
-  {\ifdim\ht\preparedmarginbox>\zeropoint
-     \beginofshapebox
-     \unvbox\preparedmarginbox
-     \endofshapebox
-     \reshapebox
-       {\box\shapebox}%
-     \setbox\preparedmarginbox\vbox to \textheight
-       {\@@mbtop
-        \flushshapebox
-        \@@mbbottom}%
-   \fi}
-
-\def\plaatsrechtermargeblok
-  {\hskip\rightmarginwidth}
-
-\def\plaatslinkermargeblok
-  {\hskip\leftmarginwidth}
-
-\def\checkmargeblokken
-  {\ifvoid\marginbox\else\docheckmargeblokken\fi}
-
-\def\docheckmargeblokken % erg inefficient
-  {\setbox\preparedmarginbox\vbox
-     {\forgetall
-      \splittopskip\topskip
-      \ifvoid\marginbox\else
-        \ifdim\ht\marginbox>\textheight
-          \vsplit\marginbox to \textheight
-        \else
-          \unvbox\marginbox
-        \fi
-      \fi}%
-   \reshapemargin
-   \setbox\preparedmarginbox\vbox
-      {\@@mbbefore\box\preparedmarginbox\@@mbafter}%
-   \def\rightmarginbox
-     {\def\plaatsrechtermargeblok
-        {\setbox\preparedmarginbox\hbox to \rightmarginwidth
-           {\@@mbleft\box\preparedmarginbox\@@mbright}%
-         \vsmashbox\preparedmarginbox
-         \box\preparedmarginbox}}%
-   \def\leftmarginbox
-     {\def\plaatslinkermargeblok
-        {\setbox\preparedmarginbox\hbox to \leftmarginwidth
-           {\@@mbright\box\preparedmarginbox\@@mbleft}%
-         \vsmashbox\preparedmarginbox
-         \box\preparedmarginbox}}%
-   \processaction % traag
-     [\@@mblocation]
-     [ \v!inmargin=>\doifbothsidesoverruled\rightmarginbox\rightmarginbox\leftmarginbox,
-         \v!middle=>\doifbothsidesoverruled\rightmarginbox\leftmarginbox\rightmarginbox,
-           \v!left=>\leftmarginbox,
-          \v!right=>\rightmarginbox,
-        \s!unknown=>\setbox\preparedmarginbox\hbox{}]}
-
-\def\dostartmarginblock % 2 maal \vbox ivm \unvbox elders
-  {\global\setbox\marginbox\vtop\bgroup\vbox\bgroup
-     \hsize\@@mbwidth
-     \ifvoid\marginbox\else
-       \unvbox\marginbox
-       \@@mbinbetween
-     \fi
-     \setupalign[\@@mbalign]%
-     \dostartattributes\??mb\c!style\c!color{}%
-     \begstrut\ignorespaces}
-
-\def\dostopmarginblock
-  {\unskip\endstrut
-   \dostopattributes
-   \egroup
-   \egroup}
-
-\def\dontstartmargeblok
-  {\@@mbbefore
-   \bgroup
-   \dostartattributes\??mb\c!style\c!color\empty}
-
-\def\dontstopmargeblok
-  {\dostopattributes
-   \egroup
-   \@@mbafter}
-
-\newcounter\nofpostponedblocks
-
-\newif\ifinpostponing
-
-\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
-
-\newtoks   \postponedpageblocks
-\newcounter\nofpostponedpageblocks
-
-% \ifinpostponing: handhaven, want gebruikt in stijlen ! ! ! ! !
-
-\def\flushpagefloats
-  {\doifoddpageelse
-     {\ifvoid\collectedleftpagefloats
-        \ifvoid\collectedrightpagefloats\else
-           \unvbox\collectedrightpagefloats
-           \page
-          %\the\everytopofpage
-        \fi
-      \fi}
-     {\ifvoid\collectedleftpagefloats\else
-        \unvbox\collectedleftpagefloats
-        \page
-       %\the\everytopofpage
-      \fi
-      \ifvoid\collectedrightpagefloats\else
-         \unvbox\collectedrightpagefloats
-         \page
-        %\the\everytopofpage
-      \fi}%
-   \ifvoid\collectedpagefloats\else
-     % message
-     \unvbox\collectedpagefloats
-   \fi}
-
-% \def\flushrestfloats
-%   {\doif{\floatsharedparameter\c!cache}\v!no\doflushfloats}
-
-% \let\flushrestfloats\relax
-
-\def\dopostponeblock
-  {\bgroup % new may 2004
-   \setsystemmode\v!postponing % new may 2004
-   \the\everytopofpage
-  %\flushrestfloats
-   \flushpagefloats
-   \donefalse
-   \ifinpostponing \else
-     \ifcase\nofpostponedblocks     \else \donetrue \fi
-     \ifcase\nofpostponedpageblocks \else \donetrue \fi
-   \fi
-   \ifdone
-     \bgroup % we need the color/font switch, else problems inside split verbatim
-     \setnormalcatcodes % postponing in verbatim
-     \pushpostponedpagecolor
-     \restoreglobalbodyfont                        % The \nof-test is
-     \global\pagetotal\zeropoint                   % recently added and
-     \global\inpostponingtrue                      % definitely needed else
-     \the\postponedpageblocks                      % we can loose or disorder
-     \dorecurse\nofpostponedblocks                 % floats; anyhow, this
-       {\getbuffer[pbuf-\recurselevel]}%           % mechanism is still
-     \doflushfloats % new but potential dangerous  % suboptimal and needs a
-     \doglobal\newcounter\nofpostponedblocks       % proper analysis
-     \global\inpostponingfalse
-     \poppostponedpagecolor
-     \egroup
-   \fi
-   \egroup} % new may 2004
-
-\def\getpostponedblock#1#2%
-  {\doif{#1}\realfolio{\getbuffer[rbuf-#2]}} % no \ifnum, avoid \fi
-
-% beware, \dosingleempty conflicts with buffers (feeds back the \par)
-
-\setvalue{\e!start\v!postponing}%
-  {\bgroup
-   \obeylines
-   \doifnextoptionalelse{\egroup\nodostartpostponing}{\egroup\dodostartpostponing}}
-
-\def\nodostartpostponing[#1]%
-  {\doglobal\increment\nofpostponedpageblocks
-   \bgroup % a little bit of misusing grouping
-   \doifinstring{+}{#1}\advance \realpageno#1\relax % ugly but efficient
-   \doglobal\appendetoks\noexpand\getpostponedblock
-     {\realfolio}{\nofpostponedpageblocks}\to\postponedpageblocks
-   \egroup
-   \showmessage\m!layouts3\nofpostponedpageblocks
-   \dostartbuffer[rbuf-\nofpostponedpageblocks]%
-     [\e!start\v!postponing][\e!stop\v!postponing]}
-
-\def\dodostartpostponing
-  {\doglobal\increment\nofpostponedblocks
-   \showmessage\m!layouts3\nofpostponedblocks
-   \expanded{\dostartbuffer[pbuf-\nofpostponedblocks][\e!start\v!postponing][\e!stop\v!postponing]}}
-
-% Setups:
-
-\setupmarginblocks
-  [\c!state=\v!start,
-   \c!location=\v!inmargin,
-   \c!width=\rightmarginwidth,
-   \c!style=,
-   \c!color=,
-   \c!align=,
-   \c!left=,
-   \c!right=,
-   \c!top=,
-   \c!inbetween=\blank,
-   \c!bottom=\vfill,
-   \c!before=,
-   \c!after=]
-
-\protect \endinput
diff --git a/tex/context/base/page-mul.mkii b/tex/context/base/page-mul.mkii
new file mode 100644
index 000000000..c78af074a
--- /dev/null
+++ b/tex/context/base/page-mul.mkii
@@ -0,0 +1,1773 @@
+%D \module
+%D   [       file=page-mul, % was: core-mul
+%D        version=1998.03.15,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Multi Column Output,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Simple Multi Column}
+
+%D This module is mostly a copy from the original multi column
+%D routine as implemented in \type {core-mul}. When the main
+%D OTR macro's were isolated in modules and column sets were
+%D introduced, this module became part of the OTR modules. As
+%D a result this module is no longer generic. It also needs
+%D an overhaul.
+
+\unprotect
+
+% TO DO !
+
+\let\OTRMULsetvsize            \OTRONEsetvsize
+\let\OTRMULsethsize            \OTRONEsethsize
+\let\OTRMULdopagecontents      \OTRONEdopagecontents
+\let\OTRMULfinalsidefloatoutput\OTRONEfinalsidefloatoutput % ???
+\let\OTRMULflushfloatbox       \OTRONEflushfloatbox
+
+\let\OTRMULdosettopinserts   \relax
+\let\OTRMULdosetbotinserts   \relax
+\let\OTRMULdotopinsertions   \relax
+\let\OTRMULdobotinsertions   \relax
+\let\OTRMULdosetbothinserts  \relax
+\let\OTRMULflushsavedfloats  \relax
+
+\let\OTRMULflushsidefloats      \forgetsidefloats % \relax
+\let\OTRMULsynchronizesidefloats\forgetsidefloats % \relax
+
+\newtoks \OTRMULoutput
+
+\def\OTRMULgotonextpage
+  {\ejectpage}
+
+\def\OTRMULgotonextpageX % will become obsolete
+  {\superejectpage}
+
+% check \count multiplications
+
+% some day try this in balancing routine
+%
+% \ifdim\pagetotal>\pagegoal
+%   \eject
+% \else
+%   \goodbreak
+% \fi
+
+%D The following macro's implement a multi||column output
+%D routine. The original implementation was based on Donald
+%D Knuth's implementation, which was adapted by Craig Platt to
+%D support balancing of the last page. I gradually adapted
+%D Platt's version to our needs but under certain
+%D circumstances things still went wrong. I considered all
+%D calls to Platt's \type{\balancingerror} as undesirable.
+
+%D This completely new implementation can handle enough
+%D situations for everyday documents, but is still far from
+%D perfect. While at the moment the routine doesn't support
+%D all kind of floats, it does support:
+%D
+%D \startitemize[packed]
+%D \item  an unlimitted number of columns
+%D \item  ragged or not ragged bottoms
+%D \item  optional balancing without \type{\balancingerrors}
+%D \item  different \type{\baselineskips}, \type{\spacing},
+%D       \type{\topskip} and \type{\maxdepth}
+%D \item  left- and right indentation, e.g. within lists
+%D \item  moving columns floats to the next column or page
+%D \item  handling of floats that are to wide for a columns
+%D \stopitemize
+%D
+%D One could wonder why single and multi||columns modes are
+%D still separated. One reason for this is that \TeX\ is not
+%D suited well for handling multi||columns. As a result, the
+%D single columns routines are more robust. Handling one
+%D column as a special case of multi||columns is posible but at
+%D the cost of worse float handling, worse page breaking,
+%D worse etc. Complicated multi||column page handling should
+%D be done in \cap{DTP}||systems anyway.
+%D
+%D There are three commands provided for entering and leaving
+%D multi||column mode and for going to the next column:
+%D
+%D \interface \type{\beginmulticolumns} \\ \\
+%D \interface \type{\endmulticolumns}   \\ \\
+%D \interface \type{\ejectcolumn}       \\ \\
+%D
+%D This routines are sort of stand||alone. They communicate
+%D with the rest of \CONTEXT\ by means of some interface
+%D macro's, which we only mention.
+%D
+%D \interface \type{\nofcolumns} \\
+%D   the number of columns \\
+%D \interface \type{\minbalancetoplines} \\
+%D   the minimum number op balanced top lines \\
+%D \interface \type{\betweencolumns} \\
+%D   the stuff between columns \\
+%D \interface \type{\finaloutput{action}{box}} \\
+%D   some kind of \type{\pagebody} and \type{\shipout} \\
+%D
+%D \interface \type{\ifbalancecolumns} \\
+%D   balancing the colums or not \\
+%D \interface \type{\ifstretchcolumns} \\
+%D   ragging the bottom or not \\
+%D
+%D \interface \type{\ifheightencolumns} \\
+%D     fix the heigh tor not \\
+%D \interface \type{\fixedcolumnheight} \\
+%D     the optional fixed height \\
+%D
+%D \interface \type{\ifinheritcolumns} \\
+%D     handle ragging or not \\
+%D \interface \type{\ifr@ggedbottom} \\
+%D     use ragged bottoms \\
+%D \interface \type{\ifb@selinebottom} \\
+%D     put the bottom line on the baseline \\
+%D \interface \type{\ifnormalbottom} \\
+%D     put the bottom line at the baseline \\
+%D
+%D \interface \type{\ifreversecolumns} \\
+%D     reverse the order in wich columns are flushed \\
+%D
+%D \interface \type{\usercolumnwidth} \\
+%D     the calculated width of a column \\
+%D \interface \type{\columntextwidth} \\
+%D     the maximum width of a column \\
+%D \interface \type{\columntextheight} \\
+%D     the minimum width of a column \\
+%D
+%D \interface \type{\spacingfactor} \\
+%D     the spacing factor \\
+%D \interface \type{\bodyfontsize} \\
+%D     the (local) bodyfontsize \\
+%D \interface \type{\openlineheight} \\
+%D     the lineheight (including \type{\spacing}) \\
+%D
+%D \interface \type{\EveryBodyFont} \\
+%D     communication channel to font switching routines \\
+%D
+%D \interface \type{\global\settopskip} \\
+%D   set \type{\topskip} \\
+%D \interface \type{\setvsize} \\
+%D   set \type{\vsize} and \type{\pagegoal} \\
+%D \interface \type{\sethsize} \\
+%D   set \type{\hsize} \\
+%D
+%D \interface \type{\flushcolumnfloats} \\
+%D   push saved column floats (next page) \\
+%D \interface \type{\flushcolumnfloat} \\
+%D   push saved column floats (next column) \\
+%D \interface \type{\setcolumnfloats} \\
+%D   initialize column floats \\
+%D
+%D \interface \type{\finishcolumnbox} \\
+%D   do something special (a hook) \\
+%D \interface \type{\postprocesscolumnpagebox} \\
+%D   do something with each columnbox (also a hook) \\
+%D \interface \type{\postprocesscolumnbox} \\
+%D   do something with each columnbox (also a hook) \\
+%D \interface \type{\postprocesscolumnline} \\
+%D   do something with each columnline (also a hook) \\
+%D \interface \type{\currentcolumn} \\
+%D   the current column \\
+%D
+%D These interface macro's are called upon or initialized
+%D by the multi||column macro's.
+
+%D A lot of footnote stuff added!
+
+\def\finalcolumntextwidth   {\makeupwidth}
+\def\finalcolumntextheight  {\textheight}
+\def\columntextwidth        {\makeupwidth}
+\def\columntextheight       {\textheight}
+\def\usercolumnwidth        {\textwidth}
+\def\columntextoffset       {\!!zeropoint}
+
+\def\fixedcolumnheight      {\textheight}
+\def\betweencolumns         {\hskip\bodyfontsize}
+
+\let\setcolumnfloats        \relax % in CONTEXT used for floats
+\let\flushcolumnfloats      \relax % in CONTEXT used for floats
+\let\flushcolumnfloat       \relax % in CONTEXT used for floats
+\let\finishcolumnbox        \relax % in CONTEXT used for backgrounds
+
+% %D In fact, the column height and width are set by means of
+% %D two macro's. One can change their meaning if needed:
+%
+% \def\setcolumntextheight
+%   {\def\columntextheight{\teksthoogte}}
+%
+% \def\setcolumntextwidth
+%   {\def\columntextwidth{\zetbreedte}}
+
+%D Both macros are redefined in \CONTEXT\ when backgrounds
+%D are applied to columns. The final values are used when
+%D flushing the columns.
+
+\newtoks\singlecolumnout % remove that one
+
+%D It's more convenient to use \type {\columnwidth} instead
+%D of messing around with boxes each time.
+
+\newdimen\columnwidth
+\newdimen\gutterwidth
+
+\def\determinecolumnwidth
+  {\bgroup
+   \setbox\scratchbox\hbox
+     {\setcolumnhsize
+      \global\columnwidth\usercolumnwidth
+      \global\gutterwidth\intercolumnwidth}%
+   \egroup}
+
+%D Going to a new columns is done by means of a
+%D \type{\ejectcolumn}. The following definition does not
+%D always work.
+
+\def\ejectcolumn
+  {\goodbreak\showmessage\m!columns2\empty}
+
+%D The next macro should never be called so let's deal with it.
+%D There were several solutions to these kind of errors. First
+%D we check for a good breakpoint before firing up the
+%D multi||column routine (\type{\break} or \type{\allowbreak}).
+%D We do the same at the end of the routine
+%D (\type{\allowbreak}). These allowances are definitely
+%D needed!
+%D
+%D Some on first sight redundant calls to for instance
+%D \type{\setvsize} in the flushing, splitting and balancing
+%D macro's can definitely not be omitted! Some are just there
+%D to handle situations that only few times arise. One of
+%D those can be that the output routine is invoked before
+%D everything is taken care of. This happens when we
+%D flush (part of) the current page with an \type{\unvbox}
+%D with a \type{\pagetotal}~$\approx$ \type{\pagegoal}. One
+%D simply cannot balance columns that are just balanced.
+%D
+%D I hope one never sees the following message. Because it
+%D took me a lot of time to develop the multi||columns
+%D routines, every (although seldom) warning gives me the
+%D creeps!
+
+\def\balancingerror
+  {\showmessage\m!columns3\empty
+   \finaloutput\unvbox\normalpagebox}
+
+\def\OTRMULsometopsfloat{\showmessage\m!columns4\empty \someherefloat}
+\def\OTRMULsomebotsfloat{\showmessage\m!columns5\empty \someherefloat}
+
+\def\OTRMULsomeherefloat{\OTRONEsomeherefloat}
+
+%D The local column width is available in the dimension
+%D register \type{\localcolumnwidth}, which is calculated as:
+
+\def\setcolumnhsize % beware, this one is available for use in macros
+  {\setbox\scratchbox\hbox{\parindent\zeropoint\betweencolumns}%
+   \intercolumnwidth\wd\scratchbox
+   \localcolumnwidth\columntextwidth
+   \advance\localcolumnwidth -\leftskip
+   \advance\localcolumnwidth -\rightskip
+   % new
+   \advance\localcolumnwidth -\colleftskip
+   \advance\localcolumnwidth -\colrightskip
+   %
+   \advance\localcolumnwidth -\nofcolumns\intercolumnwidth
+   \advance\localcolumnwidth  \intercolumnwidth
+   \divide \localcolumnwidth  \nofcolumns
+   \scratchdimen\columntextoffset
+   \multiply\scratchdimen \plustwo
+   \advance\localcolumnwidth -\scratchdimen
+   \usercolumnwidth\localcolumnwidth
+   \hsize\localcolumnwidth} % we don't do it \global
+
+%D Torture test:
+%D
+%D \startbuffer
+%D \startbuffer[b]
+%D \startcolumns
+%D   \input tufte
+%D \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower
+%D   \input tufte
+%D \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startcolumns \startnarrower
+%D   \input tufte
+%D \stopnarrower \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower \startcolumns
+%D   \input tufte
+%D \stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startcolumns \startnarrower[left]
+%D   \input tufte
+%D \stopnarrower \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower[left] \startcolumns
+%D   \input tufte
+%D \stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower \startcolumns \startnarrower
+%D   \input tufte
+%D \stopnarrower\stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower[left] \startcolumns \startnarrower
+%D   \input tufte
+%D \stopnarrower\stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D \stopbuffer
+%D
+%D \start
+%D \def\postprocesscolumnline#1{\ruledhbox{\strut\box#1}\hss}
+%D \getbuffer
+%D \stop
+
+%D One should be aware that when font related dimensions are
+%D used in typesetting the in||between material, these
+%D dimensions are influenced by bodyfont switches inside
+%D multi||column mode.
+
+\newdimen\mcscratchdimen
+\newcount\nofcolumnlines
+
+\chardef\multicolumnlinemethod\zerocount % 0: overshoot (old default), 1: tight
+% \chardef\multicolumnlinemethod\plusone
+
+\def\getmulticolumnlines
+  {\mcscratchdimen-\columntextoffset
+   \multiply\mcscratchdimen \plustwo
+   \advance\mcscratchdimen \columntextheight
+   \ifdim\precolumnboxheight>\zeropoint
+      \advance\mcscratchdimen -\precolumnboxheight
+   \fi
+   \settotalinsertionheight
+   \advance\mcscratchdimen -\totalinsertionheight
+   \ifcase\multicolumnlinemethod \getnoflines\mcscratchdimen
+   \or                           \getrawnoflines\mcscratchdimen
+   \else                         \getrawnoflines\mcscratchdimen
+   \fi
+   % added 30/7/2004
+   \ifnum\layoutlines>\zerocount \ifnum\noflines>\layoutlines
+     \noflines\layoutlines
+   \fi \fi
+   \nofcolumnlines\noflines}
+
+\def\multicolumnovershootratio{.5} % {\ifgridsnapping0\else.5\fi}
+
+\def\setcolumnvsize
+  {\getmulticolumnlines
+   \mcscratchdimen\nofcolumnlines\openlineheight
+   \advance\mcscratchdimen \multicolumnovershootratio\openlineheight % collect enough data
+   \global\vsize\nofcolumns\mcscratchdimen
+   \global\pagegoal\vsize} % let's do it only here
+
+%D It really starts here. After some checks and initializations
+%D we change the output routine to continous multi||column
+%D mode. This mode handles columns that fill the current and
+%D next full pages. The method used is (more or less)
+%D multiplying \type{\vsize} and dividing \type{\hsize} by
+%D \type{\nofcolumns}. More on this can be found in the
+%D \TeX book. We save the top of the current page in box
+%D \type{\precolumnbox}.
+%D
+%D We manipulate \type{\topskip} a bit, just to be shure that
+%D is has no flexibility. This has te be done every time a
+%D font switch takles place, because \type{\topskip} can depend
+%D on this.
+%D
+%D Watch the trick with the \type{\vbox}. This way we get the
+%D right interlining and white space.
+
+\def\beginmulticolumns
+  {\par
+   \flushnotes
+   \xdef\precolumndepth{\the\prevdepth}%
+   \begingroup
+   % new
+   \leftskip1\leftskip
+   \rightskip1\rightskip
+   \edef\colleftskip {\the\leftskip}%
+   \edef\colrightskip{\the\rightskip}%
+   \leftskip\zeropoint
+   \rightskip\zeropoint
+   %
+   \dontshowcomposition
+  %\setcolumntextwidth\relax
+  %\setcolumntextheight\relax
+   \widowpenalty\zerocount % is gewoon beter
+   \clubpenalty \zerocount % zeker bij grids
+   \ifsomefloatwaiting
+     \showmessage\m!columns6{\the\savednoffloats}%
+     \global\setbox\savedfloatlist\box\floatlist
+     \xdef\restoresavedfloats
+       {\global\savednoffloats\the\savednoffloats
+        \global\setbox\floatlist\box\savedfloatlist
+        \global\noexpand\somefloatwaitingtrue}%
+     \global\savednoffloats\zerocount
+     \global\somefloatwaitingfalse
+   \else
+     \global\let\restoresavedfloats\relax
+   \fi
+   \dimen0\pagetotal
+   \advance\dimen0 \parskip
+   \advance\dimen0 \openlineheight
+   \ifdim\dimen0<\pagegoal
+     \allowbreak
+   \else
+     \break % Sometimes fails
+   \fi
+   \appendtoks\topskip1\topskip\to\everybodyfont
+   \the\everybodyfont % ugly here
+   \saveinterlinespace % ugly here
+   \initializecolumns\nofcolumns
+   \hangafter\zerocount
+   \hangindent\zeropoint
+   \everypar\emptytoks
+   \ifdim\pagetotal=\zeropoint \else
+     \verticalstrut
+     \vskip-\struttotal
+   \fi
+   \global\savedpagetotal\pagetotal
+   \global\singlecolumnout\output
+  %\global\output{\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}}%
+   \global\output{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}%
+   \eject % no \holdinginserts=1, can make footnote disappear !
+   \global\precolumnboxheight\ht\precolumnbox
+   \global\output{\continuousmulticolumnsout}%
+   \setcolumnfloats
+   \dohandleallcolumns
+     {\global\setbox\currenttopcolumnbox\emptybox}%
+   \checkbegincolumnfootnotes
+   \activateotr{MUL}{ONE}% todo ! ! ! !
+   \let\sethsize\setcolumnhsize
+   \let\setvsize\setcolumnvsize
+   \sethsize
+   \setvsize
+   \showcomposition}
+
+%D When we leave the multi||column mode, we have to process the
+%D not yet shipped out part of the columns. When we don't
+%D balance, we simply force a continuous output, but a balanced
+%D output is more tricky.
+
+%D First we try to fill up the page and when all or something
+%D is left we try to balance things. This is another useful
+%D adaption of the ancesters of these macro's. It takes some
+%D reasoning to find out what happens and maybe I'm making
+%D some mistake, but it works.
+%D
+%D Voiding box \type{\precolumnbox} is sometimes necessary,
+%D e.g. when there is no text given between \type{\begin..}
+%D and \type{\end..}. The \type{\par} is needed!
+
+\chardef\multicolumnendsyncmethod\plusone % 1: old sync 2: new sync (cont-loc/project) / may fail ! ! ! !
+
+\def\endmulticolumns
+  {%\par
+   \ifnum\multicolumnendsyncmethod=\plustwo
+     \synchronizeoutput
+   \else
+     % don't combine these
+     \vskip\lineheight
+     \vskip-\lineheight % take footnotes into account
+   \fi
+   \dontshowcomposition
+   \doflushcolumnfloat  % added recently
+  %\doflushcolumnfloats % no, since it results in wrong top floats
+   \flushnotes          % before start of columns
+   \par
+   \ifbalancecolumns
+     \ifnum\multicolumnendsyncmethod=\plusone
+       \global\output{\continuousmulticolumnsout}%
+       \goodbreak
+     \fi
+     \global\output{\balancedmulticolumnsout}%
+   \else
+     \goodbreak
+   \fi
+   \eject               % the prevdepth is important, try e.g. toclist in
+   \prevdepth\zeropoint % columns before some noncolumned text text
+   \global\output\singlecolumnout
+   \global\output{\the\mainoutput}% % % % % todo
+   \ifvoid\precolumnbox\else
+     \unvbox\precolumnbox
+   \fi
+   \global\precolumnboxheight\zeropoint
+   \endgroup % here
+   \nofcolumns\plusone
+   \setvsize % the outer one!
+   \synchronizeoutput % new may 2004 / we need to: \pagegoal\vsize
+   \checkendcolumnfootnotes
+   \dosomebreak\allowbreak
+   \restoresavedfloats}
+
+%D Because some initializations happen three times, we
+%D defined a macro for them. Erasing \type{\everypar} is
+%D needed because we don't want anything to interfere.
+
+\def\setmulticolumnsout
+  {\everypar\emptytoks
+   \dontcomplain
+   \settopskip
+   \setmaxdepth
+   \topskip1\topskip
+   \splittopskip\topskip
+   \splitmaxdepth\maxdepth
+   \boxmaxdepth\maxdepth % dangerous
+   \emergencystretch\zeropoint\relax} % sometimes needed !
+
+%D Flushing the page comes to pasting the columns together and
+%D appending the result to box \type{\precolumnbox}, if not
+%D void. I've seen a lot of implementations in which some skip
+%D was put between normal text and multi||column text. When we
+%D don't want this, the baselines can be messed up. I hope the
+%D seemingly complicated calculation of a correction
+%D \type{\kern} is adequate to overcome this. Although not
+%D watertight, spacing is taken into account and even multiple
+%D mode changes on one page go well. But cross your fingers and
+%D don't blame me.
+%D
+%D One of the complications of flushing out the boxes is that
+%D \type{\precolumnbox} needs to be \type{\unvbox}'ed, otherwise
+%D there is too less flexibility in the page when using
+%D \type{\r@ggedbottom}. It took a lot of time before these
+%D kind of problems were overcome. Using \type{\unvbox} at the
+%D wrong moment can generate \type{\balancingerror}'s.
+%D
+%D One can use the macros \type {\maxcolumnheight} and \type
+%D {\maxcolumndepth} when generating material between columns
+%D as well as postprocessing column lines.
+
+\let\maxcolumnheight=\zeropoint
+\let\maxcolumndepth =\zeropoint
+
+\newbox\columnpagebox
+
+\def\setmaxcolumndimensions
+  {\let\maxcolumnheight\!!zeropoint
+   \let\maxcolumndepth \!!zeropoint
+   \dohandleallcolumns
+     {\ifdim\ht\currentcolumnbox>\maxcolumnheight
+        \edef\maxcolumnheight{\the\ht\currentcolumnbox}%
+      \fi
+      \ifdim\dp\currentcolumnbox>\maxcolumndepth
+        \edef\maxcolumndepth{\the\dp\currentcolumnbox}%
+      \fi}}
+
+\chardef\multicolumntopflushmethod\plusone % 0: no correction, 1: correction when topstuff, 2: correction, 3: correction++
+\chardef\multicolumntopalignmethod\plustwo % 0: nothing, 1: force grid, 2: follow grid
+
+\def\flushprecolumnboxnogrid
+  {\unvbox\precolumnbox}
+
+\def\flushprecolumnboxongrid
+  {\scratchdimen\savedpagetotal
+   \advance\scratchdimen -\ht\precolumnbox
+   \advance\scratchdimen -\dp\precolumnbox
+   \advance\scratchdimen -\topskip
+   \box\precolumnbox
+   \kern\scratchdimen}
+
+\newconditional\someprecolumncontent
+
+\def\flushcolumnedpage#1%
+  {\bgroup
+   \ifvoid\precolumnbox
+     \setfalse\someprecolumncontent % will be set elsewhere
+   \else
+     \settrue\someprecolumncontent
+\mkprocessboxcontents\precolumnbox
+   \fi
+   \forgetall
+   \setmulticolumnsout
+   \showcomposition
+   \setmaxcolumndimensions
+   \dohandleallcolumns
+     {\mkprocesscolumncontents\currentcolumnbox}%
+   \postprocesscolumns
+   \dohandleallcolumns % \hbox i.v.m. \showcomposition
+     {\global\setbox\currentcolumnbox\hbox to \localcolumnwidth
+        {\box\currentcolumnbox
+         \global\wd\currentcolumnbox\localcolumnwidth
+         \ifheightencolumns
+           \global\ht\currentcolumnbox\fixedcolumnheight
+         \fi}}%
+   \setmaxcolumndimensions
+   \overlaycolumnfootnotes
+   \setbox\columnpagebox\vbox
+     {\hbox to \finalcolumntextwidth
+        {\hskip\colleftskip\relax % new, \relax needed
+         \ifreversecolumns
+           \popsplitproperties % else wrong color stack
+           \@EA\dohandlerevcolumns
+         \else
+           \@EA\dohandleallcolumns
+         \fi
+           {\finishcolumnbox{\hbox
+              {\ifx\finishcolumnbox\relax\else\strut\fi
+               \box\currentcolumnbox}}%
+            \hfil}%
+         \unskip
+         \hskip\colrightskip}}% new
+   \scratchdimen\zeropoint
+   \dohandleallcolumns
+     {\ifdim-\ht\currenttopcolumnbox<\scratchdimen
+        \scratchdimen-\ht\currenttopcolumnbox
+      \fi
+      \global\setbox\currenttopcolumnbox\emptybox}%
+   \advance\scratchdimen \ht\columnpagebox
+   \setbox\scratchbox\hbox to \columntextwidth
+     {\vrule
+        \!!width\zeropoint
+        \!!height\scratchdimen
+        \!!depth\dp\columnpagebox
+      \dostepwiserecurse2\nofcolumns1{\hfil\betweencolumns}\hfil}%
+   \setbox\columnpagebox\hbox
+     {\box\columnpagebox
+      \hskip-\columntextwidth
+      \restoretextcolor{\box\scratchbox}}%
+   \postprocesscolumnpagebox % new, acts upon \box\columnpagebox
+   \ifconditional\someprecolumncontent
+     \settrue\someprecolumncontent
+     % next some incredible crappy code
+     \ifcase\multicolumntopalignmethod
+       \flushprecolumnboxnogrid % not on grid
+     \or
+       \flushprecolumnboxongrid % force on grid
+     \else\ifgridsnapping % somehow this junk fails in pascal
+       \flushprecolumnboxongrid % obey grid settings, force on grid
+     \else
+       \flushprecolumnboxnogrid % ignore grid settings, not on grid
+     \fi \fi
+   \fi
+   \global\precolumnboxheight\zeropoint
+   \setvsize
+   \dosomebreak\nobreak % hm, only needed when topstuff
+   \ifgridsnapping
+   \else
+     \ifcase\multicolumntopflushmethod
+       % sometimes method 1 goes wrong, so we need a way out; best sort this out
+       % when we run into it again
+     \or
+       % \input tufte \startcolumns \showbaselines \input tufte \stopcolumns \input tufte
+       \ifconditional\someprecolumncontent
+%          \scratchdimen\topskip
+%          \advance\scratchdimen -\openstrutheight
+%          \nointerlineskip
+%          \vskip-\scratchdimen
+         \nointerlineskip
+         \vskip\dimexpr\openstrutheight-\topskip\relax
+       \fi
+     \or
+%        \scratchdimen\topskip
+%        \advance\scratchdimen -\openstrutheight
+%        \nointerlineskip
+%        \vskip-\scratchdimen
+       \nointerlineskip
+       \vskip\dimexpr\openstrutheight-\topskip\relax
+     \or
+       % untested but maybe handy
+%        \scratchdimen\topskip
+%        \advance\scratchdimen -\openstrutheight
+%        \nointerlineskip
+%        \vskip-\scratchdimen
+%        \vskip-\lineheight
+%        \vbox{\strut}%
+       \nointerlineskip
+       \vskip\dimexpr\openstrutheight-\topskip-\lineheight\relax
+       \vbox{\strut}%
+     \fi
+   \fi
+   \prevdepth\openstrutdepth
+   \nointerlineskip
+   \dp\columnpagebox\zeropoint
+   \global\finalcolumnheights\ht\columnpagebox
+   \getnoflines\finalcolumnheights
+   \global\finalcolumnlines\noflines
+   \ifcase#1\else
+     % messy correction, we need to rewrite this module (newcolumns)
+     \setbox\columnpagebox\vbox
+       {\offinterlineskip
+        \scratchdimen\ht\columnpagebox
+        \advance\scratchdimen\dp\columnpagebox % we probably lost that one already
+        \box\columnpagebox
+        \vskip-\scratchdimen}%
+     \scratchdimen\noflines\openlineheight
+     \advance\scratchdimen-\openstrutdepth
+     \advance\scratchdimen-\openlineheight
+     \advance\scratchdimen\topskip
+     \ht\columnpagebox\scratchdimen
+     \dp\columnpagebox\openstrutdepth
+     % end of mess
+   \fi
+   \box\columnpagebox
+   \egroup}
+
+%D In case one didn't notice, finaly \type{\finishcolumnbox} is
+%D applied to all boxes. One can use these hooks for special
+%D purposes.
+%D
+%D Once upon a time I wanted to manipulate the individual lines
+%D in a column. This feature is demonstrated in the two examples
+%D below.
+%D
+%D \startbuffer
+%D \def\postprocesscolumnline#1% or \postprocesscolumnbox
+%D   {\ruledhbox{\box#1}\hss}
+%D
+%D \startcolumns[n=4]
+%D \dorecurse{25}{line: \recurselevel\par}
+%D \stopcolumns
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we show the natural width of the lines:
+%D
+%D {\getbuffer}
+%D
+%D The next example does a bit more advanced manipulation:
+%D
+%D \startbuffer
+%D \def\postprocesscolumnline#1%
+%D   {\ifodd\currentcolumn
+%D      \hfill\unhbox#1\relax
+%D    \else
+%D      \relax\unhbox#1\hfill
+%D    \fi}
+%D
+%D \startcolumns[n=4]
+%D \dorecurse{25}{line \recurselevel\par}
+%D \stopcolumns
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we also see an application of \type{\currentcolumn}:
+%D
+%D {\getbuffer}
+%D
+%D This feature is implemented using the reshape macros
+%D presented in \type{supp-box}.
+
+\def\postprocesscolumns
+  {\ifx\postprocesscolumnline\undefined \else
+     \dohandleallcolumns
+       {\global\setbox\currentcolumnbox\vtop
+          {\beginofshapebox
+           \unvbox\currentcolumnbox
+           \unskip\unskip
+           \endofshapebox
+           \reshapebox
+             {\dimen0\ht\shapebox
+              \dimen2\dp\shapebox
+              \setbox\shapebox\hbox to \hsize
+                {\postprocesscolumnline\shapebox}%
+              \ht\shapebox\dimen0
+              \dp\shapebox\dimen2
+              \box\shapebox}%
+           \flushshapebox
+           \everypar\emptytoks
+           \parskip\zeropoint % = \forgetall
+           \verticalstrut
+           \vskip-\struttotal
+           \vfil}}%
+   \fi
+   \ifx\postprocesscolumnbox\undefined \else
+     \dohandleallcolumns
+       {\global\setbox\currentcolumnbox\hbox
+          {\postprocesscolumnbox\currentcolumnbox}}
+   \fi}
+
+%D We default to doing nothing!
+
+\let\postprocesscolumnline   =\undefined
+\let\postprocesscolumnbox    =\undefined
+\let\postprocesscolumnpagebox=\relax
+
+%D \macros
+%D   {reversecolumnstrue}
+%D
+%D We can force the macro that takes care of combining
+%D the columns, to flush them in the revere order. Of
+%D course, by default we don't reverse.
+
+\newif\ifreversecolumns
+
+%D Here comes the simple splitting routine. It's a bit
+%D longer than expected because of ragging bottoms or not.
+%D This part can be a bit shorter but I suppose that I will
+%D forget what happens. The splitting takes some already
+%D present material (think of floats) into account!
+%D
+%D First we present some auxiliary routines. Any material,
+%D like for instance floats, that is already present in the
+%D boxes is preserved.
+
+\def\splitcolumn#1from \box#2to \dimen#3 top \box#4%
+  {\bgroup
+   \ifdim\ht#4>\zeropoint
+     \dimen0\dimen#3\relax
+     \dimen2\dimen0
+     \advance\dimen0 -\ht#4%
+     \columnfootnotecorrection{#1}{\dimen0}%
+     \setbox0\vsplit#2 to \dimen0
+     \global\setbox#1\vbox to \dimen2
+       {\ifgridsnapping
+          \dimen0-\openstrutheight
+          \advance\dimen0 \topskip
+          \vskip\dimen0\copy#4\vskip-\dimen0
+        \else
+          \unvcopy#4%
+        \fi
+        \fuzzysnappedbox\unvbox0
+        \fakecolumnfootnotes{#1}}%
+   \else
+     \ifcase\clevernotes
+       \global\setbox#1\vsplit#2 to \dimen#3%
+       \global\setbox#1\vbox
+         {\fuzzysnappedbox\unvbox{#1}}% % or \box ?
+     \else
+       \columnfootnotecorrection{#1}{\dimen#3}%
+       \setbox0\vsplit#2 to \dimen#3%
+       \global\setbox#1\vbox to \dimen#3%
+         {\fuzzysnappedbox\unvbox0
+          \fakecolumnfootnotes{#1}}%
+     \fi
+   \fi
+   \egroup}
+
+\def\splitcurrentcolumn from \box#1to \dimen#2%
+  {\splitcolumn\currentcolumnbox from \box#1 to \dimen#2 top \box\currenttopcolumnbox}
+
+\def\splitfirstcolumn from \box#1to \dimen#2%
+  {\splitcolumn\firstcolumnbox from \box#1 to \dimen#2 top \box\firsttopcolumnbox}
+
+\def\splitlastcolumn from \box#1to \dimen#2%
+  {\global\setbox\lastcolumnbox\vbox
+     {\unvcopy\lasttopcolumnbox
+      \fuzzysnappedbox\unvbox{#1}%
+      \fakecolumnfootnotes\lastcolumnbox}}
+
+%D NEW: still to be documented.
+
+\def\fakecolumnfootnotes#1%
+  {\relax
+   \ifcase\clevernotes\else
+     \ifnum#1=\lastcolumnbox
+       \fakenotes
+     \fi
+   \fi}
+
+\def\columnfootnotecorrection#1#2%
+  {\relax
+   \ifcase\clevernotes
+     % page notes
+   \or
+     \ifnum#1=\firstcolumnbox\relax
+       \calculatetotalclevernoteheight
+       \advance#2 -\totalnoteheight
+     \fi
+   \else
+     \ifnum#1=\lastcolumnbox\relax
+       \calculatetotalclevernoteheight
+       \advance#2 -\totalnoteheight
+     \fi
+   \fi}
+
+\def\overlaycolumnfootnotes
+  {\relax
+   \ifcase\clevernotes
+     % page notes
+   \else
+     \checknotepresence
+     \ifnotespresent
+       % the note box has the depth of the notefont
+       % because a column (i.e. first column has no depth,
+       % we need to anchor top down)
+       \bgroup
+       \ifcase\clevernotes\or
+         \getmulticolumnlines
+         \advance\nofcolumnlines \minustwo
+         \scratchdimen\nofcolumnlines\lineheight
+         \advance\scratchdimen \topskip
+         \setbox0\hbox
+           {\lower\scratchdimen\vbox{\placenoteinserts}}%
+         \ht0=\openstrutheight % \strutht
+         \dp0=\openstrutdepth  % \strutdp
+         \scratchdimen\ht\firstcolumnbox
+         \global\setbox\firstcolumnbox\vbox to \scratchdimen
+           {\box\firstcolumnbox
+            \vskip-\scratchdimen
+            \restoretextcolor{\box0}}%
+       \else
+         % maybe here also \getmulticolumnlines
+         \scratchdimen\ht\firstcolumnbox
+         \advance\scratchdimen -\openstrutdepth % \strutdp
+         \getnoflines\scratchdimen
+         \advance\noflines \minustwo
+         \scratchdimen\noflines\lineheight
+         \advance\scratchdimen \topskip
+         \setbox0\hbox
+           {\lower\scratchdimen\vbox{\placenoteinserts}}%
+         \ht0=\openstrutheight % \strutht
+         \dp0=\openstrutdepth  % \strutdp
+         \scratchdimen\ht\lastcolumnbox
+         \global\setbox\lastcolumnbox\vbox to \scratchdimen
+           {\box\lastcolumnbox
+            \vskip-\scratchdimen
+            \restoretextcolor{\box0}}%
+       \fi
+       \egroup
+     \fi
+   \fi}
+
+%D Here comes the routine that splits the long box in columns.
+%D The macro \type{\flushcolumnfloats} can be used to flush
+%D either floats that were present before the multi||column
+%D mode was entered, or floats that migrate to next columns.
+%D Flushing floats is a delicate process.
+
+\def\continuousmulticolumnsout
+  {\bgroup
+   \forgetall
+   \setmulticolumnsout
+   \dontshowcomposition
+%    \dimen0=\columntextheight
+%    \advance\dimen0 -\precolumnboxheight
+%    \settotalinsertionheight
+%    \advance\dimen0 -\totalinsertionheight
+%    \ifgridsnapping % evt altijd, nog testen
+%      \getnoflines{\dimen0}
+%      \dimen0=\noflines\openlineheight
+%    \fi
+   \getmulticolumnlines
+   \dimen0=\nofcolumnlines\openlineheight
+   \dohandleallcolumns
+     {\splitcurrentcolumn from \box\normalpagebox to \dimen0}%
+   \setbox\restofpage\vbox{\unvbox\normalpagebox}%
+   \ifinheritcolumns
+     \ifr@ggedbottom % vreemd
+       \dohandleallcolumns
+         {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox
+            {\dimen0\dp\currentcolumnbox
+             \unvbox\currentcolumnbox
+             \vskip-\dimen0
+             \vskip\openstrutdepth % \strutdp
+             \prevdepth\openstrutdepth % \strutdp
+             \vfill}}%
+       \ifbottomnotes \else
+         \dimen0\ht\firstcolumnbox
+       \fi
+     \fi
+     \ifn@rmalbottom
+       \advance\dimen0 \maxdepth
+       \dohandleallcolumns
+         {\global\setbox\currentcolumnbox\vbox to \dimen0
+            {\unvbox\currentcolumnbox}}%
+     \fi
+     \ifb@selinebottom
+       % the columns are on top of the baseline
+     \fi
+   \else
+     \dohandleallcolumns
+       {\global\setbox\currentcolumnbox\vbox to \dimen0
+          {\ifstretchcolumns
+             \unvbox\currentcolumnbox
+           \else
+             \unvbox\currentcolumnbox % wel of niet \unvbox ?
+             \vfill
+           \fi}}%
+     \dohandleallcolumns
+       {\global\ht\currentcolumnbox\dimen0}%
+   \fi
+   \setbox\precolumnbox\vbox{\flushcolumnedpage\zerocount}%
+   \finaloutput\box\precolumnbox
+   \sethsize
+   \setvsize
+   \flushcolumnfloats
+   \unvbox\restofpage
+   % \penalty\outputpenalty % gaat gruwelijk mis in opsommingen
+   \egroup}
+
+%D And this is the balancing stuff. Again, part of the routine
+%D is dedicated to handling ragged bottoms, but here we also
+%D see some handling concerning the stretching of columns.
+%D We set \type{\widowpenalty} at~0, which enables us to
+%D balance columns with few lines. The use of \type{\box2} and
+%D \type{\box4} garantees a more robust check when skips are
+%D used.
+
+\def\multicolumnsbalancemax{250} % 100 is too small when floats are involved
+
+\def\balancedmulticolumnsout
+  {\bgroup
+   \setmulticolumnsout
+   \dontshowcomposition
+   \widowpenalty\zerocount
+   \setbox0\vbox{\unvbox\normalpagebox}%
+\ifdim\ht0>\openlineheight % at least one line
+  \ifnum\minbalancetoplines<2 % balance anyway
+    \donetrue
+  \else % check criterium to available lines
+    \getnoflines{\ht0}%
+    \divide\noflines \nofcolumns \relax
+    \ifnum\noflines<\minbalancetoplines \relax
+      \dimen0\ht0
+      \advance\dimen0 \ht\firsttopcolumnbox
+      \advance\dimen0 \openlineheight \relax % let's play safe
+      \ifdim\dimen0>\columntextheight % column exceeding text height
+        \donetrue
+      \else % it seems to fit
+        \donefalse
+      \fi
+    \else % balance indeed
+      \donetrue
+    \fi
+  \fi
+\else % balancing does not make sense
+  \donefalse
+\fi
+\ifdone % start balancing
+  %\ifdim\ht0>\openlineheight
+     \dimen0\ht0
+     \advance\dimen0 \topskip
+     \advance\dimen0 -\baselineskip
+     \dohandleallcolumns
+       {\advance\dimen0 \ht\currenttopcolumnbox}%
+     \divide\dimen0 \nofcolumns
+     \vbadness\!!tenthousand\relax
+     \count255=\zerocount
+     \bgroup
+     \ifgridsnapping
+       \dimen2\lineheight
+     \else
+       \dimen2=\onepoint % RUBISH
+       \dimen2=\spacingfactor\dimen2
+     \fi
+     \doloop
+       {\advance\count255 \plusone
+        \global\setbox\restofpage\copy0\relax
+        \splitfirstcolumn from \box\restofpage to \dimen0
+        \dohandlemidcolumns
+          {\splitcurrentcolumn from \box\restofpage to \dimen0}%
+        \splitlastcolumn from \box\restofpage to \dimen0
+        \setbox2\vbox{\unvcopy\firstcolumnbox}%
+        \dimen4\zeropoint
+        \dohandleallcolumns
+          {\setbox4\vbox
+             {\unvcopy\currentcolumnbox
+             %rather new, test this on pdftex-z.tex
+              \unpenalty\unskip\unpenalty\unskip}% maybe better in main splitter
+          %\writestatus{balance}{\the\currentcolumnbox: \the\ht4}%
+%            \dimen6\ht4 \ifdim\dimen6>\dimen4 \dimen4=\dimen6 \fi}%
+           \ifdim\ht4>\dimen4 \dimen4=\ht4 \fi}%
+        \advance\dimen4 -.0005pt % get rid of accurracy problem, pretty new
+        \ifnum\count255>\multicolumnsbalancemax\relax
+          \exitloop
+        \else\ifdim\dimen4>\ht2
+          \advance\dimen0 \dimen2\relax
+        \else
+          \exitloop
+        \fi\fi}%
+     \dohandleallcolumns
+       {\global\setbox\currentcolumnbox\vbox{\unvcopy\currentcolumnbox}}% NIEUW
+     \ifnum\count255>\multicolumnsbalancemax\relax
+       \showmessage\m!columns7\empty
+     \else
+       \showmessage\m!columns8{\the\count255\space}%
+     \fi
+     \egroup
+     \ifinheritcolumns
+       % We cannot assume that the first column is the tallest, if
+       % only because we may have an aborted balance (one line in the
+       % first column and a graphic in the second one).
+       %
+       % \dimen0\ht\firstcolumnbox
+       % \dimen2\ht\firstcolumnbox
+       %
+       \dimen0=\zeropoint
+       \dohandleallcolumns
+         {\ifdim\ht\currentcolumnbox>\dimen0
+            \dimen0=\ht\currentcolumnbox
+          \fi}%
+       \dimen2\dimen0
+       % so far
+       \advance\dimen2 -\openlineheight
+       \dohandleallcolumns
+         {\dimen4\ht\currentcolumnbox
+          \dimen6=10\openlineheight % funny value
+          \global\setbox\currentcolumnbox\vbox to \dimen0
+            {\unvbox\currentcolumnbox
+             \ifdim\dimen4>\dimen6
+               \ifdim\dimen4<\dimen0
+                 \ifdim\dimen4>\dimen2
+                   \vskip\zeropoint  % !!
+                 \else
+                   \vskip\openlineheight
+                   \vfill
+                 \fi
+               \else
+                 \vskip\zeropoint
+               \fi
+             \else
+               \vskip\openlineheight
+               \vfill
+             \fi}}%
+     \else
+       \bgroup
+       \ifstretchcolumns
+         \dimen0\ht\firstcolumnbox
+         \dimen2=\bottomtolerance\ht\firstcolumnbox
+         \setbox0\vbox{\unvcopy\lastcolumnbox}%
+         \advance\dimen0 -\ht0\relax
+         \advance\dimen0 -\dp0\relax
+         \ifdim\dimen0>\openlineheight\relax
+           \ifdim\dimen0>\dimen2\relax
+             % \stretchcolumnsfalse % beter goed slecht dan slecht goed
+             \showmessage\m!columns9\empty
+           \fi
+         \fi
+       \fi
+       \dohandleallcolumns
+         {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox
+            {\ifstretchcolumns
+               \unvbox\currentcolumnbox
+             \else
+               \box\currentcolumnbox
+               \vfill
+             \fi}}%
+       \egroup
+     \fi
+   \else
+     % a one liner is not properly handled here, so best rewrite the text then
+     \showmessage\m!columns{10}\empty
+     \global\setbox\firstcolumnbox\vbox{\unvbox0}%
+   \fi
+   \global\output{\balancingerror}%
+   \b@selinebottomtrue % forces depth in separation rule
+   \flushcolumnedpage\plusone
+   \multicolumnseject
+   \egroup}
+
+\def\multicolumnseject
+  {\ifdim\pagetotal>\textheight
+     \eject % new
+   \else
+     \allowbreak
+   \fi}
+
+%D The multicolumn mechanism is incorporated in a \CONTEXT\
+%D interface, which acts like:
+%D
+%D \starttyping
+%D \startcolumns[n=4,balance=no]
+%D   some text
+%D \stopcolumns
+%D \stoptyping
+%D
+%D The setup is optional. The default behaviour of columns
+%D can be set up with:
+%D
+%D \starttyping
+%D \setupcolumns
+%D   [n=2,
+%D    balance=yes]
+%D \stoptyping
+%D
+%D In this case, stretching is according to the way it's
+%D done outside columns (\type{\inheritcolumnstrue}). Also
+%D we can setup the \type{tolerance} within a column, the
+%D \type{distance} between columns and the fixed
+%D \type{height} of a column.
+
+%D Multi||column output: the float routines
+%D
+%D Here come the routines that handle the placement of column
+%D floats. Floats that are to big migrate to the next
+%D column. Floats that are too wide, migrate to the top of the
+%D next page, where they span as much columns as needed.
+%D Floats that are left over from outside the multi||column
+%D mode are flushed first. In macro \type{\finaloutput} the
+%D topfloats that are left from previous text should be set.
+%D
+%D When there are some floats in the queue, we inhibit the
+%D flushing of floats on top of columns. The number of
+%D waiting floats is preswent in \type{\savednoftopfloats} and
+%D is saved. As long as there are floats waiting, the topfloats
+%D are places as if we are outside multi||column mode. This is
+%D neccessary for e.g. multicolumn lists.
+%D
+%D When all those floats are flushed, we switch to the local
+%D flushing routine.
+
+\def\setcolumnfloats
+  {\xdef\globalsavednoffloats{\the\savednoffloats}%
+   \ifnum\globalsavednoffloats>\zerocount
+     \setglobalcolumnfloats
+   \else
+     \setlocalcolumnfloats
+   \fi}
+
+\def\setglobalcolumnfloats
+  {\everypar\emptytoks
+   \let\flushcolumnfloat\relax
+  %\let\doroomfloat\relax
+   \let\docheckiffloatfits\relax
+   \let\flushcolumnfloats\noflushcolumnfloats}
+
+\def\setlocalcolumnfloats
+  {\everypar{\flushnotes\flushcolumnfloat\flushmargincontents\checkindentation}%
+   \let\flushcolumnfloat\doflushcolumnfloat
+  %\let\doroomfloat\docolumnroomfloat
+   \let\docheckiffloatfits\docolumnroomfloat
+   \let\flushcolumnfloats\doflushcolumnfloats
+   \let\doflushfloats\doflushcolumnfloats % new
+   \let\dosetbothinserts\relax
+   \let\dotopinsertions\relax}
+
+\def\noflushcolumnfloats
+  {\bgroup
+   \xdef\localsavednoffloats{\the\savednoffloats}%
+   \global\savednoffloats\globalsavednoffloats
+   \dotopinsertions
+   \xdef\globalsavenoffloats{\the\savednoffloats}%
+   \ifnum\globalsavednoffloats=\zerocount
+     \setlocalcolumnfloats
+   \fi
+   \global\savednoffloats\localsavednoffloats
+   \egroup}
+
+%D We need to calculate the amount of free space in a columns.
+%D When there is not enough room, we migrate the float to the
+%D next column. These macro's are alternatives (and
+%D look||alikes) of \type{\doroomfloat}. When a float is to
+%D wide, for one column, it is moved to the top of the next
+%D page. Of course such moved floats have to be taken into
+%D account when we calculate the available space. It's a pitty
+%D that such things are no integral part of \TEX.
+
+\def\getcolumnstatus\column#1\total#2\goal#3\\%
+  {\dimen0=\ifdim\pagegoal<\maxdimen \pagetotal \else \zeropoint \fi
+   \dimen2=\zeropoint
+   \count255=\zerocount
+   \dimen8=\columntextheight
+   \advance\dimen8 -\precolumnboxheight
+   \def\dogetcolumnstatus
+     {\advance\count255 \plusone
+      \advance\dimen2 \ht\currenttopcolumnbox
+      \advance\dimen2 \dp\currenttopcolumnbox
+      \dimen4\dimen2
+      \advance\dimen4 \dimen0
+      \dimen6=\count255\dimen8
+      \ifdim\dimen4>\dimen6
+      \else
+        \let\dogetcolumnstatus\relax
+      \fi}%
+   \dohandleallcolumns{\dogetcolumnstatus}%
+   \ifnum\count255=0 \count255=1 \fi
+   #1=\count255
+   #2=\dimen4
+   #3=\dimen6 }
+
+\def\getinsertionheight
+  {\ifdim\pagegoal<\maxdimen
+     \bgroup
+     \dimen0=\columntextheight
+     \advance\dimen0 -\pagegoal
+     \xdef\insertionheight{\the\dimen0}%
+     \egroup
+   \else
+     \global\let\insertionheight\zeropoint
+   \fi}
+
+\def\docolumnroomfloat
+  {\ifpostponecolumnfloats
+     \global\roomforfloatfalse
+   \else\ifnofloatpermitted
+     \global\roomforfloatfalse
+   \else
+     \bgroup
+     \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\%
+     \advance\dimen0 2\openlineheight % nog nodig ?
+    %\ifnum\count255=\nofcolumns
+    %  \getinsertionheight
+    % %\message{\insertionheight}\wait
+    %  \advance\dimen0 \insertionheight
+    %\fi
+     \setbox\scratchbox\vbox % tricky met objecten ?
+       {\blank[\@@bkspacebefore]
+        \snaptogrid\vbox{\copy\floatbox}}%
+     \advance\dimen0 \ht\scratchbox
+     \advance\dimen0 .5\lineheight % needed because goal a bit higher
+    %\message{column: \the\count255; total: \the\dimen0; goal: \the\dimen2}\wait
+     \ifdim\dimen0>\dimen2
+       \global\roomforfloatfalse
+     \else
+       \global\roomforfloattrue
+     \fi
+     \ifdim\wd\floatbox>\hsize
+       \showmessage\m!columns{11}\empty
+       \global\roomforfloatfalse
+     \fi
+     \egroup
+   \fi\fi}
+
+%D Flushing one float is done as soon as possible, i.e.
+%D \type{\everypar}. This means that (at the moment)
+%D sidefloats are not supported (overulled)!
+
+\newif\ifflushingcolumnfloats \flushingcolumnfloatstrue
+
+\def\doflushcolumnfloat
+  {\ifpostponecolumnfloats\else\ifflushingcolumnfloats\ifprocessingverbatim\else\ifsomefloatwaiting
+     \bgroup
+     \forgetall
+     \let\doflushcolumnfloat\relax
+     \getcolumnstatus\column\mofcolumns\total\dimen0\goal\dimen2\\%
+     \ifdim\dimen0>\zeropoint
+       \dogetfloat
+       \ifdim\wd\floatbox>\hsize
+         \doresavefloat
+       \else
+        %\setbox2=\vbox
+        %  {\blank[\@@bkspacebefore]
+        %   \snaptogrid\vbox{\copy\floatbox}%
+        %   \blank[\@@bkspaceafter]
+         \setbox2=\vbox
+           {\blank[\@@bkspacebefore]
+            \snaptogrid\vbox{\copy\floatbox}}%
+         \advance\dimen0 \ht2
+         \ifdim\dimen0>\dimen2
+           \ifnum\mofcolumns<\nofcolumns
+             \advance\mofcolumns \plusone
+%% bug %%    \edef\currenttopcolumnbox{\getvalue{\@@topcol\the\count255}}%
+             \ifdim\ht\currenttopcolumnbox=\zeropoint
+               \global\setbox\currenttopcolumnbox\vbox
+                 {\snaptogrid\vbox{\copy\floatbox}
+                  \whitespace % nodig ?
+                  \blank[\@@bkspaceafter]}%
+               \dimen4=\ht\currenttopcolumnbox
+               \advance\dimen4 \dp\currenttopcolumnbox
+               \global\advance\vsize -\dimen4
+               \advance\dimen4 -\pagegoal
+               \global\pagegoal-\dimen4
+               \showmessage\m!columns{12}a%
+             \else
+               \showmessage\m!columns{12}b%
+               \doresavefloat
+             \fi
+           \else
+             \showmessage\m!columns{12}c%
+             \doresavefloat
+           \fi
+         \else
+           \ifhmode{\setbox0\lastbox}\fi% waar is die er in geslopen
+           \par
+           \ifdim\prevdepth<\zeropoint \else % anders bovenaan kolom witruimte
+             \nobreak
+             \blank[\@@bkspacebefore]
+             \nobreak
+           \fi
+           \flushfloatbox
+           \blank[\@@bkspaceafter]
+         \fi
+       \fi
+     \fi
+     \egroup
+   \fi\fi\fi\fi}
+
+%D This one looks complicated. Upto \type{\nofcolumns} floats
+%D are placed, taking the width of a float into account. This
+%D routine can be improved on different ways:
+%D
+%D \startitemize[intro,packed]
+%D \item taking into account some imaginary baseline, just to
+%D      get the captions in line
+%D \item multipass flushing until as many floats are displaced
+%D      as possible
+%D \stopitemize
+%D
+%D When handling lots of (small) floats spacing can get worse
+%D because of lining out the columns.
+
+\def\doflushcolumnfloats
+  {\ifpostponecolumnfloats\else
+     \bgroup
+     \forgetall
+     \ifsomefloatwaiting
+       \dimen8\zeropoint
+       \dimen4\zeropoint
+       \count0\zerocount   % count0 can be used local
+       \count2\nofcolumns  % count2 can be used local
+       \dohandleallcolumns
+         {\ifnum\count0>\zerocount % the wide one's reserved space
+            \global\setbox\currenttopcolumnbox\vbox
+              {\snaptogrid\vbox
+                 {\copy\currenttopcolumnbox
+                  \hbox{\vphantom{\copy\floatbox}}}
+                  \whitespace % nodig ?
+                  \blank[\@@bkspaceafter]}%
+          \else
+            \dogetfloat
+            \ifdim\wd\floatbox>\finalcolumntextwidth % better somewhere else too
+              \global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}%
+            \fi % otherwise the graphic may disappear
+            \ifdim\wd\floatbox>\hsize
+              \dimen0\wd\floatbox
+              \advance\dimen0 \intercolumnwidth
+              \dimen2\hsize
+              \advance\dimen2 \intercolumnwidth
+              \advance\dimen0 .5pt % hm, why 1
+              \advance\dimen2 .5pt % hm, why 2
+              \divide\dimen0 \dimen2
+              \count0\dimen0
+              \advance\count0 \plusone
+              \ifnum\count0>\count2
+                \doresavefloat
+                \count0\zerocount
+              \else
+                \dimen0=\count0\hsize
+                \advance\dimen0 \count0\intercolumnwidth
+                \advance\dimen0 -\intercolumnwidth
+                \global\setbox\floatbox\hbox to \dimen0
+                 %{\hss\hbox{\copy\floatbox}\hss}%
+                  {\processaction[\@@bklocation] % how easy to forget
+                     [  \v!left=>\copy\floatbox\hss,
+                       \v!right=>\hss\copy\floatbox,
+                      \s!default=>\hss\copy\floatbox\hss,
+                      \s!unknown=>\hss\copy\floatbox\hss]}%
+              \fi
+              \showmessage\m!columns{13}\empty
+            \else
+            %  \showmessage\m!columns{13}\empty
+            \fi
+            \ifdim\ht\floatbox>\zeropoint\relax
+              \global\setbox\currenttopcolumnbox\vbox
+                {\snaptogrid\vbox
+                   {\copy\currenttopcolumnbox
+                    \copy\floatbox}
+                 \whitespace % nodig ?
+                 \blank[\@@bkspaceafter]}%
+            \fi
+            \dimen6\ht\currenttopcolumnbox
+            \advance\dimen6 \dp\currenttopcolumnbox
+          \fi
+          \ifdim\dimen4<\ht\currenttopcolumnbox
+            \dimen4\ht\currenttopcolumnbox
+          \fi
+          \advance\dimen8 \dimen6
+          \advance\count2 \minusone
+          \advance\count0 \minusone }%
+       \setvsize
+       \global\advance\vsize -\dimen8
+       \global\pagegoal\vsize
+     \else
+       %\doflushfloats % does not snap!
+     \fi
+     \egroup
+   \fi}
+
+%D The next macro can be used to flush floats in the current
+%D stream. No width checking is (yet) done.
+
+\def\insertcolumnfloats
+  {\doloop
+     {\ifsomefloatwaiting
+        \bgroup
+        \forgetall
+        % no check for width
+        \dogetfloat
+        \blank[\@@bkspacebefore]
+        \snaptogrid\vbox{\copy\floatbox}
+        \blank[\@@bkspaceafter]
+        \egroup
+      \else
+        \exitloop
+      \fi}}
+
+%D This were the multi||column routines. They can and need to
+%D be improved but at the moment their behaviour is acceptable.
+%D
+%D One inprovement can be to normalize the height of floats
+%D to $n\times$\type{\lineheight} with a macro like:
+%D
+%D \starttyping
+%D \normalizevbox{...}
+%D \stoptyping
+
+% border case, should fit on one page
+%
+% \startcolumns
+%
+% 1 \input tufte  \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{1}}
+% 2 \input tufte  \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{2}}
+% 3 \input tufte  \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{3}}
+%
+% \stopcolumns
+
+\def\setupcolumns
+  {\dosingleempty\dosetupcolumns}
+
+\def\dosetupcolumns[#1]%
+  {\getparameters[\??kl][#1]%
+   \nofcolumns\@@kln\relax
+   \processaction
+     [\@@klrule]
+     [     \v!on=>\let\betweencolumns\linebetweencolumns,
+          \v!off=>\let\betweencolumns\spacebetweencolumns,
+      \s!default=>\let\betweencolumns\spacebetweencolumns,
+      \s!unknown=>\let\betweencolumns\@@klrule]}
+
+\def\linebetweencolumns
+  {\bgroup
+   \starttextproperties
+   \ifdim\@@kldistance>\zeropoint
+     \dimen0=\@@kldistance
+   \else
+     \dimen0=\linewidth
+   \fi
+   \advance\dimen0 -\linewidth
+   \hskip.5\dimen0
+   \vrule
+     \!!width\linewidth
+     \ifb@selinebottom\!!depth\strutdepth\fi
+   \hskip.5\dimen0\relax
+   \stoptextproperties
+   \egroup}
+
+\def\spacebetweencolumns
+  {\hskip\@@kldistance}
+
+\presetlocalframed[\??kl]
+
+\def\backgroundfinishcolumnbox
+  {\doifinsetelse\@@kloffset{\v!none,\v!overlay}
+     {\let\@@kloffset\!!zeropoint}
+     {\scratchdimen\@@kloffset
+      \advance\scratchdimen -\@@klrulethickness
+      \edef\@@kloffset{\the\scratchdimen}}%
+   \localframed
+     [\??kl]
+     [\c!strut=\v!no,
+      \c!width=\v!fit,
+      \c!height=\v!fit,
+      \c!align=]}
+
+\let\restorecolumnsettings\relax
+
+\definecomplexorsimpleempty\startcolumns
+
+\def\complexstartcolumns[#1]% %% \startcolumns
+  {\bgroup
+   \let\stopcolumns\egroup
+   \ifinsidecolumns
+   \else
+     \setupcolumns[#1]%
+     \ifnum\@@kln>1\relax
+       \whitespace
+       \begingroup
+       \doif\@@kloption\v!background
+         {\let\finishcolumnbox\backgroundfinishcolumnbox
+          \let\columntextoffset\@@kloffset}%
+       \ifx\@@klcommand\empty\else
+         \let\postprocesscolumnline\@@klcommand
+       \fi
+       \doifelsenothing\@@klheight
+         \heightencolumnsfalse
+         \heightencolumnstrue
+       \doifelse\@@kldirection\v!right
+         \reversecolumnsfalse
+         \reversecolumnstrue
+       \doifelse\@@klbalance\v!yes
+         \balancecolumnstrue
+         \balancecolumnsfalse
+\installalign\v!yes {\stretchcolumnstrue \inheritcolumnsfalse}% todo: new key
+\installalign\v!no  {\stretchcolumnsfalse\inheritcolumnsfalse}% todo: new key
+\installalign\v!text{\stretchcolumnsfalse\inheritcolumnstrue }%
+\stretchcolumnsfalse
+\inheritcolumnstrue
+\doifsomething\@@klalign{\expanded{\setupalign[\@@klalign]}}%
+%        \processaction
+%          [\@@klalign]
+%          [   \v!yes=>\stretchcolumnstrue
+%                     \inheritcolumnsfalse,
+%             \v!no=>\stretchcolumnsfalse
+%                     \inheritcolumnsfalse,
+%           \v!text=>\stretchcolumnsfalse
+%                     \inheritcolumnstrue]%
+       \nofcolumns=\@@kln
+       %
+       % probably more is needed, and how about nesting save's
+       %
+       \savecurrentblank
+       \savecurrentwhitespace
+       \def\restorecolumnsettings
+         {\boxmaxdepth\maxdimen % done elsewhere
+          \restorecurrentblank
+          \restorecurrentwhitespace}%
+       %
+       \edef\fixedcolumnheight{\@@klheight}%
+       \edef\minbalancetoplines{\@@klntop}%
+       \setuptolerance[\@@kltolerance]%     %% \startcolumns
+       \setupblank[\@@klblank]%
+       \ifdim\ctxparskip>\zeropoint\relax
+         \setupwhitespace[\@@klblank]%
+       \fi
+       \def\stopcolumns
+         {\endmulticolumns
+          \global\insidecolumnsfalse
+          \endgroup
+          \egroup}%
+       \global\insidecolumnstrue
+       \beginmulticolumns
+     \fi
+   \fi}
+
+\installcolumnbreakhandler {MUL} \v!preference
+  {\goodbreak}
+
+\installcolumnbreakhandler {MUL} \v!yes
+  {\par                                             % todo: since
+   {\testrulewidth\zeropoint\ruledvskip\textheight} % we misuse a
+   \penalty-200                                     % side effect
+   \vskip-\textheight
+   }% bugged : \prevdepth-\thousandpoint} % signals top of column to \blank
+
+%D New: only at start of columns; may change ! Rather
+%D interwoven and therefore to be integrated when the multi
+%D column modules are merged. (moved from cont-new.tex)
+
+\def\setupcolumnspan[#1]%
+  {\getparameters[\??ks][#1]}
+
+\presetlocalframed
+  [\??ks]
+
+\setupcolumnspan
+  [\c!n=2,
+   \c!offset=\v!overlay,
+   \c!frame=\v!off]
+
+\newbox\columnspanbox \let\postprocesscolumnspanbox\gobbleoneargument
+
+\def\dostartcolumnspan[#1]%
+  {\bgroup
+   \setupcolumnspan[#1]%
+   \forgetall
+   \ifinsidecolumns
+     \advance\hsize \intercolumnwidth
+     \hsize\@@ksn\hsize
+     \advance\hsize -\intercolumnwidth
+   \fi
+   \dowithnextbox
+     {\setbox\columnspanbox\flushnextbox
+      \ifinsidecolumns\wd\columnspanbox\hsize\fi
+      \postprocesscolumnspanbox\columnspanbox
+      \scratchdimen\ht\columnspanbox
+      \setbox\columnspanbox\hbox % depth to be checked, probably option!
+        {\localframed[\??ks][\c!offset=\v!overlay]{\box\columnspanbox}}%
+      \ht\columnspanbox\scratchdimen
+      \dp\columnspanbox\strutdp
+      \wd\columnspanbox\hsize
+      \ifinsidecolumns
+        \ifnum\@@ksn>1
+          \setvsize
+          \dohandleallcolumns
+            {\ifnum\currentcolumn>\@@ksn\else
+               \global\setbox\currenttopcolumnbox=\vbox
+                 {\ifnum\currentcolumn=1
+                    \snaptogrid\vbox{\copy\columnspanbox}
+                  \else
+                    \snaptogrid\vbox{\vphantom{\copy\columnspanbox}}
+                  \fi}%
+               \wd\currenttopcolumnbox\hsize
+               \global\advance\vsize -\ht\currenttopcolumnbox
+             \fi}
+          \global\pagegoal\vsize
+        \else
+          \snaptogrid\vbox{\box\columnspanbox}
+        \fi
+      \else
+        \snaptogrid\vbox{\box\columnspanbox}
+      \fi
+      \endgraf
+      \ifvmode\prevdepth\strutdp\fi
+      \egroup}
+     \vbox\bgroup
+      %\topskipcorrection % becomes an option !
+       \EveryPar{\begstrut\EveryPar{}}} % also !
+
+\def\startcolumnspan
+  {\dosingleempty\dostartcolumnspan}
+
+\def\stopcolumnspan
+  {\egroup}
+
+\setupcolumns
+  [\c!n=2,
+   \c!ntop=1,
+   \c!command=,
+   \c!direction=\v!right,
+   \c!rule=\v!off,
+   \c!tolerance=\v!tolerant,
+   \c!distance=1.5\bodyfontsize, % influenced by switching
+   \c!height=,
+   \c!balance=\v!yes,
+   \c!align=\v!text,
+   \c!blank={\v!line,\v!fixed},
+   \c!option=,
+   \c!rulethickness=\linewidth,
+   \c!offset=.5\bodyfontsize]
+
+%D Undocumented and still under development.
+
+\def\startsimplecolumns
+  {\dosingleempty\dostartsimplecolumns}
+
+\def\dostartsimplecolumns[#1]%
+  {\bgroup
+   \nopenalties
+   \getparameters[\??kl]
+     [\c!width=\hsize,\c!distance=1.5\bodyfontsize,%
+      \c!n=2,\c!lines=0,#1]%
+   \let\rigidcolumnlines\@@kllines
+   \setrigidcolumnhsize\@@klwidth\@@kldistance\@@kln
+   \setbox\scratchbox\vbox\bgroup
+   \forgetall} % \blank[\v!disable]
+
+\def\stopsimplecolumns
+  {\removebottomthings
+   \egroup
+   \rigidcolumnbalance\scratchbox
+   \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/page-mul.mkiv b/tex/context/base/page-mul.mkiv
new file mode 100644
index 000000000..789cfbe43
--- /dev/null
+++ b/tex/context/base/page-mul.mkiv
@@ -0,0 +1,1755 @@
+%D \module
+%D   [       file=page-mul, % was: core-mul
+%D        version=1998.03.15,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Multi Column Output,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Simple Multi Column}
+
+%D This module is mostly a copy from the original multi column
+%D routine as implemented in \type {core-mul}. When the main
+%D OTR macro's were isolated in modules and column sets were
+%D introduced, this module became part of the OTR modules. As
+%D a result this module is no longer generic. It also needs
+%D an overhaul.
+
+\unprotect
+
+% TO DO !
+
+\let\OTRMULsetvsize            \OTRONEsetvsize
+\let\OTRMULsethsize            \OTRONEsethsize
+\let\OTRMULdopagecontents      \OTRONEdopagecontents
+\let\OTRMULfinalsidefloatoutput\OTRONEfinalsidefloatoutput % ???
+\let\OTRMULflushfloatbox       \OTRONEflushfloatbox
+
+\let\OTRMULdosettopinserts   \relax
+\let\OTRMULdosetbotinserts   \relax
+\let\OTRMULdotopinsertions   \relax
+\let\OTRMULdobotinsertions   \relax
+\let\OTRMULdosetbothinserts  \relax
+\let\OTRMULflushsavedfloats  \relax
+
+\let\OTRMULflushsidefloats      \forgetsidefloats % \relax
+\let\OTRMULsynchronizesidefloats\forgetsidefloats % \relax
+
+\newtoks \OTRMULoutput
+
+\def\OTRMULgotonextpage
+  {\ejectpage}
+
+\def\OTRMULgotonextpageX % will become obsolete
+  {\superejectpage}
+
+% check \count multiplications
+
+% some day try this in balancing routine
+%
+% \ifdim\pagetotal>\pagegoal
+%   \eject
+% \else
+%   \goodbreak
+% \fi
+
+%D The following macro's implement a multi||column output
+%D routine. The original implementation was based on Donald
+%D Knuth's implementation, which was adapted by Craig Platt to
+%D support balancing of the last page. I gradually adapted
+%D Platt's version to our needs but under certain
+%D circumstances things still went wrong. I considered all
+%D calls to Platt's \type{\balancingerror} as undesirable.
+
+%D This completely new implementation can handle enough
+%D situations for everyday documents, but is still far from
+%D perfect. While at the moment the routine doesn't support
+%D all kind of floats, it does support:
+%D
+%D \startitemize[packed]
+%D \item  an unlimitted number of columns
+%D \item  ragged or not ragged bottoms
+%D \item  optional balancing without \type{\balancingerrors}
+%D \item  different \type{\baselineskips}, \type{\spacing},
+%D       \type{\topskip} and \type{\maxdepth}
+%D \item  left- and right indentation, e.g. within lists
+%D \item  moving columns floats to the next column or page
+%D \item  handling of floats that are to wide for a columns
+%D \stopitemize
+%D
+%D One could wonder why single and multi||columns modes are
+%D still separated. One reason for this is that \TeX\ is not
+%D suited well for handling multi||columns. As a result, the
+%D single columns routines are more robust. Handling one
+%D column as a special case of multi||columns is posible but at
+%D the cost of worse float handling, worse page breaking,
+%D worse etc. Complicated multi||column page handling should
+%D be done in \cap{DTP}||systems anyway.
+%D
+%D There are three commands provided for entering and leaving
+%D multi||column mode and for going to the next column:
+%D
+%D \interface \type{\beginmulticolumns} \\ \\
+%D \interface \type{\endmulticolumns}   \\ \\
+%D \interface \type{\ejectcolumn}       \\ \\
+%D
+%D This routines are sort of stand||alone. They communicate
+%D with the rest of \CONTEXT\ by means of some interface
+%D macro's, which we only mention.
+%D
+%D \interface \type{\nofcolumns} \\
+%D   the number of columns \\
+%D \interface \type{\minbalancetoplines} \\
+%D   the minimum number op balanced top lines \\
+%D \interface \type{\betweencolumns} \\
+%D   the stuff between columns \\
+%D \interface \type{\finaloutput{action}{box}} \\
+%D   some kind of \type{\pagebody} and \type{\shipout} \\
+%D
+%D \interface \type{\ifbalancecolumns} \\
+%D   balancing the colums or not \\
+%D \interface \type{\ifstretchcolumns} \\
+%D   ragging the bottom or not \\
+%D
+%D \interface \type{\ifheightencolumns} \\
+%D     fix the heigh tor not \\
+%D \interface \type{\fixedcolumnheight} \\
+%D     the optional fixed height \\
+%D
+%D \interface \type{\ifinheritcolumns} \\
+%D     handle ragging or not \\
+%D \interface \type{\ifr@ggedbottom} \\
+%D     use ragged bottoms \\
+%D \interface \type{\ifb@selinebottom} \\
+%D     put the bottom line on the baseline \\
+%D \interface \type{\ifnormalbottom} \\
+%D     put the bottom line at the baseline \\
+%D
+%D \interface \type{\ifreversecolumns} \\
+%D     reverse the order in wich columns are flushed \\
+%D
+%D \interface \type{\usercolumnwidth} \\
+%D     the calculated width of a column \\
+%D \interface \type{\columntextwidth} \\
+%D     the maximum width of a column \\
+%D \interface \type{\columntextheight} \\
+%D     the minimum width of a column \\
+%D
+%D \interface \type{\spacingfactor} \\
+%D     the spacing factor \\
+%D \interface \type{\bodyfontsize} \\
+%D     the (local) bodyfontsize \\
+%D \interface \type{\openlineheight} \\
+%D     the lineheight (including \type{\spacing}) \\
+%D
+%D \interface \type{\EveryBodyFont} \\
+%D     communication channel to font switching routines \\
+%D
+%D \interface \type{\global\settopskip} \\
+%D   set \type{\topskip} \\
+%D \interface \type{\setvsize} \\
+%D   set \type{\vsize} and \type{\pagegoal} \\
+%D \interface \type{\sethsize} \\
+%D   set \type{\hsize} \\
+%D
+%D \interface \type{\flushcolumnfloats} \\
+%D   push saved column floats (next page) \\
+%D \interface \type{\flushcolumnfloat} \\
+%D   push saved column floats (next column) \\
+%D \interface \type{\setcolumnfloats} \\
+%D   initialize column floats \\
+%D
+%D \interface \type{\finishcolumnbox} \\
+%D   do something special (a hook) \\
+%D \interface \type{\postprocesscolumnpagebox} \\
+%D   do something with each columnbox (also a hook) \\
+%D \interface \type{\postprocesscolumnbox} \\
+%D   do something with each columnbox (also a hook) \\
+%D \interface \type{\postprocesscolumnline} \\
+%D   do something with each columnline (also a hook) \\
+%D \interface \type{\currentcolumn} \\
+%D   the current column \\
+%D
+%D These interface macro's are called upon or initialized
+%D by the multi||column macro's.
+
+%D A lot of footnote stuff added!
+
+\def\finalcolumntextwidth   {\makeupwidth}
+\def\finalcolumntextheight  {\textheight}
+\def\columntextwidth        {\makeupwidth}
+\def\columntextheight       {\textheight}
+\def\usercolumnwidth        {\textwidth}
+\def\columntextoffset       {\!!zeropoint}
+
+\def\fixedcolumnheight      {\textheight}
+\def\betweencolumns         {\hskip\bodyfontsize}
+
+\let\setcolumnfloats        \relax % in CONTEXT used for floats
+\let\flushcolumnfloats      \relax % in CONTEXT used for floats
+\let\flushcolumnfloat       \relax % in CONTEXT used for floats
+\let\finishcolumnbox        \relax % in CONTEXT used for backgrounds
+
+% %D In fact, the column height and width are set by means of
+% %D two macro's. One can change their meaning if needed:
+%
+% \def\setcolumntextheight
+%   {\def\columntextheight{\teksthoogte}}
+%
+% \def\setcolumntextwidth
+%   {\def\columntextwidth{\zetbreedte}}
+
+%D Both macros are redefined in \CONTEXT\ when backgrounds
+%D are applied to columns. The final values are used when
+%D flushing the columns.
+
+\newtoks\singlecolumnout % remove that one
+
+%D It's more convenient to use \type {\columnwidth} instead
+%D of messing around with boxes each time.
+
+\newdimen\columnwidth
+\newdimen\gutterwidth
+
+\def\determinecolumnwidth
+  {\bgroup
+   \setbox\scratchbox\hbox
+     {\setcolumnhsize
+      \global\columnwidth\usercolumnwidth
+      \global\gutterwidth\intercolumnwidth}%
+   \egroup}
+
+%D Going to a new columns is done by means of a
+%D \type{\ejectcolumn}. The following definition does not
+%D always work.
+
+\def\ejectcolumn
+  {\goodbreak\showmessage\m!columns2\empty}
+
+%D The next macro should never be called so let's deal with it.
+%D There were several solutions to these kind of errors. First
+%D we check for a good breakpoint before firing up the
+%D multi||column routine (\type{\break} or \type{\allowbreak}).
+%D We do the same at the end of the routine
+%D (\type{\allowbreak}). These allowances are definitely
+%D needed!
+%D
+%D Some on first sight redundant calls to for instance
+%D \type{\setvsize} in the flushing, splitting and balancing
+%D macro's can definitely not be omitted! Some are just there
+%D to handle situations that only few times arise. One of
+%D those can be that the output routine is invoked before
+%D everything is taken care of. This happens when we
+%D flush (part of) the current page with an \type{\unvbox}
+%D with a \type{\pagetotal}~$\approx$ \type{\pagegoal}. One
+%D simply cannot balance columns that are just balanced.
+%D
+%D I hope one never sees the following message. Because it
+%D took me a lot of time to develop the multi||columns
+%D routines, every (although seldom) warning gives me the
+%D creeps!
+
+\def\balancingerror
+  {\showmessage\m!columns3\empty
+   \finaloutput\unvbox\normalpagebox}
+
+\def\OTRMULsometopsfloat{\showmessage\m!columns4\empty \someherefloat}
+\def\OTRMULsomebotsfloat{\showmessage\m!columns5\empty \someherefloat}
+
+\def\OTRMULsomeherefloat{\OTRONEsomeherefloat}
+
+%D The local column width is available in the dimension
+%D register \type{\localcolumnwidth}, which is calculated as:
+
+\def\setcolumnhsize % beware, this one is available for use in macros
+  {\setbox\scratchbox\hbox{\parindent\zeropoint\betweencolumns}%
+   \intercolumnwidth\wd\scratchbox
+   \localcolumnwidth\columntextwidth
+   \advance\localcolumnwidth -\leftskip
+   \advance\localcolumnwidth -\rightskip
+   % new
+   \advance\localcolumnwidth -\colleftskip
+   \advance\localcolumnwidth -\colrightskip
+   %
+   \advance\localcolumnwidth -\nofcolumns\intercolumnwidth
+   \advance\localcolumnwidth  \intercolumnwidth
+   \divide \localcolumnwidth  \nofcolumns
+   \scratchdimen\columntextoffset
+   \multiply\scratchdimen \plustwo
+   \advance\localcolumnwidth -\scratchdimen
+   \usercolumnwidth\localcolumnwidth
+   \hsize\localcolumnwidth} % we don't do it \global
+
+%D Torture test:
+%D
+%D \startbuffer
+%D \startbuffer[b]
+%D \startcolumns
+%D   \input tufte
+%D \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower
+%D   \input tufte
+%D \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startcolumns \startnarrower
+%D   \input tufte
+%D \stopnarrower \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower \startcolumns
+%D   \input tufte
+%D \stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startcolumns \startnarrower[left]
+%D   \input tufte
+%D \stopnarrower \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower[left] \startcolumns
+%D   \input tufte
+%D \stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower \startcolumns \startnarrower
+%D   \input tufte
+%D \stopnarrower\stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower[left] \startcolumns \startnarrower
+%D   \input tufte
+%D \stopnarrower\stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D \stopbuffer
+%D
+%D \start
+%D \def\postprocesscolumnline#1{\ruledhbox{\strut\box#1}\hss}
+%D \getbuffer
+%D \stop
+
+%D One should be aware that when font related dimensions are
+%D used in typesetting the in||between material, these
+%D dimensions are influenced by bodyfont switches inside
+%D multi||column mode.
+
+\newdimen\mcscratchdimen
+\newcount\nofcolumnlines
+
+\chardef\multicolumnlinemethod\zerocount % 0: overshoot (old default), 1: tight
+% \chardef\multicolumnlinemethod\plusone
+
+\def\getmulticolumnlines
+  {\mcscratchdimen-\columntextoffset
+   \multiply\mcscratchdimen \plustwo
+   \advance\mcscratchdimen \columntextheight
+   \ifdim\precolumnboxheight>\zeropoint
+      \advance\mcscratchdimen -\precolumnboxheight
+   \fi
+   \settotalinsertionheight
+   \advance\mcscratchdimen -\totalinsertionheight
+   \ifcase\multicolumnlinemethod \getnoflines\mcscratchdimen
+   \or                           \getrawnoflines\mcscratchdimen
+   \else                         \getrawnoflines\mcscratchdimen
+   \fi
+   % added 30/7/2004
+   \ifnum\layoutlines>\zerocount \ifnum\noflines>\layoutlines
+     \noflines\layoutlines
+   \fi \fi
+   \nofcolumnlines\noflines}
+
+\def\multicolumnovershootratio{.5} % {\ifgridsnapping0\else.5\fi}
+
+\def\setcolumnvsize
+  {\getmulticolumnlines
+   \mcscratchdimen\nofcolumnlines\openlineheight
+   \advance\mcscratchdimen \multicolumnovershootratio\openlineheight % collect enough data
+   \global\vsize\nofcolumns\mcscratchdimen
+   \global\pagegoal\vsize} % let's do it only here
+
+%D It really starts here. After some checks and initializations
+%D we change the output routine to continous multi||column
+%D mode. This mode handles columns that fill the current and
+%D next full pages. The method used is (more or less)
+%D multiplying \type{\vsize} and dividing \type{\hsize} by
+%D \type{\nofcolumns}. More on this can be found in the
+%D \TeX book. We save the top of the current page in box
+%D \type{\precolumnbox}.
+%D
+%D We manipulate \type{\topskip} a bit, just to be shure that
+%D is has no flexibility. This has te be done every time a
+%D font switch takles place, because \type{\topskip} can depend
+%D on this.
+%D
+%D Watch the trick with the \type{\vbox}. This way we get the
+%D right interlining and white space.
+
+\def\beginmulticolumns
+  {\par
+   \flushnotes
+   \xdef\precolumndepth{\the\prevdepth}%
+   \begingroup
+   % new
+   \leftskip1\leftskip
+   \rightskip1\rightskip
+   \edef\colleftskip {\the\leftskip}%
+   \edef\colrightskip{\the\rightskip}%
+   \leftskip\zeropoint
+   \rightskip\zeropoint
+   %
+   \dontshowcomposition
+  %\setcolumntextwidth\relax
+  %\setcolumntextheight\relax
+   \widowpenalty\zerocount % is gewoon beter
+   \clubpenalty \zerocount % zeker bij grids
+   \ifsomefloatwaiting
+     \showmessage\m!columns6{\the\savednoffloats}%
+     \global\setbox\savedfloatlist\box\floatlist
+     \xdef\restoresavedfloats
+       {\global\savednoffloats\the\savednoffloats
+        \global\setbox\floatlist\box\savedfloatlist
+        \global\noexpand\somefloatwaitingtrue}%
+     \global\savednoffloats\zerocount
+     \global\somefloatwaitingfalse
+   \else
+     \global\let\restoresavedfloats\relax
+   \fi
+   \dimen0\dimexpr\pagetotal+\parskip+\openlineheight\relax
+   \ifdim\dimen0<\pagegoal
+     \allowbreak
+   \else
+     \break % Sometimes fails
+   \fi
+   \appendtoks\topskip1\topskip\to\everybodyfont
+   \the\everybodyfont % ugly here
+   \saveinterlinespace % ugly here
+   \initializecolumns\nofcolumns
+   \hangafter\zerocount
+   \hangindent\zeropoint
+   \everypar\emptytoks
+   \ifdim\pagetotal=\zeropoint \else
+     \verticalstrut
+     \vskip-\struttotal
+   \fi
+   \global\savedpagetotal\pagetotal
+   \global\singlecolumnout\output
+  %\global\output{\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}}%
+   \global\output{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}%
+   \eject % no \holdinginserts=1, can make footnote disappear !
+   \global\precolumnboxheight\ht\precolumnbox
+   \global\output{\continuousmulticolumnsout}%
+   \setcolumnfloats
+   \dohandleallcolumns
+     {\global\setbox\currenttopcolumnbox\emptybox}%
+   \checkbegincolumnfootnotes
+   \activateotr{MUL}{ONE}% todo ! ! ! !
+   \let\sethsize\setcolumnhsize
+   \let\setvsize\setcolumnvsize
+   \sethsize
+   \setvsize
+   \showcomposition}
+
+%D When we leave the multi||column mode, we have to process the
+%D not yet shipped out part of the columns. When we don't
+%D balance, we simply force a continuous output, but a balanced
+%D output is more tricky.
+
+%D First we try to fill up the page and when all or something
+%D is left we try to balance things. This is another useful
+%D adaption of the ancesters of these macro's. It takes some
+%D reasoning to find out what happens and maybe I'm making
+%D some mistake, but it works.
+%D
+%D Voiding box \type{\precolumnbox} is sometimes necessary,
+%D e.g. when there is no text given between \type{\begin..}
+%D and \type{\end..}. The \type{\par} is needed!
+
+\chardef\multicolumnendsyncmethod\plusone % 1: old sync 2: new sync (cont-loc/project) / may fail ! ! ! !
+
+\def\endmulticolumns
+  {%\par
+   \ifnum\multicolumnendsyncmethod=\plustwo
+     \synchronizeoutput
+   \else
+     % don't combine these
+     \vskip\lineheight
+     \vskip-\lineheight % take footnotes into account
+   \fi
+   \dontshowcomposition
+   \doflushcolumnfloat  % added recently
+  %\doflushcolumnfloats % no, since it results in wrong top floats
+   \flushnotes          % before start of columns
+   \par
+   \ifbalancecolumns
+     \ifnum\multicolumnendsyncmethod=\plusone
+       \global\output{\continuousmulticolumnsout}%
+       \goodbreak
+     \fi
+     \global\output{\balancedmulticolumnsout}%
+   \else
+     \goodbreak
+   \fi
+   \eject               % the prevdepth is important, try e.g. toclist in
+   \prevdepth\zeropoint % columns before some noncolumned text text
+   \global\output\singlecolumnout
+   \global\output{\the\mainoutput}% % % % % todo
+   \ifvoid\precolumnbox\else
+     \unvbox\precolumnbox
+   \fi
+   \global\precolumnboxheight\zeropoint
+   \endgroup % here
+   \nofcolumns\plusone
+   \setvsize % the outer one!
+   \synchronizeoutput % new may 2004 / we need to: \pagegoal\vsize
+   \checkendcolumnfootnotes
+   \dosomebreak\allowbreak
+   \restoresavedfloats}
+
+%D Because some initializations happen three times, we
+%D defined a macro for them. Erasing \type{\everypar} is
+%D needed because we don't want anything to interfere.
+
+\def\setmulticolumnsout
+  {\everypar\emptytoks
+   \dontcomplain
+   \settopskip
+   \setmaxdepth
+   \topskip1\topskip
+   \splittopskip\topskip
+   \splitmaxdepth\maxdepth
+   \boxmaxdepth\maxdepth % dangerous
+   \emergencystretch\zeropoint\relax} % sometimes needed !
+
+%D Flushing the page comes to pasting the columns together and
+%D appending the result to box \type{\precolumnbox}, if not
+%D void. I've seen a lot of implementations in which some skip
+%D was put between normal text and multi||column text. When we
+%D don't want this, the baselines can be messed up. I hope the
+%D seemingly complicated calculation of a correction
+%D \type{\kern} is adequate to overcome this. Although not
+%D watertight, spacing is taken into account and even multiple
+%D mode changes on one page go well. But cross your fingers and
+%D don't blame me.
+%D
+%D One of the complications of flushing out the boxes is that
+%D \type{\precolumnbox} needs to be \type{\unvbox}'ed, otherwise
+%D there is too less flexibility in the page when using
+%D \type{\r@ggedbottom}. It took a lot of time before these
+%D kind of problems were overcome. Using \type{\unvbox} at the
+%D wrong moment can generate \type{\balancingerror}'s.
+%D
+%D One can use the macros \type {\maxcolumnheight} and \type
+%D {\maxcolumndepth} when generating material between columns
+%D as well as postprocessing column lines.
+
+\let\maxcolumnheight=\zeropoint
+\let\maxcolumndepth =\zeropoint
+
+\newbox\columnpagebox
+
+\def\setmaxcolumndimensions
+  {\let\maxcolumnheight\!!zeropoint
+   \let\maxcolumndepth \!!zeropoint
+   \dohandleallcolumns
+     {\ifdim\ht\currentcolumnbox>\maxcolumnheight
+        \edef\maxcolumnheight{\the\ht\currentcolumnbox}%
+      \fi
+      \ifdim\dp\currentcolumnbox>\maxcolumndepth
+        \edef\maxcolumndepth{\the\dp\currentcolumnbox}%
+      \fi}}
+
+\chardef\multicolumntopflushmethod\plusone % 0: no correction, 1: correction when topstuff, 2: correction, 3: correction++
+\chardef\multicolumntopalignmethod\plustwo % 0: nothing, 1: force grid, 2: follow grid
+
+\def\flushprecolumnboxnogrid
+  {\unvbox\precolumnbox}
+
+\def\flushprecolumnboxongrid
+  {\scratchdimen\savedpagetotal
+   \advance\scratchdimen -\ht\precolumnbox
+   \advance\scratchdimen -\dp\precolumnbox
+   \advance\scratchdimen -\topskip
+   \box\precolumnbox
+   \kern\scratchdimen}
+
+\newconditional\someprecolumncontent
+
+\def\flushcolumnedpage#1%
+  {\bgroup
+   \ifvoid\precolumnbox
+     \setfalse\someprecolumncontent % will be set elsewhere
+   \else
+     \settrue\someprecolumncontent
+\mkprocessboxcontents\precolumnbox
+   \fi
+   \forgetall
+   \setmulticolumnsout
+   \showcomposition
+   \setmaxcolumndimensions
+   \dohandleallcolumns
+     {\mkprocesscolumncontents\currentcolumnbox}%
+   \postprocesscolumns
+   \dohandleallcolumns % \hbox i.v.m. \showcomposition
+     {\global\setbox\currentcolumnbox\hbox to \localcolumnwidth
+        {\box\currentcolumnbox
+         \global\wd\currentcolumnbox\localcolumnwidth
+         \ifheightencolumns
+           \global\ht\currentcolumnbox\fixedcolumnheight
+         \fi}}%
+   \setmaxcolumndimensions
+   \overlaycolumnfootnotes
+   \setbox\columnpagebox\vbox
+     {\hbox to \finalcolumntextwidth
+        {\hskip\colleftskip\relax % new, \relax needed
+         \ifreversecolumns
+           \@EA\dohandlerevcolumns
+         \else
+           \@EA\dohandleallcolumns
+         \fi
+           {\finishcolumnbox{\hbox
+              {\ifx\finishcolumnbox\relax\else\strut\fi
+               \box\currentcolumnbox}}%
+            \hfil}%
+         \unskip
+         \hskip\colrightskip}}% new
+   \scratchdimen\zeropoint
+   \dohandleallcolumns
+     {\ifdim-\ht\currenttopcolumnbox<\scratchdimen
+        \scratchdimen-\ht\currenttopcolumnbox
+      \fi
+      \global\setbox\currenttopcolumnbox\emptybox}%
+   \advance\scratchdimen \ht\columnpagebox
+   \setbox\scratchbox\hbox to \columntextwidth
+     {\vrule
+        \!!width\zeropoint
+        \!!height\scratchdimen
+        \!!depth\dp\columnpagebox
+      \dostepwiserecurse2\nofcolumns1{\hfil\betweencolumns}\hfil}%
+   \setbox\columnpagebox\hbox
+     {\box\columnpagebox
+      \hskip-\columntextwidth
+      \box\scratchbox}%
+   \postprocesscolumnpagebox % new, acts upon \box\columnpagebox
+   \ifconditional\someprecolumncontent
+     \settrue\someprecolumncontent
+     % next some incredible crappy code
+     \ifcase\multicolumntopalignmethod
+       \flushprecolumnboxnogrid % not on grid
+     \or
+       \flushprecolumnboxongrid % force on grid
+     \else\ifgridsnapping % somehow this junk fails in pascal
+       \flushprecolumnboxongrid % obey grid settings, force on grid
+     \else
+       \flushprecolumnboxnogrid % ignore grid settings, not on grid
+     \fi \fi
+   \fi
+   \global\precolumnboxheight\zeropoint
+   \setvsize
+   \dosomebreak\nobreak % hm, only needed when topstuff
+   \ifgridsnapping
+   \else
+     \ifcase\multicolumntopflushmethod
+       % sometimes method 1 goes wrong, so we need a way out; best sort this out
+       % when we run into it again
+     \or
+       % \input tufte \startcolumns \showbaselines \input tufte \stopcolumns \input tufte
+       \ifconditional\someprecolumncontent
+%          \scratchdimen\topskip
+%          \advance\scratchdimen -\openstrutheight
+%          \nointerlineskip
+%          \vskip-\scratchdimen
+         \nointerlineskip
+         \vskip\dimexpr\openstrutheight-\topskip\relax
+       \fi
+     \or
+%        \scratchdimen\topskip
+%        \advance\scratchdimen -\openstrutheight
+%        \nointerlineskip
+%        \vskip-\scratchdimen
+       \nointerlineskip
+       \vskip\dimexpr\openstrutheight-\topskip\relax
+     \or
+       % untested but maybe handy
+%        \scratchdimen\topskip
+%        \advance\scratchdimen -\openstrutheight
+%        \nointerlineskip
+%        \vskip-\scratchdimen
+%        \vskip-\lineheight
+%        \vbox{\strut}%
+       \nointerlineskip
+       \vskip\dimexpr\openstrutheight-\topskip-\lineheight\relax
+       \vbox{\strut}%
+     \fi
+   \fi
+   \prevdepth\openstrutdepth
+   \nointerlineskip
+   \dp\columnpagebox\zeropoint
+   \global\finalcolumnheights\ht\columnpagebox
+   \getnoflines\finalcolumnheights
+   \global\finalcolumnlines\noflines
+   \ifcase#1\else
+     % messy correction, we need to rewrite this module (newcolumns)
+     \setbox\columnpagebox\vbox
+       {\offinterlineskip
+        \scratchdimen\ht\columnpagebox
+        \advance\scratchdimen\dp\columnpagebox % we probably lost that one already
+        \box\columnpagebox
+        \vskip-\scratchdimen}%
+     \scratchdimen\noflines\openlineheight
+     \advance\scratchdimen-\openstrutdepth
+     \advance\scratchdimen-\openlineheight
+     \advance\scratchdimen\topskip
+     \ht\columnpagebox\scratchdimen
+     \dp\columnpagebox\openstrutdepth
+     % end of mess
+   \fi
+   \box\columnpagebox
+   \egroup}
+
+%D In case one didn't notice, finaly \type{\finishcolumnbox} is
+%D applied to all boxes. One can use these hooks for special
+%D purposes.
+%D
+%D Once upon a time I wanted to manipulate the individual lines
+%D in a column. This feature is demonstrated in the two examples
+%D below.
+%D
+%D \startbuffer
+%D \def\postprocesscolumnline#1% or \postprocesscolumnbox
+%D   {\ruledhbox{\box#1}\hss}
+%D
+%D \startcolumns[n=4]
+%D \dorecurse{25}{line: \recurselevel\par}
+%D \stopcolumns
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we show the natural width of the lines:
+%D
+%D {\getbuffer}
+%D
+%D The next example does a bit more advanced manipulation:
+%D
+%D \startbuffer
+%D \def\postprocesscolumnline#1%
+%D   {\ifodd\currentcolumn
+%D      \hfill\unhbox#1\relax
+%D    \else
+%D      \relax\unhbox#1\hfill
+%D    \fi}
+%D
+%D \startcolumns[n=4]
+%D \dorecurse{25}{line \recurselevel\par}
+%D \stopcolumns
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we also see an application of \type{\currentcolumn}:
+%D
+%D {\getbuffer}
+%D
+%D This feature is implemented using the reshape macros
+%D presented in \type{supp-box}.
+
+\def\postprocesscolumns
+  {\ifx\postprocesscolumnline\undefined \else
+     \dohandleallcolumns
+       {\global\setbox\currentcolumnbox\vtop
+          {\beginofshapebox
+           \unvbox\currentcolumnbox
+           \unskip\unskip
+           \endofshapebox
+           \reshapebox
+             {\dimen0\ht\shapebox
+              \dimen2\dp\shapebox
+              \setbox\shapebox\hbox to \hsize
+                {\postprocesscolumnline\shapebox}%
+              \ht\shapebox\dimen0
+              \dp\shapebox\dimen2
+              \box\shapebox}%
+           \flushshapebox
+           \everypar\emptytoks
+           \parskip\zeropoint % = \forgetall
+           \verticalstrut
+           \vskip-\struttotal
+           \vfil}}%
+   \fi
+   \ifx\postprocesscolumnbox\undefined \else
+     \dohandleallcolumns
+       {\global\setbox\currentcolumnbox\hbox
+          {\postprocesscolumnbox\currentcolumnbox}}
+   \fi}
+
+%D We default to doing nothing!
+
+\let\postprocesscolumnline   =\undefined
+\let\postprocesscolumnbox    =\undefined
+\let\postprocesscolumnpagebox=\relax
+
+%D \macros
+%D   {reversecolumnstrue}
+%D
+%D We can force the macro that takes care of combining
+%D the columns, to flush them in the revere order. Of
+%D course, by default we don't reverse.
+
+\newif\ifreversecolumns
+
+%D Here comes the simple splitting routine. It's a bit
+%D longer than expected because of ragging bottoms or not.
+%D This part can be a bit shorter but I suppose that I will
+%D forget what happens. The splitting takes some already
+%D present material (think of floats) into account!
+%D
+%D First we present some auxiliary routines. Any material,
+%D like for instance floats, that is already present in the
+%D boxes is preserved.
+
+\def\splitcolumn#1from \box#2to \dimen#3 top \box#4%
+  {\bgroup
+   \ifdim\ht#4>\zeropoint
+     \dimen0\dimen#3\relax
+     \dimen2\dimen0
+     \advance\dimen0 -\ht#4%
+     \columnfootnotecorrection{#1}{\dimen0}%
+     \setbox0\vsplit#2 to \dimen0
+     \global\setbox#1\vbox to \dimen2
+       {\ifgridsnapping
+          \dimen0-\openstrutheight
+          \advance\dimen0 \topskip
+          \vskip\dimen0\copy#4\vskip-\dimen0
+        \else
+          \unvcopy#4%
+        \fi
+        \fuzzysnappedbox\unvbox0
+        \fakecolumnfootnotes{#1}}%
+   \else
+     \ifcase\clevernotes
+       \global\setbox#1\vsplit#2 to \dimen#3%
+       \global\setbox#1\vbox
+         {\fuzzysnappedbox\unvbox{#1}}% % or \box ?
+     \else
+       \columnfootnotecorrection{#1}{\dimen#3}%
+       \setbox0\vsplit#2 to \dimen#3%
+       \global\setbox#1\vbox to \dimen#3%
+         {\fuzzysnappedbox\unvbox0
+          \fakecolumnfootnotes{#1}}%
+     \fi
+   \fi
+   \egroup}
+
+\def\splitcurrentcolumn from \box#1to \dimen#2%
+  {\splitcolumn\currentcolumnbox from \box#1 to \dimen#2 top \box\currenttopcolumnbox}
+
+\def\splitfirstcolumn from \box#1to \dimen#2%
+  {\splitcolumn\firstcolumnbox from \box#1 to \dimen#2 top \box\firsttopcolumnbox}
+
+\def\splitlastcolumn from \box#1to \dimen#2%
+  {\global\setbox\lastcolumnbox\vbox
+     {\unvcopy\lasttopcolumnbox
+      \fuzzysnappedbox\unvbox{#1}%
+      \fakecolumnfootnotes\lastcolumnbox}}
+
+%D NEW: still to be documented.
+
+\def\fakecolumnfootnotes#1%
+  {\relax
+   \ifcase\clevernotes\else
+     \ifnum#1=\lastcolumnbox
+       \fakenotes
+     \fi
+   \fi}
+
+\def\columnfootnotecorrection#1#2%
+  {\relax
+   \ifcase\clevernotes
+     % page notes
+   \or
+     \ifnum#1=\firstcolumnbox\relax
+       \calculatetotalclevernoteheight
+       \advance#2 -\totalnoteheight
+     \fi
+   \else
+     \ifnum#1=\lastcolumnbox\relax
+       \calculatetotalclevernoteheight
+       \advance#2 -\totalnoteheight
+     \fi
+   \fi}
+
+\def\overlaycolumnfootnotes
+  {\relax
+   \ifcase\clevernotes
+     % page notes
+   \else
+     \checknotepresence
+     \ifnotespresent
+       % the note box has the depth of the notefont
+       % because a column (i.e. first column has no depth,
+       % we need to anchor top down)
+       \bgroup
+       \ifcase\clevernotes\or
+         \getmulticolumnlines
+         \advance\nofcolumnlines \minustwo
+         \scratchdimen\nofcolumnlines\lineheight
+         \advance\scratchdimen \topskip
+         \setbox0\hbox
+           {\lower\scratchdimen\vbox{\placenoteinserts}}%
+         \ht0=\openstrutheight % \strutht
+         \dp0=\openstrutdepth  % \strutdp
+         \scratchdimen\ht\firstcolumnbox
+         \global\setbox\firstcolumnbox\vbox to \scratchdimen
+           {\box\firstcolumnbox
+            \vskip-\scratchdimen
+            \box0}%
+       \else
+         % maybe here also \getmulticolumnlines
+         \scratchdimen\ht\firstcolumnbox
+         \advance\scratchdimen -\openstrutdepth % \strutdp
+         \getnoflines\scratchdimen
+         \advance\noflines \minustwo
+         \scratchdimen\noflines\lineheight
+         \advance\scratchdimen \topskip
+         \setbox0\hbox
+           {\lower\scratchdimen\vbox{\placenoteinserts}}%
+         \ht0=\openstrutheight % \strutht
+         \dp0=\openstrutdepth  % \strutdp
+         \scratchdimen\ht\lastcolumnbox
+         \global\setbox\lastcolumnbox\vbox to \scratchdimen
+           {\box\lastcolumnbox
+            \vskip-\scratchdimen
+            box0}%
+       \fi
+       \egroup
+     \fi
+   \fi}
+
+%D Here comes the routine that splits the long box in columns.
+%D The macro \type{\flushcolumnfloats} can be used to flush
+%D either floats that were present before the multi||column
+%D mode was entered, or floats that migrate to next columns.
+%D Flushing floats is a delicate process.
+
+\def\continuousmulticolumnsout
+  {\bgroup
+   \forgetall
+   \setmulticolumnsout
+   \dontshowcomposition
+%    \dimen0=\columntextheight
+%    \advance\dimen0 -\precolumnboxheight
+%    \settotalinsertionheight
+%    \advance\dimen0 -\totalinsertionheight
+%    \ifgridsnapping % evt altijd, nog testen
+%      \getnoflines{\dimen0}
+%      \dimen0=\noflines\openlineheight
+%    \fi
+   \getmulticolumnlines
+   \dimen0=\nofcolumnlines\openlineheight
+   \dohandleallcolumns
+     {\splitcurrentcolumn from \box\normalpagebox to \dimen0}%
+   \setbox\restofpage\vbox{\unvbox\normalpagebox}%
+   \ifinheritcolumns
+     \ifr@ggedbottom % vreemd
+       \dohandleallcolumns
+         {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox
+            {\dimen0\dp\currentcolumnbox
+             \unvbox\currentcolumnbox
+             \vskip-\dimen0
+             \vskip\openstrutdepth % \strutdp
+             \prevdepth\openstrutdepth % \strutdp
+             \vfill}}%
+       \ifbottomnotes \else
+         \dimen0\ht\firstcolumnbox
+       \fi
+     \fi
+     \ifn@rmalbottom
+       \advance\dimen0 \maxdepth
+       \dohandleallcolumns
+         {\global\setbox\currentcolumnbox\vbox to \dimen0
+            {\unvbox\currentcolumnbox}}%
+     \fi
+     \ifb@selinebottom
+       % the columns are on top of the baseline
+     \fi
+   \else
+     \dohandleallcolumns
+       {\global\setbox\currentcolumnbox\vbox to \dimen0
+          {\ifstretchcolumns
+             \unvbox\currentcolumnbox
+           \else
+             \unvbox\currentcolumnbox % wel of niet \unvbox ?
+             \vfill
+           \fi}}%
+     \dohandleallcolumns
+       {\global\ht\currentcolumnbox\dimen0}%
+   \fi
+   \setbox\precolumnbox\vbox{\flushcolumnedpage\zerocount}%
+   \finaloutput\box\precolumnbox
+   \sethsize
+   \setvsize
+   \flushcolumnfloats
+   \unvbox\restofpage
+   % \penalty\outputpenalty % gaat gruwelijk mis in opsommingen
+   \egroup}
+
+%D And this is the balancing stuff. Again, part of the routine
+%D is dedicated to handling ragged bottoms, but here we also
+%D see some handling concerning the stretching of columns.
+%D We set \type{\widowpenalty} at~0, which enables us to
+%D balance columns with few lines. The use of \type{\box2} and
+%D \type{\box4} garantees a more robust check when skips are
+%D used.
+
+\def\multicolumnsbalancemax{250} % 100 is too small when floats are involved
+
+\def\balancedmulticolumnsout
+  {\bgroup
+   \setmulticolumnsout
+   \dontshowcomposition
+   \widowpenalty\zerocount
+   \setbox0\vbox{\unvbox\normalpagebox}%
+\ifdim\ht0>\openlineheight % at least one line
+  \ifnum\minbalancetoplines<2 % balance anyway
+    \donetrue
+  \else % check criterium to available lines
+    \getnoflines{\ht0}%
+    \divide\noflines \nofcolumns \relax
+    \ifnum\noflines<\minbalancetoplines \relax
+      \dimen0\ht0
+      \advance\dimen0 \ht\firsttopcolumnbox
+      \advance\dimen0 \openlineheight \relax % let's play safe
+      \ifdim\dimen0>\columntextheight % column exceeding text height
+        \donetrue
+      \else % it seems to fit
+        \donefalse
+      \fi
+    \else % balance indeed
+      \donetrue
+    \fi
+  \fi
+\else % balancing does not make sense
+  \donefalse
+\fi
+\ifdone % start balancing
+  %\ifdim\ht0>\openlineheight
+     \dimen0\ht0
+     \advance\dimen0 \topskip
+     \advance\dimen0 -\baselineskip
+     \dohandleallcolumns
+       {\advance\dimen0 \ht\currenttopcolumnbox}%
+     \divide\dimen0 \nofcolumns
+     \vbadness\!!tenthousand\relax
+     \count255=\zerocount
+     \bgroup
+     \ifgridsnapping
+       \dimen2\lineheight
+     \else
+       \dimen2=\onepoint % RUBISH
+       \dimen2=\spacingfactor\dimen2
+     \fi
+     \doloop
+       {\advance\count255 \plusone
+        \global\setbox\restofpage\copy0\relax
+        \splitfirstcolumn from \box\restofpage to \dimen0
+        \dohandlemidcolumns
+          {\splitcurrentcolumn from \box\restofpage to \dimen0}%
+        \splitlastcolumn from \box\restofpage to \dimen0
+        \setbox2\vbox{\unvcopy\firstcolumnbox}%
+        \dimen4\zeropoint
+        \dohandleallcolumns
+          {\setbox4\vbox
+             {\unvcopy\currentcolumnbox
+             %rather new, test this on pdftex-z.tex
+              \unpenalty\unskip\unpenalty\unskip}% maybe better in main splitter
+          %\writestatus{balance}{\the\currentcolumnbox: \the\ht4}%
+%            \dimen6\ht4 \ifdim\dimen6>\dimen4 \dimen4=\dimen6 \fi}%
+           \ifdim\ht4>\dimen4 \dimen4=\ht4 \fi}%
+        \advance\dimen4 -.0005pt % get rid of accurracy problem, pretty new
+        \ifnum\count255>\multicolumnsbalancemax\relax
+          \exitloop
+        \else\ifdim\dimen4>\ht2
+          \advance\dimen0 \dimen2\relax
+        \else
+          \exitloop
+        \fi\fi}%
+     \dohandleallcolumns
+       {\global\setbox\currentcolumnbox\vbox{\unvcopy\currentcolumnbox}}% NIEUW
+     \ifnum\count255>\multicolumnsbalancemax\relax
+       \showmessage\m!columns7\empty
+     \else
+       \showmessage\m!columns8{\the\count255\space}%
+     \fi
+     \egroup
+     \ifinheritcolumns
+       % We cannot assume that the first column is the tallest, if
+       % only because we may have an aborted balance (one line in the
+       % first column and a graphic in the second one).
+       %
+       % \dimen0\ht\firstcolumnbox
+       % \dimen2\ht\firstcolumnbox
+       %
+       \dimen0=\zeropoint
+       \dohandleallcolumns
+         {\ifdim\ht\currentcolumnbox>\dimen0
+            \dimen0=\ht\currentcolumnbox
+          \fi}%
+       \dimen2\dimen0
+       % so far
+       \advance\dimen2 -\openlineheight
+       \dohandleallcolumns
+         {\dimen4\ht\currentcolumnbox
+          \dimen6=10\openlineheight % funny value
+          \global\setbox\currentcolumnbox\vbox to \dimen0
+            {\unvbox\currentcolumnbox
+             \ifdim\dimen4>\dimen6
+               \ifdim\dimen4<\dimen0
+                 \ifdim\dimen4>\dimen2
+                   \vskip\zeropoint  % !!
+                 \else
+                   \vskip\openlineheight
+                   \vfill
+                 \fi
+               \else
+                 \vskip\zeropoint
+               \fi
+             \else
+               \vskip\openlineheight
+               \vfill
+             \fi}}%
+     \else
+       \bgroup
+       \ifstretchcolumns
+         \dimen0\ht\firstcolumnbox
+         \dimen2=\bottomtolerance\ht\firstcolumnbox
+         \setbox0\vbox{\unvcopy\lastcolumnbox}%
+         \advance\dimen0 -\ht0\relax
+         \advance\dimen0 -\dp0\relax
+         \ifdim\dimen0>\openlineheight\relax
+           \ifdim\dimen0>\dimen2\relax
+             % \stretchcolumnsfalse % beter goed slecht dan slecht goed
+             \showmessage\m!columns9\empty
+           \fi
+         \fi
+       \fi
+       \dohandleallcolumns
+         {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox
+            {\ifstretchcolumns
+               \unvbox\currentcolumnbox
+             \else
+               \box\currentcolumnbox
+               \vfill
+             \fi}}%
+       \egroup
+     \fi
+   \else
+     % a one liner is not properly handled here, so best rewrite the text then
+     \showmessage\m!columns{10}\empty
+     \global\setbox\firstcolumnbox\vbox{\unvbox0}%
+   \fi
+   \global\output{\balancingerror}%
+   \b@selinebottomtrue % forces depth in separation rule
+   \flushcolumnedpage\plusone
+   \multicolumnseject
+   \egroup}
+
+\def\multicolumnseject
+  {\ifdim\pagetotal>\textheight
+     \eject % new
+   \else
+     \allowbreak
+   \fi}
+
+%D The multicolumn mechanism is incorporated in a \CONTEXT\
+%D interface, which acts like:
+%D
+%D \starttyping
+%D \startcolumns[n=4,balance=no]
+%D   some text
+%D \stopcolumns
+%D \stoptyping
+%D
+%D The setup is optional. The default behaviour of columns
+%D can be set up with:
+%D
+%D \starttyping
+%D \setupcolumns
+%D   [n=2,
+%D    balance=yes]
+%D \stoptyping
+%D
+%D In this case, stretching is according to the way it's
+%D done outside columns (\type{\inheritcolumnstrue}). Also
+%D we can setup the \type{tolerance} within a column, the
+%D \type{distance} between columns and the fixed
+%D \type{height} of a column.
+
+%D Multi||column output: the float routines
+%D
+%D Here come the routines that handle the placement of column
+%D floats. Floats that are to big migrate to the next
+%D column. Floats that are too wide, migrate to the top of the
+%D next page, where they span as much columns as needed.
+%D Floats that are left over from outside the multi||column
+%D mode are flushed first. In macro \type{\finaloutput} the
+%D topfloats that are left from previous text should be set.
+%D
+%D When there are some floats in the queue, we inhibit the
+%D flushing of floats on top of columns. The number of
+%D waiting floats is preswent in \type{\savednoftopfloats} and
+%D is saved. As long as there are floats waiting, the topfloats
+%D are places as if we are outside multi||column mode. This is
+%D neccessary for e.g. multicolumn lists.
+%D
+%D When all those floats are flushed, we switch to the local
+%D flushing routine.
+
+\def\setcolumnfloats
+  {\xdef\globalsavednoffloats{\the\savednoffloats}%
+   \ifnum\globalsavednoffloats>\zerocount
+     \setglobalcolumnfloats
+   \else
+     \setlocalcolumnfloats
+   \fi}
+
+\def\setglobalcolumnfloats
+  {\everypar\emptytoks
+   \let\flushcolumnfloat\relax
+  %\let\doroomfloat\relax
+   \let\docheckiffloatfits\relax
+   \let\flushcolumnfloats\noflushcolumnfloats}
+
+\def\setlocalcolumnfloats
+  {\everypar{\flushnotes\flushcolumnfloat\flushmargincontents\checkindentation}%
+   \let\flushcolumnfloat\doflushcolumnfloat
+  %\let\doroomfloat\docolumnroomfloat
+   \let\docheckiffloatfits\docolumnroomfloat
+   \let\flushcolumnfloats\doflushcolumnfloats
+   \let\doflushfloats\doflushcolumnfloats % new
+   \let\dosetbothinserts\relax
+   \let\dotopinsertions\relax}
+
+\def\noflushcolumnfloats
+  {\bgroup
+   \xdef\localsavednoffloats{\the\savednoffloats}%
+   \global\savednoffloats\globalsavednoffloats
+   \dotopinsertions
+   \xdef\globalsavenoffloats{\the\savednoffloats}%
+   \ifnum\globalsavednoffloats=\zerocount
+     \setlocalcolumnfloats
+   \fi
+   \global\savednoffloats\localsavednoffloats
+   \egroup}
+
+%D We need to calculate the amount of free space in a columns.
+%D When there is not enough room, we migrate the float to the
+%D next column. These macro's are alternatives (and
+%D look||alikes) of \type{\doroomfloat}. When a float is to
+%D wide, for one column, it is moved to the top of the next
+%D page. Of course such moved floats have to be taken into
+%D account when we calculate the available space. It's a pitty
+%D that such things are no integral part of \TEX.
+
+\def\getcolumnstatus\column#1\total#2\goal#3\\%
+  {\dimen0=\ifdim\pagegoal<\maxdimen \pagetotal \else \zeropoint \fi
+   \dimen2=\zeropoint
+   \count255=\zerocount
+   \dimen8=\columntextheight
+   \advance\dimen8 -\precolumnboxheight
+   \def\dogetcolumnstatus
+     {\advance\count255 \plusone
+      \advance\dimen2 \ht\currenttopcolumnbox
+      \advance\dimen2 \dp\currenttopcolumnbox
+      \dimen4\dimen2
+      \advance\dimen4 \dimen0
+      \dimen6=\count255\dimen8
+      \ifdim\dimen4>\dimen6
+      \else
+        \let\dogetcolumnstatus\relax
+      \fi}%
+   \dohandleallcolumns{\dogetcolumnstatus}%
+   \ifnum\count255=0 \count255=1 \fi
+   #1=\count255
+   #2=\dimen4
+   #3=\dimen6 }
+
+\def\getinsertionheight
+  {\ifdim\pagegoal<\maxdimen
+     \bgroup
+     \dimen0=\columntextheight
+     \advance\dimen0 -\pagegoal
+     \xdef\insertionheight{\the\dimen0}%
+     \egroup
+   \else
+     \global\let\insertionheight\zeropoint
+   \fi}
+
+\def\docolumnroomfloat
+  {\ifpostponecolumnfloats
+     \global\roomforfloatfalse
+   \else\ifnofloatpermitted
+     \global\roomforfloatfalse
+   \else
+     \bgroup
+     \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\%
+     \advance\dimen0 2\openlineheight % nog nodig ?
+    %\ifnum\count255=\nofcolumns
+    %  \getinsertionheight
+    % %\message{\insertionheight}\wait
+    %  \advance\dimen0 \insertionheight
+    %\fi
+     \setbox\scratchbox\vbox % tricky met objecten ?
+       {\blank[\@@bkspacebefore]
+        \snaptogrid\vbox{\copy\floatbox}}%
+     \advance\dimen0 \ht\scratchbox
+     \advance\dimen0 .5\lineheight % needed because goal a bit higher
+    %\message{column: \the\count255; total: \the\dimen0; goal: \the\dimen2}\wait
+     \ifdim\dimen0>\dimen2
+       \global\roomforfloatfalse
+     \else
+       \global\roomforfloattrue
+     \fi
+     \ifdim\wd\floatbox>\hsize
+       \showmessage\m!columns{11}\empty
+       \global\roomforfloatfalse
+     \fi
+     \egroup
+   \fi\fi}
+
+%D Flushing one float is done as soon as possible, i.e.
+%D \type{\everypar}. This means that (at the moment)
+%D sidefloats are not supported (overulled)!
+
+\newif\ifflushingcolumnfloats \flushingcolumnfloatstrue
+
+\def\doflushcolumnfloat
+  {\ifpostponecolumnfloats\else\ifflushingcolumnfloats\ifprocessingverbatim\else\ifsomefloatwaiting
+     \bgroup
+     \forgetall
+     \let\doflushcolumnfloat\relax
+     \getcolumnstatus\column\mofcolumns\total\dimen0\goal\dimen2\\%
+     \ifdim\dimen0>\zeropoint
+       \dogetfloat
+       \ifdim\wd\floatbox>\hsize
+         \doresavefloat
+       \else
+        %\setbox2=\vbox
+        %  {\blank[\@@bkspacebefore]
+        %   \snaptogrid\vbox{\copy\floatbox}%
+        %   \blank[\@@bkspaceafter]
+         \setbox2=\vbox
+           {\blank[\@@bkspacebefore]
+            \snaptogrid\vbox{\copy\floatbox}}%
+         \advance\dimen0 \ht2
+         \ifdim\dimen0>\dimen2
+           \ifnum\mofcolumns<\nofcolumns
+             \advance\mofcolumns \plusone
+%% bug %%    \edef\currenttopcolumnbox{\getvalue{\@@topcol\the\count255}}%
+             \ifdim\ht\currenttopcolumnbox=\zeropoint
+               \global\setbox\currenttopcolumnbox\vbox
+                 {\snaptogrid\vbox{\copy\floatbox}
+                  \whitespace % nodig ?
+                  \blank[\@@bkspaceafter]}%
+               \dimen4=\ht\currenttopcolumnbox
+               \advance\dimen4 \dp\currenttopcolumnbox
+               \global\advance\vsize -\dimen4
+               \advance\dimen4 -\pagegoal
+               \global\pagegoal-\dimen4
+               \showmessage\m!columns{12}a%
+             \else
+               \showmessage\m!columns{12}b%
+               \doresavefloat
+             \fi
+           \else
+             \showmessage\m!columns{12}c%
+             \doresavefloat
+           \fi
+         \else
+           \ifhmode{\setbox0\lastbox}\fi% waar is die er in geslopen
+           \par
+           \ifdim\prevdepth<\zeropoint \else % anders bovenaan kolom witruimte
+             \nobreak
+             \blank[\@@bkspacebefore]
+             \nobreak
+           \fi
+           \flushfloatbox
+           \blank[\@@bkspaceafter]
+         \fi
+       \fi
+     \fi
+     \egroup
+   \fi\fi\fi\fi}
+
+%D This one looks complicated. Upto \type{\nofcolumns} floats
+%D are placed, taking the width of a float into account. This
+%D routine can be improved on different ways:
+%D
+%D \startitemize[intro,packed]
+%D \item taking into account some imaginary baseline, just to
+%D      get the captions in line
+%D \item multipass flushing until as many floats are displaced
+%D      as possible
+%D \stopitemize
+%D
+%D When handling lots of (small) floats spacing can get worse
+%D because of lining out the columns.
+
+\def\doflushcolumnfloats
+  {\ifpostponecolumnfloats\else
+     \bgroup
+     \forgetall
+     \ifsomefloatwaiting
+       \dimen8\zeropoint
+       \dimen4\zeropoint
+       \count0\zerocount   % count0 can be used local
+       \count2\nofcolumns  % count2 can be used local
+       \dohandleallcolumns
+         {\ifnum\count0>\zerocount % the wide one's reserved space
+            \global\setbox\currenttopcolumnbox\vbox
+              {\snaptogrid\vbox
+                 {\copy\currenttopcolumnbox
+                  \hbox{\vphantom{\copy\floatbox}}}
+                  \whitespace % nodig ?
+                  \blank[\@@bkspaceafter]}%
+          \else
+            \dogetfloat
+            \ifdim\wd\floatbox>\finalcolumntextwidth % better somewhere else too
+              \global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}%
+            \fi % otherwise the graphic may disappear
+            \ifdim\wd\floatbox>\hsize
+              \dimen0\wd\floatbox
+              \advance\dimen0 \intercolumnwidth
+              \dimen2\hsize
+              \advance\dimen2 \intercolumnwidth
+              \advance\dimen0 .5pt % hm, why 1
+              \advance\dimen2 .5pt % hm, why 2
+              \divide\dimen0 \dimen2
+              \count0\dimen0
+              \advance\count0 \plusone
+              \ifnum\count0>\count2
+                \doresavefloat
+                \count0\zerocount
+              \else
+                \dimen0=\count0\hsize
+                \advance\dimen0 \count0\intercolumnwidth
+                \advance\dimen0 -\intercolumnwidth
+                \global\setbox\floatbox\hbox to \dimen0
+                 %{\hss\hbox{\copy\floatbox}\hss}%
+                  {\processaction[\@@bklocation] % how easy to forget
+                     [  \v!left=>\copy\floatbox\hss,
+                       \v!right=>\hss\copy\floatbox,
+                      \s!default=>\hss\copy\floatbox\hss,
+                      \s!unknown=>\hss\copy\floatbox\hss]}%
+              \fi
+              \showmessage\m!columns{13}\empty
+            \else
+            %  \showmessage\m!columns{13}\empty
+            \fi
+            \ifdim\ht\floatbox>\zeropoint\relax
+              \global\setbox\currenttopcolumnbox\vbox
+                {\snaptogrid\vbox
+                   {\copy\currenttopcolumnbox
+                    \copy\floatbox}
+                 \whitespace % nodig ?
+                 \blank[\@@bkspaceafter]}%
+            \fi
+            \dimen6\ht\currenttopcolumnbox
+            \advance\dimen6 \dp\currenttopcolumnbox
+          \fi
+          \ifdim\dimen4<\ht\currenttopcolumnbox
+            \dimen4\ht\currenttopcolumnbox
+          \fi
+          \advance\dimen8 \dimen6
+          \advance\count2 \minusone
+          \advance\count0 \minusone }%
+       \setvsize
+       \global\advance\vsize -\dimen8
+       \global\pagegoal\vsize
+     \else
+       %\doflushfloats % does not snap!
+     \fi
+     \egroup
+   \fi}
+
+%D The next macro can be used to flush floats in the current
+%D stream. No width checking is (yet) done.
+
+\def\insertcolumnfloats
+  {\doloop
+     {\ifsomefloatwaiting
+        \bgroup
+        \forgetall
+        % no check for width
+        \dogetfloat
+        \blank[\@@bkspacebefore]
+        \snaptogrid\vbox{\copy\floatbox}
+        \blank[\@@bkspaceafter]
+        \egroup
+      \else
+        \exitloop
+      \fi}}
+
+%D This were the multi||column routines. They can and need to
+%D be improved but at the moment their behaviour is acceptable.
+%D
+%D One inprovement can be to normalize the height of floats
+%D to $n\times$\type{\lineheight} with a macro like:
+%D
+%D \starttyping
+%D \normalizevbox{...}
+%D \stoptyping
+
+% border case, should fit on one page
+%
+% \startcolumns
+%
+% 1 \input tufte  \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{1}}
+% 2 \input tufte  \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{2}}
+% 3 \input tufte  \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{3}}
+%
+% \stopcolumns
+
+\def\setupcolumns
+  {\dosingleempty\dosetupcolumns}
+
+\def\dosetupcolumns[#1]%
+  {\getparameters[\??kl][#1]%
+   \nofcolumns\@@kln\relax
+   \processaction
+     [\@@klrule]
+     [     \v!on=>\let\betweencolumns\linebetweencolumns,
+          \v!off=>\let\betweencolumns\spacebetweencolumns,
+      \s!default=>\let\betweencolumns\spacebetweencolumns,
+      \s!unknown=>\let\betweencolumns\@@klrule]}
+
+\def\linebetweencolumns
+  {\bgroup
+   \starttextproperties
+   \ifdim\@@kldistance>\zeropoint
+     \dimen0=\@@kldistance
+   \else
+     \dimen0=\linewidth
+   \fi
+   \advance\dimen0 -\linewidth
+   \hskip.5\dimen0
+   \vrule
+     \!!width\linewidth
+     \ifb@selinebottom\!!depth\strutdepth\fi
+   \hskip.5\dimen0\relax
+   \stoptextproperties
+   \egroup}
+
+\def\spacebetweencolumns
+  {\hskip\@@kldistance}
+
+\presetlocalframed[\??kl]
+
+\def\backgroundfinishcolumnbox
+  {\doifinsetelse\@@kloffset{\v!none,\v!overlay}
+     {\let\@@kloffset\!!zeropoint}
+     {\scratchdimen\@@kloffset
+      \advance\scratchdimen -\@@klrulethickness
+      \edef\@@kloffset{\the\scratchdimen}}%
+   \localframed
+     [\??kl]
+     [\c!strut=\v!no,
+      \c!width=\v!fit,
+      \c!height=\v!fit,
+      \c!align=]}
+
+\definecomplexorsimpleempty\startcolumns
+
+\def\complexstartcolumns[#1]% %% \startcolumns
+  {\bgroup
+   \let\stopcolumns\egroup
+   \ifinsidecolumns
+   \else
+     \setupcolumns[#1]%
+     \ifnum\@@kln>1\relax
+       \whitespace
+       \begingroup
+       \doif\@@kloption\v!background
+         {\let\finishcolumnbox\backgroundfinishcolumnbox
+          \let\columntextoffset\@@kloffset}%
+       \ifx\@@klcommand\empty\else
+         \let\postprocesscolumnline\@@klcommand
+       \fi
+       \doifelsenothing\@@klheight
+         \heightencolumnsfalse
+         \heightencolumnstrue
+       \doifelse\@@kldirection\v!right
+         \reversecolumnsfalse
+         \reversecolumnstrue
+       \doifelse\@@klbalance\v!yes
+         \balancecolumnstrue
+         \balancecolumnsfalse
+       \installalign\v!yes {\stretchcolumnstrue \inheritcolumnsfalse}% todo: new key
+       \installalign\v!no  {\stretchcolumnsfalse\inheritcolumnsfalse}% todo: new key
+       \installalign\v!text{\stretchcolumnsfalse\inheritcolumnstrue }%
+       \stretchcolumnsfalse
+       \inheritcolumnstrue
+       \doifsomething\@@klalign{\expanded{\setupalign[\@@klalign]}}%
+       \nofcolumns=\@@kln
+       %
+       % probably more is needed, and how about nesting save's
+       %
+       \saveouterspacing
+       %
+       \edef\fixedcolumnheight{\@@klheight}%
+       \edef\minbalancetoplines{\@@klntop}%
+       \setuptolerance[\@@kltolerance]%     %% \startcolumns
+       \setupblank[\@@klblank]%
+       \ifdim\ctxparskip>\zeropoint\relax
+         \setupwhitespace[\@@klblank]%
+       \fi
+       \def\stopcolumns
+         {\endmulticolumns
+          \global\insidecolumnsfalse
+          \endgroup
+          \egroup}%
+       \global\insidecolumnstrue
+       \beginmulticolumns
+     \fi
+   \fi}
+
+\installcolumnbreakhandler {MUL} \v!preference
+  {\goodbreak}
+
+\installcolumnbreakhandler {MUL} \v!yes
+  {\par                                             % todo: since
+   {\testrulewidth\zeropoint\ruledvskip\textheight} % we misuse a
+   \penalty-200                                     % side effect
+   \vskip-\textheight
+   }% bugged : \prevdepth-\thousandpoint} % signals top of column to \blank
+
+%D New: only at start of columns; may change ! Rather
+%D interwoven and therefore to be integrated when the multi
+%D column modules are merged. (moved from cont-new.tex)
+
+\def\setupcolumnspan[#1]%
+  {\getparameters[\??ks][#1]}
+
+\presetlocalframed
+  [\??ks]
+
+\setupcolumnspan
+  [\c!n=2,
+   \c!offset=\v!overlay,
+   \c!frame=\v!off]
+
+\newbox\columnspanbox \let\postprocesscolumnspanbox\gobbleoneargument
+
+\def\dostartcolumnspan[#1]%
+  {\bgroup
+   \setupcolumnspan[#1]%
+   \forgetall
+   \ifinsidecolumns
+     \advance\hsize \intercolumnwidth
+     \hsize\@@ksn\hsize
+     \advance\hsize -\intercolumnwidth
+   \fi
+   \dowithnextbox
+     {\setbox\columnspanbox\flushnextbox
+      \ifinsidecolumns\wd\columnspanbox\hsize\fi
+      \postprocesscolumnspanbox\columnspanbox
+      \scratchdimen\ht\columnspanbox
+      \setbox\columnspanbox\hbox % depth to be checked, probably option!
+        {\localframed[\??ks][\c!offset=\v!overlay]{\box\columnspanbox}}%
+      \ht\columnspanbox\scratchdimen
+      \dp\columnspanbox\strutdp
+      \wd\columnspanbox\hsize
+      \ifinsidecolumns
+        \ifnum\@@ksn>1
+          \setvsize
+          \dohandleallcolumns
+            {\ifnum\currentcolumn>\@@ksn\else
+               \global\setbox\currenttopcolumnbox=\vbox
+                 {\ifnum\currentcolumn=1
+                    \snaptogrid\vbox{\copy\columnspanbox}
+                  \else
+                    \snaptogrid\vbox{\vphantom{\copy\columnspanbox}}
+                  \fi}%
+               \wd\currenttopcolumnbox\hsize
+               \global\advance\vsize -\ht\currenttopcolumnbox
+             \fi}
+          \global\pagegoal\vsize
+        \else
+          \snaptogrid\vbox{\box\columnspanbox}
+        \fi
+      \else
+        \snaptogrid\vbox{\box\columnspanbox}
+      \fi
+      \endgraf
+      \ifvmode\prevdepth\strutdp\fi
+      \egroup}
+     \vbox\bgroup
+      %\topskipcorrection % becomes an option !
+       \EveryPar{\begstrut\EveryPar{}}} % also !
+
+\def\startcolumnspan
+  {\dosingleempty\dostartcolumnspan}
+
+\def\stopcolumnspan
+  {\egroup}
+
+\setupcolumns
+  [\c!n=2,
+   \c!ntop=1,
+   \c!command=,
+   \c!direction=\v!right,
+   \c!rule=\v!off,
+   \c!tolerance=\v!tolerant,
+   \c!distance=1.5\bodyfontsize, % influenced by switching
+   \c!height=,
+   \c!balance=\v!yes,
+   \c!align=\v!text,
+   \c!blank={\v!line,\v!fixed},
+   \c!option=,
+   \c!rulethickness=\linewidth,
+   \c!offset=.5\bodyfontsize]
+
+%D Undocumented and still under development.
+
+\def\startsimplecolumns
+  {\dosingleempty\dostartsimplecolumns}
+
+\def\dostartsimplecolumns[#1]%
+  {\bgroup
+   \nopenalties
+   \getparameters[\??kl]
+     [\c!width=\hsize,\c!distance=1.5\bodyfontsize,%
+      \c!n=2,\c!lines=0,#1]%
+   \let\rigidcolumnlines\@@kllines
+   \setrigidcolumnhsize\@@klwidth\@@kldistance\@@kln
+   \setbox\scratchbox\vbox\bgroup
+   \forgetall} % \blank[\v!disable]
+
+\def\stopsimplecolumns
+  {\removebottomthings
+   \egroup
+   \rigidcolumnbalance\scratchbox
+   \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/page-mul.tex b/tex/context/base/page-mul.tex
deleted file mode 100644
index c78af074a..000000000
--- a/tex/context/base/page-mul.tex
+++ /dev/null
@@ -1,1773 +0,0 @@
-%D \module
-%D   [       file=page-mul, % was: core-mul
-%D        version=1998.03.15,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Multi Column Output,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Simple Multi Column}
-
-%D This module is mostly a copy from the original multi column
-%D routine as implemented in \type {core-mul}. When the main
-%D OTR macro's were isolated in modules and column sets were
-%D introduced, this module became part of the OTR modules. As
-%D a result this module is no longer generic. It also needs
-%D an overhaul.
-
-\unprotect
-
-% TO DO !
-
-\let\OTRMULsetvsize            \OTRONEsetvsize
-\let\OTRMULsethsize            \OTRONEsethsize
-\let\OTRMULdopagecontents      \OTRONEdopagecontents
-\let\OTRMULfinalsidefloatoutput\OTRONEfinalsidefloatoutput % ???
-\let\OTRMULflushfloatbox       \OTRONEflushfloatbox
-
-\let\OTRMULdosettopinserts   \relax
-\let\OTRMULdosetbotinserts   \relax
-\let\OTRMULdotopinsertions   \relax
-\let\OTRMULdobotinsertions   \relax
-\let\OTRMULdosetbothinserts  \relax
-\let\OTRMULflushsavedfloats  \relax
-
-\let\OTRMULflushsidefloats      \forgetsidefloats % \relax
-\let\OTRMULsynchronizesidefloats\forgetsidefloats % \relax
-
-\newtoks \OTRMULoutput
-
-\def\OTRMULgotonextpage
-  {\ejectpage}
-
-\def\OTRMULgotonextpageX % will become obsolete
-  {\superejectpage}
-
-% check \count multiplications
-
-% some day try this in balancing routine
-%
-% \ifdim\pagetotal>\pagegoal
-%   \eject
-% \else
-%   \goodbreak
-% \fi
-
-%D The following macro's implement a multi||column output
-%D routine. The original implementation was based on Donald
-%D Knuth's implementation, which was adapted by Craig Platt to
-%D support balancing of the last page. I gradually adapted
-%D Platt's version to our needs but under certain
-%D circumstances things still went wrong. I considered all
-%D calls to Platt's \type{\balancingerror} as undesirable.
-
-%D This completely new implementation can handle enough
-%D situations for everyday documents, but is still far from
-%D perfect. While at the moment the routine doesn't support
-%D all kind of floats, it does support:
-%D
-%D \startitemize[packed]
-%D \item  an unlimitted number of columns
-%D \item  ragged or not ragged bottoms
-%D \item  optional balancing without \type{\balancingerrors}
-%D \item  different \type{\baselineskips}, \type{\spacing},
-%D       \type{\topskip} and \type{\maxdepth}
-%D \item  left- and right indentation, e.g. within lists
-%D \item  moving columns floats to the next column or page
-%D \item  handling of floats that are to wide for a columns
-%D \stopitemize
-%D
-%D One could wonder why single and multi||columns modes are
-%D still separated. One reason for this is that \TeX\ is not
-%D suited well for handling multi||columns. As a result, the
-%D single columns routines are more robust. Handling one
-%D column as a special case of multi||columns is posible but at
-%D the cost of worse float handling, worse page breaking,
-%D worse etc. Complicated multi||column page handling should
-%D be done in \cap{DTP}||systems anyway.
-%D
-%D There are three commands provided for entering and leaving
-%D multi||column mode and for going to the next column:
-%D
-%D \interface \type{\beginmulticolumns} \\ \\
-%D \interface \type{\endmulticolumns}   \\ \\
-%D \interface \type{\ejectcolumn}       \\ \\
-%D
-%D This routines are sort of stand||alone. They communicate
-%D with the rest of \CONTEXT\ by means of some interface
-%D macro's, which we only mention.
-%D
-%D \interface \type{\nofcolumns} \\
-%D   the number of columns \\
-%D \interface \type{\minbalancetoplines} \\
-%D   the minimum number op balanced top lines \\
-%D \interface \type{\betweencolumns} \\
-%D   the stuff between columns \\
-%D \interface \type{\finaloutput{action}{box}} \\
-%D   some kind of \type{\pagebody} and \type{\shipout} \\
-%D
-%D \interface \type{\ifbalancecolumns} \\
-%D   balancing the colums or not \\
-%D \interface \type{\ifstretchcolumns} \\
-%D   ragging the bottom or not \\
-%D
-%D \interface \type{\ifheightencolumns} \\
-%D     fix the heigh tor not \\
-%D \interface \type{\fixedcolumnheight} \\
-%D     the optional fixed height \\
-%D
-%D \interface \type{\ifinheritcolumns} \\
-%D     handle ragging or not \\
-%D \interface \type{\ifr@ggedbottom} \\
-%D     use ragged bottoms \\
-%D \interface \type{\ifb@selinebottom} \\
-%D     put the bottom line on the baseline \\
-%D \interface \type{\ifnormalbottom} \\
-%D     put the bottom line at the baseline \\
-%D
-%D \interface \type{\ifreversecolumns} \\
-%D     reverse the order in wich columns are flushed \\
-%D
-%D \interface \type{\usercolumnwidth} \\
-%D     the calculated width of a column \\
-%D \interface \type{\columntextwidth} \\
-%D     the maximum width of a column \\
-%D \interface \type{\columntextheight} \\
-%D     the minimum width of a column \\
-%D
-%D \interface \type{\spacingfactor} \\
-%D     the spacing factor \\
-%D \interface \type{\bodyfontsize} \\
-%D     the (local) bodyfontsize \\
-%D \interface \type{\openlineheight} \\
-%D     the lineheight (including \type{\spacing}) \\
-%D
-%D \interface \type{\EveryBodyFont} \\
-%D     communication channel to font switching routines \\
-%D
-%D \interface \type{\global\settopskip} \\
-%D   set \type{\topskip} \\
-%D \interface \type{\setvsize} \\
-%D   set \type{\vsize} and \type{\pagegoal} \\
-%D \interface \type{\sethsize} \\
-%D   set \type{\hsize} \\
-%D
-%D \interface \type{\flushcolumnfloats} \\
-%D   push saved column floats (next page) \\
-%D \interface \type{\flushcolumnfloat} \\
-%D   push saved column floats (next column) \\
-%D \interface \type{\setcolumnfloats} \\
-%D   initialize column floats \\
-%D
-%D \interface \type{\finishcolumnbox} \\
-%D   do something special (a hook) \\
-%D \interface \type{\postprocesscolumnpagebox} \\
-%D   do something with each columnbox (also a hook) \\
-%D \interface \type{\postprocesscolumnbox} \\
-%D   do something with each columnbox (also a hook) \\
-%D \interface \type{\postprocesscolumnline} \\
-%D   do something with each columnline (also a hook) \\
-%D \interface \type{\currentcolumn} \\
-%D   the current column \\
-%D
-%D These interface macro's are called upon or initialized
-%D by the multi||column macro's.
-
-%D A lot of footnote stuff added!
-
-\def\finalcolumntextwidth   {\makeupwidth}
-\def\finalcolumntextheight  {\textheight}
-\def\columntextwidth        {\makeupwidth}
-\def\columntextheight       {\textheight}
-\def\usercolumnwidth        {\textwidth}
-\def\columntextoffset       {\!!zeropoint}
-
-\def\fixedcolumnheight      {\textheight}
-\def\betweencolumns         {\hskip\bodyfontsize}
-
-\let\setcolumnfloats        \relax % in CONTEXT used for floats
-\let\flushcolumnfloats      \relax % in CONTEXT used for floats
-\let\flushcolumnfloat       \relax % in CONTEXT used for floats
-\let\finishcolumnbox        \relax % in CONTEXT used for backgrounds
-
-% %D In fact, the column height and width are set by means of
-% %D two macro's. One can change their meaning if needed:
-%
-% \def\setcolumntextheight
-%   {\def\columntextheight{\teksthoogte}}
-%
-% \def\setcolumntextwidth
-%   {\def\columntextwidth{\zetbreedte}}
-
-%D Both macros are redefined in \CONTEXT\ when backgrounds
-%D are applied to columns. The final values are used when
-%D flushing the columns.
-
-\newtoks\singlecolumnout % remove that one
-
-%D It's more convenient to use \type {\columnwidth} instead
-%D of messing around with boxes each time.
-
-\newdimen\columnwidth
-\newdimen\gutterwidth
-
-\def\determinecolumnwidth
-  {\bgroup
-   \setbox\scratchbox\hbox
-     {\setcolumnhsize
-      \global\columnwidth\usercolumnwidth
-      \global\gutterwidth\intercolumnwidth}%
-   \egroup}
-
-%D Going to a new columns is done by means of a
-%D \type{\ejectcolumn}. The following definition does not
-%D always work.
-
-\def\ejectcolumn
-  {\goodbreak\showmessage\m!columns2\empty}
-
-%D The next macro should never be called so let's deal with it.
-%D There were several solutions to these kind of errors. First
-%D we check for a good breakpoint before firing up the
-%D multi||column routine (\type{\break} or \type{\allowbreak}).
-%D We do the same at the end of the routine
-%D (\type{\allowbreak}). These allowances are definitely
-%D needed!
-%D
-%D Some on first sight redundant calls to for instance
-%D \type{\setvsize} in the flushing, splitting and balancing
-%D macro's can definitely not be omitted! Some are just there
-%D to handle situations that only few times arise. One of
-%D those can be that the output routine is invoked before
-%D everything is taken care of. This happens when we
-%D flush (part of) the current page with an \type{\unvbox}
-%D with a \type{\pagetotal}~$\approx$ \type{\pagegoal}. One
-%D simply cannot balance columns that are just balanced.
-%D
-%D I hope one never sees the following message. Because it
-%D took me a lot of time to develop the multi||columns
-%D routines, every (although seldom) warning gives me the
-%D creeps!
-
-\def\balancingerror
-  {\showmessage\m!columns3\empty
-   \finaloutput\unvbox\normalpagebox}
-
-\def\OTRMULsometopsfloat{\showmessage\m!columns4\empty \someherefloat}
-\def\OTRMULsomebotsfloat{\showmessage\m!columns5\empty \someherefloat}
-
-\def\OTRMULsomeherefloat{\OTRONEsomeherefloat}
-
-%D The local column width is available in the dimension
-%D register \type{\localcolumnwidth}, which is calculated as:
-
-\def\setcolumnhsize % beware, this one is available for use in macros
-  {\setbox\scratchbox\hbox{\parindent\zeropoint\betweencolumns}%
-   \intercolumnwidth\wd\scratchbox
-   \localcolumnwidth\columntextwidth
-   \advance\localcolumnwidth -\leftskip
-   \advance\localcolumnwidth -\rightskip
-   % new
-   \advance\localcolumnwidth -\colleftskip
-   \advance\localcolumnwidth -\colrightskip
-   %
-   \advance\localcolumnwidth -\nofcolumns\intercolumnwidth
-   \advance\localcolumnwidth  \intercolumnwidth
-   \divide \localcolumnwidth  \nofcolumns
-   \scratchdimen\columntextoffset
-   \multiply\scratchdimen \plustwo
-   \advance\localcolumnwidth -\scratchdimen
-   \usercolumnwidth\localcolumnwidth
-   \hsize\localcolumnwidth} % we don't do it \global
-
-%D Torture test:
-%D
-%D \startbuffer
-%D \startbuffer[b]
-%D \startcolumns
-%D   \input tufte
-%D \stopcolumns
-%D \stopbuffer
-%D \typebuffer[b] \getbuffer[b]
-%D
-%D \startbuffer[b]
-%D \startnarrower
-%D   \input tufte
-%D \stopnarrower
-%D \stopbuffer
-%D \typebuffer[b] \getbuffer[b]
-%D
-%D \startbuffer[b]
-%D \startcolumns \startnarrower
-%D   \input tufte
-%D \stopnarrower \stopcolumns
-%D \stopbuffer
-%D \typebuffer[b] \getbuffer[b]
-%D
-%D \startbuffer[b]
-%D \startnarrower \startcolumns
-%D   \input tufte
-%D \stopcolumns \stopnarrower
-%D \stopbuffer
-%D \typebuffer[b] \getbuffer[b]
-%D
-%D \startbuffer[b]
-%D \startcolumns \startnarrower[left]
-%D   \input tufte
-%D \stopnarrower \stopcolumns
-%D \stopbuffer
-%D \typebuffer[b] \getbuffer[b]
-%D
-%D \startbuffer[b]
-%D \startnarrower[left] \startcolumns
-%D   \input tufte
-%D \stopcolumns \stopnarrower
-%D \stopbuffer
-%D \typebuffer[b] \getbuffer[b]
-%D
-%D \startbuffer[b]
-%D \startnarrower \startcolumns \startnarrower
-%D   \input tufte
-%D \stopnarrower\stopcolumns \stopnarrower
-%D \stopbuffer
-%D \typebuffer[b] \getbuffer[b]
-%D
-%D \startbuffer[b]
-%D \startnarrower[left] \startcolumns \startnarrower
-%D   \input tufte
-%D \stopnarrower\stopcolumns \stopnarrower
-%D \stopbuffer
-%D \typebuffer[b] \getbuffer[b]
-%D \stopbuffer
-%D
-%D \start
-%D \def\postprocesscolumnline#1{\ruledhbox{\strut\box#1}\hss}
-%D \getbuffer
-%D \stop
-
-%D One should be aware that when font related dimensions are
-%D used in typesetting the in||between material, these
-%D dimensions are influenced by bodyfont switches inside
-%D multi||column mode.
-
-\newdimen\mcscratchdimen
-\newcount\nofcolumnlines
-
-\chardef\multicolumnlinemethod\zerocount % 0: overshoot (old default), 1: tight
-% \chardef\multicolumnlinemethod\plusone
-
-\def\getmulticolumnlines
-  {\mcscratchdimen-\columntextoffset
-   \multiply\mcscratchdimen \plustwo
-   \advance\mcscratchdimen \columntextheight
-   \ifdim\precolumnboxheight>\zeropoint
-      \advance\mcscratchdimen -\precolumnboxheight
-   \fi
-   \settotalinsertionheight
-   \advance\mcscratchdimen -\totalinsertionheight
-   \ifcase\multicolumnlinemethod \getnoflines\mcscratchdimen
-   \or                           \getrawnoflines\mcscratchdimen
-   \else                         \getrawnoflines\mcscratchdimen
-   \fi
-   % added 30/7/2004
-   \ifnum\layoutlines>\zerocount \ifnum\noflines>\layoutlines
-     \noflines\layoutlines
-   \fi \fi
-   \nofcolumnlines\noflines}
-
-\def\multicolumnovershootratio{.5} % {\ifgridsnapping0\else.5\fi}
-
-\def\setcolumnvsize
-  {\getmulticolumnlines
-   \mcscratchdimen\nofcolumnlines\openlineheight
-   \advance\mcscratchdimen \multicolumnovershootratio\openlineheight % collect enough data
-   \global\vsize\nofcolumns\mcscratchdimen
-   \global\pagegoal\vsize} % let's do it only here
-
-%D It really starts here. After some checks and initializations
-%D we change the output routine to continous multi||column
-%D mode. This mode handles columns that fill the current and
-%D next full pages. The method used is (more or less)
-%D multiplying \type{\vsize} and dividing \type{\hsize} by
-%D \type{\nofcolumns}. More on this can be found in the
-%D \TeX book. We save the top of the current page in box
-%D \type{\precolumnbox}.
-%D
-%D We manipulate \type{\topskip} a bit, just to be shure that
-%D is has no flexibility. This has te be done every time a
-%D font switch takles place, because \type{\topskip} can depend
-%D on this.
-%D
-%D Watch the trick with the \type{\vbox}. This way we get the
-%D right interlining and white space.
-
-\def\beginmulticolumns
-  {\par
-   \flushnotes
-   \xdef\precolumndepth{\the\prevdepth}%
-   \begingroup
-   % new
-   \leftskip1\leftskip
-   \rightskip1\rightskip
-   \edef\colleftskip {\the\leftskip}%
-   \edef\colrightskip{\the\rightskip}%
-   \leftskip\zeropoint
-   \rightskip\zeropoint
-   %
-   \dontshowcomposition
-  %\setcolumntextwidth\relax
-  %\setcolumntextheight\relax
-   \widowpenalty\zerocount % is gewoon beter
-   \clubpenalty \zerocount % zeker bij grids
-   \ifsomefloatwaiting
-     \showmessage\m!columns6{\the\savednoffloats}%
-     \global\setbox\savedfloatlist\box\floatlist
-     \xdef\restoresavedfloats
-       {\global\savednoffloats\the\savednoffloats
-        \global\setbox\floatlist\box\savedfloatlist
-        \global\noexpand\somefloatwaitingtrue}%
-     \global\savednoffloats\zerocount
-     \global\somefloatwaitingfalse
-   \else
-     \global\let\restoresavedfloats\relax
-   \fi
-   \dimen0\pagetotal
-   \advance\dimen0 \parskip
-   \advance\dimen0 \openlineheight
-   \ifdim\dimen0<\pagegoal
-     \allowbreak
-   \else
-     \break % Sometimes fails
-   \fi
-   \appendtoks\topskip1\topskip\to\everybodyfont
-   \the\everybodyfont % ugly here
-   \saveinterlinespace % ugly here
-   \initializecolumns\nofcolumns
-   \hangafter\zerocount
-   \hangindent\zeropoint
-   \everypar\emptytoks
-   \ifdim\pagetotal=\zeropoint \else
-     \verticalstrut
-     \vskip-\struttotal
-   \fi
-   \global\savedpagetotal\pagetotal
-   \global\singlecolumnout\output
-  %\global\output{\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}}%
-   \global\output{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}%
-   \eject % no \holdinginserts=1, can make footnote disappear !
-   \global\precolumnboxheight\ht\precolumnbox
-   \global\output{\continuousmulticolumnsout}%
-   \setcolumnfloats
-   \dohandleallcolumns
-     {\global\setbox\currenttopcolumnbox\emptybox}%
-   \checkbegincolumnfootnotes
-   \activateotr{MUL}{ONE}% todo ! ! ! !
-   \let\sethsize\setcolumnhsize
-   \let\setvsize\setcolumnvsize
-   \sethsize
-   \setvsize
-   \showcomposition}
-
-%D When we leave the multi||column mode, we have to process the
-%D not yet shipped out part of the columns. When we don't
-%D balance, we simply force a continuous output, but a balanced
-%D output is more tricky.
-
-%D First we try to fill up the page and when all or something
-%D is left we try to balance things. This is another useful
-%D adaption of the ancesters of these macro's. It takes some
-%D reasoning to find out what happens and maybe I'm making
-%D some mistake, but it works.
-%D
-%D Voiding box \type{\precolumnbox} is sometimes necessary,
-%D e.g. when there is no text given between \type{\begin..}
-%D and \type{\end..}. The \type{\par} is needed!
-
-\chardef\multicolumnendsyncmethod\plusone % 1: old sync 2: new sync (cont-loc/project) / may fail ! ! ! !
-
-\def\endmulticolumns
-  {%\par
-   \ifnum\multicolumnendsyncmethod=\plustwo
-     \synchronizeoutput
-   \else
-     % don't combine these
-     \vskip\lineheight
-     \vskip-\lineheight % take footnotes into account
-   \fi
-   \dontshowcomposition
-   \doflushcolumnfloat  % added recently
-  %\doflushcolumnfloats % no, since it results in wrong top floats
-   \flushnotes          % before start of columns
-   \par
-   \ifbalancecolumns
-     \ifnum\multicolumnendsyncmethod=\plusone
-       \global\output{\continuousmulticolumnsout}%
-       \goodbreak
-     \fi
-     \global\output{\balancedmulticolumnsout}%
-   \else
-     \goodbreak
-   \fi
-   \eject               % the prevdepth is important, try e.g. toclist in
-   \prevdepth\zeropoint % columns before some noncolumned text text
-   \global\output\singlecolumnout
-   \global\output{\the\mainoutput}% % % % % todo
-   \ifvoid\precolumnbox\else
-     \unvbox\precolumnbox
-   \fi
-   \global\precolumnboxheight\zeropoint
-   \endgroup % here
-   \nofcolumns\plusone
-   \setvsize % the outer one!
-   \synchronizeoutput % new may 2004 / we need to: \pagegoal\vsize
-   \checkendcolumnfootnotes
-   \dosomebreak\allowbreak
-   \restoresavedfloats}
-
-%D Because some initializations happen three times, we
-%D defined a macro for them. Erasing \type{\everypar} is
-%D needed because we don't want anything to interfere.
-
-\def\setmulticolumnsout
-  {\everypar\emptytoks
-   \dontcomplain
-   \settopskip
-   \setmaxdepth
-   \topskip1\topskip
-   \splittopskip\topskip
-   \splitmaxdepth\maxdepth
-   \boxmaxdepth\maxdepth % dangerous
-   \emergencystretch\zeropoint\relax} % sometimes needed !
-
-%D Flushing the page comes to pasting the columns together and
-%D appending the result to box \type{\precolumnbox}, if not
-%D void. I've seen a lot of implementations in which some skip
-%D was put between normal text and multi||column text. When we
-%D don't want this, the baselines can be messed up. I hope the
-%D seemingly complicated calculation of a correction
-%D \type{\kern} is adequate to overcome this. Although not
-%D watertight, spacing is taken into account and even multiple
-%D mode changes on one page go well. But cross your fingers and
-%D don't blame me.
-%D
-%D One of the complications of flushing out the boxes is that
-%D \type{\precolumnbox} needs to be \type{\unvbox}'ed, otherwise
-%D there is too less flexibility in the page when using
-%D \type{\r@ggedbottom}. It took a lot of time before these
-%D kind of problems were overcome. Using \type{\unvbox} at the
-%D wrong moment can generate \type{\balancingerror}'s.
-%D
-%D One can use the macros \type {\maxcolumnheight} and \type
-%D {\maxcolumndepth} when generating material between columns
-%D as well as postprocessing column lines.
-
-\let\maxcolumnheight=\zeropoint
-\let\maxcolumndepth =\zeropoint
-
-\newbox\columnpagebox
-
-\def\setmaxcolumndimensions
-  {\let\maxcolumnheight\!!zeropoint
-   \let\maxcolumndepth \!!zeropoint
-   \dohandleallcolumns
-     {\ifdim\ht\currentcolumnbox>\maxcolumnheight
-        \edef\maxcolumnheight{\the\ht\currentcolumnbox}%
-      \fi
-      \ifdim\dp\currentcolumnbox>\maxcolumndepth
-        \edef\maxcolumndepth{\the\dp\currentcolumnbox}%
-      \fi}}
-
-\chardef\multicolumntopflushmethod\plusone % 0: no correction, 1: correction when topstuff, 2: correction, 3: correction++
-\chardef\multicolumntopalignmethod\plustwo % 0: nothing, 1: force grid, 2: follow grid
-
-\def\flushprecolumnboxnogrid
-  {\unvbox\precolumnbox}
-
-\def\flushprecolumnboxongrid
-  {\scratchdimen\savedpagetotal
-   \advance\scratchdimen -\ht\precolumnbox
-   \advance\scratchdimen -\dp\precolumnbox
-   \advance\scratchdimen -\topskip
-   \box\precolumnbox
-   \kern\scratchdimen}
-
-\newconditional\someprecolumncontent
-
-\def\flushcolumnedpage#1%
-  {\bgroup
-   \ifvoid\precolumnbox
-     \setfalse\someprecolumncontent % will be set elsewhere
-   \else
-     \settrue\someprecolumncontent
-\mkprocessboxcontents\precolumnbox
-   \fi
-   \forgetall
-   \setmulticolumnsout
-   \showcomposition
-   \setmaxcolumndimensions
-   \dohandleallcolumns
-     {\mkprocesscolumncontents\currentcolumnbox}%
-   \postprocesscolumns
-   \dohandleallcolumns % \hbox i.v.m. \showcomposition
-     {\global\setbox\currentcolumnbox\hbox to \localcolumnwidth
-        {\box\currentcolumnbox
-         \global\wd\currentcolumnbox\localcolumnwidth
-         \ifheightencolumns
-           \global\ht\currentcolumnbox\fixedcolumnheight
-         \fi}}%
-   \setmaxcolumndimensions
-   \overlaycolumnfootnotes
-   \setbox\columnpagebox\vbox
-     {\hbox to \finalcolumntextwidth
-        {\hskip\colleftskip\relax % new, \relax needed
-         \ifreversecolumns
-           \popsplitproperties % else wrong color stack
-           \@EA\dohandlerevcolumns
-         \else
-           \@EA\dohandleallcolumns
-         \fi
-           {\finishcolumnbox{\hbox
-              {\ifx\finishcolumnbox\relax\else\strut\fi
-               \box\currentcolumnbox}}%
-            \hfil}%
-         \unskip
-         \hskip\colrightskip}}% new
-   \scratchdimen\zeropoint
-   \dohandleallcolumns
-     {\ifdim-\ht\currenttopcolumnbox<\scratchdimen
-        \scratchdimen-\ht\currenttopcolumnbox
-      \fi
-      \global\setbox\currenttopcolumnbox\emptybox}%
-   \advance\scratchdimen \ht\columnpagebox
-   \setbox\scratchbox\hbox to \columntextwidth
-     {\vrule
-        \!!width\zeropoint
-        \!!height\scratchdimen
-        \!!depth\dp\columnpagebox
-      \dostepwiserecurse2\nofcolumns1{\hfil\betweencolumns}\hfil}%
-   \setbox\columnpagebox\hbox
-     {\box\columnpagebox
-      \hskip-\columntextwidth
-      \restoretextcolor{\box\scratchbox}}%
-   \postprocesscolumnpagebox % new, acts upon \box\columnpagebox
-   \ifconditional\someprecolumncontent
-     \settrue\someprecolumncontent
-     % next some incredible crappy code
-     \ifcase\multicolumntopalignmethod
-       \flushprecolumnboxnogrid % not on grid
-     \or
-       \flushprecolumnboxongrid % force on grid
-     \else\ifgridsnapping % somehow this junk fails in pascal
-       \flushprecolumnboxongrid % obey grid settings, force on grid
-     \else
-       \flushprecolumnboxnogrid % ignore grid settings, not on grid
-     \fi \fi
-   \fi
-   \global\precolumnboxheight\zeropoint
-   \setvsize
-   \dosomebreak\nobreak % hm, only needed when topstuff
-   \ifgridsnapping
-   \else
-     \ifcase\multicolumntopflushmethod
-       % sometimes method 1 goes wrong, so we need a way out; best sort this out
-       % when we run into it again
-     \or
-       % \input tufte \startcolumns \showbaselines \input tufte \stopcolumns \input tufte
-       \ifconditional\someprecolumncontent
-%          \scratchdimen\topskip
-%          \advance\scratchdimen -\openstrutheight
-%          \nointerlineskip
-%          \vskip-\scratchdimen
-         \nointerlineskip
-         \vskip\dimexpr\openstrutheight-\topskip\relax
-       \fi
-     \or
-%        \scratchdimen\topskip
-%        \advance\scratchdimen -\openstrutheight
-%        \nointerlineskip
-%        \vskip-\scratchdimen
-       \nointerlineskip
-       \vskip\dimexpr\openstrutheight-\topskip\relax
-     \or
-       % untested but maybe handy
-%        \scratchdimen\topskip
-%        \advance\scratchdimen -\openstrutheight
-%        \nointerlineskip
-%        \vskip-\scratchdimen
-%        \vskip-\lineheight
-%        \vbox{\strut}%
-       \nointerlineskip
-       \vskip\dimexpr\openstrutheight-\topskip-\lineheight\relax
-       \vbox{\strut}%
-     \fi
-   \fi
-   \prevdepth\openstrutdepth
-   \nointerlineskip
-   \dp\columnpagebox\zeropoint
-   \global\finalcolumnheights\ht\columnpagebox
-   \getnoflines\finalcolumnheights
-   \global\finalcolumnlines\noflines
-   \ifcase#1\else
-     % messy correction, we need to rewrite this module (newcolumns)
-     \setbox\columnpagebox\vbox
-       {\offinterlineskip
-        \scratchdimen\ht\columnpagebox
-        \advance\scratchdimen\dp\columnpagebox % we probably lost that one already
-        \box\columnpagebox
-        \vskip-\scratchdimen}%
-     \scratchdimen\noflines\openlineheight
-     \advance\scratchdimen-\openstrutdepth
-     \advance\scratchdimen-\openlineheight
-     \advance\scratchdimen\topskip
-     \ht\columnpagebox\scratchdimen
-     \dp\columnpagebox\openstrutdepth
-     % end of mess
-   \fi
-   \box\columnpagebox
-   \egroup}
-
-%D In case one didn't notice, finaly \type{\finishcolumnbox} is
-%D applied to all boxes. One can use these hooks for special
-%D purposes.
-%D
-%D Once upon a time I wanted to manipulate the individual lines
-%D in a column. This feature is demonstrated in the two examples
-%D below.
-%D
-%D \startbuffer
-%D \def\postprocesscolumnline#1% or \postprocesscolumnbox
-%D   {\ruledhbox{\box#1}\hss}
-%D
-%D \startcolumns[n=4]
-%D \dorecurse{25}{line: \recurselevel\par}
-%D \stopcolumns
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D Here we show the natural width of the lines:
-%D
-%D {\getbuffer}
-%D
-%D The next example does a bit more advanced manipulation:
-%D
-%D \startbuffer
-%D \def\postprocesscolumnline#1%
-%D   {\ifodd\currentcolumn
-%D      \hfill\unhbox#1\relax
-%D    \else
-%D      \relax\unhbox#1\hfill
-%D    \fi}
-%D
-%D \startcolumns[n=4]
-%D \dorecurse{25}{line \recurselevel\par}
-%D \stopcolumns
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D Here we also see an application of \type{\currentcolumn}:
-%D
-%D {\getbuffer}
-%D
-%D This feature is implemented using the reshape macros
-%D presented in \type{supp-box}.
-
-\def\postprocesscolumns
-  {\ifx\postprocesscolumnline\undefined \else
-     \dohandleallcolumns
-       {\global\setbox\currentcolumnbox\vtop
-          {\beginofshapebox
-           \unvbox\currentcolumnbox
-           \unskip\unskip
-           \endofshapebox
-           \reshapebox
-             {\dimen0\ht\shapebox
-              \dimen2\dp\shapebox
-              \setbox\shapebox\hbox to \hsize
-                {\postprocesscolumnline\shapebox}%
-              \ht\shapebox\dimen0
-              \dp\shapebox\dimen2
-              \box\shapebox}%
-           \flushshapebox
-           \everypar\emptytoks
-           \parskip\zeropoint % = \forgetall
-           \verticalstrut
-           \vskip-\struttotal
-           \vfil}}%
-   \fi
-   \ifx\postprocesscolumnbox\undefined \else
-     \dohandleallcolumns
-       {\global\setbox\currentcolumnbox\hbox
-          {\postprocesscolumnbox\currentcolumnbox}}
-   \fi}
-
-%D We default to doing nothing!
-
-\let\postprocesscolumnline   =\undefined
-\let\postprocesscolumnbox    =\undefined
-\let\postprocesscolumnpagebox=\relax
-
-%D \macros
-%D   {reversecolumnstrue}
-%D
-%D We can force the macro that takes care of combining
-%D the columns, to flush them in the revere order. Of
-%D course, by default we don't reverse.
-
-\newif\ifreversecolumns
-
-%D Here comes the simple splitting routine. It's a bit
-%D longer than expected because of ragging bottoms or not.
-%D This part can be a bit shorter but I suppose that I will
-%D forget what happens. The splitting takes some already
-%D present material (think of floats) into account!
-%D
-%D First we present some auxiliary routines. Any material,
-%D like for instance floats, that is already present in the
-%D boxes is preserved.
-
-\def\splitcolumn#1from \box#2to \dimen#3 top \box#4%
-  {\bgroup
-   \ifdim\ht#4>\zeropoint
-     \dimen0\dimen#3\relax
-     \dimen2\dimen0
-     \advance\dimen0 -\ht#4%
-     \columnfootnotecorrection{#1}{\dimen0}%
-     \setbox0\vsplit#2 to \dimen0
-     \global\setbox#1\vbox to \dimen2
-       {\ifgridsnapping
-          \dimen0-\openstrutheight
-          \advance\dimen0 \topskip
-          \vskip\dimen0\copy#4\vskip-\dimen0
-        \else
-          \unvcopy#4%
-        \fi
-        \fuzzysnappedbox\unvbox0
-        \fakecolumnfootnotes{#1}}%
-   \else
-     \ifcase\clevernotes
-       \global\setbox#1\vsplit#2 to \dimen#3%
-       \global\setbox#1\vbox
-         {\fuzzysnappedbox\unvbox{#1}}% % or \box ?
-     \else
-       \columnfootnotecorrection{#1}{\dimen#3}%
-       \setbox0\vsplit#2 to \dimen#3%
-       \global\setbox#1\vbox to \dimen#3%
-         {\fuzzysnappedbox\unvbox0
-          \fakecolumnfootnotes{#1}}%
-     \fi
-   \fi
-   \egroup}
-
-\def\splitcurrentcolumn from \box#1to \dimen#2%
-  {\splitcolumn\currentcolumnbox from \box#1 to \dimen#2 top \box\currenttopcolumnbox}
-
-\def\splitfirstcolumn from \box#1to \dimen#2%
-  {\splitcolumn\firstcolumnbox from \box#1 to \dimen#2 top \box\firsttopcolumnbox}
-
-\def\splitlastcolumn from \box#1to \dimen#2%
-  {\global\setbox\lastcolumnbox\vbox
-     {\unvcopy\lasttopcolumnbox
-      \fuzzysnappedbox\unvbox{#1}%
-      \fakecolumnfootnotes\lastcolumnbox}}
-
-%D NEW: still to be documented.
-
-\def\fakecolumnfootnotes#1%
-  {\relax
-   \ifcase\clevernotes\else
-     \ifnum#1=\lastcolumnbox
-       \fakenotes
-     \fi
-   \fi}
-
-\def\columnfootnotecorrection#1#2%
-  {\relax
-   \ifcase\clevernotes
-     % page notes
-   \or
-     \ifnum#1=\firstcolumnbox\relax
-       \calculatetotalclevernoteheight
-       \advance#2 -\totalnoteheight
-     \fi
-   \else
-     \ifnum#1=\lastcolumnbox\relax
-       \calculatetotalclevernoteheight
-       \advance#2 -\totalnoteheight
-     \fi
-   \fi}
-
-\def\overlaycolumnfootnotes
-  {\relax
-   \ifcase\clevernotes
-     % page notes
-   \else
-     \checknotepresence
-     \ifnotespresent
-       % the note box has the depth of the notefont
-       % because a column (i.e. first column has no depth,
-       % we need to anchor top down)
-       \bgroup
-       \ifcase\clevernotes\or
-         \getmulticolumnlines
-         \advance\nofcolumnlines \minustwo
-         \scratchdimen\nofcolumnlines\lineheight
-         \advance\scratchdimen \topskip
-         \setbox0\hbox
-           {\lower\scratchdimen\vbox{\placenoteinserts}}%
-         \ht0=\openstrutheight % \strutht
-         \dp0=\openstrutdepth  % \strutdp
-         \scratchdimen\ht\firstcolumnbox
-         \global\setbox\firstcolumnbox\vbox to \scratchdimen
-           {\box\firstcolumnbox
-            \vskip-\scratchdimen
-            \restoretextcolor{\box0}}%
-       \else
-         % maybe here also \getmulticolumnlines
-         \scratchdimen\ht\firstcolumnbox
-         \advance\scratchdimen -\openstrutdepth % \strutdp
-         \getnoflines\scratchdimen
-         \advance\noflines \minustwo
-         \scratchdimen\noflines\lineheight
-         \advance\scratchdimen \topskip
-         \setbox0\hbox
-           {\lower\scratchdimen\vbox{\placenoteinserts}}%
-         \ht0=\openstrutheight % \strutht
-         \dp0=\openstrutdepth  % \strutdp
-         \scratchdimen\ht\lastcolumnbox
-         \global\setbox\lastcolumnbox\vbox to \scratchdimen
-           {\box\lastcolumnbox
-            \vskip-\scratchdimen
-            \restoretextcolor{\box0}}%
-       \fi
-       \egroup
-     \fi
-   \fi}
-
-%D Here comes the routine that splits the long box in columns.
-%D The macro \type{\flushcolumnfloats} can be used to flush
-%D either floats that were present before the multi||column
-%D mode was entered, or floats that migrate to next columns.
-%D Flushing floats is a delicate process.
-
-\def\continuousmulticolumnsout
-  {\bgroup
-   \forgetall
-   \setmulticolumnsout
-   \dontshowcomposition
-%    \dimen0=\columntextheight
-%    \advance\dimen0 -\precolumnboxheight
-%    \settotalinsertionheight
-%    \advance\dimen0 -\totalinsertionheight
-%    \ifgridsnapping % evt altijd, nog testen
-%      \getnoflines{\dimen0}
-%      \dimen0=\noflines\openlineheight
-%    \fi
-   \getmulticolumnlines
-   \dimen0=\nofcolumnlines\openlineheight
-   \dohandleallcolumns
-     {\splitcurrentcolumn from \box\normalpagebox to \dimen0}%
-   \setbox\restofpage\vbox{\unvbox\normalpagebox}%
-   \ifinheritcolumns
-     \ifr@ggedbottom % vreemd
-       \dohandleallcolumns
-         {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox
-            {\dimen0\dp\currentcolumnbox
-             \unvbox\currentcolumnbox
-             \vskip-\dimen0
-             \vskip\openstrutdepth % \strutdp
-             \prevdepth\openstrutdepth % \strutdp
-             \vfill}}%
-       \ifbottomnotes \else
-         \dimen0\ht\firstcolumnbox
-       \fi
-     \fi
-     \ifn@rmalbottom
-       \advance\dimen0 \maxdepth
-       \dohandleallcolumns
-         {\global\setbox\currentcolumnbox\vbox to \dimen0
-            {\unvbox\currentcolumnbox}}%
-     \fi
-     \ifb@selinebottom
-       % the columns are on top of the baseline
-     \fi
-   \else
-     \dohandleallcolumns
-       {\global\setbox\currentcolumnbox\vbox to \dimen0
-          {\ifstretchcolumns
-             \unvbox\currentcolumnbox
-           \else
-             \unvbox\currentcolumnbox % wel of niet \unvbox ?
-             \vfill
-           \fi}}%
-     \dohandleallcolumns
-       {\global\ht\currentcolumnbox\dimen0}%
-   \fi
-   \setbox\precolumnbox\vbox{\flushcolumnedpage\zerocount}%
-   \finaloutput\box\precolumnbox
-   \sethsize
-   \setvsize
-   \flushcolumnfloats
-   \unvbox\restofpage
-   % \penalty\outputpenalty % gaat gruwelijk mis in opsommingen
-   \egroup}
-
-%D And this is the balancing stuff. Again, part of the routine
-%D is dedicated to handling ragged bottoms, but here we also
-%D see some handling concerning the stretching of columns.
-%D We set \type{\widowpenalty} at~0, which enables us to
-%D balance columns with few lines. The use of \type{\box2} and
-%D \type{\box4} garantees a more robust check when skips are
-%D used.
-
-\def\multicolumnsbalancemax{250} % 100 is too small when floats are involved
-
-\def\balancedmulticolumnsout
-  {\bgroup
-   \setmulticolumnsout
-   \dontshowcomposition
-   \widowpenalty\zerocount
-   \setbox0\vbox{\unvbox\normalpagebox}%
-\ifdim\ht0>\openlineheight % at least one line
-  \ifnum\minbalancetoplines<2 % balance anyway
-    \donetrue
-  \else % check criterium to available lines
-    \getnoflines{\ht0}%
-    \divide\noflines \nofcolumns \relax
-    \ifnum\noflines<\minbalancetoplines \relax
-      \dimen0\ht0
-      \advance\dimen0 \ht\firsttopcolumnbox
-      \advance\dimen0 \openlineheight \relax % let's play safe
-      \ifdim\dimen0>\columntextheight % column exceeding text height
-        \donetrue
-      \else % it seems to fit
-        \donefalse
-      \fi
-    \else % balance indeed
-      \donetrue
-    \fi
-  \fi
-\else % balancing does not make sense
-  \donefalse
-\fi
-\ifdone % start balancing
-  %\ifdim\ht0>\openlineheight
-     \dimen0\ht0
-     \advance\dimen0 \topskip
-     \advance\dimen0 -\baselineskip
-     \dohandleallcolumns
-       {\advance\dimen0 \ht\currenttopcolumnbox}%
-     \divide\dimen0 \nofcolumns
-     \vbadness\!!tenthousand\relax
-     \count255=\zerocount
-     \bgroup
-     \ifgridsnapping
-       \dimen2\lineheight
-     \else
-       \dimen2=\onepoint % RUBISH
-       \dimen2=\spacingfactor\dimen2
-     \fi
-     \doloop
-       {\advance\count255 \plusone
-        \global\setbox\restofpage\copy0\relax
-        \splitfirstcolumn from \box\restofpage to \dimen0
-        \dohandlemidcolumns
-          {\splitcurrentcolumn from \box\restofpage to \dimen0}%
-        \splitlastcolumn from \box\restofpage to \dimen0
-        \setbox2\vbox{\unvcopy\firstcolumnbox}%
-        \dimen4\zeropoint
-        \dohandleallcolumns
-          {\setbox4\vbox
-             {\unvcopy\currentcolumnbox
-             %rather new, test this on pdftex-z.tex
-              \unpenalty\unskip\unpenalty\unskip}% maybe better in main splitter
-          %\writestatus{balance}{\the\currentcolumnbox: \the\ht4}%
-%            \dimen6\ht4 \ifdim\dimen6>\dimen4 \dimen4=\dimen6 \fi}%
-           \ifdim\ht4>\dimen4 \dimen4=\ht4 \fi}%
-        \advance\dimen4 -.0005pt % get rid of accurracy problem, pretty new
-        \ifnum\count255>\multicolumnsbalancemax\relax
-          \exitloop
-        \else\ifdim\dimen4>\ht2
-          \advance\dimen0 \dimen2\relax
-        \else
-          \exitloop
-        \fi\fi}%
-     \dohandleallcolumns
-       {\global\setbox\currentcolumnbox\vbox{\unvcopy\currentcolumnbox}}% NIEUW
-     \ifnum\count255>\multicolumnsbalancemax\relax
-       \showmessage\m!columns7\empty
-     \else
-       \showmessage\m!columns8{\the\count255\space}%
-     \fi
-     \egroup
-     \ifinheritcolumns
-       % We cannot assume that the first column is the tallest, if
-       % only because we may have an aborted balance (one line in the
-       % first column and a graphic in the second one).
-       %
-       % \dimen0\ht\firstcolumnbox
-       % \dimen2\ht\firstcolumnbox
-       %
-       \dimen0=\zeropoint
-       \dohandleallcolumns
-         {\ifdim\ht\currentcolumnbox>\dimen0
-            \dimen0=\ht\currentcolumnbox
-          \fi}%
-       \dimen2\dimen0
-       % so far
-       \advance\dimen2 -\openlineheight
-       \dohandleallcolumns
-         {\dimen4\ht\currentcolumnbox
-          \dimen6=10\openlineheight % funny value
-          \global\setbox\currentcolumnbox\vbox to \dimen0
-            {\unvbox\currentcolumnbox
-             \ifdim\dimen4>\dimen6
-               \ifdim\dimen4<\dimen0
-                 \ifdim\dimen4>\dimen2
-                   \vskip\zeropoint  % !!
-                 \else
-                   \vskip\openlineheight
-                   \vfill
-                 \fi
-               \else
-                 \vskip\zeropoint
-               \fi
-             \else
-               \vskip\openlineheight
-               \vfill
-             \fi}}%
-     \else
-       \bgroup
-       \ifstretchcolumns
-         \dimen0\ht\firstcolumnbox
-         \dimen2=\bottomtolerance\ht\firstcolumnbox
-         \setbox0\vbox{\unvcopy\lastcolumnbox}%
-         \advance\dimen0 -\ht0\relax
-         \advance\dimen0 -\dp0\relax
-         \ifdim\dimen0>\openlineheight\relax
-           \ifdim\dimen0>\dimen2\relax
-             % \stretchcolumnsfalse % beter goed slecht dan slecht goed
-             \showmessage\m!columns9\empty
-           \fi
-         \fi
-       \fi
-       \dohandleallcolumns
-         {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox
-            {\ifstretchcolumns
-               \unvbox\currentcolumnbox
-             \else
-               \box\currentcolumnbox
-               \vfill
-             \fi}}%
-       \egroup
-     \fi
-   \else
-     % a one liner is not properly handled here, so best rewrite the text then
-     \showmessage\m!columns{10}\empty
-     \global\setbox\firstcolumnbox\vbox{\unvbox0}%
-   \fi
-   \global\output{\balancingerror}%
-   \b@selinebottomtrue % forces depth in separation rule
-   \flushcolumnedpage\plusone
-   \multicolumnseject
-   \egroup}
-
-\def\multicolumnseject
-  {\ifdim\pagetotal>\textheight
-     \eject % new
-   \else
-     \allowbreak
-   \fi}
-
-%D The multicolumn mechanism is incorporated in a \CONTEXT\
-%D interface, which acts like:
-%D
-%D \starttyping
-%D \startcolumns[n=4,balance=no]
-%D   some text
-%D \stopcolumns
-%D \stoptyping
-%D
-%D The setup is optional. The default behaviour of columns
-%D can be set up with:
-%D
-%D \starttyping
-%D \setupcolumns
-%D   [n=2,
-%D    balance=yes]
-%D \stoptyping
-%D
-%D In this case, stretching is according to the way it's
-%D done outside columns (\type{\inheritcolumnstrue}). Also
-%D we can setup the \type{tolerance} within a column, the
-%D \type{distance} between columns and the fixed
-%D \type{height} of a column.
-
-%D Multi||column output: the float routines
-%D
-%D Here come the routines that handle the placement of column
-%D floats. Floats that are to big migrate to the next
-%D column. Floats that are too wide, migrate to the top of the
-%D next page, where they span as much columns as needed.
-%D Floats that are left over from outside the multi||column
-%D mode are flushed first. In macro \type{\finaloutput} the
-%D topfloats that are left from previous text should be set.
-%D
-%D When there are some floats in the queue, we inhibit the
-%D flushing of floats on top of columns. The number of
-%D waiting floats is preswent in \type{\savednoftopfloats} and
-%D is saved. As long as there are floats waiting, the topfloats
-%D are places as if we are outside multi||column mode. This is
-%D neccessary for e.g. multicolumn lists.
-%D
-%D When all those floats are flushed, we switch to the local
-%D flushing routine.
-
-\def\setcolumnfloats
-  {\xdef\globalsavednoffloats{\the\savednoffloats}%
-   \ifnum\globalsavednoffloats>\zerocount
-     \setglobalcolumnfloats
-   \else
-     \setlocalcolumnfloats
-   \fi}
-
-\def\setglobalcolumnfloats
-  {\everypar\emptytoks
-   \let\flushcolumnfloat\relax
-  %\let\doroomfloat\relax
-   \let\docheckiffloatfits\relax
-   \let\flushcolumnfloats\noflushcolumnfloats}
-
-\def\setlocalcolumnfloats
-  {\everypar{\flushnotes\flushcolumnfloat\flushmargincontents\checkindentation}%
-   \let\flushcolumnfloat\doflushcolumnfloat
-  %\let\doroomfloat\docolumnroomfloat
-   \let\docheckiffloatfits\docolumnroomfloat
-   \let\flushcolumnfloats\doflushcolumnfloats
-   \let\doflushfloats\doflushcolumnfloats % new
-   \let\dosetbothinserts\relax
-   \let\dotopinsertions\relax}
-
-\def\noflushcolumnfloats
-  {\bgroup
-   \xdef\localsavednoffloats{\the\savednoffloats}%
-   \global\savednoffloats\globalsavednoffloats
-   \dotopinsertions
-   \xdef\globalsavenoffloats{\the\savednoffloats}%
-   \ifnum\globalsavednoffloats=\zerocount
-     \setlocalcolumnfloats
-   \fi
-   \global\savednoffloats\localsavednoffloats
-   \egroup}
-
-%D We need to calculate the amount of free space in a columns.
-%D When there is not enough room, we migrate the float to the
-%D next column. These macro's are alternatives (and
-%D look||alikes) of \type{\doroomfloat}. When a float is to
-%D wide, for one column, it is moved to the top of the next
-%D page. Of course such moved floats have to be taken into
-%D account when we calculate the available space. It's a pitty
-%D that such things are no integral part of \TEX.
-
-\def\getcolumnstatus\column#1\total#2\goal#3\\%
-  {\dimen0=\ifdim\pagegoal<\maxdimen \pagetotal \else \zeropoint \fi
-   \dimen2=\zeropoint
-   \count255=\zerocount
-   \dimen8=\columntextheight
-   \advance\dimen8 -\precolumnboxheight
-   \def\dogetcolumnstatus
-     {\advance\count255 \plusone
-      \advance\dimen2 \ht\currenttopcolumnbox
-      \advance\dimen2 \dp\currenttopcolumnbox
-      \dimen4\dimen2
-      \advance\dimen4 \dimen0
-      \dimen6=\count255\dimen8
-      \ifdim\dimen4>\dimen6
-      \else
-        \let\dogetcolumnstatus\relax
-      \fi}%
-   \dohandleallcolumns{\dogetcolumnstatus}%
-   \ifnum\count255=0 \count255=1 \fi
-   #1=\count255
-   #2=\dimen4
-   #3=\dimen6 }
-
-\def\getinsertionheight
-  {\ifdim\pagegoal<\maxdimen
-     \bgroup
-     \dimen0=\columntextheight
-     \advance\dimen0 -\pagegoal
-     \xdef\insertionheight{\the\dimen0}%
-     \egroup
-   \else
-     \global\let\insertionheight\zeropoint
-   \fi}
-
-\def\docolumnroomfloat
-  {\ifpostponecolumnfloats
-     \global\roomforfloatfalse
-   \else\ifnofloatpermitted
-     \global\roomforfloatfalse
-   \else
-     \bgroup
-     \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\%
-     \advance\dimen0 2\openlineheight % nog nodig ?
-    %\ifnum\count255=\nofcolumns
-    %  \getinsertionheight
-    % %\message{\insertionheight}\wait
-    %  \advance\dimen0 \insertionheight
-    %\fi
-     \setbox\scratchbox\vbox % tricky met objecten ?
-       {\blank[\@@bkspacebefore]
-        \snaptogrid\vbox{\copy\floatbox}}%
-     \advance\dimen0 \ht\scratchbox
-     \advance\dimen0 .5\lineheight % needed because goal a bit higher
-    %\message{column: \the\count255; total: \the\dimen0; goal: \the\dimen2}\wait
-     \ifdim\dimen0>\dimen2
-       \global\roomforfloatfalse
-     \else
-       \global\roomforfloattrue
-     \fi
-     \ifdim\wd\floatbox>\hsize
-       \showmessage\m!columns{11}\empty
-       \global\roomforfloatfalse
-     \fi
-     \egroup
-   \fi\fi}
-
-%D Flushing one float is done as soon as possible, i.e.
-%D \type{\everypar}. This means that (at the moment)
-%D sidefloats are not supported (overulled)!
-
-\newif\ifflushingcolumnfloats \flushingcolumnfloatstrue
-
-\def\doflushcolumnfloat
-  {\ifpostponecolumnfloats\else\ifflushingcolumnfloats\ifprocessingverbatim\else\ifsomefloatwaiting
-     \bgroup
-     \forgetall
-     \let\doflushcolumnfloat\relax
-     \getcolumnstatus\column\mofcolumns\total\dimen0\goal\dimen2\\%
-     \ifdim\dimen0>\zeropoint
-       \dogetfloat
-       \ifdim\wd\floatbox>\hsize
-         \doresavefloat
-       \else
-        %\setbox2=\vbox
-        %  {\blank[\@@bkspacebefore]
-        %   \snaptogrid\vbox{\copy\floatbox}%
-        %   \blank[\@@bkspaceafter]
-         \setbox2=\vbox
-           {\blank[\@@bkspacebefore]
-            \snaptogrid\vbox{\copy\floatbox}}%
-         \advance\dimen0 \ht2
-         \ifdim\dimen0>\dimen2
-           \ifnum\mofcolumns<\nofcolumns
-             \advance\mofcolumns \plusone
-%% bug %%    \edef\currenttopcolumnbox{\getvalue{\@@topcol\the\count255}}%
-             \ifdim\ht\currenttopcolumnbox=\zeropoint
-               \global\setbox\currenttopcolumnbox\vbox
-                 {\snaptogrid\vbox{\copy\floatbox}
-                  \whitespace % nodig ?
-                  \blank[\@@bkspaceafter]}%
-               \dimen4=\ht\currenttopcolumnbox
-               \advance\dimen4 \dp\currenttopcolumnbox
-               \global\advance\vsize -\dimen4
-               \advance\dimen4 -\pagegoal
-               \global\pagegoal-\dimen4
-               \showmessage\m!columns{12}a%
-             \else
-               \showmessage\m!columns{12}b%
-               \doresavefloat
-             \fi
-           \else
-             \showmessage\m!columns{12}c%
-             \doresavefloat
-           \fi
-         \else
-           \ifhmode{\setbox0\lastbox}\fi% waar is die er in geslopen
-           \par
-           \ifdim\prevdepth<\zeropoint \else % anders bovenaan kolom witruimte
-             \nobreak
-             \blank[\@@bkspacebefore]
-             \nobreak
-           \fi
-           \flushfloatbox
-           \blank[\@@bkspaceafter]
-         \fi
-       \fi
-     \fi
-     \egroup
-   \fi\fi\fi\fi}
-
-%D This one looks complicated. Upto \type{\nofcolumns} floats
-%D are placed, taking the width of a float into account. This
-%D routine can be improved on different ways:
-%D
-%D \startitemize[intro,packed]
-%D \item taking into account some imaginary baseline, just to
-%D      get the captions in line
-%D \item multipass flushing until as many floats are displaced
-%D      as possible
-%D \stopitemize
-%D
-%D When handling lots of (small) floats spacing can get worse
-%D because of lining out the columns.
-
-\def\doflushcolumnfloats
-  {\ifpostponecolumnfloats\else
-     \bgroup
-     \forgetall
-     \ifsomefloatwaiting
-       \dimen8\zeropoint
-       \dimen4\zeropoint
-       \count0\zerocount   % count0 can be used local
-       \count2\nofcolumns  % count2 can be used local
-       \dohandleallcolumns
-         {\ifnum\count0>\zerocount % the wide one's reserved space
-            \global\setbox\currenttopcolumnbox\vbox
-              {\snaptogrid\vbox
-                 {\copy\currenttopcolumnbox
-                  \hbox{\vphantom{\copy\floatbox}}}
-                  \whitespace % nodig ?
-                  \blank[\@@bkspaceafter]}%
-          \else
-            \dogetfloat
-            \ifdim\wd\floatbox>\finalcolumntextwidth % better somewhere else too
-              \global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}%
-            \fi % otherwise the graphic may disappear
-            \ifdim\wd\floatbox>\hsize
-              \dimen0\wd\floatbox
-              \advance\dimen0 \intercolumnwidth
-              \dimen2\hsize
-              \advance\dimen2 \intercolumnwidth
-              \advance\dimen0 .5pt % hm, why 1
-              \advance\dimen2 .5pt % hm, why 2
-              \divide\dimen0 \dimen2
-              \count0\dimen0
-              \advance\count0 \plusone
-              \ifnum\count0>\count2
-                \doresavefloat
-                \count0\zerocount
-              \else
-                \dimen0=\count0\hsize
-                \advance\dimen0 \count0\intercolumnwidth
-                \advance\dimen0 -\intercolumnwidth
-                \global\setbox\floatbox\hbox to \dimen0
-                 %{\hss\hbox{\copy\floatbox}\hss}%
-                  {\processaction[\@@bklocation] % how easy to forget
-                     [  \v!left=>\copy\floatbox\hss,
-                       \v!right=>\hss\copy\floatbox,
-                      \s!default=>\hss\copy\floatbox\hss,
-                      \s!unknown=>\hss\copy\floatbox\hss]}%
-              \fi
-              \showmessage\m!columns{13}\empty
-            \else
-            %  \showmessage\m!columns{13}\empty
-            \fi
-            \ifdim\ht\floatbox>\zeropoint\relax
-              \global\setbox\currenttopcolumnbox\vbox
-                {\snaptogrid\vbox
-                   {\copy\currenttopcolumnbox
-                    \copy\floatbox}
-                 \whitespace % nodig ?
-                 \blank[\@@bkspaceafter]}%
-            \fi
-            \dimen6\ht\currenttopcolumnbox
-            \advance\dimen6 \dp\currenttopcolumnbox
-          \fi
-          \ifdim\dimen4<\ht\currenttopcolumnbox
-            \dimen4\ht\currenttopcolumnbox
-          \fi
-          \advance\dimen8 \dimen6
-          \advance\count2 \minusone
-          \advance\count0 \minusone }%
-       \setvsize
-       \global\advance\vsize -\dimen8
-       \global\pagegoal\vsize
-     \else
-       %\doflushfloats % does not snap!
-     \fi
-     \egroup
-   \fi}
-
-%D The next macro can be used to flush floats in the current
-%D stream. No width checking is (yet) done.
-
-\def\insertcolumnfloats
-  {\doloop
-     {\ifsomefloatwaiting
-        \bgroup
-        \forgetall
-        % no check for width
-        \dogetfloat
-        \blank[\@@bkspacebefore]
-        \snaptogrid\vbox{\copy\floatbox}
-        \blank[\@@bkspaceafter]
-        \egroup
-      \else
-        \exitloop
-      \fi}}
-
-%D This were the multi||column routines. They can and need to
-%D be improved but at the moment their behaviour is acceptable.
-%D
-%D One inprovement can be to normalize the height of floats
-%D to $n\times$\type{\lineheight} with a macro like:
-%D
-%D \starttyping
-%D \normalizevbox{...}
-%D \stoptyping
-
-% border case, should fit on one page
-%
-% \startcolumns
-%
-% 1 \input tufte  \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{1}}
-% 2 \input tufte  \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{2}}
-% 3 \input tufte  \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{3}}
-%
-% \stopcolumns
-
-\def\setupcolumns
-  {\dosingleempty\dosetupcolumns}
-
-\def\dosetupcolumns[#1]%
-  {\getparameters[\??kl][#1]%
-   \nofcolumns\@@kln\relax
-   \processaction
-     [\@@klrule]
-     [     \v!on=>\let\betweencolumns\linebetweencolumns,
-          \v!off=>\let\betweencolumns\spacebetweencolumns,
-      \s!default=>\let\betweencolumns\spacebetweencolumns,
-      \s!unknown=>\let\betweencolumns\@@klrule]}
-
-\def\linebetweencolumns
-  {\bgroup
-   \starttextproperties
-   \ifdim\@@kldistance>\zeropoint
-     \dimen0=\@@kldistance
-   \else
-     \dimen0=\linewidth
-   \fi
-   \advance\dimen0 -\linewidth
-   \hskip.5\dimen0
-   \vrule
-     \!!width\linewidth
-     \ifb@selinebottom\!!depth\strutdepth\fi
-   \hskip.5\dimen0\relax
-   \stoptextproperties
-   \egroup}
-
-\def\spacebetweencolumns
-  {\hskip\@@kldistance}
-
-\presetlocalframed[\??kl]
-
-\def\backgroundfinishcolumnbox
-  {\doifinsetelse\@@kloffset{\v!none,\v!overlay}
-     {\let\@@kloffset\!!zeropoint}
-     {\scratchdimen\@@kloffset
-      \advance\scratchdimen -\@@klrulethickness
-      \edef\@@kloffset{\the\scratchdimen}}%
-   \localframed
-     [\??kl]
-     [\c!strut=\v!no,
-      \c!width=\v!fit,
-      \c!height=\v!fit,
-      \c!align=]}
-
-\let\restorecolumnsettings\relax
-
-\definecomplexorsimpleempty\startcolumns
-
-\def\complexstartcolumns[#1]% %% \startcolumns
-  {\bgroup
-   \let\stopcolumns\egroup
-   \ifinsidecolumns
-   \else
-     \setupcolumns[#1]%
-     \ifnum\@@kln>1\relax
-       \whitespace
-       \begingroup
-       \doif\@@kloption\v!background
-         {\let\finishcolumnbox\backgroundfinishcolumnbox
-          \let\columntextoffset\@@kloffset}%
-       \ifx\@@klcommand\empty\else
-         \let\postprocesscolumnline\@@klcommand
-       \fi
-       \doifelsenothing\@@klheight
-         \heightencolumnsfalse
-         \heightencolumnstrue
-       \doifelse\@@kldirection\v!right
-         \reversecolumnsfalse
-         \reversecolumnstrue
-       \doifelse\@@klbalance\v!yes
-         \balancecolumnstrue
-         \balancecolumnsfalse
-\installalign\v!yes {\stretchcolumnstrue \inheritcolumnsfalse}% todo: new key
-\installalign\v!no  {\stretchcolumnsfalse\inheritcolumnsfalse}% todo: new key
-\installalign\v!text{\stretchcolumnsfalse\inheritcolumnstrue }%
-\stretchcolumnsfalse
-\inheritcolumnstrue
-\doifsomething\@@klalign{\expanded{\setupalign[\@@klalign]}}%
-%        \processaction
-%          [\@@klalign]
-%          [   \v!yes=>\stretchcolumnstrue
-%                     \inheritcolumnsfalse,
-%             \v!no=>\stretchcolumnsfalse
-%                     \inheritcolumnsfalse,
-%           \v!text=>\stretchcolumnsfalse
-%                     \inheritcolumnstrue]%
-       \nofcolumns=\@@kln
-       %
-       % probably more is needed, and how about nesting save's
-       %
-       \savecurrentblank
-       \savecurrentwhitespace
-       \def\restorecolumnsettings
-         {\boxmaxdepth\maxdimen % done elsewhere
-          \restorecurrentblank
-          \restorecurrentwhitespace}%
-       %
-       \edef\fixedcolumnheight{\@@klheight}%
-       \edef\minbalancetoplines{\@@klntop}%
-       \setuptolerance[\@@kltolerance]%     %% \startcolumns
-       \setupblank[\@@klblank]%
-       \ifdim\ctxparskip>\zeropoint\relax
-         \setupwhitespace[\@@klblank]%
-       \fi
-       \def\stopcolumns
-         {\endmulticolumns
-          \global\insidecolumnsfalse
-          \endgroup
-          \egroup}%
-       \global\insidecolumnstrue
-       \beginmulticolumns
-     \fi
-   \fi}
-
-\installcolumnbreakhandler {MUL} \v!preference
-  {\goodbreak}
-
-\installcolumnbreakhandler {MUL} \v!yes
-  {\par                                             % todo: since
-   {\testrulewidth\zeropoint\ruledvskip\textheight} % we misuse a
-   \penalty-200                                     % side effect
-   \vskip-\textheight
-   }% bugged : \prevdepth-\thousandpoint} % signals top of column to \blank
-
-%D New: only at start of columns; may change ! Rather
-%D interwoven and therefore to be integrated when the multi
-%D column modules are merged. (moved from cont-new.tex)
-
-\def\setupcolumnspan[#1]%
-  {\getparameters[\??ks][#1]}
-
-\presetlocalframed
-  [\??ks]
-
-\setupcolumnspan
-  [\c!n=2,
-   \c!offset=\v!overlay,
-   \c!frame=\v!off]
-
-\newbox\columnspanbox \let\postprocesscolumnspanbox\gobbleoneargument
-
-\def\dostartcolumnspan[#1]%
-  {\bgroup
-   \setupcolumnspan[#1]%
-   \forgetall
-   \ifinsidecolumns
-     \advance\hsize \intercolumnwidth
-     \hsize\@@ksn\hsize
-     \advance\hsize -\intercolumnwidth
-   \fi
-   \dowithnextbox
-     {\setbox\columnspanbox\flushnextbox
-      \ifinsidecolumns\wd\columnspanbox\hsize\fi
-      \postprocesscolumnspanbox\columnspanbox
-      \scratchdimen\ht\columnspanbox
-      \setbox\columnspanbox\hbox % depth to be checked, probably option!
-        {\localframed[\??ks][\c!offset=\v!overlay]{\box\columnspanbox}}%
-      \ht\columnspanbox\scratchdimen
-      \dp\columnspanbox\strutdp
-      \wd\columnspanbox\hsize
-      \ifinsidecolumns
-        \ifnum\@@ksn>1
-          \setvsize
-          \dohandleallcolumns
-            {\ifnum\currentcolumn>\@@ksn\else
-               \global\setbox\currenttopcolumnbox=\vbox
-                 {\ifnum\currentcolumn=1
-                    \snaptogrid\vbox{\copy\columnspanbox}
-                  \else
-                    \snaptogrid\vbox{\vphantom{\copy\columnspanbox}}
-                  \fi}%
-               \wd\currenttopcolumnbox\hsize
-               \global\advance\vsize -\ht\currenttopcolumnbox
-             \fi}
-          \global\pagegoal\vsize
-        \else
-          \snaptogrid\vbox{\box\columnspanbox}
-        \fi
-      \else
-        \snaptogrid\vbox{\box\columnspanbox}
-      \fi
-      \endgraf
-      \ifvmode\prevdepth\strutdp\fi
-      \egroup}
-     \vbox\bgroup
-      %\topskipcorrection % becomes an option !
-       \EveryPar{\begstrut\EveryPar{}}} % also !
-
-\def\startcolumnspan
-  {\dosingleempty\dostartcolumnspan}
-
-\def\stopcolumnspan
-  {\egroup}
-
-\setupcolumns
-  [\c!n=2,
-   \c!ntop=1,
-   \c!command=,
-   \c!direction=\v!right,
-   \c!rule=\v!off,
-   \c!tolerance=\v!tolerant,
-   \c!distance=1.5\bodyfontsize, % influenced by switching
-   \c!height=,
-   \c!balance=\v!yes,
-   \c!align=\v!text,
-   \c!blank={\v!line,\v!fixed},
-   \c!option=,
-   \c!rulethickness=\linewidth,
-   \c!offset=.5\bodyfontsize]
-
-%D Undocumented and still under development.
-
-\def\startsimplecolumns
-  {\dosingleempty\dostartsimplecolumns}
-
-\def\dostartsimplecolumns[#1]%
-  {\bgroup
-   \nopenalties
-   \getparameters[\??kl]
-     [\c!width=\hsize,\c!distance=1.5\bodyfontsize,%
-      \c!n=2,\c!lines=0,#1]%
-   \let\rigidcolumnlines\@@kllines
-   \setrigidcolumnhsize\@@klwidth\@@kldistance\@@kln
-   \setbox\scratchbox\vbox\bgroup
-   \forgetall} % \blank[\v!disable]
-
-\def\stopsimplecolumns
-  {\removebottomthings
-   \egroup
-   \rigidcolumnbalance\scratchbox
-   \egroup}
-
-\protect \endinput
diff --git a/tex/context/base/page-new.tex b/tex/context/base/page-new.tex
deleted file mode 100644
index 0b047ffbe..000000000
--- a/tex/context/base/page-new.tex
+++ /dev/null
@@ -1,277 +0,0 @@
-%D \module
-%D   [       file=page-new,
-%D        version=2000.10.20,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Page New,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-\unprotect
-
-% % % NOT ENGLISH % % %
-
-% clean up footnotes to notes
-
-% We need to set the \dimen globally since we are in the
-% OTR. Unfortunately this interferes with local settings,
-% although we may assume that they will not cross page
-% boundaries.
-
-\def\OTRSETcheckcontent
-  {\bgroup
-   \donefalse
-   \def\OTRSETcheckcontent##1%
-     {\setbox\scratchbox##1\recurselevel
-      \setbox\scratchbox\vbox{\unvbox\scratchbox}%
-      \ifdim\ht\scratchbox>\zeropoint\donetrue\fi}%
-   \dorecurse{\nofcolumns}
-     {\OTRSETcheckcontent\columngettextbox
-      \OTRSETcheckcontent\columngetfootbox
-      \OTRSETcheckcontent\columngettopbox
-      \OTRSETcheckcontent\columngetbotbox}%
-   \ifdone\egroup\donefalse\else\egroup\donetrue\fi}
-
-\def\OTRSETgetcolumntextheight#1% max - boven - top
-  {\scratchdimen=\OTRSETgetparameter\c!maxhoogte#1%
-   \advance\scratchdimen -\OTRSETgetparameter\c!bovenoffset#1%
-   \advance\scratchdimen -\ht\columntopbox#1%
-   \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}%
-   \advance\scratchdimen -\ht\columnbotbox#1} % not used
-
-\def\OTRSETgetcolumnnaturalheight#1% max - boven - top
-  {\setbox\scratchbox\vbox{\unvcopy\columntextbox#1}%
-   \scratchdimen\ht\scratchbox
-   \advance\scratchdimen \OTRSETgetparameter\c!bovenoffset#1%
-   \advance\scratchdimen \ht\columntopbox#1%
-   \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}%
-   \advance\scratchdimen \ht\columnbotbox#1} % not used
-
-\def\OTRSETdobalance% splitten in met en zonder footnotes
-  {\bgroup
-   \maxdeadcycles=1000
-   % collect content and notes
-   \bgroup
-   \OTRSEToutput
-     {\global\setbox1\vbox{\unvbox\normalpagebox}%
-      \global\setbox3\vbox{\unvbox\footins}}%
-   \verticalstrut\vskip-\struttotal % makes footnotes flush
-   \eject
-   \global\collectingcontentfalse
-   % check for footnotes only
-   \ifdim\ht1<\topskip % real dirty
-     \global\setbox1=\vbox{}
-     % fix height of first line
-     \ifdim\ht3>\!!zeropoint
-       \global\setbox3\vbox
-         {\setfootnotebodyfont
-          \kern-\strutht
-          \kern\topskip
-          \unvbox3}
-   \fi
-   % prepare trial box
-   \global\setbox5\vbox
-     {\ifdim\ht1>\zeropoint
-        \unvcopy1 \ifdim\ht3>\zeropoint \kern\skip\footins \fi
-      \fi
-      \ifdim\ht3>\zeropoint \unvcopy3 \fi}
-   \egroup
-   % erase old stuff
-   \columnerasetextboxes
-   \columnerasefootboxes
-   % prepare floats
-   \OTRSETdotopinsertions
-   \OTRSETdobotinsertions % not used can be removed
-   % calculate available space
-   \!!heighta\zeropoint % available total height
-   \dorecurse{\nofcolumns}
-     {\OTRSETgetcolumntextheight\recurselevel
-      \OTRSETcalculatelines\scratchdimen
-      \advance\!!heighta \scratchdimen}
-   % quick check
-   \ifdim\ht5>\!!heighta
-     % use normal routine
-     \columnerasetextboxes
-     \columnerasefootboxes
-     % TEMP, TODO, FORCE NEXT PASS !
-     \unvbox1
-     \unvbox3
-     \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist
-     \donefalse
-    %\writestatus\m!columns{no balancing, text overflows height}%
-   \else\ifdim\ht5>\zeropoint \relax
-     % some text and/or notes
-     \donetrue
-   \else
-     \donefalse
-     \dorecurse\nofcolumns
-       {\ifdim\ht\columntopbox\recurselevel>\zeropoint \donetrue \fi}%
-     \ifdone
-       % no text and notes, but figures
-     \else
-       % no text, no notes, no figures
-       \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist
-       \writestatus\m!columns{no balancing, nothing to be placed}%
-     \fi
-   \fi\fi
-   \ifdone
-     \ifdim\ht5>\zeropoint \relax
-       % balancing text and notes
-      %\writestatus\m!columns{text may fit, balancing}%
-       \newcounter\loopcounter
-       \newcounter\balancinglines
-       \doloop
-         {\increment\loopcounter\relax
-          % initialize
-          \columnerasetextboxes
-          \columnerasefootboxes
-          \setbox0=\copy5
-          \splittopskip\topskip
-          % pre-split loop and quality calculation
-         %\writestatus\m!columns{pass \loopcounter: correction -\balancinglines}
-          \dorecurse\nofcolumns
-            {\OTRSETgetcolumntextheight\recurselevel
-             \OTRSETcalculatelines\scratchdimen
-             \!!heightc\scratchdimen
-             \ifnum\recurselevel<\nofcolumns
-               \advance\!!heightc -\balancinglines\lineheight
-             \fi
-             \columnsettextbox\recurselevel\vsplit0 to \!!heightc}
-          % just one method
-          \OTRSETgetcolumnnaturalheight1           \dimen4\scratchdimen
-          \OTRSETgetcolumnnaturalheight\nofcolumns \dimen6\scratchdimen
-         %\writestatus\m!columns{first column: \the\dimen4}%
-         %\writestatus\m!columns{last  column: \the\dimen6}%
-          \ifdim\dimen4=\dimen6
-            \donetrue  % perfect balance
-          \else\ifdim\dimen4>\dimen6
-            \donefalse % not yet good enough
-            \increment\balancinglines % try again
-            \edef\balancingcount{\the\!!counta}
-          \else
-            \donetrue  % worse balance
-            \ifnum\balancinglines>0 % take previous
-              \decrement\balancinglines
-            \fi
-          \fi\fi
-          % extra check
-          % \ifdim\ht0>\zeropoint\relax \donefalse \fi
-          % another check
-          \ifdone
-           %\writestatus\m!columns{balancing finished in pass \loopcounter}%
-          \else \ifnum\loopcounter>100 \donetrue
-           %\writestatus\m!columns{balancing aborted after pass \loopcounter}%
-          \else
-           %\writestatus\m!columns{balancing continued after pass \loopcounter}%
-          \fi \fi
-          % final balancing pass
-          \ifdone
-            \setbox0\copy1
-            \setbox2\copy3
-            \columnerasetextboxes
-            \columnerasefootboxes
-            \dorecurse\nofcolumns
-              {\OTRSETgetcolumntextheight\recurselevel
-               \OTRSETcalculatelines\scratchdimen
-               \!!heightc\scratchdimen
-               \ifnum\recurselevel<\nofcolumns
-                 \advance\!!heightc -\balancinglines\lineheight
-               \fi
-               % split off text
-               \ifdim\ht0>\zeropoint
-                 \columnsettextbox\recurselevel\vsplit0 to \!!heightc
-                 \setbox4\vbox{\unvcopy\columntextbox\recurselevel}
-                 \advance\!!heightc -\ht4
-                 \ifdim\ht0>\zeropoint
-                   \columnsettextbox\recurselevel\box4
-                   \advance\!!heightc \skip\footins
-                 \fi
-               \fi
-               % split off footnotes
-               \ifdim\ht0>\zeropoint\relax \else
-                 \ifdim\ht2>\zeropoint\relax
-                   \setbox4\vsplit2 to \!!heightc
-                   \setbox\footins=\vbox{\unvbox4} % ugly and dirty trick
-                   \ifdim\ht\columntextbox\recurselevel=\zeropoint\relax
-                     \columnsettextbox\recurselevel\hbox
-                       {\raise\strutdp\hbox % ugly but needed
-                          {\setfootnotebodyfont % both these moves
-                           \lower\strutdp\hbox{\placebottomnotes}}}
-                   \else
-                     \columnsetfootbox\recurselevel\hbox{\placebottomnotes}
-                   \fi
-                 \fi
-               \fi}
-            \exitloop
-          \fi}
-       \else
-         % no reason to balance floats
-       \fi
-     \fi
-     \doglobal\addtocommalist{\realfolio}\OTRSETbalancinglist
-     \OTRSETdoflush
-   \fi
-   \egroup}
-
-\protect \endinput
-
-% \def\OTRSETsetbalanceht#1#2% var col
-%   {#1\getvalue{\??mc\OTRSETidentifier\number#2\c!regels}\relax
-%    \ifcase#1#1\getvalue{\??mc\OTRSETidentifier\c!regels}\relax\fi
-%    \ifcase#1#1\savedcolumnmaxcells\relax\fi}
-
-% \def\OTRSETinitbalancing
-%   {\ifbalancecolumns
-%      \let\savedcolumnmaxcells\columnmaxcells
-%      \ifnum\realpageno=\balancingpageno\relax
-%        \ifnum\mofcolumns=\plusone\relax
-%          \ifcase\OTRSETbottombalance \else
-%            \!!countc\zeropoint
-%            \dorecurse\nofcolumns
-%              {\OTRSETsetbalanceht\!!countb\recurselevel
-%               \ifnum\!!countb>\!!countc\!!countc\!!countb\fi}%
-%          \fi
-%          \dorecurse\nofcolumns
-%            {\!!counta\recurselevel\relax
-%             % can be an option: absolute versus relative
-%             \ifcase\OTRSETbottombalance
-%               \OTRSETsetbalanceht\!!countb\recurselevel
-%               \advance\!!countb\precolumnlines
-%               \ifnum\!!countb>\localcolumnmaxcells\relax
-%                 \xdef\localcolumnmaxcells{\the\!!countb}%
-%               \fi
-%               \advance\!!countb \plusone
-%               \dostepwiserecurse\!!countb\columnmaxcells\plusone
-%                 {\ifvoid\OTRSETgridcell\!!counta\recurselevel
-%                    \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe
-%                  \fi}%
-%             \else
-%               \globallet\localcolumnmaxcells\columnmaxcells
-%               \!!countb\!!countc
-%               \advance\!!countb-\columnmaxcells
-%               \!!countb-\!!countb
-%               \advance\!!countb \minusone
-%               \ifnum\!!countb>\zerocount
-%                 \dostepwiserecurse\plusone\!!countb\plusone
-%                   {\ifvoid\OTRSETgridcell\!!counta\recurselevel
-%                      \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe
-%                    \fi}%
-%                 \OTRSETsetbalanceht\!!countb\recurselevel
-%                 \ifnum\!!countc>\!!countb
-%                   \!!countd\columnmaxcells
-%                   \advance\!!countd-\!!countc
-%                   \advance\!!countd+\!!countb
-%                   \dostepwiserecurse\!!countd\columnmaxcells\plusone
-%                     {\ifvoid\OTRSETgridcell\!!counta\recurselevel
-%                        \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe
-%                      \fi}%
-%                 \fi
-%               \fi
-%             \fi}%
-%          \OTRSETsetvsize % ! ! !
-%        \fi
-%      \fi
-%    \fi}
diff --git a/tex/context/base/page-not.mkii b/tex/context/base/page-not.mkii
new file mode 100644
index 000000000..9c67f18f1
--- /dev/null
+++ b/tex/context/base/page-not.mkii
@@ -0,0 +1,72 @@
+%D \module
+%D   [       file=page-nnt,
+%D        version=2002.04.16,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Footnotes,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Footnotes}
+
+%D Terrible hacks: we need to share save/restore
+
+%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.
+
+\unprotect
+
+\def\checkbegincolumnfootnotes % should happen inside otr
+  {\ifcase\clevernotes
+     \erasenotebackup
+   \else
+     \doflushnotes
+     \savenotecontent
+   \fi
+   \savenotedata
+   \checknotes}
+
+\def\checkendcolumnfootnotes
+  {\restorenotedata % maybe better just \checknotes
+   \ifcase\clevernotes\else
+     \restorenotecontent
+   \fi}
+
+\def\checksinglecolumnfootnotes
+  {\checknotes} % njet : \restorenotedata
+
+\newdimen\totalinsertionheight
+
+\def\settotalinsertionheight
+  {\calculatetotalnoteheight
+   \totalinsertionheight\totalnoteheight
+   \addinsertionheight\topins\to\totalinsertionheight
+   \addinsertionheight\botins\to\totalinsertionheight}
+
+% hm
+
+\def\checkbegincolumnfootnotes % should happen inside otr
+  {\ifcase\clevernotes
+     \erasenotebackup
+   \else
+     \doflushnotes
+     \savenotecontent
+   \fi
+   \savenotedata
+   \checknotes}
+
+\def\checkendcolumnfootnotes
+  {\restorenotedata
+   \ifinsidecolumns
+     \ifcase\clevernotes\else
+       \restorenotecontent
+     \fi
+   \fi}
+
+\protect \endinput
diff --git a/tex/context/base/page-not.mkiv b/tex/context/base/page-not.mkiv
new file mode 100644
index 000000000..9628b9d5f
--- /dev/null
+++ b/tex/context/base/page-not.mkiv
@@ -0,0 +1,72 @@
+%D \module
+%D   [       file=page-nnt,
+%D        version=2002.04.16,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Footnotes,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Footnotes}
+
+%D Terrible hacks: we need to share save/restore
+
+%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.
+
+\unprotect
+
+\def\checkbegincolumnfootnotes % should happen inside otr
+  {\ifcase\clevernotes
+     \erasenotebackup
+   \else
+     \flushnotes
+     \savenotecontent
+   \fi
+   \savenotedata
+   \checknotes}
+
+\def\checkendcolumnfootnotes
+  {\restorenotedata % maybe better just \checknotes
+   \ifcase\clevernotes\else
+     \restorenotecontent
+   \fi}
+
+\def\checksinglecolumnfootnotes
+  {\checknotes} % niet : \restorenotedata
+
+\newdimen\totalinsertionheight
+
+\def\settotalinsertionheight
+  {\calculatetotalnoteheight
+   \totalinsertionheight\totalnoteheight
+   \addinsertionheight\topins\to\totalinsertionheight
+   \addinsertionheight\botins\to\totalinsertionheight}
+
+% hm
+
+\def\checkbegincolumnfootnotes % should happen inside otr
+  {\ifcase\clevernotes
+     \erasenotebackup
+   \else
+     \flushnotes
+     \savenotecontent
+   \fi
+   \savenotedata
+   \checknotes}
+
+\def\checkendcolumnfootnotes
+  {\restorenotedata
+   \ifinsidecolumns
+     \ifcase\clevernotes\else
+       \restorenotecontent
+     \fi
+   \fi}
+
+\protect \endinput
diff --git a/tex/context/base/page-not.tex b/tex/context/base/page-not.tex
deleted file mode 100644
index 9c67f18f1..000000000
--- a/tex/context/base/page-not.tex
+++ /dev/null
@@ -1,72 +0,0 @@
-%D \module
-%D   [       file=page-nnt,
-%D        version=2002.04.16,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Footnotes,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Footnotes}
-
-%D Terrible hacks: we need to share save/restore
-
-%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.
-
-\unprotect
-
-\def\checkbegincolumnfootnotes % should happen inside otr
-  {\ifcase\clevernotes
-     \erasenotebackup
-   \else
-     \doflushnotes
-     \savenotecontent
-   \fi
-   \savenotedata
-   \checknotes}
-
-\def\checkendcolumnfootnotes
-  {\restorenotedata % maybe better just \checknotes
-   \ifcase\clevernotes\else
-     \restorenotecontent
-   \fi}
-
-\def\checksinglecolumnfootnotes
-  {\checknotes} % njet : \restorenotedata
-
-\newdimen\totalinsertionheight
-
-\def\settotalinsertionheight
-  {\calculatetotalnoteheight
-   \totalinsertionheight\totalnoteheight
-   \addinsertionheight\topins\to\totalinsertionheight
-   \addinsertionheight\botins\to\totalinsertionheight}
-
-% hm
-
-\def\checkbegincolumnfootnotes % should happen inside otr
-  {\ifcase\clevernotes
-     \erasenotebackup
-   \else
-     \doflushnotes
-     \savenotecontent
-   \fi
-   \savenotedata
-   \checknotes}
-
-\def\checkendcolumnfootnotes
-  {\restorenotedata
-   \ifinsidecolumns
-     \ifcase\clevernotes\else
-       \restorenotecontent
-     \fi
-   \fi}
-
-\protect \endinput
diff --git a/tex/context/base/page-one.mkiv b/tex/context/base/page-one.mkiv
index 19ab43889..73f69d582 100644
--- a/tex/context/base/page-one.mkiv
+++ b/tex/context/base/page-one.mkiv
@@ -116,6 +116,8 @@
 
 \chardef\kindofpagetextareas=2 % whole page (public variable! never change)
 
+% can we avoind the extra vboxing here?
+
 \def\OTRONEregisteredtextarea#1%
   {\ifregistertextareas
      \setbox0\vbox{#1}%
@@ -132,8 +134,7 @@
      \xypos{pbd:\realfolio:b}% we could save bytes by only saving the y
      \endgraf
      \begingroup
-     \scratchdimen\MPy{pbd:\realfolio:b}%
-     \advance\scratchdimen-\MPy{pbd:\realfolio:e}%
+     \scratchdimen\dimexpr\MPy{pbd:\realfolio:b}-\MPy{pbd:\realfolio:e}\relax
      \setbox\scratchbox\null
      \wd\scratchbox\makeupwidth
      \ht\scratchbox\scratchdimen
@@ -174,36 +175,31 @@
       \ifgridsnapping
         \OTRONEregisteredtextareaA{#1#2}%
         \vskip-\currentpagedepth\vskip\openstrutdepth
-        \pushproperties % moved from just after #1#2
         \prevdepth\openstrutdepth
         \dobotinsertions
         \vfil
       \else\ifr@ggedbottom
         \OTRONEregisteredtextareaA{#1#2}%
         \vskip-\currentpagedepth\vskip\openstrutdepth
-        \pushproperties % moved from just after #1#2
         \prevdepth\openstrutdepth
         \dobotinsertions
         \vfil
       \else\ifb@selinebottom
         \OTRONEregisteredtextareaA{#1#2}%
         \kern-\currentpagedepth\kern\maxdepth
-        \pushproperties % moved from just after #1#2
         \dobotinsertions
       \else
         \OTRONEregisteredtextareaA{#1#2}%
-        \pushproperties % moved from just after #1#2
         \dobotinsertions % added
       \fi\fi\fi
       \fakepagenotes}% was \fakenotes, but wrong! (check with \setupalign[height])
    \ifbottomnotes
      \ifgridsnapping
-\ifcase\layoutlines % todo: make macro of this
-    \getrawnoflines\textheight
-\else
-    \noflines\layoutlines
-\fi
-%        \getnoflines\textheight
+       \ifcase\layoutlines % todo: make macro of this
+         \getrawnoflines\textheight
+       \else
+         \noflines\layoutlines
+        \fi
        \advance\noflines \minusone
        \scratchdimen\noflines\lineheight
        \advance\scratchdimen \topskip
@@ -626,9 +622,7 @@
    \else
      \topofinsertfalse
    \fi
-   \global\advance\topinserted \ht\floatbox
-   \global\advance\topinserted \dp\floatbox
-   \global\advance\topinserted \floatbottomskip
+   \global\advance\topinserted \ht\floatbox+\dp\floatbox+\floatbottomskip\relax
    \insert\topins
      {\forgetall
       \iftopofinsert
@@ -643,9 +637,7 @@
    \doinsertfloatinfo}
 
 \def\OTRONEsomebotsfloat[#1]%
-  {\global\advance\botinserted \ht\floatbox
-   \global\advance\botinserted \dp\floatbox
-   \global\advance\botinserted \floattopskip
+  {\global\advance\botinserted\dimexpr\ht\floatbox+\dp\floatbox+\floattopskip\relax
    \insert\botins
      {\forgetall
       \blank[\@@bkspacebefore]%
diff --git a/tex/context/base/page-par.mkii b/tex/context/base/page-par.mkii
new file mode 100644
index 000000000..a5dea2e63
--- /dev/null
+++ b/tex/context/base/page-par.mkii
@@ -0,0 +1,58 @@
+%D \module
+%D   [       file=page-par, % copied from page-lin
+%D        version=1997.03.31,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Line Numbering,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Paragraph Numbering}
+
+\unprotect
+
+\newcount\internalparagraphnumber
+
+\def\setupparagraphnumbering
+  {\dosingleempty\dosetupparagraphnumbering}
+
+\def\dosetupparagraphnumbering[#1]%
+  {\getparameters
+     [\??ph][#1]%
+   \processaction
+     [\@@phstate]
+     [\v!start=>\let\showparagraphnumber\doshowparagraphnumberA,
+       \v!stop=>\let\showparagraphnumber\relax,
+       \v!line=>\let\showparagraphnumber\doshowparagraphnumberB,
+      \v!reset=>\global\internalparagraphnumber\zerocount
+                \let\showparagraphnumber\doshowparagraphnumberA]}
+
+\def\dodoshowparagraphnumber
+  {\global\advance\internalparagraphnumber \plusone
+   \inleftmargin % \tf normalizes em
+     {\tf{\doattributes\??ph\c!style\c!color{\the\internalparagraphnumber}}%
+      \kern\@@phdistance}}
+
+\def\doshowparagraphnumberA
+  {\ifprocessingverbatim
+     \iflinepar\dodoshowparagraphnumber\fi
+   \else
+     \dodoshowparagraphnumber
+   \fi}
+
+\def\doshowparagraphnumberB
+  {\ifnumberinglines
+     \doshowparagraphnumberA
+   \fi}
+
+\setupparagraphnumbering
+  [\c!state=\v!stop,
+   \c!style=,
+   \c!color=,
+   \c!distance=\ifcase\linenumberlocation2em\else\!!zeropoint\fi] % will change
+
+\protect \endinput
diff --git a/tex/context/base/page-par.mkiv b/tex/context/base/page-par.mkiv
new file mode 100644
index 000000000..a5dea2e63
--- /dev/null
+++ b/tex/context/base/page-par.mkiv
@@ -0,0 +1,58 @@
+%D \module
+%D   [       file=page-par, % copied from page-lin
+%D        version=1997.03.31,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Line Numbering,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Paragraph Numbering}
+
+\unprotect
+
+\newcount\internalparagraphnumber
+
+\def\setupparagraphnumbering
+  {\dosingleempty\dosetupparagraphnumbering}
+
+\def\dosetupparagraphnumbering[#1]%
+  {\getparameters
+     [\??ph][#1]%
+   \processaction
+     [\@@phstate]
+     [\v!start=>\let\showparagraphnumber\doshowparagraphnumberA,
+       \v!stop=>\let\showparagraphnumber\relax,
+       \v!line=>\let\showparagraphnumber\doshowparagraphnumberB,
+      \v!reset=>\global\internalparagraphnumber\zerocount
+                \let\showparagraphnumber\doshowparagraphnumberA]}
+
+\def\dodoshowparagraphnumber
+  {\global\advance\internalparagraphnumber \plusone
+   \inleftmargin % \tf normalizes em
+     {\tf{\doattributes\??ph\c!style\c!color{\the\internalparagraphnumber}}%
+      \kern\@@phdistance}}
+
+\def\doshowparagraphnumberA
+  {\ifprocessingverbatim
+     \iflinepar\dodoshowparagraphnumber\fi
+   \else
+     \dodoshowparagraphnumber
+   \fi}
+
+\def\doshowparagraphnumberB
+  {\ifnumberinglines
+     \doshowparagraphnumberA
+   \fi}
+
+\setupparagraphnumbering
+  [\c!state=\v!stop,
+   \c!style=,
+   \c!color=,
+   \c!distance=\ifcase\linenumberlocation2em\else\!!zeropoint\fi] % will change
+
+\protect \endinput
diff --git a/tex/context/base/page-par.tex b/tex/context/base/page-par.tex
deleted file mode 100644
index a5dea2e63..000000000
--- a/tex/context/base/page-par.tex
+++ /dev/null
@@ -1,58 +0,0 @@
-%D \module
-%D   [       file=page-par, % copied from page-lin
-%D        version=1997.03.31,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Line Numbering,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Paragraph Numbering}
-
-\unprotect
-
-\newcount\internalparagraphnumber
-
-\def\setupparagraphnumbering
-  {\dosingleempty\dosetupparagraphnumbering}
-
-\def\dosetupparagraphnumbering[#1]%
-  {\getparameters
-     [\??ph][#1]%
-   \processaction
-     [\@@phstate]
-     [\v!start=>\let\showparagraphnumber\doshowparagraphnumberA,
-       \v!stop=>\let\showparagraphnumber\relax,
-       \v!line=>\let\showparagraphnumber\doshowparagraphnumberB,
-      \v!reset=>\global\internalparagraphnumber\zerocount
-                \let\showparagraphnumber\doshowparagraphnumberA]}
-
-\def\dodoshowparagraphnumber
-  {\global\advance\internalparagraphnumber \plusone
-   \inleftmargin % \tf normalizes em
-     {\tf{\doattributes\??ph\c!style\c!color{\the\internalparagraphnumber}}%
-      \kern\@@phdistance}}
-
-\def\doshowparagraphnumberA
-  {\ifprocessingverbatim
-     \iflinepar\dodoshowparagraphnumber\fi
-   \else
-     \dodoshowparagraphnumber
-   \fi}
-
-\def\doshowparagraphnumberB
-  {\ifnumberinglines
-     \doshowparagraphnumberA
-   \fi}
-
-\setupparagraphnumbering
-  [\c!state=\v!stop,
-   \c!style=,
-   \c!color=,
-   \c!distance=\ifcase\linenumberlocation2em\else\!!zeropoint\fi] % will change
-
-\protect \endinput
diff --git a/tex/context/base/page-plg.mkii b/tex/context/base/page-plg.mkii
new file mode 100644
index 000000000..3203b923c
--- /dev/null
+++ b/tex/context/base/page-plg.mkii
@@ -0,0 +1,202 @@
+%D \module
+%D   [       file=page-pls,
+%D        version=2003.03.16,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Page Setup,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%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 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
+%D support \type {page}, \type {leftpage} and \type {rightpage}
+%D definitions where specific areas are placed with the \type
+%D {\pagearea} command.
+%D
+%D \starttyping
+%D \setupheadertexts[the header text]
+%D \setupfootertexts[a pretty long left footer text][something right]
+%D \setupbottomtexts[a not so long bottom text][another right thing]
+%D \setuptexttexts  [margin][something marginal][indeed]
+%D
+%D \startpagelayout[leftpage]
+%D   \setupTABLE[offset=overlay]
+%D   \setupTABLE[c][1][width=\leftmarginwidth]
+%D   \bTABLE
+%D     \bTR
+%D       \bTD[nx=3,background=color,backgroundcolor=green]
+%D         \pagearea[header][text][middle]
+%D       \eTD
+%D     \eTR
+%D     \bTR
+%D       \bTD \pagearea[text][margin][left] \eTD
+%D       \bTD[nx=2] \pagearea[text] \eTD
+%D     \eTR
+%D     \bTR
+%D       \bTD[nx=3,offset=overlay]
+%D         {\bTABLE[width=.5\hsize]
+%D            \bTR
+%D              \bTD \pagearea[footer][text][left] \eTD
+%D              \bTD \pagearea[bottom][text][left] \eTD
+%D            \eTR
+%D          \eTABLE}
+%D        \eTD
+%D     \eTR
+%D   \eTABLE
+%D \stoppagelayout
+%D
+%D \startpagelayout[rightpage]
+%D   \setupTABLE[offset=overlay]
+%D   \setupTABLE[c][1][width=\rightmarginwidth]
+%D   \bTABLE
+%D     \bTR
+%D       \bTD[nx=3] \pagearea[header][text][middle] \eTD
+%D     \eTR
+%D     \bTR
+%D       \bTD \pagearea[text][margin][left] \eTD
+%D       \bTD[nx=2] \pagearea[text] \eTD
+%D     \eTR
+%D     \bTR
+%D       \bTD[nx=3,offset=overlay]
+%D         {\bTABLE[width=.5\hsize]
+%D            \bTR
+%D              \bTD \pagearea[bottom][text][right] \eTD
+%D              \bTD \pagearea[footer][text][right] \eTD
+%D            \eTR
+%D          \eTABLE}
+%D       \eTD
+%D     \eTR
+%D   \eTABLE
+%D \stoppagelayout
+%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
+%D \definetextbackground
+%D   [test]
+%D   [state=start,
+%D    background=color,
+%D    backgroundcolor=yellow]
+%D
+%D \starttext
+%D
+%D \dorecurse{10}{\input tufte \par}
+%D
+%D \input tufte \starttest \input tufte \stoptest \input tufte
+%D
+%D \starttabulate
+%D \NC test \NC \starttest \input tufte  \stoptest \NC \NR
+%D \stoptabulate
+%D
+%D \dorecurse{10}{\input tufte \par}
+%D
+%D \stoptext
+%D \stoptyping
+
+\unprotect
+
+\setvalue{\??ly\c!method\v!makeup}#1#2%
+  {\setbox\pagebox\hbox
+     {\vbox to \textheight
+        {\offinterlineskip
+         % optie
+         \vskip\dimexpr-1\topskip+\strutheight\relax
+         %
+         \textwidth\makeupwidth
+         \hsize\textwidth
+         \boxmaxdepth\maxdepth
+         \noindent
+         \dopagecontents#1#2}}%
+   \wd\pagebox\makeupwidth
+   \ht\pagebox\textheight
+   \dp\pagebox\zeropoint
+   \hsize\paperwidth
+   \vsize\paperheight
+   \setbox\pagebox\vbox
+     {\doifbothsidesoverruled
+        {\let\!!stringa\v!page}
+        {\let\!!stringa\v!rightpage}
+        {\let\!!stringa\v!leftpage}%
+      \getvalue{\??ly\c!method:\!!stringa}}%
+   \wd\pagebox\paperwidth
+   \ht\pagebox\paperheight
+   \dp\pagebox\zeropoint}
+
+\newbox\pageareabox
+
+\def\pagearea
+  {\dotripleempty\dopagearea}
+
+\def\dopagearea[#1][#2][#3]%
+  {\ifthirdargument
+     \doifelse{#3}\v!left
+       {\dodopagearea{#1}{#2}\c!lefttext}
+       {\doifelse{#3}\v!right
+          {\dodopagearea{#1}{#2}\c!righttext}
+          {\dodopagearea{#1}{#2}\c!middletext}}%
+   \else\ifsecondargument
+     \doifbothsidesoverruled
+       {\dodopagearea{#1}{#2}\c!righttext}
+       {\dodopagearea{#1}{#2}\c!righttext}
+       {\dodopagearea{#1}{#2}\c!lefttext }%
+   \else
+     \doif{#1}\v!text % copy due to trial runs in TABLE
+       {\iftrialtypesetting
+          \copy\pagebox
+        \else
+          \setbox\pagebox\vbox
+            {\localstarttextcolor
+               \box\pagebox
+             \localstoptextcolor}%
+          \localpositioningfalse
+          \addtextbackground\pagebox
+          \addtextgridlayer\pagebox
+          \box\pagebox
+        \fi}%
+   \fi\fi}
+
+\def\dodopagearea#1#2#3%
+  {\setbox\pageareabox\vbox{\getvalue{\??tk#1#2#3}}%
+   \ifsomebackgroundfound{#1#2}%
+     \iftrialtypesetting
+       \box\pageareabox
+     \else
+       \localframed
+         [\??ma#1#2]
+         [\c!width=\wd\pageareabox,
+          \c!height=\ht\pageareabox,
+          \c!offset=\v!overlay]
+         {\box\pageareabox}%
+     \fi
+   \else
+     \box\pageareabox
+   \fi}
+
+\setvalue{\??ly\c!method:\v!leftpage }{\getvalue{\??ly\c!method:\v!page}}
+\setvalue{\??ly\c!method:\v!rightpage}{\getvalue{\??ly\c!method:\v!page}}
+
+% \long\def\startpagelayout[#1]#2\stoppagelayout
+%   {\long\setvalue{\??ly\c!method:#1}{#2}}
+
+\long\def\startpagelayout
+  {\bgroup\catcode`\^^M=\@@ignore\dostartpagelayout}
+
+\long\def\dostartpagelayout[#1]#2\stoppagelayout
+  {\egroup\long\setvalue{\??ly\c!method:#1}{#2}}
+
+\protect \endinput
diff --git a/tex/context/base/page-plg.mkiv b/tex/context/base/page-plg.mkiv
new file mode 100644
index 000000000..bbee2eb57
--- /dev/null
+++ b/tex/context/base/page-plg.mkiv
@@ -0,0 +1,198 @@
+%D \module
+%D   [       file=page-pls,
+%D        version=2003.03.16,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Page Setup,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%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 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
+%D support \type {page}, \type {leftpage} and \type {rightpage}
+%D definitions where specific areas are placed with the \type
+%D {\pagearea} command.
+%D
+%D \starttyping
+%D \setupheadertexts[the header text]
+%D \setupfootertexts[a pretty long left footer text][something right]
+%D \setupbottomtexts[a not so long bottom text][another right thing]
+%D \setuptexttexts  [margin][something marginal][indeed]
+%D
+%D \startpagelayout[leftpage]
+%D   \setupTABLE[offset=overlay]
+%D   \setupTABLE[c][1][width=\leftmarginwidth]
+%D   \bTABLE
+%D     \bTR
+%D       \bTD[nx=3,background=color,backgroundcolor=green]
+%D         \pagearea[header][text][middle]
+%D       \eTD
+%D     \eTR
+%D     \bTR
+%D       \bTD \pagearea[text][margin][left] \eTD
+%D       \bTD[nx=2] \pagearea[text] \eTD
+%D     \eTR
+%D     \bTR
+%D       \bTD[nx=3,offset=overlay]
+%D         {\bTABLE[width=.5\hsize]
+%D            \bTR
+%D              \bTD \pagearea[footer][text][left] \eTD
+%D              \bTD \pagearea[bottom][text][left] \eTD
+%D            \eTR
+%D          \eTABLE}
+%D        \eTD
+%D     \eTR
+%D   \eTABLE
+%D \stoppagelayout
+%D
+%D \startpagelayout[rightpage]
+%D   \setupTABLE[offset=overlay]
+%D   \setupTABLE[c][1][width=\rightmarginwidth]
+%D   \bTABLE
+%D     \bTR
+%D       \bTD[nx=3] \pagearea[header][text][middle] \eTD
+%D     \eTR
+%D     \bTR
+%D       \bTD \pagearea[text][margin][left] \eTD
+%D       \bTD[nx=2] \pagearea[text] \eTD
+%D     \eTR
+%D     \bTR
+%D       \bTD[nx=3,offset=overlay]
+%D         {\bTABLE[width=.5\hsize]
+%D            \bTR
+%D              \bTD \pagearea[bottom][text][right] \eTD
+%D              \bTD \pagearea[footer][text][right] \eTD
+%D            \eTR
+%D          \eTABLE}
+%D       \eTD
+%D     \eTR
+%D   \eTABLE
+%D \stoppagelayout
+%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
+%D \definetextbackground
+%D   [test]
+%D   [state=start,
+%D    background=color,
+%D    backgroundcolor=yellow]
+%D
+%D \starttext
+%D
+%D \dorecurse{10}{\input tufte \par}
+%D
+%D \input tufte \starttest \input tufte \stoptest \input tufte
+%D
+%D \starttabulate
+%D \NC test \NC \starttest \input tufte  \stoptest \NC \NR
+%D \stoptabulate
+%D
+%D \dorecurse{10}{\input tufte \par}
+%D
+%D \stoptext
+%D \stoptyping
+
+\unprotect
+
+\setvalue{\??ly\c!method\v!makeup}#1#2%
+  {\setbox\pagebox\hbox
+     {\vbox to \textheight
+        {\offinterlineskip
+         % optie
+         \vskip\dimexpr-1\topskip+\strutheight\relax
+         %
+         \textwidth\makeupwidth
+         \hsize\textwidth
+         \boxmaxdepth\maxdepth
+         \noindent
+         \dopagecontents#1#2}}%
+   \wd\pagebox\makeupwidth
+   \ht\pagebox\textheight
+   \dp\pagebox\zeropoint
+   \hsize\paperwidth
+   \vsize\paperheight
+   \setbox\pagebox\vbox
+     {\doifbothsidesoverruled
+        {\let\!!stringa\v!page}
+        {\let\!!stringa\v!rightpage}
+        {\let\!!stringa\v!leftpage}%
+      \getvalue{\??ly\c!method:\!!stringa}}%
+   \wd\pagebox\paperwidth
+   \ht\pagebox\paperheight
+   \dp\pagebox\zeropoint}
+
+\newbox\pageareabox
+
+\def\pagearea
+  {\dotripleempty\dopagearea}
+
+\def\dopagearea[#1][#2][#3]%
+  {\ifthirdargument
+     \doifelse{#3}\v!left
+       {\dodopagearea{#1}{#2}\c!lefttext}
+       {\doifelse{#3}\v!right
+          {\dodopagearea{#1}{#2}\c!righttext}
+          {\dodopagearea{#1}{#2}\c!middletext}}%
+   \else\ifsecondargument
+     \doifbothsidesoverruled
+       {\dodopagearea{#1}{#2}\c!righttext}
+       {\dodopagearea{#1}{#2}\c!righttext}
+       {\dodopagearea{#1}{#2}\c!lefttext }%
+   \else
+     \doif{#1}\v!text % copy due to trial runs in TABLE
+       {\iftrialtypesetting
+          \copy\pagebox
+        \else
+          \localpositioningfalse
+          \addtextbackground\pagebox
+          \addtextgridlayer\pagebox
+          \box\pagebox
+        \fi}%
+   \fi\fi}
+
+\def\dodopagearea#1#2#3%
+  {\setbox\pageareabox\vbox{\getvalue{\??tk#1#2#3}}%
+   \ifsomebackgroundfound{#1#2}%
+     \iftrialtypesetting
+       \box\pageareabox
+     \else
+       \localframed
+         [\??ma#1#2]
+         [\c!width=\wd\pageareabox,
+          \c!height=\ht\pageareabox,
+          \c!offset=\v!overlay]
+         {\box\pageareabox}%
+     \fi
+   \else
+     \box\pageareabox
+   \fi}
+
+\setvalue{\??ly\c!method:\v!leftpage }{\getvalue{\??ly\c!method:\v!page}}
+\setvalue{\??ly\c!method:\v!rightpage}{\getvalue{\??ly\c!method:\v!page}}
+
+% \long\def\startpagelayout[#1]#2\stoppagelayout
+%   {\long\setvalue{\??ly\c!method:#1}{#2}}
+
+\long\def\startpagelayout
+  {\bgroup\catcode`\^^M=\@@ignore\dostartpagelayout}
+
+\long\def\dostartpagelayout[#1]#2\stoppagelayout
+  {\egroup\long\setvalue{\??ly\c!method:#1}{#2}}
+
+\protect \endinput
diff --git a/tex/context/base/page-plg.tex b/tex/context/base/page-plg.tex
deleted file mode 100644
index 3203b923c..000000000
--- a/tex/context/base/page-plg.tex
+++ /dev/null
@@ -1,202 +0,0 @@
-%D \module
-%D   [       file=page-pls,
-%D        version=2003.03.16,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Page Setup,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright=PRAGMA-ADE]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%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 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
-%D support \type {page}, \type {leftpage} and \type {rightpage}
-%D definitions where specific areas are placed with the \type
-%D {\pagearea} command.
-%D
-%D \starttyping
-%D \setupheadertexts[the header text]
-%D \setupfootertexts[a pretty long left footer text][something right]
-%D \setupbottomtexts[a not so long bottom text][another right thing]
-%D \setuptexttexts  [margin][something marginal][indeed]
-%D
-%D \startpagelayout[leftpage]
-%D   \setupTABLE[offset=overlay]
-%D   \setupTABLE[c][1][width=\leftmarginwidth]
-%D   \bTABLE
-%D     \bTR
-%D       \bTD[nx=3,background=color,backgroundcolor=green]
-%D         \pagearea[header][text][middle]
-%D       \eTD
-%D     \eTR
-%D     \bTR
-%D       \bTD \pagearea[text][margin][left] \eTD
-%D       \bTD[nx=2] \pagearea[text] \eTD
-%D     \eTR
-%D     \bTR
-%D       \bTD[nx=3,offset=overlay]
-%D         {\bTABLE[width=.5\hsize]
-%D            \bTR
-%D              \bTD \pagearea[footer][text][left] \eTD
-%D              \bTD \pagearea[bottom][text][left] \eTD
-%D            \eTR
-%D          \eTABLE}
-%D        \eTD
-%D     \eTR
-%D   \eTABLE
-%D \stoppagelayout
-%D
-%D \startpagelayout[rightpage]
-%D   \setupTABLE[offset=overlay]
-%D   \setupTABLE[c][1][width=\rightmarginwidth]
-%D   \bTABLE
-%D     \bTR
-%D       \bTD[nx=3] \pagearea[header][text][middle] \eTD
-%D     \eTR
-%D     \bTR
-%D       \bTD \pagearea[text][margin][left] \eTD
-%D       \bTD[nx=2] \pagearea[text] \eTD
-%D     \eTR
-%D     \bTR
-%D       \bTD[nx=3,offset=overlay]
-%D         {\bTABLE[width=.5\hsize]
-%D            \bTR
-%D              \bTD \pagearea[bottom][text][right] \eTD
-%D              \bTD \pagearea[footer][text][right] \eTD
-%D            \eTR
-%D          \eTABLE}
-%D       \eTD
-%D     \eTR
-%D   \eTABLE
-%D \stoppagelayout
-%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
-%D \definetextbackground
-%D   [test]
-%D   [state=start,
-%D    background=color,
-%D    backgroundcolor=yellow]
-%D
-%D \starttext
-%D
-%D \dorecurse{10}{\input tufte \par}
-%D
-%D \input tufte \starttest \input tufte \stoptest \input tufte
-%D
-%D \starttabulate
-%D \NC test \NC \starttest \input tufte  \stoptest \NC \NR
-%D \stoptabulate
-%D
-%D \dorecurse{10}{\input tufte \par}
-%D
-%D \stoptext
-%D \stoptyping
-
-\unprotect
-
-\setvalue{\??ly\c!method\v!makeup}#1#2%
-  {\setbox\pagebox\hbox
-     {\vbox to \textheight
-        {\offinterlineskip
-         % optie
-         \vskip\dimexpr-1\topskip+\strutheight\relax
-         %
-         \textwidth\makeupwidth
-         \hsize\textwidth
-         \boxmaxdepth\maxdepth
-         \noindent
-         \dopagecontents#1#2}}%
-   \wd\pagebox\makeupwidth
-   \ht\pagebox\textheight
-   \dp\pagebox\zeropoint
-   \hsize\paperwidth
-   \vsize\paperheight
-   \setbox\pagebox\vbox
-     {\doifbothsidesoverruled
-        {\let\!!stringa\v!page}
-        {\let\!!stringa\v!rightpage}
-        {\let\!!stringa\v!leftpage}%
-      \getvalue{\??ly\c!method:\!!stringa}}%
-   \wd\pagebox\paperwidth
-   \ht\pagebox\paperheight
-   \dp\pagebox\zeropoint}
-
-\newbox\pageareabox
-
-\def\pagearea
-  {\dotripleempty\dopagearea}
-
-\def\dopagearea[#1][#2][#3]%
-  {\ifthirdargument
-     \doifelse{#3}\v!left
-       {\dodopagearea{#1}{#2}\c!lefttext}
-       {\doifelse{#3}\v!right
-          {\dodopagearea{#1}{#2}\c!righttext}
-          {\dodopagearea{#1}{#2}\c!middletext}}%
-   \else\ifsecondargument
-     \doifbothsidesoverruled
-       {\dodopagearea{#1}{#2}\c!righttext}
-       {\dodopagearea{#1}{#2}\c!righttext}
-       {\dodopagearea{#1}{#2}\c!lefttext }%
-   \else
-     \doif{#1}\v!text % copy due to trial runs in TABLE
-       {\iftrialtypesetting
-          \copy\pagebox
-        \else
-          \setbox\pagebox\vbox
-            {\localstarttextcolor
-               \box\pagebox
-             \localstoptextcolor}%
-          \localpositioningfalse
-          \addtextbackground\pagebox
-          \addtextgridlayer\pagebox
-          \box\pagebox
-        \fi}%
-   \fi\fi}
-
-\def\dodopagearea#1#2#3%
-  {\setbox\pageareabox\vbox{\getvalue{\??tk#1#2#3}}%
-   \ifsomebackgroundfound{#1#2}%
-     \iftrialtypesetting
-       \box\pageareabox
-     \else
-       \localframed
-         [\??ma#1#2]
-         [\c!width=\wd\pageareabox,
-          \c!height=\ht\pageareabox,
-          \c!offset=\v!overlay]
-         {\box\pageareabox}%
-     \fi
-   \else
-     \box\pageareabox
-   \fi}
-
-\setvalue{\??ly\c!method:\v!leftpage }{\getvalue{\??ly\c!method:\v!page}}
-\setvalue{\??ly\c!method:\v!rightpage}{\getvalue{\??ly\c!method:\v!page}}
-
-% \long\def\startpagelayout[#1]#2\stoppagelayout
-%   {\long\setvalue{\??ly\c!method:#1}{#2}}
-
-\long\def\startpagelayout
-  {\bgroup\catcode`\^^M=\@@ignore\dostartpagelayout}
-
-\long\def\dostartpagelayout[#1]#2\stoppagelayout
-  {\egroup\long\setvalue{\??ly\c!method:#1}{#2}}
-
-\protect \endinput
diff --git a/tex/context/base/page-run.mkii b/tex/context/base/page-run.mkii
new file mode 100644
index 000000000..ae5af81e9
--- /dev/null
+++ b/tex/context/base/page-run.mkii
@@ -0,0 +1,382 @@
+%D \module
+%D   [       file=page-run,
+%D        version=2000.10.20,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Runtime Macros,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Runtime Macros}
+
+\unprotect
+
+\gdef\doshowprint[#1][#2][#3]%
+  {\framed
+     [\c!offset=\v!overlay,
+      \c!strut=\v!no]
+     {\forgetall
+      \dontcomplain
+      \globaldefs\minusone
+      \dimen0\pagegoal
+      \definepapersize[X][\c!width=4em, \c!height=6em]%
+      \definepapersize[Y][\c!width=12em,\c!height=14em]%
+      \setuppapersize[#1,X][#2,Y]%
+      \setuplayout[#3]%
+      \setbox0\vbox
+        {\framed
+          [\c!offset=\v!overlay,\c!strut=\v!no,
+           \c!width=\paperwidth,\c!height=\paperheight]
+          {\ss ABC\par DEF}}%
+      \doublesidedfalse
+      \def\cutmarklength{.5em}%
+      \addpagecutmarks0%
+      \replicatepagebox0%
+      \scalepagebox0%
+      \mirrorpaperbox0%
+      \orientpaperbox0%
+      \centerpagebox0%
+      \mirrorprintbox0%
+      \orientprintbox0%
+      \offsetprintbox0%
+      \pagegoal\dimen0
+      \box0}}
+
+\gdef\showprint
+  {\dotripleempty\doshowprint}
+
+% \switchnaarkorps[8pt]
+%
+% \startcombinatie[4*4]
+%   {\toonprint}                                       {\strut}
+%   {\toonprint[][][plaats=midden]}                    {\type{plaats=midden}}
+%   {\toonprint[][][plaats=midden,markering=aan]}      {\type{markering=aan}\break
+%                                                      \type{plaats=midden}}
+%   {\toonprint[][][plaats=midden,markering=aan,nx=2]} {\type{markering=aan}\break
+%                                                      \type{plaats=midden}\break
+%                                                      \type{nx=2}}
+%   {\toonprint[][][plaats=links]}                     {\type{plaats=links}}
+%   {\toonprint[][][plaats=rechts]}                    {\type{plaats=rechts}}
+%   {\toonprint[][][plaats={links,onder}]}             {\type{plaats={links,onder}}}
+%   {\toonprint[][][plaats={rechts,onder}]}            {\type{plaats={rechts,onder}}}
+%   {\toonprint[][][nx=2,ny=1]}                        {\type{nx=2,ny=1}}
+%   {\toonprint[][][nx=1,ny=2]}                        {\type{nx=1,ny=2}}
+%   {\toonprint[][][nx=2,ny=2]}                        {\type{nx=2,ny=2}}
+%   {\toonprint[][][nx=2,ny=2,plaats=midden]}          {\type{nx=2,ny=2}\break
+%                                                       \type{plaats=midden}}
+%   {\toonprint[][][rugoffset=3pt]}                    {\type{rugoffset=.5cm}}
+%   {\toonprint[][][kopoffset=3pt]}                    {\type{kopoffset=.5cm}}
+%   {\toonprint[][][schaal=1.5]}                       {\type{schaal=1.5}}
+%   {\toonprint[][][schaal=0.8]}                       {\type{schaal=0.8}}
+% \stopcombinatie
+%
+% \startcombinatie[3*4]
+%   {\toonprint[liggend][][plaats=midden]}              {\type{liggend}}
+%   {\toonprint[][liggend][plaats=midden]}              {\strut\break\type{liggend}}
+%   {\toonprint[liggend][liggend][plaats=midden]}       {\type{liggend}\break\type{liggend}}
+%   {\toonprint[90][][plaats=midden]}                   {\type{90}}
+%   {\toonprint[][90][plaats=midden]}                   {\strut\break\type{90}}
+%   {\toonprint[90][90][plaats=midden]}                 {\type{90}\break\type{90}}
+%   {\toonprint[180][][plaats=midden]}                  {\type{180}}
+%   {\toonprint[][180][plaats=midden]}                  {\strut\break\type{180}}
+%   {\toonprint[180][180][plaats=midden]}               {\type{180}\break\type{180}}
+%   {\toonprint[gespiegeld][][plaats=midden]}           {\type{gespiegeld}}
+%   {\toonprint[][gespiegeld][plaats=midden]}           {\strut\break\type{gespiegeld}}
+%   {\toonprint[gespiegeld][gespiegeld][plaats=midden]} {\type{gespiegeld}\break\type{gespiegeld}}
+% \stopcombinatie
+
+\gdef\doshowframe[#1][#2]%
+  {\ifsecondargument
+     \setupbackgrounds
+       [\v!page]
+       [\c!frame=\v!on,
+        \c!corner=\v!rectangular,
+        \c!frameoffset=\!!zeropoint,
+        \c!framedepth=\!!zeropoint,
+        \c!framecolor=layout:page]
+     \setupbackgrounds
+       [#1][#2]
+       [\c!background=,
+        \c!frame=\v!on,
+        \c!corner=\v!rectangular,
+        \c!frameoffset=\!!zeropoint,
+        \c!framedepth=\!!zeropoint,
+        \c!framecolor=]
+   \else\iffirstargument
+     \showframe
+       [\v!header,\v!text,\v!footer]
+       [#1]
+   \else
+     \showframe
+       [\v!header,\v!text,\v!footer]
+       [\v!leftedge,\v!leftmargin,
+        \v!text,
+        \v!rightmargin,\v!rightedge]
+   \fi\fi
+   \setupbackgrounds
+     [\c!state=\v!repeat]}
+
+\gdef\showframe{\dodoubleempty\doshowframe}
+
+\gdef\showsetupA#1#2%
+  {#1&\PtToCm{\the#2}&\the#2&\tttf\string#2\cr}
+
+\gdef\showsetupB#1#2#3%
+  {#1&\tttf\string#3\cr}
+
+% \startinterface english % english is fallback
+
+\gdef\showsetups
+  {\noindent
+   \vbox
+     {\forgetall
+      \dontcomplain
+      \switchtobodyfont[\v!small]
+      \tabskip\zeropoint
+      \halign
+        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
+         \showsetupA{paperheight}        \paperheight
+         \showsetupA{paperwidth}         \paperwidth
+         \showsetupA{printpaperheight}   \printpaperheight
+         \showsetupA{printpaperwidth}    \printpaperwidth
+         \showsetupA{topspace}           \topspace
+         \showsetupA{backspace}          \backspace
+         \showsetupA{height}             \makeupheight
+         \showsetupA{width}              \makeupwidth
+         \showsetupA{top}                \topheight
+         \showsetupA{topdistance}        \topdistance
+         \showsetupA{header}             \headerheight
+         \showsetupA{headerdistance}     \headerdistance
+         \showsetupA{textheight}         \textheight
+         \showsetupA{footerdistance}     \footerdistance
+         \showsetupA{footer}             \footerheight
+         \showsetupA{bottomdistance}     \bottomdistance
+         \showsetupA{bottom}             \bottomheight
+         \showsetupA{leftedge}           \leftedgewidth
+         \showsetupA{leftedgedistance}   \leftedgedistance
+         \showsetupA{leftmargin}         \leftmarginwidth
+         \showsetupA{leftmargindistance} \leftmargindistance
+         \showsetupA{textwidth}          \textwidth
+         \showsetupA{rightmargindistance}\rightmargindistance
+         \showsetupA{rightmargin}        \rightmarginwidth
+         \showsetupA{rightedgedistance}  \rightedgedistance
+         \showsetupA{rightedge}          \rightedgewidth
+         \showsetupB{bodyfontsize}       \the   \globalbodyfontsize
+         \showsetupB{line}               \relax \normallineheight
+         \showsetupB{height}             \relax \strutheightfactor
+         \showsetupB{depth}              \relax \strutdepthfactor
+         \showsetupB{topskip}            \relax \topskipfactor
+         \showsetupB{maxdepth}           \relax \maxdepthfactor}}}
+
+% \stopinterface
+
+\startinterface dutch
+
+\gdef\showsetups
+  {\noindent
+   \vbox
+     {\forgetall
+      \dontcomplain
+      \switchtobodyfont[\v!small]
+      \tabskip\zeropoint
+      \halign
+        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
+         \showsetupA{papierhoogte}       \papierhoogte
+         \showsetupA{papierbreedte}      \papierbreedte
+         \showsetupA{printpapierhoogte}  \printpapierhoogte
+         \showsetupA{printpapierbreedte} \printpapierbreedte
+         \showsetupA{kopwit}             \kopwit
+         \showsetupA{rugwit}             \rugwit
+         \showsetupA{snijwit}            \snijwit
+         \showsetupA{hoogte}             \zethoogte
+         \showsetupA{breedte}            \zetbreedte
+         \showsetupA{boven}              \bovenhoogte
+         \showsetupA{bovenafstand}       \bovenafstand
+         \showsetupA{hoofd}              \hoofdhoogte
+         \showsetupA{hoofdafstand}       \hoofdafstand
+         \showsetupA{teksthoogte}        \teksthoogte
+         \showsetupA{voetafstand}        \voetafstand
+         \showsetupA{voet}               \voethoogte
+         \showsetupA{onderafstand}       \onderafstand
+         \showsetupA{onder}              \onderhoogte
+         \showsetupA{linkerrand}         \linkerrandbreedte
+         \showsetupA{linkerrandafstand}  \linkerrandafstand
+         \showsetupA{linkermarge}        \linkermargebreedte
+         \showsetupA{linkermargeafstand} \linkermargeafstand
+         \showsetupA{tekstbreedte}       \tekstbreedte
+         \showsetupA{rechtermargeafstand}\rechtermargeafstand
+         \showsetupA{rechtermarge}       \rechtermargebreedte
+         \showsetupA{rechterrandafstand} \rechterrandafstand
+         \showsetupA{rechterrand}        \rechterrandbreedte
+         \showsetupB{korps}              \the   \globalbodyfontsize
+         \showsetupB{regel}              \relax \normallineheight
+         \showsetupB{hoogte}             \relax \strutheightfactor
+         \showsetupB{diepte}             \relax \strutdepthfactor
+         \showsetupB{boven}              \relax \topskipfactor
+         \showsetupB{onder}              \relax \maxdepthfactor}}}
+
+\stopinterface
+
+% todo: \showsetupA{rugwit} \rugwit
+
+\startinterface german
+
+\gdef\showsetups%
+  {\noindent
+   \vbox
+     {\forgetall
+      \dontcomplain
+      \switchtobodyfont[\v!small]
+      \tabskip\zeropoint
+      \halign
+        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
+         \showsetupA{papierhoehe}          \papierhoehe
+         \showsetupA{papierbreite}         \papierbreite
+         \showsetupA{printpapierhoehe}     \printpapierhoehe
+         \showsetupA{printpapierbreite}    \printpapierbreite
+         \showsetupA{kopfweite}            \kopfweite
+         \showsetupA{rumpfweite}           \rumpfweite
+         \showsetupA{hoehe}                \satzhoehe
+         \showsetupA{breite}               \satzbreite
+         \showsetupA{oben}                 \hoeheoben
+         \showsetupA{abstandoben}          \abstandoben
+         \showsetupA{kopfzeile}            \kopfzeilenhoehe
+         \showsetupA{kopfzeilenabstand}    \kopfzeilenabstand
+         \showsetupA{texthoehe}            \texthoehe
+         \showsetupA{fusszeileabstand}     \fusszeileabstand
+         \showsetupA{fusszeilen}           \fusszeilenhoehe
+         \showsetupA{abstandunten}         \abstandunten
+         \showsetupA{hoeheunten}           \hoeheunten
+         \showsetupA{linkerrand}           \breitelinkerrand
+         \showsetupA{abstandlinkerrand}    \abstandlinkerrand
+         \showsetupA{linkemarginal}        \linkemarginalbreite
+         \showsetupA{linkemarginalafstand} \linkemarginalafstand
+         \showsetupA{textbreite}           \textbreite
+         \showsetupA{rechtemarginalafstand}\rechtemarginalafstand
+         \showsetupA{rechtemarginal}       \rechtemarginalbreite
+         \showsetupA{abstandrechterrand}   \abstandrechterrand
+         \showsetupA{rechterrand}          \breiterechterrand
+         \showsetupB{fliesstext}           \the   \globalbodyfontsize
+         \showsetupB{linie}                \relax \normallineheight
+         \showsetupB{hoehe}                \relax \strutheightfactor
+         \showsetupB{tiefe}                \relax \strutdepthfactor
+         \showsetupB{topskip}              \relax \topskipfactor
+         \showsetupB{maxdepth}             \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\startinterface czech
+
+\gdef\showsetups%
+  {\noindent
+   \vbox
+     {\forgetall
+      \dontcomplain
+      \switchtobodyfont[\v!small]
+      \tabskip\zeropoint
+      \halign
+        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
+         \showsetupA{vyskapapiru}              \vyskapapiru
+         \showsetupA{sirkapapiru}              \sirkapapiru
+         \showsetupA{vyskatiskpapiru}          \vyskatiskpapiru
+         \showsetupA{sirkatiskpapiru}          \sirkatiskpapiru
+         \showsetupA{hornimezera}              \hornimezera
+         \showsetupA{spodnimezera}             \spodnimezera
+         \showsetupA{vyska}                    \vyskasazby
+         \showsetupA{breite}                   \sirkasazby
+         \showsetupA{vyskatextu}               \vyskatextu
+         \showsetupA{sirkatextu}               \sirkatextu
+         \showsetupA{horejsek}                 \vyskahorejsku
+         \showsetupA{vzdalenosthorejsku}       \vzdalenosthorejsku
+         \showsetupA{zahlavi}                  \vyskazahlavi
+         \showsetupA{vzdalenostzahlavi}        \vzdalenostzahlavi
+         \showsetupA{fusszeileabstand}         \vzdalenostupati
+         \showsetupA{upati}                    \vyskaupati
+         \showsetupA{vzdalenostspodku}         \vzdalenostspodku
+         \showsetupA{spodek}                   \vyakaspodku
+         \showsetupA{levyokraj}                \sirkalevehookraje
+         \showsetupA{vzdalenostlevehookraje}   \vzdalenostlevehookraje
+         \showsetupA{levamarginalie}           \sirkalevemarginalie
+         \showsetupA{vzdalenostlevemarginalie} \vzdalenostlevemarginalie
+         \showsetupA{vzdalenostpravemarginalie}\vzdalenostpravemarginalie
+         \showsetupA{pravamarginalie}          \sirkapravemarginalie
+         \showsetupA{vzdalenostpravehookraje}  \vzdalenostpravehookraje
+         \showsetupA{pravyokraj}               \sirkapravehookraje
+         \showsetupB{zakladnivelikost}         \the   \globalbodyfontsize
+         \showsetupB{linka}                    \relax \normallineheight
+         \showsetupB{vyska}                    \relax \strutheightfactor
+         \showsetupB{hloubka}                  \relax \strutdepthfactor
+         \showsetupB{topskip}                  \relax \topskipfactor
+         \showsetupB{maxdepth}                 \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\startinterface romanian
+
+\gdef\showsetups%
+  {\noindent
+   \vbox
+     {\forgetall
+      \dontcomplain
+      \switchtobodyfont[\v!small]
+      \tabskip\zeropoint
+      \halign
+        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
+         \showsetupA{paperheight}        \paperheight
+         \showsetupA{paperwidth}         \paperwidth
+         \showsetupA{printpaperheight}   \printpaperheight
+         \showsetupA{printpaperwidth}    \printpaperwidth
+         \showsetupA{topspace}           \topspace
+         \showsetupA{backspace}          \backspace
+         \showsetupA{height}             \makeupheight
+         \showsetupA{width}              \makeupwidth
+         \showsetupA{top}                \topheight
+         \showsetupA{topdistance}        \topdistance
+         \showsetupA{header}             \headerheight
+         \showsetupA{headerdistance}     \headerdistance
+         \showsetupA{textheight}         \textheight
+         \showsetupA{footerdistance}     \footerdistance
+         \showsetupA{footer}             \footerheight
+         \showsetupA{bottomdistance}     \bottomdistance
+         \showsetupA{bottom}             \bottomheight
+         \showsetupA{leftedge}           \leftedgewidth
+         \showsetupA{leftedgedistance}   \leftedgedistance
+         \showsetupA{leftmargin}         \leftmarginwidth
+         \showsetupA{leftmargindistance} \leftmargindistance
+         \showsetupA{textwidth}          \textwidth
+         \showsetupA{rightmargindistance}\rightmargindistance
+         \showsetupA{rightmargin}        \rightmarginwidth
+         \showsetupA{rightedgedistance}  \rightedgedistance
+         \showsetupA{rightedge}          \rightedgewidth
+         \showsetupB{bodyfontsize}       \the   \globalbodyfontsize
+         \showsetupB{line}               \relax \normallineheight
+         \showsetupB{height}             \relax \strutheightfactor
+         \showsetupB{depth}              \relax \strutdepthfactor
+         \showsetupB{topskip}            \relax \topskipfactor
+         \showsetupB{maxdepth}           \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\gdef\showlayout % interfereert lelijk met een \typefile er na
+  {\bgroup
+   \page
+   \showframe
+   \setuplayout[\c!marking=\v!on]
+   \dorecurse{4}{\showsetups\page}
+   \egroup}
+
+\gdef\showmargins
+  {\starttabulate
+   \NC asynchrone   \NC \doifoddpageelse     {odd}   {even} \NC \NR
+   \NC synchrone    \NC \doifrightpageelse   {right} {left} \NC \NR
+   \NC right margin \NC \the\rightmarginwidth               \NC \NR
+   \NC left margin  \NC \the\leftmarginwidth                \NC \NR
+   \NC outer margin \NC \the\outermarginwidth               \NC \NR
+   \NC inner margin \NC \the\innermarginwidth               \NC \NR
+   \stoptabulate}
+
+\protect \endinput
diff --git a/tex/context/base/page-run.mkiv b/tex/context/base/page-run.mkiv
new file mode 100644
index 000000000..ae5af81e9
--- /dev/null
+++ b/tex/context/base/page-run.mkiv
@@ -0,0 +1,382 @@
+%D \module
+%D   [       file=page-run,
+%D        version=2000.10.20,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Runtime Macros,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Runtime Macros}
+
+\unprotect
+
+\gdef\doshowprint[#1][#2][#3]%
+  {\framed
+     [\c!offset=\v!overlay,
+      \c!strut=\v!no]
+     {\forgetall
+      \dontcomplain
+      \globaldefs\minusone
+      \dimen0\pagegoal
+      \definepapersize[X][\c!width=4em, \c!height=6em]%
+      \definepapersize[Y][\c!width=12em,\c!height=14em]%
+      \setuppapersize[#1,X][#2,Y]%
+      \setuplayout[#3]%
+      \setbox0\vbox
+        {\framed
+          [\c!offset=\v!overlay,\c!strut=\v!no,
+           \c!width=\paperwidth,\c!height=\paperheight]
+          {\ss ABC\par DEF}}%
+      \doublesidedfalse
+      \def\cutmarklength{.5em}%
+      \addpagecutmarks0%
+      \replicatepagebox0%
+      \scalepagebox0%
+      \mirrorpaperbox0%
+      \orientpaperbox0%
+      \centerpagebox0%
+      \mirrorprintbox0%
+      \orientprintbox0%
+      \offsetprintbox0%
+      \pagegoal\dimen0
+      \box0}}
+
+\gdef\showprint
+  {\dotripleempty\doshowprint}
+
+% \switchnaarkorps[8pt]
+%
+% \startcombinatie[4*4]
+%   {\toonprint}                                       {\strut}
+%   {\toonprint[][][plaats=midden]}                    {\type{plaats=midden}}
+%   {\toonprint[][][plaats=midden,markering=aan]}      {\type{markering=aan}\break
+%                                                      \type{plaats=midden}}
+%   {\toonprint[][][plaats=midden,markering=aan,nx=2]} {\type{markering=aan}\break
+%                                                      \type{plaats=midden}\break
+%                                                      \type{nx=2}}
+%   {\toonprint[][][plaats=links]}                     {\type{plaats=links}}
+%   {\toonprint[][][plaats=rechts]}                    {\type{plaats=rechts}}
+%   {\toonprint[][][plaats={links,onder}]}             {\type{plaats={links,onder}}}
+%   {\toonprint[][][plaats={rechts,onder}]}            {\type{plaats={rechts,onder}}}
+%   {\toonprint[][][nx=2,ny=1]}                        {\type{nx=2,ny=1}}
+%   {\toonprint[][][nx=1,ny=2]}                        {\type{nx=1,ny=2}}
+%   {\toonprint[][][nx=2,ny=2]}                        {\type{nx=2,ny=2}}
+%   {\toonprint[][][nx=2,ny=2,plaats=midden]}          {\type{nx=2,ny=2}\break
+%                                                       \type{plaats=midden}}
+%   {\toonprint[][][rugoffset=3pt]}                    {\type{rugoffset=.5cm}}
+%   {\toonprint[][][kopoffset=3pt]}                    {\type{kopoffset=.5cm}}
+%   {\toonprint[][][schaal=1.5]}                       {\type{schaal=1.5}}
+%   {\toonprint[][][schaal=0.8]}                       {\type{schaal=0.8}}
+% \stopcombinatie
+%
+% \startcombinatie[3*4]
+%   {\toonprint[liggend][][plaats=midden]}              {\type{liggend}}
+%   {\toonprint[][liggend][plaats=midden]}              {\strut\break\type{liggend}}
+%   {\toonprint[liggend][liggend][plaats=midden]}       {\type{liggend}\break\type{liggend}}
+%   {\toonprint[90][][plaats=midden]}                   {\type{90}}
+%   {\toonprint[][90][plaats=midden]}                   {\strut\break\type{90}}
+%   {\toonprint[90][90][plaats=midden]}                 {\type{90}\break\type{90}}
+%   {\toonprint[180][][plaats=midden]}                  {\type{180}}
+%   {\toonprint[][180][plaats=midden]}                  {\strut\break\type{180}}
+%   {\toonprint[180][180][plaats=midden]}               {\type{180}\break\type{180}}
+%   {\toonprint[gespiegeld][][plaats=midden]}           {\type{gespiegeld}}
+%   {\toonprint[][gespiegeld][plaats=midden]}           {\strut\break\type{gespiegeld}}
+%   {\toonprint[gespiegeld][gespiegeld][plaats=midden]} {\type{gespiegeld}\break\type{gespiegeld}}
+% \stopcombinatie
+
+\gdef\doshowframe[#1][#2]%
+  {\ifsecondargument
+     \setupbackgrounds
+       [\v!page]
+       [\c!frame=\v!on,
+        \c!corner=\v!rectangular,
+        \c!frameoffset=\!!zeropoint,
+        \c!framedepth=\!!zeropoint,
+        \c!framecolor=layout:page]
+     \setupbackgrounds
+       [#1][#2]
+       [\c!background=,
+        \c!frame=\v!on,
+        \c!corner=\v!rectangular,
+        \c!frameoffset=\!!zeropoint,
+        \c!framedepth=\!!zeropoint,
+        \c!framecolor=]
+   \else\iffirstargument
+     \showframe
+       [\v!header,\v!text,\v!footer]
+       [#1]
+   \else
+     \showframe
+       [\v!header,\v!text,\v!footer]
+       [\v!leftedge,\v!leftmargin,
+        \v!text,
+        \v!rightmargin,\v!rightedge]
+   \fi\fi
+   \setupbackgrounds
+     [\c!state=\v!repeat]}
+
+\gdef\showframe{\dodoubleempty\doshowframe}
+
+\gdef\showsetupA#1#2%
+  {#1&\PtToCm{\the#2}&\the#2&\tttf\string#2\cr}
+
+\gdef\showsetupB#1#2#3%
+  {#1&\tttf\string#3\cr}
+
+% \startinterface english % english is fallback
+
+\gdef\showsetups
+  {\noindent
+   \vbox
+     {\forgetall
+      \dontcomplain
+      \switchtobodyfont[\v!small]
+      \tabskip\zeropoint
+      \halign
+        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
+         \showsetupA{paperheight}        \paperheight
+         \showsetupA{paperwidth}         \paperwidth
+         \showsetupA{printpaperheight}   \printpaperheight
+         \showsetupA{printpaperwidth}    \printpaperwidth
+         \showsetupA{topspace}           \topspace
+         \showsetupA{backspace}          \backspace
+         \showsetupA{height}             \makeupheight
+         \showsetupA{width}              \makeupwidth
+         \showsetupA{top}                \topheight
+         \showsetupA{topdistance}        \topdistance
+         \showsetupA{header}             \headerheight
+         \showsetupA{headerdistance}     \headerdistance
+         \showsetupA{textheight}         \textheight
+         \showsetupA{footerdistance}     \footerdistance
+         \showsetupA{footer}             \footerheight
+         \showsetupA{bottomdistance}     \bottomdistance
+         \showsetupA{bottom}             \bottomheight
+         \showsetupA{leftedge}           \leftedgewidth
+         \showsetupA{leftedgedistance}   \leftedgedistance
+         \showsetupA{leftmargin}         \leftmarginwidth
+         \showsetupA{leftmargindistance} \leftmargindistance
+         \showsetupA{textwidth}          \textwidth
+         \showsetupA{rightmargindistance}\rightmargindistance
+         \showsetupA{rightmargin}        \rightmarginwidth
+         \showsetupA{rightedgedistance}  \rightedgedistance
+         \showsetupA{rightedge}          \rightedgewidth
+         \showsetupB{bodyfontsize}       \the   \globalbodyfontsize
+         \showsetupB{line}               \relax \normallineheight
+         \showsetupB{height}             \relax \strutheightfactor
+         \showsetupB{depth}              \relax \strutdepthfactor
+         \showsetupB{topskip}            \relax \topskipfactor
+         \showsetupB{maxdepth}           \relax \maxdepthfactor}}}
+
+% \stopinterface
+
+\startinterface dutch
+
+\gdef\showsetups
+  {\noindent
+   \vbox
+     {\forgetall
+      \dontcomplain
+      \switchtobodyfont[\v!small]
+      \tabskip\zeropoint
+      \halign
+        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
+         \showsetupA{papierhoogte}       \papierhoogte
+         \showsetupA{papierbreedte}      \papierbreedte
+         \showsetupA{printpapierhoogte}  \printpapierhoogte
+         \showsetupA{printpapierbreedte} \printpapierbreedte
+         \showsetupA{kopwit}             \kopwit
+         \showsetupA{rugwit}             \rugwit
+         \showsetupA{snijwit}            \snijwit
+         \showsetupA{hoogte}             \zethoogte
+         \showsetupA{breedte}            \zetbreedte
+         \showsetupA{boven}              \bovenhoogte
+         \showsetupA{bovenafstand}       \bovenafstand
+         \showsetupA{hoofd}              \hoofdhoogte
+         \showsetupA{hoofdafstand}       \hoofdafstand
+         \showsetupA{teksthoogte}        \teksthoogte
+         \showsetupA{voetafstand}        \voetafstand
+         \showsetupA{voet}               \voethoogte
+         \showsetupA{onderafstand}       \onderafstand
+         \showsetupA{onder}              \onderhoogte
+         \showsetupA{linkerrand}         \linkerrandbreedte
+         \showsetupA{linkerrandafstand}  \linkerrandafstand
+         \showsetupA{linkermarge}        \linkermargebreedte
+         \showsetupA{linkermargeafstand} \linkermargeafstand
+         \showsetupA{tekstbreedte}       \tekstbreedte
+         \showsetupA{rechtermargeafstand}\rechtermargeafstand
+         \showsetupA{rechtermarge}       \rechtermargebreedte
+         \showsetupA{rechterrandafstand} \rechterrandafstand
+         \showsetupA{rechterrand}        \rechterrandbreedte
+         \showsetupB{korps}              \the   \globalbodyfontsize
+         \showsetupB{regel}              \relax \normallineheight
+         \showsetupB{hoogte}             \relax \strutheightfactor
+         \showsetupB{diepte}             \relax \strutdepthfactor
+         \showsetupB{boven}              \relax \topskipfactor
+         \showsetupB{onder}              \relax \maxdepthfactor}}}
+
+\stopinterface
+
+% todo: \showsetupA{rugwit} \rugwit
+
+\startinterface german
+
+\gdef\showsetups%
+  {\noindent
+   \vbox
+     {\forgetall
+      \dontcomplain
+      \switchtobodyfont[\v!small]
+      \tabskip\zeropoint
+      \halign
+        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
+         \showsetupA{papierhoehe}          \papierhoehe
+         \showsetupA{papierbreite}         \papierbreite
+         \showsetupA{printpapierhoehe}     \printpapierhoehe
+         \showsetupA{printpapierbreite}    \printpapierbreite
+         \showsetupA{kopfweite}            \kopfweite
+         \showsetupA{rumpfweite}           \rumpfweite
+         \showsetupA{hoehe}                \satzhoehe
+         \showsetupA{breite}               \satzbreite
+         \showsetupA{oben}                 \hoeheoben
+         \showsetupA{abstandoben}          \abstandoben
+         \showsetupA{kopfzeile}            \kopfzeilenhoehe
+         \showsetupA{kopfzeilenabstand}    \kopfzeilenabstand
+         \showsetupA{texthoehe}            \texthoehe
+         \showsetupA{fusszeileabstand}     \fusszeileabstand
+         \showsetupA{fusszeilen}           \fusszeilenhoehe
+         \showsetupA{abstandunten}         \abstandunten
+         \showsetupA{hoeheunten}           \hoeheunten
+         \showsetupA{linkerrand}           \breitelinkerrand
+         \showsetupA{abstandlinkerrand}    \abstandlinkerrand
+         \showsetupA{linkemarginal}        \linkemarginalbreite
+         \showsetupA{linkemarginalafstand} \linkemarginalafstand
+         \showsetupA{textbreite}           \textbreite
+         \showsetupA{rechtemarginalafstand}\rechtemarginalafstand
+         \showsetupA{rechtemarginal}       \rechtemarginalbreite
+         \showsetupA{abstandrechterrand}   \abstandrechterrand
+         \showsetupA{rechterrand}          \breiterechterrand
+         \showsetupB{fliesstext}           \the   \globalbodyfontsize
+         \showsetupB{linie}                \relax \normallineheight
+         \showsetupB{hoehe}                \relax \strutheightfactor
+         \showsetupB{tiefe}                \relax \strutdepthfactor
+         \showsetupB{topskip}              \relax \topskipfactor
+         \showsetupB{maxdepth}             \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\startinterface czech
+
+\gdef\showsetups%
+  {\noindent
+   \vbox
+     {\forgetall
+      \dontcomplain
+      \switchtobodyfont[\v!small]
+      \tabskip\zeropoint
+      \halign
+        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
+         \showsetupA{vyskapapiru}              \vyskapapiru
+         \showsetupA{sirkapapiru}              \sirkapapiru
+         \showsetupA{vyskatiskpapiru}          \vyskatiskpapiru
+         \showsetupA{sirkatiskpapiru}          \sirkatiskpapiru
+         \showsetupA{hornimezera}              \hornimezera
+         \showsetupA{spodnimezera}             \spodnimezera
+         \showsetupA{vyska}                    \vyskasazby
+         \showsetupA{breite}                   \sirkasazby
+         \showsetupA{vyskatextu}               \vyskatextu
+         \showsetupA{sirkatextu}               \sirkatextu
+         \showsetupA{horejsek}                 \vyskahorejsku
+         \showsetupA{vzdalenosthorejsku}       \vzdalenosthorejsku
+         \showsetupA{zahlavi}                  \vyskazahlavi
+         \showsetupA{vzdalenostzahlavi}        \vzdalenostzahlavi
+         \showsetupA{fusszeileabstand}         \vzdalenostupati
+         \showsetupA{upati}                    \vyskaupati
+         \showsetupA{vzdalenostspodku}         \vzdalenostspodku
+         \showsetupA{spodek}                   \vyakaspodku
+         \showsetupA{levyokraj}                \sirkalevehookraje
+         \showsetupA{vzdalenostlevehookraje}   \vzdalenostlevehookraje
+         \showsetupA{levamarginalie}           \sirkalevemarginalie
+         \showsetupA{vzdalenostlevemarginalie} \vzdalenostlevemarginalie
+         \showsetupA{vzdalenostpravemarginalie}\vzdalenostpravemarginalie
+         \showsetupA{pravamarginalie}          \sirkapravemarginalie
+         \showsetupA{vzdalenostpravehookraje}  \vzdalenostpravehookraje
+         \showsetupA{pravyokraj}               \sirkapravehookraje
+         \showsetupB{zakladnivelikost}         \the   \globalbodyfontsize
+         \showsetupB{linka}                    \relax \normallineheight
+         \showsetupB{vyska}                    \relax \strutheightfactor
+         \showsetupB{hloubka}                  \relax \strutdepthfactor
+         \showsetupB{topskip}                  \relax \topskipfactor
+         \showsetupB{maxdepth}                 \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\startinterface romanian
+
+\gdef\showsetups%
+  {\noindent
+   \vbox
+     {\forgetall
+      \dontcomplain
+      \switchtobodyfont[\v!small]
+      \tabskip\zeropoint
+      \halign
+        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
+         \showsetupA{paperheight}        \paperheight
+         \showsetupA{paperwidth}         \paperwidth
+         \showsetupA{printpaperheight}   \printpaperheight
+         \showsetupA{printpaperwidth}    \printpaperwidth
+         \showsetupA{topspace}           \topspace
+         \showsetupA{backspace}          \backspace
+         \showsetupA{height}             \makeupheight
+         \showsetupA{width}              \makeupwidth
+         \showsetupA{top}                \topheight
+         \showsetupA{topdistance}        \topdistance
+         \showsetupA{header}             \headerheight
+         \showsetupA{headerdistance}     \headerdistance
+         \showsetupA{textheight}         \textheight
+         \showsetupA{footerdistance}     \footerdistance
+         \showsetupA{footer}             \footerheight
+         \showsetupA{bottomdistance}     \bottomdistance
+         \showsetupA{bottom}             \bottomheight
+         \showsetupA{leftedge}           \leftedgewidth
+         \showsetupA{leftedgedistance}   \leftedgedistance
+         \showsetupA{leftmargin}         \leftmarginwidth
+         \showsetupA{leftmargindistance} \leftmargindistance
+         \showsetupA{textwidth}          \textwidth
+         \showsetupA{rightmargindistance}\rightmargindistance
+         \showsetupA{rightmargin}        \rightmarginwidth
+         \showsetupA{rightedgedistance}  \rightedgedistance
+         \showsetupA{rightedge}          \rightedgewidth
+         \showsetupB{bodyfontsize}       \the   \globalbodyfontsize
+         \showsetupB{line}               \relax \normallineheight
+         \showsetupB{height}             \relax \strutheightfactor
+         \showsetupB{depth}              \relax \strutdepthfactor
+         \showsetupB{topskip}            \relax \topskipfactor
+         \showsetupB{maxdepth}           \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\gdef\showlayout % interfereert lelijk met een \typefile er na
+  {\bgroup
+   \page
+   \showframe
+   \setuplayout[\c!marking=\v!on]
+   \dorecurse{4}{\showsetups\page}
+   \egroup}
+
+\gdef\showmargins
+  {\starttabulate
+   \NC asynchrone   \NC \doifoddpageelse     {odd}   {even} \NC \NR
+   \NC synchrone    \NC \doifrightpageelse   {right} {left} \NC \NR
+   \NC right margin \NC \the\rightmarginwidth               \NC \NR
+   \NC left margin  \NC \the\leftmarginwidth                \NC \NR
+   \NC outer margin \NC \the\outermarginwidth               \NC \NR
+   \NC inner margin \NC \the\innermarginwidth               \NC \NR
+   \stoptabulate}
+
+\protect \endinput
diff --git a/tex/context/base/page-run.tex b/tex/context/base/page-run.tex
deleted file mode 100644
index ae5af81e9..000000000
--- a/tex/context/base/page-run.tex
+++ /dev/null
@@ -1,382 +0,0 @@
-%D \module
-%D   [       file=page-run,
-%D        version=2000.10.20,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Runtime Macros,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Runtime Macros}
-
-\unprotect
-
-\gdef\doshowprint[#1][#2][#3]%
-  {\framed
-     [\c!offset=\v!overlay,
-      \c!strut=\v!no]
-     {\forgetall
-      \dontcomplain
-      \globaldefs\minusone
-      \dimen0\pagegoal
-      \definepapersize[X][\c!width=4em, \c!height=6em]%
-      \definepapersize[Y][\c!width=12em,\c!height=14em]%
-      \setuppapersize[#1,X][#2,Y]%
-      \setuplayout[#3]%
-      \setbox0\vbox
-        {\framed
-          [\c!offset=\v!overlay,\c!strut=\v!no,
-           \c!width=\paperwidth,\c!height=\paperheight]
-          {\ss ABC\par DEF}}%
-      \doublesidedfalse
-      \def\cutmarklength{.5em}%
-      \addpagecutmarks0%
-      \replicatepagebox0%
-      \scalepagebox0%
-      \mirrorpaperbox0%
-      \orientpaperbox0%
-      \centerpagebox0%
-      \mirrorprintbox0%
-      \orientprintbox0%
-      \offsetprintbox0%
-      \pagegoal\dimen0
-      \box0}}
-
-\gdef\showprint
-  {\dotripleempty\doshowprint}
-
-% \switchnaarkorps[8pt]
-%
-% \startcombinatie[4*4]
-%   {\toonprint}                                       {\strut}
-%   {\toonprint[][][plaats=midden]}                    {\type{plaats=midden}}
-%   {\toonprint[][][plaats=midden,markering=aan]}      {\type{markering=aan}\break
-%                                                      \type{plaats=midden}}
-%   {\toonprint[][][plaats=midden,markering=aan,nx=2]} {\type{markering=aan}\break
-%                                                      \type{plaats=midden}\break
-%                                                      \type{nx=2}}
-%   {\toonprint[][][plaats=links]}                     {\type{plaats=links}}
-%   {\toonprint[][][plaats=rechts]}                    {\type{plaats=rechts}}
-%   {\toonprint[][][plaats={links,onder}]}             {\type{plaats={links,onder}}}
-%   {\toonprint[][][plaats={rechts,onder}]}            {\type{plaats={rechts,onder}}}
-%   {\toonprint[][][nx=2,ny=1]}                        {\type{nx=2,ny=1}}
-%   {\toonprint[][][nx=1,ny=2]}                        {\type{nx=1,ny=2}}
-%   {\toonprint[][][nx=2,ny=2]}                        {\type{nx=2,ny=2}}
-%   {\toonprint[][][nx=2,ny=2,plaats=midden]}          {\type{nx=2,ny=2}\break
-%                                                       \type{plaats=midden}}
-%   {\toonprint[][][rugoffset=3pt]}                    {\type{rugoffset=.5cm}}
-%   {\toonprint[][][kopoffset=3pt]}                    {\type{kopoffset=.5cm}}
-%   {\toonprint[][][schaal=1.5]}                       {\type{schaal=1.5}}
-%   {\toonprint[][][schaal=0.8]}                       {\type{schaal=0.8}}
-% \stopcombinatie
-%
-% \startcombinatie[3*4]
-%   {\toonprint[liggend][][plaats=midden]}              {\type{liggend}}
-%   {\toonprint[][liggend][plaats=midden]}              {\strut\break\type{liggend}}
-%   {\toonprint[liggend][liggend][plaats=midden]}       {\type{liggend}\break\type{liggend}}
-%   {\toonprint[90][][plaats=midden]}                   {\type{90}}
-%   {\toonprint[][90][plaats=midden]}                   {\strut\break\type{90}}
-%   {\toonprint[90][90][plaats=midden]}                 {\type{90}\break\type{90}}
-%   {\toonprint[180][][plaats=midden]}                  {\type{180}}
-%   {\toonprint[][180][plaats=midden]}                  {\strut\break\type{180}}
-%   {\toonprint[180][180][plaats=midden]}               {\type{180}\break\type{180}}
-%   {\toonprint[gespiegeld][][plaats=midden]}           {\type{gespiegeld}}
-%   {\toonprint[][gespiegeld][plaats=midden]}           {\strut\break\type{gespiegeld}}
-%   {\toonprint[gespiegeld][gespiegeld][plaats=midden]} {\type{gespiegeld}\break\type{gespiegeld}}
-% \stopcombinatie
-
-\gdef\doshowframe[#1][#2]%
-  {\ifsecondargument
-     \setupbackgrounds
-       [\v!page]
-       [\c!frame=\v!on,
-        \c!corner=\v!rectangular,
-        \c!frameoffset=\!!zeropoint,
-        \c!framedepth=\!!zeropoint,
-        \c!framecolor=layout:page]
-     \setupbackgrounds
-       [#1][#2]
-       [\c!background=,
-        \c!frame=\v!on,
-        \c!corner=\v!rectangular,
-        \c!frameoffset=\!!zeropoint,
-        \c!framedepth=\!!zeropoint,
-        \c!framecolor=]
-   \else\iffirstargument
-     \showframe
-       [\v!header,\v!text,\v!footer]
-       [#1]
-   \else
-     \showframe
-       [\v!header,\v!text,\v!footer]
-       [\v!leftedge,\v!leftmargin,
-        \v!text,
-        \v!rightmargin,\v!rightedge]
-   \fi\fi
-   \setupbackgrounds
-     [\c!state=\v!repeat]}
-
-\gdef\showframe{\dodoubleempty\doshowframe}
-
-\gdef\showsetupA#1#2%
-  {#1&\PtToCm{\the#2}&\the#2&\tttf\string#2\cr}
-
-\gdef\showsetupB#1#2#3%
-  {#1&\tttf\string#3\cr}
-
-% \startinterface english % english is fallback
-
-\gdef\showsetups
-  {\noindent
-   \vbox
-     {\forgetall
-      \dontcomplain
-      \switchtobodyfont[\v!small]
-      \tabskip\zeropoint
-      \halign
-        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
-         \showsetupA{paperheight}        \paperheight
-         \showsetupA{paperwidth}         \paperwidth
-         \showsetupA{printpaperheight}   \printpaperheight
-         \showsetupA{printpaperwidth}    \printpaperwidth
-         \showsetupA{topspace}           \topspace
-         \showsetupA{backspace}          \backspace
-         \showsetupA{height}             \makeupheight
-         \showsetupA{width}              \makeupwidth
-         \showsetupA{top}                \topheight
-         \showsetupA{topdistance}        \topdistance
-         \showsetupA{header}             \headerheight
-         \showsetupA{headerdistance}     \headerdistance
-         \showsetupA{textheight}         \textheight
-         \showsetupA{footerdistance}     \footerdistance
-         \showsetupA{footer}             \footerheight
-         \showsetupA{bottomdistance}     \bottomdistance
-         \showsetupA{bottom}             \bottomheight
-         \showsetupA{leftedge}           \leftedgewidth
-         \showsetupA{leftedgedistance}   \leftedgedistance
-         \showsetupA{leftmargin}         \leftmarginwidth
-         \showsetupA{leftmargindistance} \leftmargindistance
-         \showsetupA{textwidth}          \textwidth
-         \showsetupA{rightmargindistance}\rightmargindistance
-         \showsetupA{rightmargin}        \rightmarginwidth
-         \showsetupA{rightedgedistance}  \rightedgedistance
-         \showsetupA{rightedge}          \rightedgewidth
-         \showsetupB{bodyfontsize}       \the   \globalbodyfontsize
-         \showsetupB{line}               \relax \normallineheight
-         \showsetupB{height}             \relax \strutheightfactor
-         \showsetupB{depth}              \relax \strutdepthfactor
-         \showsetupB{topskip}            \relax \topskipfactor
-         \showsetupB{maxdepth}           \relax \maxdepthfactor}}}
-
-% \stopinterface
-
-\startinterface dutch
-
-\gdef\showsetups
-  {\noindent
-   \vbox
-     {\forgetall
-      \dontcomplain
-      \switchtobodyfont[\v!small]
-      \tabskip\zeropoint
-      \halign
-        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
-         \showsetupA{papierhoogte}       \papierhoogte
-         \showsetupA{papierbreedte}      \papierbreedte
-         \showsetupA{printpapierhoogte}  \printpapierhoogte
-         \showsetupA{printpapierbreedte} \printpapierbreedte
-         \showsetupA{kopwit}             \kopwit
-         \showsetupA{rugwit}             \rugwit
-         \showsetupA{snijwit}            \snijwit
-         \showsetupA{hoogte}             \zethoogte
-         \showsetupA{breedte}            \zetbreedte
-         \showsetupA{boven}              \bovenhoogte
-         \showsetupA{bovenafstand}       \bovenafstand
-         \showsetupA{hoofd}              \hoofdhoogte
-         \showsetupA{hoofdafstand}       \hoofdafstand
-         \showsetupA{teksthoogte}        \teksthoogte
-         \showsetupA{voetafstand}        \voetafstand
-         \showsetupA{voet}               \voethoogte
-         \showsetupA{onderafstand}       \onderafstand
-         \showsetupA{onder}              \onderhoogte
-         \showsetupA{linkerrand}         \linkerrandbreedte
-         \showsetupA{linkerrandafstand}  \linkerrandafstand
-         \showsetupA{linkermarge}        \linkermargebreedte
-         \showsetupA{linkermargeafstand} \linkermargeafstand
-         \showsetupA{tekstbreedte}       \tekstbreedte
-         \showsetupA{rechtermargeafstand}\rechtermargeafstand
-         \showsetupA{rechtermarge}       \rechtermargebreedte
-         \showsetupA{rechterrandafstand} \rechterrandafstand
-         \showsetupA{rechterrand}        \rechterrandbreedte
-         \showsetupB{korps}              \the   \globalbodyfontsize
-         \showsetupB{regel}              \relax \normallineheight
-         \showsetupB{hoogte}             \relax \strutheightfactor
-         \showsetupB{diepte}             \relax \strutdepthfactor
-         \showsetupB{boven}              \relax \topskipfactor
-         \showsetupB{onder}              \relax \maxdepthfactor}}}
-
-\stopinterface
-
-% todo: \showsetupA{rugwit} \rugwit
-
-\startinterface german
-
-\gdef\showsetups%
-  {\noindent
-   \vbox
-     {\forgetall
-      \dontcomplain
-      \switchtobodyfont[\v!small]
-      \tabskip\zeropoint
-      \halign
-        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
-         \showsetupA{papierhoehe}          \papierhoehe
-         \showsetupA{papierbreite}         \papierbreite
-         \showsetupA{printpapierhoehe}     \printpapierhoehe
-         \showsetupA{printpapierbreite}    \printpapierbreite
-         \showsetupA{kopfweite}            \kopfweite
-         \showsetupA{rumpfweite}           \rumpfweite
-         \showsetupA{hoehe}                \satzhoehe
-         \showsetupA{breite}               \satzbreite
-         \showsetupA{oben}                 \hoeheoben
-         \showsetupA{abstandoben}          \abstandoben
-         \showsetupA{kopfzeile}            \kopfzeilenhoehe
-         \showsetupA{kopfzeilenabstand}    \kopfzeilenabstand
-         \showsetupA{texthoehe}            \texthoehe
-         \showsetupA{fusszeileabstand}     \fusszeileabstand
-         \showsetupA{fusszeilen}           \fusszeilenhoehe
-         \showsetupA{abstandunten}         \abstandunten
-         \showsetupA{hoeheunten}           \hoeheunten
-         \showsetupA{linkerrand}           \breitelinkerrand
-         \showsetupA{abstandlinkerrand}    \abstandlinkerrand
-         \showsetupA{linkemarginal}        \linkemarginalbreite
-         \showsetupA{linkemarginalafstand} \linkemarginalafstand
-         \showsetupA{textbreite}           \textbreite
-         \showsetupA{rechtemarginalafstand}\rechtemarginalafstand
-         \showsetupA{rechtemarginal}       \rechtemarginalbreite
-         \showsetupA{abstandrechterrand}   \abstandrechterrand
-         \showsetupA{rechterrand}          \breiterechterrand
-         \showsetupB{fliesstext}           \the   \globalbodyfontsize
-         \showsetupB{linie}                \relax \normallineheight
-         \showsetupB{hoehe}                \relax \strutheightfactor
-         \showsetupB{tiefe}                \relax \strutdepthfactor
-         \showsetupB{topskip}              \relax \topskipfactor
-         \showsetupB{maxdepth}             \relax \maxdepthfactor}}}
-
-\stopinterface
-
-\startinterface czech
-
-\gdef\showsetups%
-  {\noindent
-   \vbox
-     {\forgetall
-      \dontcomplain
-      \switchtobodyfont[\v!small]
-      \tabskip\zeropoint
-      \halign
-        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
-         \showsetupA{vyskapapiru}              \vyskapapiru
-         \showsetupA{sirkapapiru}              \sirkapapiru
-         \showsetupA{vyskatiskpapiru}          \vyskatiskpapiru
-         \showsetupA{sirkatiskpapiru}          \sirkatiskpapiru
-         \showsetupA{hornimezera}              \hornimezera
-         \showsetupA{spodnimezera}             \spodnimezera
-         \showsetupA{vyska}                    \vyskasazby
-         \showsetupA{breite}                   \sirkasazby
-         \showsetupA{vyskatextu}               \vyskatextu
-         \showsetupA{sirkatextu}               \sirkatextu
-         \showsetupA{horejsek}                 \vyskahorejsku
-         \showsetupA{vzdalenosthorejsku}       \vzdalenosthorejsku
-         \showsetupA{zahlavi}                  \vyskazahlavi
-         \showsetupA{vzdalenostzahlavi}        \vzdalenostzahlavi
-         \showsetupA{fusszeileabstand}         \vzdalenostupati
-         \showsetupA{upati}                    \vyskaupati
-         \showsetupA{vzdalenostspodku}         \vzdalenostspodku
-         \showsetupA{spodek}                   \vyakaspodku
-         \showsetupA{levyokraj}                \sirkalevehookraje
-         \showsetupA{vzdalenostlevehookraje}   \vzdalenostlevehookraje
-         \showsetupA{levamarginalie}           \sirkalevemarginalie
-         \showsetupA{vzdalenostlevemarginalie} \vzdalenostlevemarginalie
-         \showsetupA{vzdalenostpravemarginalie}\vzdalenostpravemarginalie
-         \showsetupA{pravamarginalie}          \sirkapravemarginalie
-         \showsetupA{vzdalenostpravehookraje}  \vzdalenostpravehookraje
-         \showsetupA{pravyokraj}               \sirkapravehookraje
-         \showsetupB{zakladnivelikost}         \the   \globalbodyfontsize
-         \showsetupB{linka}                    \relax \normallineheight
-         \showsetupB{vyska}                    \relax \strutheightfactor
-         \showsetupB{hloubka}                  \relax \strutdepthfactor
-         \showsetupB{topskip}                  \relax \topskipfactor
-         \showsetupB{maxdepth}                 \relax \maxdepthfactor}}}
-
-\stopinterface
-
-\startinterface romanian
-
-\gdef\showsetups%
-  {\noindent
-   \vbox
-     {\forgetall
-      \dontcomplain
-      \switchtobodyfont[\v!small]
-      \tabskip\zeropoint
-      \halign
-        {\strut##\quad\hss#\quad\hss#\quad\hss#\hss\cr
-         \showsetupA{paperheight}        \paperheight
-         \showsetupA{paperwidth}         \paperwidth
-         \showsetupA{printpaperheight}   \printpaperheight
-         \showsetupA{printpaperwidth}    \printpaperwidth
-         \showsetupA{topspace}           \topspace
-         \showsetupA{backspace}          \backspace
-         \showsetupA{height}             \makeupheight
-         \showsetupA{width}              \makeupwidth
-         \showsetupA{top}                \topheight
-         \showsetupA{topdistance}        \topdistance
-         \showsetupA{header}             \headerheight
-         \showsetupA{headerdistance}     \headerdistance
-         \showsetupA{textheight}         \textheight
-         \showsetupA{footerdistance}     \footerdistance
-         \showsetupA{footer}             \footerheight
-         \showsetupA{bottomdistance}     \bottomdistance
-         \showsetupA{bottom}             \bottomheight
-         \showsetupA{leftedge}           \leftedgewidth
-         \showsetupA{leftedgedistance}   \leftedgedistance
-         \showsetupA{leftmargin}         \leftmarginwidth
-         \showsetupA{leftmargindistance} \leftmargindistance
-         \showsetupA{textwidth}          \textwidth
-         \showsetupA{rightmargindistance}\rightmargindistance
-         \showsetupA{rightmargin}        \rightmarginwidth
-         \showsetupA{rightedgedistance}  \rightedgedistance
-         \showsetupA{rightedge}          \rightedgewidth
-         \showsetupB{bodyfontsize}       \the   \globalbodyfontsize
-         \showsetupB{line}               \relax \normallineheight
-         \showsetupB{height}             \relax \strutheightfactor
-         \showsetupB{depth}              \relax \strutdepthfactor
-         \showsetupB{topskip}            \relax \topskipfactor
-         \showsetupB{maxdepth}           \relax \maxdepthfactor}}}
-
-\stopinterface
-
-\gdef\showlayout % interfereert lelijk met een \typefile er na
-  {\bgroup
-   \page
-   \showframe
-   \setuplayout[\c!marking=\v!on]
-   \dorecurse{4}{\showsetups\page}
-   \egroup}
-
-\gdef\showmargins
-  {\starttabulate
-   \NC asynchrone   \NC \doifoddpageelse     {odd}   {even} \NC \NR
-   \NC synchrone    \NC \doifrightpageelse   {right} {left} \NC \NR
-   \NC right margin \NC \the\rightmarginwidth               \NC \NR
-   \NC left margin  \NC \the\leftmarginwidth                \NC \NR
-   \NC outer margin \NC \the\outermarginwidth               \NC \NR
-   \NC inner margin \NC \the\innermarginwidth               \NC \NR
-   \stoptabulate}
-
-\protect \endinput
diff --git a/tex/context/base/page-set.mkii b/tex/context/base/page-set.mkii
new file mode 100644
index 000000000..b8a075179
--- /dev/null
+++ b/tex/context/base/page-set.mkii
@@ -0,0 +1,3109 @@
+%D \module
+%D   [       file=page-set,
+%D        version=2000.10.20,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Column Sets,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% getnoflines vs getrawnoflines
+
+% some day: cleanup and go etex
+
+\writestatus{loading}{ConTeXt Page Macros / Column Sets}
+
+% todo : last longer than previous
+% todo : block span over last column if footnotes
+% todo : diagnosis balancing run
+% todo : separate footnote placement
+% todo : go on on same page with colset
+% todo : test page areas per page
+% todo : leftmargin/rightmargin (better than afstand(1))
+
+% use the OTRSET layer for more purposes, like the footnotes !
+
+\unprotect
+
+\newcount\tofcolumns % total
+\newcount\lofcolumns % left
+\newcount\rofcolumns % right
+
+\newcount\columnfirstcell \columnfirstcell=1
+\newcount\columnlastcell
+\newcount\columnfreecells
+\newcount\currenthcell
+\newcount\currentvcell
+\newcount\columnhcells
+\newcount\columnvcells
+
+\newif\ifenoughcolumncells
+\newif\ifsomefreecolumncells
+\newif\ifcolumnspread
+\newif\iftracecolumnset    %   \tracecolumnsettrue
+
+\def\columnmaxcells    {75} % runtime
+\def\columnmaxfreecells {0} % runtime
+\def\columngaplimit     {0} % {5}
+
+\def\@otr@{otr}
+
+\def\OTRSETmakeupwidth{\innermakeupwidth}
+
+\let\OTRSETflushsidefloats      \forgetsidefloats % \relax
+\let\OTRSETsynchronizesidefloats\forgetsidefloats % \relax
+
+\def\OTRSETgridcell   #1#2{\csname              \@otr@:\number#1:\number#2\endcsname}
+\def\OTRSETgetgridcell#1#2{\box\csname          \@otr@:\number#1:\number#2\endcsname}
+\def\OTRSETsetgridcell#1#2{\global\setbox\csname\@otr@:\number#1:\number#2\endcsname}
+
+\long\def\OTRSETdoifcellelse#1#2%
+  {\relax\ifvoid\csname\@otr@:\number#1:\number#2\endcsname
+     \@EA\secondoftwoarguments\else\@EA\firstoftwoarguments
+   \fi}
+
+% The following two macros are used to compensate for a switch in body fonts
+% as in:
+%
+% \definecolumnset [two]  [n=2,balancing=yes]
+% \definecolumnset [three] [n=3,balancing=yes]
+%
+% \setupcolumnsetlines[two][1][1][7]
+% \setupcolumnsetlines[two][1][2][10]
+%
+% \setupcolumnsetlines[three][1][1][40]
+% \setupcolumnsetlines[three][1][2][40]
+% \setupcolumnsetlines[three][1][3][40]
+%
+% \setupcolumnsetstart[three][1][1][15]
+% \setupcolumnsetstart[three][1][2][20]
+% \setupcolumnsetstart[three][1][3][20]
+%
+% \starttext
+%   \startcolumnset [two] \dorecurse {1}{\input tufte \par} \stopcolumnset
+%   \switchtobodyfont[small]
+%   \startcolumnset [three] \dorecurse {1}{\input tufte \par} \stopcolumnset
+% \stoptext
+
+%D Marks in columnsets:
+%D
+%D \starttyping
+%D \definemarking[M]
+%D \setupheadertexts[\setups{show-M-marks}]
+%D \definecolumnset[test][n=3]
+%D
+%D \startsetups show-M-marks
+%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][1][last]\quad
+%D \getmarking[M][2][previous]/\getmarking[M][2][first]/\getmarking[M][2][last]\quad
+%D \getmarking[M][3][previous]/\getmarking[M][3][first]/\getmarking[M][3][last]\quad
+%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][last]\quad
+%D \getsavedmarking[M][previous]/\getsavedmarking[M][first]/\getsavedmarking[M][last]
+%D \stopsetups
+%D
+%D \startbuffer
+%D \section{Knuth} [K1]\marking[M]{k1} [K2]\marking[M]{k2} \input knuth
+%D \section{Zapf}  [Z]\marking[M]{z} \input zapf
+%D \stopbuffer
+%D
+%D \startbuffer
+%D \section{Ward} [W]\marking[M]{w} \input ward
+%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D \section{Davis} [D]\marking[M]{d} \input davis
+%D \section{Zapf} [Z]\marking[M]{z} \input zapf
+%D \stopbuffer
+%D
+%D \startbuffer
+%D \section{Ward} [W]\marking[M]{w} \input ward
+%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D \section{Davis} [D]\marking[M]{d} \input davis
+%D \section{Zapf} [Z]\marking[M]{z} \input zapf
+%D \section{Douglas} [O]\marking[M]{o} \input douglas
+%D \stopbuffer
+%D
+%D \starttext
+%D   \startcolumnset[test]
+%D     \dorecurse{5}{\getbuffer}
+%D     \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D     % \column % sometimes needed
+%D   \stopcolumnset
+%D \stoptext
+%D \stoptyping
+
+% not ok yet, for column sets we need a special case: within a column we
+% need to bubble-up the marks; the indirectness permits overloading here
+
+\let\saveOTRSETmark  \refreshsavedmark
+\let\bubbleOTRSETmark\bubblesavedmark
+\let\resetOTRSETmark \resetsavedmark
+\let\presetOTRSETmark\presetsavedmark
+
+\def\doregisterOTRSETmarks#1{\saveOTRSETmark  [#1][\number\mofcolumns]}
+\def\dobubbleOTRSETmarks  #1{\bubbleOTRSETmark[#1][\number\mofcolumns]}
+\def\doresetOTRSETmarks   #1{\resetOTRSETmark [#1][\recurselevel]}
+\def\dopresetOTRSETmarks  #1{\presetOTRSETmark[#1][\recurselevel]}
+
+\def\registerOTRSETmarks
+  {\processcommacommand[\alldefinedmarks]\doregisterOTRSETmarks}
+\def\bubbleOTRSETmarks
+  {\processcommacommand[\alldefinedmarks]\dobubbleOTRSETmarks}
+\def\resetOTRSETmarks
+  {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\doresetOTRSETmarks}}
+\def\presetOTRSETmarks
+  {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\dopresetOTRSETmarks}}
+
+%D test case of Vit Zika (context list):
+%D
+%D \starttyping
+%D \setuplayout[height=middle,width=middle,grid=yes]
+%D
+%D \starttext
+%D   \startcolumnset
+%D     \dorecurse{10}
+%D       {\input thuan \endgraf
+%D        \bgroup
+%D        \ss\restoreinterlinespace
+%D        \dorecurse{3}{\input hawking \endgraf}
+%D        \egroup
+%D        \input bryson \endgraf}
+%D   \stopcolumnset
+%D \stoptext
+%D \stoptyping
+
+\def\OTRSETsetcorrectnofcells#1%
+  {\bgroup
+   \!!counta#1\relax
+   \ifdim\globalbodyfontsize=\localbodyfontsize
+     \restoreinterlinespace
+   \else
+     \!!dimena-\!!counta\lineheight
+     \restoreglobalbodyfont % slow, we need a fast one
+     \advance\!!dimena\!!counta\lineheight
+     \getnoflines\!!dimena
+     \advance\!!counta\noflines
+     \ifnum\!!counta<#1\else
+       \!!counta#1\relax
+     \fi
+   \fi
+   \relax % needed ! ! ! ! else lookahead over \fi and \@EA
+   \@EA\egroup\@EA\scratchcounter\the\!!counta\relax}
+
+\def\OTRSETsetcorrectcellht
+  {\bgroup
+   \!!dimena-\strutht\relax
+   \ifdim\globalbodyfontsize=\localbodyfontsize
+     \restoreinterlinespace
+   \else
+     \restoreglobalbodyfont
+   \fi
+   \advance\!!dimena\strutht
+   \relax % needed ! ! ! ! else lookahead over \fi and \@EA
+   \@EA\egroup\@EA\scratchdimen\the\!!dimena\relax}
+
+\def\columnerasegridboxes % maybe dedicated loops
+  {\bgroup
+   \increment\columnmaxcells\relax
+   \ifodd\realpageno
+   \else % we are on the other page
+     \columnspreadfalse
+   \fi
+   \ifcolumnspread
+     \dorecurse\nofcolumns
+       {\let\!!stringa\recurselevel
+        \scratchcounter\recurselevel \advance\scratchcounter\lofcolumns
+        \edef\!!stringb{\the\scratchcounter}%
+        \dostepwiserecurse \zerocount \columnmaxcells \plusone
+          {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname
+             \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+             \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname
+               \box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+              %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+             \else
+               \emptybox
+              %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox
+               \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
+             \fi
+           \else
+             \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+             \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname
+               \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+             \else
+               \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
+             \fi
+           \fi}}%
+   \else
+     \dorecurse \tofcolumns
+       {\let\!!stringa\recurselevel
+        \dostepwiserecurse \zerocount \columnmaxcells \plusone
+          {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname
+             \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox
+           \else
+             \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+           \fi}}%
+   \fi
+   \dorecurse\tofcolumns
+     {\global\setbox\csname\@otr@:\recurselevel:\columnmaxcells\endcsname\copy\placeholderboxa}%
+   \global\columnfirstcell\zerocount
+   \global\columnlastcell\columnfirstcell
+   \global\columnfreecells\columnfirstcell
+   \egroup}
+
+\def\doOTRSETsetgridcells#1#2#3#4#5#6% placeholder col row wid hei {data}
+  {\!!countd#2\advance\!!countd#4\advance\!!countd\minusone
+   \!!counte#3\advance\!!counte#5\advance\!!counte\minusone
+   \dostepwiserecurse{#2}\!!countd\plusone
+     {\!!countf\recurselevel
+      \dostepwiserecurse{#3}\!!counte\plusone
+        {\OTRSETsetgridcell\!!countf\recurselevel#1}}%
+   \dostepwiserecurse{#3}\!!counte\plusone
+     {\global\wd\OTRSETgridcell{#2}\recurselevel\hsize}%
+   \OTRSETsetgridcell{#2}\!!counte#6}
+
+\def\OTRSETsetgridcells
+  {\doOTRSETsetgridcells{\copy\placeholderboxb}}
+
+\def\OTRSETerasegridcells#1#2#3#4%
+  {\doOTRSETsetgridcells{\emptybox}{#1}{#2}{#3}{#4}{\emptybox}}
+
+\def\setupcolumnsetlines{\doquintupleempty\dosetupcolumnsettrick[l]}
+\def\setupcolumnsetstart{\doquintupleempty\dosetupcolumnsettrick[s]}
+
+\def\dosetupcolumnsettrick[#1][#2][#3][#4][#5]% tag id page col value
+  {% not needed, is already relative
+   % \doifinstringelse{+}{#3}{\scratchcounter\realpageno}{\scratchcounter\zerocount}%
+   % \advance\scratchcounter#3\relax % \relax needed
+   % \setevalue{\??mc:#1:#2:\the\scratchcounter:\number#4}{\number#5}}
+   \iffifthargument
+     \setevalue{\??mc:#1:#2:\number#3:\number#4}{\number#5}%
+   \else
+     \setevalue{\??mc:#1:#2:\number#3:0}{\number#4}%
+   \fi}
+
+\def\currentcolumnmaxcellstag #1{\??mc:l:\OTRSETidentifier:\columnsetpage:\number#1}
+\def\currentcolumnstartcelltag#1{\??mc:s:\OTRSETidentifier:\columnsetpage:\number#1}
+
+\def\doresetcolumnsetlines#1%
+  {\ifcsname\currentcolumnmaxcellstag{#1}\endcsname
+     \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
+   \fi
+   \ifcsname\currentcolumnmaxcellstag{#1}\endcsname
+     \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
+   \fi}
+
+\def\currentcolumnsomecells#1#2%
+  {\ifcsname#1\mofcolumns\endcsname
+     \ifnum\csname#1\mofcolumns\endcsname=\zerocount
+       #2%
+     \else
+       \number\numexpr\ifnum\csname#1\mofcolumns\endcsname<\zerocount
+         \columnmaxcells+\fi\csname#1\mofcolumns\endcsname\relax
+     \fi
+   \else\ifcsname#10\endcsname
+     \ifnum\csname#10\endcsname=\zerocount
+       #2%
+     \else
+       \number\numexpr\ifnum\csname#10\endcsname<\zerocount
+         \columnmaxcells+\fi\csname#10\endcsname\relax
+     \fi
+   \else
+     #2%
+   \fi\fi}
+
+\def\currentcolumnmaxcells {\currentcolumnsomecells\currentcolumnmaxcellstag \columnmaxcells}
+\def\currentcolumnstartcell{\currentcolumnsomecells\currentcolumnstartcelltag\plusone}
+
+\def\OTRSETsetfreecells#1#2% col start
+  {\bgroup
+   \global\columnfirstcell\ifnum#2=0 1\else#2\fi\relax
+   \OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter
+   \edef\columnmaxcells{\the\scratchcounter}%
+   \ifnum\columnfirstcell>\columnmaxcells
+     \global\columnfreecells\zerocount
+     \global\columnfirstcell\plusone
+     \global\columnlastcell \zerocount
+     \global\somefreecolumncellsfalse
+    %\message{no cells a}%
+   \else
+     \doloop
+       {\ifnum\columnfirstcell>\columnmaxcells\relax
+          \exitloop
+        \else
+          \OTRSETdoifcellelse{#1}\columnfirstcell
+            {\global\advance\columnfirstcell\plusone}\exitloop
+        \fi}%
+     \global\columnlastcell\columnfirstcell
+     \doloop
+       {\ifnum\columnlastcell>\columnmaxcells\relax
+          \exitloop
+        \else
+          \OTRSETdoifcellelse{#1}\columnlastcell
+            {\global\advance\columnlastcell \minusone \exitloop}
+            {\global\advance\columnlastcell \plusone }%
+        \fi}%
+     \ifnum\columnfirstcell>\columnmaxcells
+       \global\columnfreecells\zerocount
+       \global\columnfirstcell\plusone
+       \global\columnlastcell \zerocount
+       \global\somefreecolumncellsfalse
+      %\message{no cells b}%
+     \else
+       \ifnum\columnlastcell>\columnmaxcells
+         \global\columnlastcell\columnmaxcells
+       \fi
+       \global\columnfreecells\columnlastcell
+       \global\advance\columnfreecells -\columnfirstcell
+       \global\advance\columnfreecells \plusone
+       \global\somefreecolumncellstrue
+      %\message{\number\columnfirstcell-\number\columnlastcell=\number\columnfreecells}%
+     \fi
+   \fi
+   \egroup}
+
+\def\OTRSETgetmaxfreecells#1#2% col start
+  {\let\columnmaxfreecells\!!zerocount
+   \let\columnfrmfreecells\!!zerocount
+   \pushmacro \columnmaxcells
+\OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter
+\edef\columnmaxcells{\the\scratchcounter}%
+   \scratchcounter\zerocount
+   \dostepwiserecurse{#2}\columnmaxcells\plusone
+     {\OTRSETdoifcellelse{#1}\recurselevel
+        {\ifnum\columnmaxfreecells<\scratchcounter
+           \edef\columnmaxfreecells{\the\scratchcounter}%
+           \let\columnfrmfreecells\recurselevel
+         \fi
+         \scratchcounter\zerocount}
+        {\advance\scratchcounter\plusone}}%
+   \popmacro\columnmaxcells}
+
+\long\def\OTRSETrecurseRL#1%
+  {\dostepwiserecurse\nofcolumns\plusone\minusone
+     {#1\hskip\OTRSETgetparameter\c!distance\recurselevel}}
+
+\def\OTRSETmakegridbox
+  {\ifcase\columndirection
+     \OTRSETdomakegridbox\plusone\nofcolumns\plusone
+   \else
+     \OTRSETdomakegridbox\nofcolumns\plusone\minusone
+   \fi}
+
+\def\OTRSETmakeupwidth{\makeupwidth} % temporary indirectness
+
+\def\OTRSETdomakegridbox#1#2#3%
+  {\hbox\bgroup
+   \dontcomplain
+   \forgetall % can go once in \flush
+   \!!heighta \textheight
+   % test first !
+   \hbox to \OTRSETmakeupwidth
+     {\dostepwiserecurse{#1}{#2}{#3}
+        {\mofcolumns\recurselevel
+         \localcolumnwidth\OTRSETlocalwidth\mofcolumns
+         \setbox\scratchbox\hbox\localframed
+           [\??mc\OTRSETidentifier\number\mofcolumns]%
+           [\c!width=\localcolumnwidth,\c!height=\!!heighta,\c!lines=]%
+           {}%
+         \wd\scratchbox\localcolumnwidth
+         \ht\scratchbox\!!heighta
+         \ifcase\columndirection
+           \hskip\OTRSETgetparameter\c!distance\recurselevel
+           \box\scratchbox
+         \else
+           \box\scratchbox
+           \hskip\OTRSETgetparameter\c!distance\recurselevel
+         \fi}}%
+   \hskip-\OTRSETmakeupwidth
+   % main text
+   \hbox to \OTRSETmakeupwidth
+     {\dostepwiserecurse{#1}{#2}{#3}
+        {\mofcolumns\recurselevel
+         \localcolumnwidth\OTRSETlocalwidth\mofcolumns
+         \offinterlineskip
+         \setbox\scratchbox\vbox to \!!heighta
+           {\topskipcorrection % not needed
+            \ifcase\OTRSETbalancemethod
+              % no
+            \or
+              % yes
+              \doifelselayerdata{OTRTEXT}\vfill\relax % temp hack
+            \or
+              % top
+            \or
+              % bottom
+              \vfill
+            \fi
+            \dorecurse\columnmaxcells
+              {\setbox\scratchbox\hbox{\OTRSETgetgridcell\mofcolumns\recurselevel}%
+%               {\setbox\scratchbox\hbox
+%                  {\localstarttextcolor
+%                   \OTRSETgetgridcell\mofcolumns\recurselevel
+%                   \localstoptextcolor}%
+               \ht\scratchbox\strutht
+               \dp\scratchbox\strutdp
+               \ifcase\columndirection
+                 \box\scratchbox
+               \else
+                 \hbox to \localcolumnwidth
+                   {\hskip\localcolumnwidth\llap{\box\scratchbox}}%
+               \fi
+               \par}%
+            \ifcase\OTRSETbalancemethod
+              % no
+            \else
+              % yes, top, bottom
+              \ifdim\globalbodyfontsize=\localbodyfontsize
+                \removedepth
+                \restoreglobalbodyfont
+                \vskip\strutdepth
+              \fi
+              \kern\zeropoint
+              \vss
+            \fi}%
+         \wd\scratchbox\localcolumnwidth % \textwidth
+         \ifcase\columndirection
+           \hskip\OTRSETgetparameter\c!distance\recurselevel\box\scratchbox
+         \else
+           \box\scratchbox\hskip\OTRSETgetparameter\c!distance\recurselevel
+         \fi}}%
+   \egroup}
+
+\let\OTRSETbalht\zeropoint
+
+\def\OTRSETreducegridbox % for the moment no difference between methods
+  {\globallet\OTRSETbalht\zeropoint
+   \ifcase\OTRSETbalancemethod
+     % no balancing
+   \else
+     \bgroup
+     \!!counta\columnmaxcells
+     \donetrue
+     \doloop
+       {\dorecurse\nofcolumns{\OTRSETdoifcellelse\recurselevel\!!counta\donefalse\donothing}%
+        \ifdone
+          \ifnum\!!counta>\plusone\advance\!!counta\minusone\else\exitloop\fi
+        \else
+          \exitloop
+        \fi}%
+     \ifnum\!!counta>\plusone
+       \!!heighta\lineheight
+       \multiply\!!heighta \!!counta
+       \advance\!!heighta \topskip
+       \advance\!!heighta -\lineheight
+     \else
+       \!!heighta\zeropoint
+     \fi
+     \xdef\OTRSETbalht{\the\!!heighta}%
+     \egroup
+   \fi}
+
+\def\OTRSETflushfinalfootnotes
+  {\ifcase\lastcolumnlastcell \else
+     \setbox\scratchbox\hbox
+       {\placebottomnotes}%
+     \ifdim\ht\scratchbox>\zeropoint
+       \setbox\scratchbox\hbox
+         {\hbox to \zeropoint{\OTRSETgetgridcell\nofcolumns\lastcolumnlastcell}%
+          \box\scratchbox}%
+       \ht\scratchbox\strutht
+       \dp\scratchbox\strutdp
+       \OTRSETsetgridcell\nofcolumns\lastcolumnlastcell\box\scratchbox
+     \fi
+     \global\lastcolumnlastcell\zerocount
+   \fi}
+
+\def\OTRSETdoflush
+  {\ifcollectingcontent
+     \registerOTRSETmarks
+     \global\mofcolumns\plusone
+   \else
+     \OTRSETdofinalflush
+     \OTRSETdofinaloutput
+     \ifnum\columnsetpage>0
+       \dorecurse\nofcolumns{\doresetcolumnsetlines\recurselevel}%
+     \fi
+     \doglobal\increment\columnsetpage
+     \OTRSETinitializecolumns
+    %\OTRSETdoflushfloats
+     \OTRSETstartnextpage
+\presetOTRSETmarks
+     \initializecolumntextareas
+   \fi}
+
+\newbox\OTRfinalpagebox
+
+\def\OTRSETdofinalflush % see \OTRSETdoflush
+  {\OTRSETflushfinalfootnotes
+   \placecolumntextareas
+   \OTRSETcentergridcells
+   \bgroup % we want to keep the reduction local
+     \OTRSETreducegridbox
+     \global\setbox\OTRfinalpagebox\OTRSETmakegridbox
+   \egroup % otherwise we get the wrong number of free cells
+  %\gdef\localcolumnmaxcells{0}% here ?
+   \global\mofcolumns\nofcolumns} % otherwise problems in finaloutput
+
+% \def\OTRSETdofinaloutput
+%   {\ifdim\ht\OTRfinalpagebox=\teksthoogte
+%    % \bgroup \let\OTRSETsetvsize\relax % prevents useless search for gap
+%      \ifcase\OTRSETbalancemethod
+%        \finaloutput\box\OTRfinalpagebox
+%      \else\ifdim\OTRSETbalht>\zeropoint
+%        \global\setbox\OTRfinalpagebox \iftracecolumnset\ruledvbox\else\vbox\fi to \OTRSETbalht
+%          {\box\OTRfinalpagebox}%
+%        \global\dp\OTRfinalpagebox\strutdepth
+%        \box\OTRfinalpagebox
+%      \else
+%        \finaloutput\box\OTRfinalpagebox
+%      \fi \fi
+%      \globallet\OTRSETbalht\zeropoint
+%    % \egroup
+%    \fi}
+
+\def\OTRSETdofinaloutput
+  {\ifdim\ht\OTRfinalpagebox=\textheight
+    \bgroup % \let\OTRSETsetvsize\relax % prevents useless search for gap
+     \ifcase\OTRSETbalancemethod
+       \finaloutput\box\OTRfinalpagebox
+     \else\ifdim\OTRSETbalht>\zeropoint
+       % catch a bordercase
+       \scratchdimen\OTRSETbalht
+       \advance\scratchdimen\lineheight\relax
+       \ifdim\scratchdimen>\textheight
+         % full page
+         \finaloutput\box\OTRfinalpagebox
+       \else
+         % same page
+         \global\setbox\OTRfinalpagebox \iftracecolumnset\ruledvbox\else\vbox\fi to \OTRSETbalht
+           {\box\OTRfinalpagebox\vss}%
+         \setlayer[OTRTEXT]{\box\OTRfinalpagebox}%
+         \snaptogrid\vbox{\vskip\OTRSETbalht}% hack
+       \fi
+     \else
+       \finaloutput\box\OTRfinalpagebox
+     \fi \fi
+     \globallet\OTRSETbalht\zeropoint
+    \egroup
+   \fi}
+
+\definesystemvariable {mc}
+\definesystemvariable {mt}
+\definesystemconstant {colset}
+
+\definetwopasslist\s!colset
+
+\newdimen  \OTRSETtextswidth
+\newdimen  \OTRSETtextsheight
+\let       \OTRSETidentifier=\empty
+
+\newtoks   \OTRSEToutput
+
+\def\OTRSETgetparameter#1#2{\csname\??mc\OTRSETidentifier\number#2#1\endcsname}
+\def\OTRSETsetparameter#1#2{\setvalue{\??mc\OTRSETidentifier\number#2#1}}
+
+\def\OTRSETskipstart
+  {\scratchcounter\executeifdefined{\??mc\OTRSETidentifier\c!start}\zerocount
+   \relax % needed !
+   \ifcase\scratchcounter\else
+     \advance\scratchcounter\plusone
+     \doOTRSETsetgridcells
+       {\copy\placeholderboxe}
+       \plusone\plusone\nofcolumns\scratchcounter
+       \null
+   \fi}
+
+\def\OTRSETsetvsize % snap per sectie (gap here?)
+  {\ifcollectingcontent \else % can be assigndimen
+\OTRSETskipstart % not that well tested
+     \OTRSETcheckinsert % added
+     \OTRSETsetfreecells\mofcolumns\columnfirstcell
+     \ifsomefreecolumncells
+       \global\vsize\columnfreecells\lineheight
+       \ifinotr % else problems with floats, see extreme
+         \global\pagegoal\vsize % niet nodig, tenzij binnen otr
+       \fi
+       \synchronizeoutput % fails on example
+      % \allowbreak % hm
+     \fi
+     \synchronizenotes
+   \fi}
+
+\def\OTRSETsethsize % of course this does not migrate outside the otr
+  {\localcolumnwidth\OTRSETlocalwidth\mofcolumns
+   \textwidth\localcolumnwidth
+   \hsize\localcolumnwidth}
+
+\def\OTRSETsynchronizehsize
+  {\ifcase0\getvalue{\??mc\??mc\c!width}\else % some width set
+     \bgroup
+     \scratchdimen\OTRSETlocalwidth\mofcolumns
+     \ifdim\scratchdimen=\textwidth
+       \egroup
+     \else
+       % only if change in width and \column/\break
+       \egroup \OTRSETsethsize
+     \fi
+   \fi}
+
+\def\OTRSETcheckfreelines
+  {\OTRSETsetvsize}
+
+\def\doOTRSETcolumnseparator
+  {\hbox to \zeropoint{\hss\red\vl\hss}}
+
+\let\OTRSETcolumnseparator\relax
+
+\def\showbreaks
+  {\let\OTRSETcolumnseparator\doOTRSETcolumnseparator}
+
+% \installcolumnbreakhandler {SET} \v!ja
+%   {% hmmm:
+%    \ifhmode
+%      \bgroup
+%      \removeunwantedspaces
+%      \parfillskip\zeropoint
+%      \OTRSETcolumnseparator
+%      \par
+%      \egroup
+%    \fi
+%    % brrr:
+%    \ejectinsert
+%    \ejectpage
+%    \OTRSETsynchronizehsize} % no \OTRSETsethsize, can be mid smaller (like tabulate)
+%
+% \installcolumnbreakhandler {SET} \v!forceer
+%   {\OTRSETgotocolumn[\v!forceer]}
+% \installcolumnbreakhandler {SET} \v!eerste
+%   {\OTRSETgotocolumn[\v!eerste]}
+% \installcolumnbreakhandler {SET} \v!laatste
+%   {\OTRSETgotocolumn[\v!laatste]}
+%
+% \installcolumnbreakhandler {SET} \v!pagina
+%   {\simplepagebreak % \flushnotes \executepagebreakhandler\v!ja
+%    \ifnum\mofcolumns>\plusone
+%      \OTRSETgotocolumn[\v!laatste,\v!forceer]%
+%    \fi}
+
+\def\OTRSETcolumnhbreak
+  {\ifhmode
+     \bgroup
+     \removeunwantedspaces
+     \parfillskip\zeropoint
+     \OTRSETcolumnseparator
+     \par
+     \egroup
+   \fi}
+
+\installcolumnbreakhandler {SET} \v!local
+  {\OTRSETcolumnhbreak
+   \ejectinsert
+   \ejectpage % brrr
+   % no \OTRSETsethsize, can be mid smaller (like tabulate)
+   % also, this one should be executed at the outer level
+   % (setting hsize inside otr does not work)
+   \OTRSETsynchronizehsize}
+
+% We need to make sure that we really leave the column; mid
+% column we may end up in an empty gap, and we don't want to
+% stay there (basically such a gap is a small empty page
+% then).
+
+\installcolumnbreakhandler {SET} \v!yes
+  {\OTRSETcolumnhbreak
+   \edef\savedmofcolumns{\the\mofcolumns}%
+   \edef\savedrealpageno{\the\realpageno}%
+   \ejectinsert
+   \ejectpage % brrr
+   \doloop
+     {\ifnum\savedmofcolumns=\mofcolumns
+        \ifnum\savedrealpageno=\realpageno
+          \OTRSETdummycolumn
+        \else
+          \exitloop
+        \fi
+      \else
+        \exitloop
+      \fi}%
+   \OTRSETsynchronizehsize}
+
+\installcolumnbreakhandler {SET} \s!unknown
+  {\expanded{\OTRSETgotocolumn[\@@columnspecification]}}
+
+\installcolumnbreakhandler {SET} \v!page
+  {\vfill\eject % \doejectpage\eject
+   \OTRSETgotonextpage}
+
+\newtoks\OTRSETeverystartofcolumn
+
+\newbox\OTRSETsavedfootnotes
+
+% \installoutput\OTRSETflushtextsofar % spacing goes wrong
+
+%\def\OTRSETflushtextsofar
+%  {\ifvoid\normalpagebox \else
+%     \setbox\scratchbox\vbox{\unvbox\normalpagebox}%
+%     \OTRSETsavenotes
+%     \OTRSEThandleflushedtext0
+%   \fi}
+
+% The complication is in the fact that when the HERE float
+% is placed, the otr is not invoked when there is not yet
+% enough content; this can lead to a change in order (turning
+% on the tracer with option 0 is very instructive, watch the
+% small numbers in the margin)
+%
+% 0 = no flushing, so no interference but user should handle
+%     border cases of placement
+% 1 = the normal otr, rather untested
+% 2 = a solution that works ok, is experimental and above
+%     all messy
+
+\chardef\OTRSETflushtextmode=0
+
+\def\OTRSETflushtextsofar
+  {\ifcase\OTRSETflushtextmode
+     % don't mess around
+   \or
+     % the normal one
+     \ifvoid\normalpagebox\else
+       \OTRSETnaturalflush
+       \OTRSETcheckfreelines
+     \fi
+   \or
+     % way to complicated, but kind of ok
+     \doOTRSETflushtextsofar
+   \fi}
+
+\newskip\lastskipinotr
+
+\installoutput\doOTRSETflushtextsofar % experimental
+  {\ifvoid\normalpagebox\else
+     \scratchdimen\dp\normalpagebox
+     \setbox\scratchbox\vbox
+       {\forgetall
+        \unvbox\normalpagebox
+        \global\lastskipinotr\lastskip\relax
+        \ifdim\lastskipinotr>\zeropoint\relax
+          \removelastskip
+        \else
+          \kern-\scratchdimen % handle depth
+        \fi}%
+     \ifdim\lastskipinotr>\zeropoint
+       \scratchskip\ht\scratchbox
+       \setbox\scratchbox\hbox
+         {\lower\strutdepth\box\scratchbox}%
+       \dp\scratchbox\scratchdimen
+       \ht\scratchbox\scratchskip
+     \fi
+     \OTRSETsavenotes
+     \OTRSEThandleflushedtext\zerocount
+     \ifdim\lastskipinotr>\zeropoint
+       %\vskip \lastskipinotr % hm, gets lost anyway
+     \else
+       % we should not discard skips after here; tricky
+     \fi
+     \OTRSETsetvsize
+   \fi}
+
+\def\OTRSETplacebottomnotes
+  {\iflastcolumnfootnotes
+     \ifnum\nofcolumns=\mofcolumns
+       \ifintermediatefootnotes \placebottomnotes \fi
+     \fi
+   \else
+     \placebottomnotes
+   \fi}
+
+\def\OTRSETflushsavednotes
+  {\iflastcolumnfootnotes
+     \ifnum\nofcolumns=\mofcolumns
+       \flushsavednotes
+     \fi
+   \else
+     \flushsavednotes
+   \fi}
+
+\def\OTRSETsavenotes
+  {\iflastcolumnfootnotes
+     \ifnum\nofcolumns=\mofcolumns \else
+       \savenotes
+     \fi
+   \fi}
+
+\appendtoks \OTRSETflushsavednotes \to \OTRSETeverystartofcolumn
+
+\def\OTRSETnaturalflush
+  {\bgroup
+   \forgetall % new, needed !
+   \setbox0\vbox to \columnfreecells\lineheight
+     {\vskip-\topskip
+      \vskip\lineheight
+      \prevdepth\strutdp
+      \unvbox\normalpagebox
+      \vfill}%
+   \setbox2\hbox
+     {\OTRSETplacebottomnotes}%
+   \setbox\scratchbox\hbox
+     {\wd0\zeropoint\box0\box2}%
+   \dp\scratchbox\strutdp
+   \OTRSEThandleflushedtext\plusone
+   \egroup}
+
+\newcount\lastcolumnlastcell
+
+\def\OTRSEThandleflushedtext#1%
+  {\getnoflines{\ht\scratchbox}%
+  %\wd\scratchbox\textwidth % geen \hsize kan < zijn in bv split tabulate
+   \wd\scratchbox\OTRSETlocalwidth\mofcolumns
+   \doOTRSETsetgridcells
+     {\copy\placeholderboxf}
+     \mofcolumns\columnfirstcell\plusone\noflines
+     {\registeredtextarea1\columnfirstcell\scratchbox}% == \hbox / tricky htcorr == \columnfirstcell
+   \global\columnlastcell\columnfirstcell
+   \global\advance\columnlastcell \noflines
+   \global\lastcolumnlastcell\columnlastcell
+   \global\advance\lastcolumnlastcell \minusone
+   % find next (acceptable) gap, todo: deadcycle
+   \ifcase#1\else
+     \OTRSETfillgapsbetweencells\mofcolumns\columnlastcell
+   \fi
+   \OTRSETfindnextgap
+   % \message{\the\mofcolumns,\the\columnfirstcell,\the\columnfreecells}%
+   % \wait
+   % we cannot adapt the hsize since it may have changed (like
+   % inside a tabulate) so we only change it when there is a
+   % reason to do so
+   \OTRSETsynchronizehsize
+   \OTRSETsetvsize}
+
+\def\OTRSETfindnextgap
+  {\OTRSETsetfreecells\mofcolumns\columnlastcell
+   \ifsomefreecolumncells
+     % okay
+     \bubbleOTRSETmarks % not robust because we reenter
+   \else
+     \registerOTRSETmarks % not robust because we reenter
+     \global\advance\mofcolumns \plusone
+     \ifnum\mofcolumns>\nofcolumns
+       \OTRSETdoflush
+       \global\columnlastcell\plusone
+       \global\columnfirstcell\zerocount
+       \OTRSETdoflushfloats
+     \else
+       \the\OTRSETeverystartofcolumn
+       \global\columnlastcell\plusone
+       \global\columnfirstcell\zerocount
+     \fi
+   \fi}
+
+\let\OTRSETcheckfreelines\donothing
+
+\def\OTRSETfillgapsbetweencells#1#2% col
+  {\ifnum\columngaplimit>\zerocount
+     \donefalse
+     \dostepwiserecurse{#2}\columnmaxcells\plusone
+       {\OTRSETdoifcellelse{#1}\recurselevel
+          {\ifdone
+             \!!countb\recurselevel \advance\!!countb -\!!counta\relax
+             \ifnum\!!countb>\plusone
+               \advance\!!countb \minusone
+               \ifnum\!!countb<\columngaplimit\relax
+                 \!!countb\recurselevel \advance\!!countb \minusone
+                 \dostepwiserecurse\!!counta\!!countb\plusone
+                   {\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}%
+                %\message{[gap]}%
+               \fi
+             \fi
+           \fi
+           \donefalse}
+          {\ifdone \else
+             \donetrue
+             \!!counta\recurselevel
+           \fi}}%
+   \fi}
+
+\appendtoks
+  \OTRSETfillgapsbetweencells\mofcolumns\plusone
+\to \OTRSETeverystartofcolumn
+
+%\def\OTRSETfreezeminimumgap#1%
+%  {\OTRSETgetmaxfreecells{#1}{1}%
+%   \ifnum\columnmaxfreecells>0
+%     \!!countb=\columnfrmfreecells
+%     \!!counta=\!!counta \advance\!!counta -\columnmaxfreecells
+%     \dorecurse{\columnmaxcells}
+%       {\ifnum\recurselevel<\!!counta\relax
+%          \donetrue
+%        \else\ifnum\recurselevel>\!!countb
+%          \donetrue
+%        \else
+%          \donefalse
+%        \fi\fi
+%        \ifdone
+%          \OTRSETdoifcellelse{#1}{\recurselevel}
+%            {}{\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}%
+%        \fi}%
+%   \fi}
+%
+%\def\OTRSETfillgaps#1#2#3% col from to
+%  {\dostepwiserecurse{#2}{#3}{1}
+%     {\OTRSETdoifcellelse{#1}{\recurselevel}
+%        {}{\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}}}
+%
+%\def\OTRSETfillbotgaps#1#2% col first
+%  {\OTRSETfillgaps{#1}{#2}{\columnmaxcells}}
+%
+%\def\OTRSETfilltopgaps#1#2% col last
+%  {\OTRSETfillgaps{#1}{1}{#2}}
+
+\newif\ifspancolumnslots \spancolumnslotstrue
+\newif\ifcheckcolumnspan \checkcolumnspantrue
+
+\def\OTRSETcheckwidthgap#1#2% box size
+  {\ifcheckcolumnspan
+     \bgroup
+     \scratchdimen#2%
+     \advance\scratchdimen-\wd#1\relax
+     \ifdim-10\scaledpoint>\scratchdimen
+       \egroup
+     \else\ifdim10\scaledpoint<\scratchdimen
+       \egroup
+     \else
+       \egroup
+       \wd#1=#2%
+     \fi\fi
+   \fi}
+
+\def\OTRSETcheckcolumnslot#1%
+  {\enoughcolumncellstrue
+   \ifspancolumnslots\else
+     \OTRSETcheckwidthgap#1\hsize
+     \ifdim\wd#1>\hsize
+       \enoughcolumncellsfalse
+     \fi
+   \fi
+   \ifenoughcolumncells
+     \getnoflines\pagetotal
+     \scratchcounter\noflines
+     \getnoflines{\ht#1}%
+     \columnvcells\noflines
+     \columnhcells\plusone
+     \advance\scratchcounter \columnvcells \relax
+     \ifnum\scratchcounter>\columnfreecells
+       \enoughcolumncellsfalse
+     \fi
+   \fi}
+
+\def\OTRSETstoreincolumnslotPAGE#1%
+  {\ifenoughcolumncells
+     % to do
+     \OTRSETsavebox{#1}%
+   \else
+     \OTRSETsavebox{#1}%
+   \fi}
+
+\def\OTRSETstoreincolumnslotTOPS#1%
+  {\OTRSETprepareforcolumnslot1{#1}%
+   \OTRSETcheckcolumnslot{#1}%
+   \ifenoughcolumncells
+     \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}%
+   \fi
+   \ifenoughcolumncells
+     \OTRSETsetgridcells\mofcolumns\columnfirstcell\columnhcells\columnvcells
+       {\hbox{\copy#1}}%
+     \OTRSETsetvsize
+   \else
+     \OTRSETsavebox{#1}%
+   \fi}
+
+\def\OTRSETstoreincolumnslotBOTS#1%
+  {\OTRSETprepareforcolumnslot3{#1}%
+   \edef\savedcolumnlastcell{\the\columnlastcell}%
+   \OTRSETcheckcolumnslot{#1}%
+   \ifenoughcolumncells
+     \advance\columnlastcell -\columnvcells \advance\columnlastcell \plusone
+%     \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}%
+     \OTRSETcheckcolumnspace\mofcolumns\columnlastcell{#1}%
+   \fi
+   \ifenoughcolumncells
+     \OTRSETsetgridcells\mofcolumns\columnlastcell\columnhcells\columnvcells{\copy#1}%
+     \OTRSETfillgapsbetweencells\mofcolumns\savedcolumnlastcell % -)
+     \OTRSETsetvsize
+   \else
+     \columnlastcell\savedcolumnlastcell
+     \OTRSETsavebox{#1}%
+   \fi}
+
+\newdimen\totalcolumnspace
+
+\def\columnspacetopoffset{0}
+\def\columnspacebotoffset{0}
+
+\def\OTRSETcheckcolumnspace#1#2#3% col row box
+  {\columnhcells\plusone
+   \totalcolumnspace\zeropoint
+   \scratchcounter#1%
+   \enoughcolumncellstrue
+   \doloop
+     {\advance\totalcolumnspace \OTRSETlocalwidth\scratchcounter\relax % needed
+\OTRSETcheckwidthgap#3\totalcolumnspace
+      \ifnum\wd#3>\totalcolumnspace\relax
+        \ifnum\scratchcounter=\nofcolumns
+          \enoughcolumncellsfalse
+          \exitloop
+        \else
+          \advance\columnhcells \plusone
+          \advance\scratchcounter \plusone
+          \advance\totalcolumnspace \OTRSETgetparameter\c!distance\scratchcounter
+        \fi
+      \else
+        \exitloop
+      \fi}%
+   \ifenoughcolumncells
+     \getnoflines{\ht#3}%
+     \columnvcells\noflines
+     \OTRSETcheckcolumncells{#1}{#2}\columnhcells\columnvcells
+   \fi}
+
+\def\OTRSETcheckcolumncells#1#2#3#4% col row wid hei
+  {\!!countd#1\advance\!!countd#3\advance\!!countd\minusone
+   \!!counte#2\advance\!!counte#4\advance\!!counte\minusone
+   \ifnum\!!counte>\columnmaxcells\relax
+     \enoughcolumncellsfalse
+   \else
+     \enoughcolumncellstrue
+%\let\columnspacetopoffset\zerocount
+%\scratchcounter#2\advance\scratchcounter\minusone
+%\ifnum\scratchcounter>0
+%  \dostepwiserecurse{#1}\!!countd\plusone
+%    {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+%       \let\columnspacetopoffset\plusone
+%     \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+%       \let\columnspacetopoffset\plusone
+%     \fi\fi}%
+%  \advance\!!counte \columnspacetopoffset \relax
+%  \advance\columnvcells \columnspacetopoffset \relax
+%\fi
+%\let\columnspacebotoffset\zerocount
+%\scratchcounter\!!counte
+%\advance\scratchcounter \columnvcells \relax
+%\ifnum\scratchcounter>\columnmaxcells\else
+%  \dostepwiserecurse{#1}\!!countd\plusone
+%    {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+%       \let\columnspacebotoffset\plusone
+%     \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+%       \let\columnspacebotoffset\plusone
+%     \fi\fi}%
+%  \advance\!!counte \columnspacebotoffset \relax
+%  \advance\columnvcells \columnspacebotoffset \relax
+%\fi
+     \dostepwiserecurse{#1}\!!countd\plusone % cols
+       {\ifenoughcolumncells
+          \!!countf\recurselevel\relax
+          \dostepwiserecurse{#2}\!!counte\plusone % rows
+            {\ifenoughcolumncells
+               \OTRSETdoifcellelse\!!countf\recurselevel
+                 {\enoughcolumncellsfalse}{}%
+             \fi}%
+        \fi}%
+   \fi}
+
+\def\OTRSETsetpreferedcolumnslot#1#2%
+  {\doifsomething{#1}{\edef\preferedcolumn{#1}}%
+   \doifsomething{#2}{\edef\preferedrow   {#2}}}
+
+\OTRSETsetpreferedcolumnslot{\nofcolumns}{1} % default ?
+
+\let\pofcolumns\mofcolumns
+\let\qofcolumns\mofcolumns
+
+\newif\ifquitincurrentcolumn
+
+\def\OTRSETstoreincolumnslotLRTB#1%
+  {\OTRSETprepareforcolumnslot1{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \mofcolumns\nofcolumns+\currenthcell
+     \plusone\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotLRBT#1%
+  {\OTRSETprepareforcolumnslot3{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \mofcolumns\nofcolumns+\currenthcell
+     \columnmaxcells\plusone-\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotRLTB#1%
+  {\OTRSETprepareforcolumnslot1{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETcheckprefered
+   \OTRSETstoreincolumnslotindeed
+     \nofcolumns\qofcolumns-\currenthcell
+     \plusone\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotRLBT#1%
+  {\OTRSETprepareforcolumnslot3{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETcheckprefered
+   \OTRSETstoreincolumnslotindeed
+     \nofcolumns\qofcolumns-\currenthcell
+     \columnmaxcells\plusone-\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotTBLR#1%
+  {\OTRSETprepareforcolumnslot1{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \plusone\columnmaxcells+\currentvcell
+     \mofcolumns\nofcolumns+\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotTBRL#1%
+  {\OTRSETprepareforcolumnslot1{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETcheckprefered
+   \OTRSETstoreincolumnslotindeed
+     \plusone\columnmaxcells+\currentvcell
+     \nofcolumns\qofcolumns-\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotBTLR#1%
+  {\OTRSETprepareforcolumnslot3{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \columnmaxcells\plusone-\currentvcell
+     \mofcolumns\nofcolumns+\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotBTRL#1%
+  {\OTRSETprepareforcolumnslot3{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETcheckprefered
+   \OTRSETstoreincolumnslotindeed
+     \columnmaxcells\plusone-\currentvcell
+     \nofcolumns\qofcolumns-\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotFXTB#1% fixed column
+  {\OTRSETcheckprefered
+   \OTRSETdoifcellelse\pofcolumns\plusone
+     {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot1}{#1}% % 1/2 dependent of place, todo
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \pofcolumns \pofcolumns    +\currenthcell
+     \preferedrow\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotFXBT#1% fixed column
+  {\OTRSETcheckprefered
+   \OTRSETdoifcellelse\pofcolumns\columnmaxcells
+     {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot3}{#1}% % 3/2 dependent of place, todo
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \pofcolumns    \pofcolumns +\currenthcell
+     \columnmaxcells\preferedrow-\currentvcell{#1}}
+
+% \def\OTRSETstoreincolumnslotHERE#1% fixed column
+%   {\OTRSETprepareforcolumnslot2{#1}%
+%    \OTRSETflushtextsofar
+%    \getnoflines\pagetotal \advance\noflines\columnfirstcell
+%    \OTRSETstoreincolumnslotindeed
+%      \mofcolumns\mofcolumns+\currenthcell
+%      \noflines\columnmaxcells+\currentvcell{#1}%
+%    \OTRSETsetvsize}
+
+\chardef\OTRSETforcefixedfloats=0
+
+\def\OTRSETstoreincolumnslotHERE#1% fixed column
+  {\ifcase\OTRSETforcefixedfloats
+     \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+   \else
+     \OTRSETstoreincolumnslotFIXD{#1}%
+   \fi}
+
+% this one looses too wide graphics
+%
+% \def\OTRSETstoreincolumnslotFIXD#1% fixed column
+%   {\OTRSETprepareforcolumnslot2{#1}%
+%    % no flush text sofar here, beware: no width test
+%    \snaptogrid\vbox{\box#1}}
+%
+% still imperfect
+
+\def\OTRSETstoreincolumnslotFIXD#1% fixed column
+  {\OTRSETflushtextsofar
+   \ifdim\wd#1>\textwidth
+     \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+   \else
+     % crappy test / needed for o-pbu-f / will be replaced
+     \getnoflines{\ht#1}%
+     \scratchdimen\noflines\lineheight
+     \advance\scratchdimen\lineheight
+     \advance\scratchdimen\pagetotal\relax
+     \ifdim\scratchdimen<\pagegoal
+       %OTRSETprepareforcolumnslot3{#1}%
+       %ruledvskip\columnslotspacing\lineheight
+       \blank[\columnslotspacing*\v!line]%
+       \snaptogrid\hbox to \hsize{\hss\box#1\hss}% strange, why the centering
+       \blank[\columnslotspacing*\v!line]%
+     \else
+       \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+     \fi
+   \fi}
+
+\def\OTRSETstoreincolumnslotSOMEWHERE#1#2%
+  {\OTRSETprepareforcolumnslot{#1}{#2}%
+   \OTRSETflushtextsofar
+   \getnoflines\pagetotal \advance\noflines\columnfirstcell
+   \OTRSETstoreincolumnslotindeed
+     \mofcolumns\mofcolumns+\currenthcell
+     \noflines\columnmaxcells+\currentvcell{#2}%
+   \OTRSETsetvsize}
+
+\def\OTRSETcheckprefered
+  {\ifnum\preferedcolumn<\mofcolumns
+     \let\pofcolumns\mofcolumns
+   \else
+     \let\pofcolumns\preferedcolumn
+   \fi
+   \ifquitincurrentcolumn
+     \ifnum\mofcolumns=\nofcolumns
+       \def\qofcolumns{\mofcolumns}%
+     \else
+       \scratchcounter\mofcolumns
+       \advance\scratchcounter \plusone
+       \edef\qofcolumns{\the\scratchcounter}%
+     \fi
+   \else
+     \let\qofcolumns\mofcolumns
+   \fi}
+
+\def\OTRSETstoreincolumnslotindeed#1#2#3#4#5#6#7#8#9%
+  {\OTRSETcheckprefered
+   \enoughcolumncellsfalse
+   \donefalse
+   \dostepwiserecurse{#1}{#2}{#31}
+     {\ifdone
+        \exitloop
+      \else
+        #4=\recurselevel
+        \dostepwiserecurse{#5}{#6}{#71}
+          {\ifdone
+             \exitloop
+           \else
+             #8=\recurselevel
+             \OTRSETcheckcolumnspace\currenthcell\currentvcell{#9}%
+             \ifenoughcolumncells \donetrue \fi
+           \fi}%
+      \fi}%
+   \ifdone
+     \enoughcolumncellstrue
+   \else
+     \enoughcolumncellsfalse
+   \fi
+   \ifenoughcolumncells
+%    \ifnum\columnspacetopoffset>0\message{[+++]}\fi
+%    \ifnum\columnspacebotoffset>0\message{[---]}\fi
+%    \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells
+%      {\vbox
+%         {\ifcase\columnspacetopoffset\else\ruledvskip\columnspacetopoffset\lineheight\fi
+%          \copy#9
+%          \ifcase\columnspacebotoffset\else\ruledvskip\columnspacebotoffset\lineheight\fi}}%
+     \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells
+       {\copy#9}%
+     \ifnum\currenthcell=\mofcolumns\relax
+       \ifdim\ht\OTRSETsavedfootnotes>\zeropoint
+         \OTRSETsetfreecells\mofcolumns\columnfirstcell
+         \ifsomefreecolumncells
+           \getnoflines{\ht\OTRSETsavedfootnotes}\relax
+           \ifnum\columnfreecells<\noflines
+             \global\somefreecolumncellsfalse
+           \else
+            %\message{[flt]}% float
+           \fi
+         \fi
+         \ifsomefreecolumncells
+           % ok, enough room for notes
+          %\message{[flt]}% float
+         \else % ?
+           \OTRSETsavebox{#9}%
+           \OTRSETerasegridcells\currenthcell\currentvcell\columnhcells\columnvcells
+          %\message{[clr]}% save box
+         \fi
+       \else
+        %\message{[flt]}% float
+       \fi
+     \else
+      %\message{[flt]}% float
+     \fi
+     \OTRSETsetvsize
+    %\message{[fnt]}% float
+   \else
+    %\message{[rej]}% save box
+     \OTRSETsavebox{#9}%
+   \fi}
+
+\chardef\columnslotspacing \plusone
+
+\def\OTRSETstoreincolumnslot#1% #2 % {method} {box} % alleen last
+  {% no messing around here
+   % \dp#2=\zeropoint
+   % \ifcase\columnslotspacing\else
+   %   \setbox#2=\vbox spread \columnslotspacing\lineheight
+   %     {\vss\box#2\vss}%
+   % \fi
+   % and don't change this any more
+%   \doifdefinedelse{\strippedcsname\OTRSETstoreincolumnslot#1}
+%     {\getvalue{\strippedcsname\OTRSETstoreincolumnslot#1}{#2}}
+%     {\OTRSETstoreincolumnslotUNKNOWN{#2}}}
+   \executeifdefined{\strippedcsname\OTRSETstoreincolumnslot#1}
+     \OTRSETstoreincolumnslotUNKNOWN} % {#2}}
+
+\def\OTRSETstoreincolumnslotUNKNOWN#1%
+  {\OTRSETprepareforcolumnslot2{#1}\copy#1} % {} ?
+
+% \def\OTRSETprepareforcolumnslot#1#2% 1=hoog 2=midden 3=laag
+%   {\dp#2\zeropoint
+%    \ifcase\columnslotspacing\else
+%      \scratchdimen\columnslotspacing\lineheight
+%      \ifnum#1=2 \scratchdimen2\scratchdimen \fi
+%      \setbox#2\vbox spread \scratchdimen
+%        {\ifnum#1>1\vss\fi\box#2\relax\ifnum#1<3\vss\fi}%
+%    \fi}
+
+\def\OTRSETprepareforcolumnslot#1#2% 1=hoog 2=midden 3=laag
+  {\dp#2\zeropoint
+   \ifcase\columnslotspacing\else
+     \scratchdimen\columnslotspacing\lineheight
+     \ifnum#1=2 \scratchdimen2\scratchdimen \fi
+     \begingroup
+     \advance\scratchdimen\ht#2\relax
+     \ifdim\scratchdimen<\columnmaxcells\lineheight
+       \endgroup \setbox#2\vbox spread \scratchdimen \bgroup
+     \else
+       \endgroup \setbox#2\vbox to \columnmaxcells\lineheight \bgroup
+       \vskip\strutdepth
+     \fi
+     \ifnum#1>1\vss\fi
+     \box#2\relax
+     \ifnum#1<3\vss\fi
+     \egroup
+   \fi}
+
+\def\OTRSETdocheckiffloatfits % eigenlijk moet else float anders
+  {\global\ifnofloatpermitted\roomforfloatfalse\else\roomforfloattrue\fi}
+
+\def\OTRSETunpreparebox#1%
+  {\ifhbox#1% spans and so
+     \global\setbox\floatbox\vbox{\box#1}%
+   \else
+     \setbox\scratchbox\vbox
+       {\unvbox#1\unskip\unskip\unskip
+        \global\setbox\floatbox\lastbox}%
+   \fi}
+
+\def\OTRSETsavebox#1% clean up the skips
+  {\OTRSETunpreparebox{#1}%
+   \dosavefloat}
+
+\def\OTRSETresavebox#1% clean up the skips
+  {\OTRSETunpreparebox{#1}%
+   \doresavefloat}
+
+\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge
+  {\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
+
+\def\OTRSETdoflushfloats
+  {\bgroup
+   \def\OTRSETsavebox##1{\!!doneafalse}%
+   \doloop
+     {\ifsomefloatwaiting
+\OTRSETskipstart
+        \dogetfloat
+        \ifdim\wd\floatbox>\zeropoint
+          \!!doneatrue
+          \dp\floatbox\zeropoint
+          \OTRSETstoreincolumnslot{TBLR}\floatbox
+          \if!!donea
+           %\message{[flu]}%
+          \else
+            \OTRSETresavebox\floatbox
+            \exitloop
+          \fi
+        \else
+         %\message{[err]}% happens but why?
+        \fi
+      \else
+        \exitloop
+      \fi}
+   \egroup}
+
+\newif\ifcentergridcells \centergridcellstrue
+
+\newif\ifcentergridcellonly     \centergridcellonlyfalse
+\newif\ifautocentergridcellonly \autocentergridcellonlytrue
+
+\def\OTRSETcentergridcells
+  {\ifcentergridcells
+     \dorecurse\nofcolumns
+       {\currenthcell\recurselevel
+        \ifautocentergridcellonly
+          % we prevent centering when the next column is empty
+          % to be checked ! ! ! !
+          \advance\currenthcell \plusone
+          \centergridcellonlytrue
+          \ifnum\currenthcell>\nofcolumns
+            % ok already
+          \else
+            % only span if there is a next column with content
+            \dorecurse\columnmaxcells
+              {\ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+                 \centergridcellonlyfalse
+               \else\ifdim\dp\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+                 \centergridcellonlyfalse
+               \fi\fi}%
+          \fi
+        \fi
+        \currenthcell\recurselevel
+        \dorecurse\columnmaxcells
+          {\currentvcell\recurselevel\relax
+           \ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+           \ifdim\dp\OTRSETgridcell\currenthcell\currentvcell=\zeropoint
+             \bgroup
+             \setbox\scratchbox\OTRSETgetgridcell\currenthcell\currentvcell
+             \getnoflines{\ht\scratchbox}%
+             \!!counta\currentvcell
+             \advance\!!counta -\noflines
+             \advance\!!counta \plusone
+             % first col always ok
+             \!!countb\currenthcell
+             \!!countc\currenthcell
+             \advance\!!countc \plusone
+             \!!donebtrue
+             \ifcentergridcellonly
+               \!!countc\maxdimen
+             \fi
+             \dostepwiserecurse\!!countc\nofcolumns\plusone
+               {\if!!doneb
+                  \let\xrecurselevel\recurselevel
+                  \dostepwiserecurse\!!counta\currentvcell\plusone
+                    {\ifdim\ht\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint
+                       \!!donebfalse
+                     \else\ifdim\wd\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint
+                       \!!donebfalse
+                     \fi\fi}%
+                  \if!!doneb
+                    \!!countb\xrecurselevel
+                  \fi
+                \fi}%
+             \totalcolumnspace\OTRSETlocalwidth\currenthcell
+             \dostepwiserecurse\!!countc\!!countb\plusone
+               {\advance\totalcolumnspace \OTRSETlocalwidth\recurselevel
+                \advance\totalcolumnspace \OTRSETgetparameter\c!distance\recurselevel}%
+             \ifdim\totalcolumnspace>\wd\scratchbox
+               \setbox\scratchbox\hbox to \totalcolumnspace{\hss\box\scratchbox\hss}%
+             \fi
+             \OTRSETsetgridcell\currenthcell\currentvcell\box\scratchbox
+           \egroup
+           \fi
+           \fi}}%
+   \fi}
+
+\def\OTRSETinitializecolumns% once per page
+  {\columnspreadtrue % todo
+   \ifcolumnspread
+     \global\rofcolumns\getvalue{\??mc\OTRSETidentifier\c!nright}%
+     \global\lofcolumns\getvalue{\??mc\OTRSETidentifier\c!nleft}%
+     \global\tofcolumns\rofcolumns \relax
+     \ifodd\realpageno\relax
+       \global\nofcolumns\rofcolumns
+     \else
+       \global\advance\tofcolumns\lofcolumns
+       \global\nofcolumns\lofcolumns
+     \fi
+   \else
+     \global\nofcolumns\getvalue{\??mc\OTRSETidentifier\c!n}%
+     \global\rofcolumns\nofcolumns
+     \global\lofcolumns\nofcolumns
+     \global\tofcolumns\nofcolumns
+   \fi
+   \OTRSETassignwidths
+   \global\mofcolumns\plusone
+   \columnerasegridboxes}
+
+% vanaf hier:
+
+\def\definecolumnset
+  {\dodoubleargument\dodefinecolumnset}
+
+\def\dodefinecolumnset[#1][#2]%
+  {\getparameters[\??mc#1]
+     [\c!direction=\v!right,
+      \c!balance=\v!no,
+      \c!distance=1.5\bodyfontsize, % controleren
+      \c!n=2,
+      \c!nleft=\getvalue{\??mc#1\c!n},
+      \c!nright=\getvalue{\??mc#1\c!n},
+      \c!width=\v!fit,
+      \c!lines=0,
+      \c!start=0,
+      #2]%
+   \dorecurse{\getvalue{\??mc#1\c!nleft}} % todo
+     {\dododefinecolumnset[#1][\recurselevel]}%
+   \dorecurse{\getvalue{\??mc#1\c!nright}} % todo
+     {\dododefinecolumnset[#1][\recurselevel]}%
+   % redo framed settings
+   \setupcolumnset[#1][1][\c!distance=\!!zeropoint]}
+
+\def\dododefinecolumnset[#1][#2]%
+  {\presetlocalframed
+     [\??mc#1#2]%
+   \setupcolumnset
+     [#1][#2]
+     [\c!offset=\v!overlay,
+      \c!frame=\v!off,
+      \c!align=,
+      \c!lines=0,% really needed since c!regels is now part of framed
+      \c!width=\getvalue{\??mc#1\c!width},
+      \c!distance=\getvalue{\??mc#1\c!distance}]}
+
+\def\setupcolumnset
+  {\dotripleargument\dosetupcolumnset}
+
+\def\dosetupcolumnset[#1][#2][#3]%
+  {\ifthirdargument
+     \def\docommand##1%
+       {\doifelse{##1}\v!each
+          {\dorecurse{\getvalue{\??mc#1\c!n}}{\docommand\recurselevel}}
+          {\getparameters[\??mc#1##1][#3]}}%
+     \processcommalist[#2]\docommand
+   \else
+     \getparameters[\??mc#1][#2]%
+   \fi}
+
+\definecolumnset[\s!default][\c!n=2] % fallback
+
+\def\OTRSETgotonextpage
+  {\vfill\eject
+   \relax\ifnum\mofcolumns>\plusone
+     \OTRSETgotocolumn[\v!last]%
+     \ifnum\mofcolumns>\plusone
+       \OTRSETgotocolumn[\v!force]%
+     \fi
+   \fi}
+
+\let\OTRSETgotonextpageX\OTRSETgotonextpage % will become obsolete
+
+\def\OTRSETgotocolumn
+  {\dosingleempty\doOTRSETgotocolumn}
+
+\def\doOTRSETgotoCOLROW#1% |*
+  {\bgroup % really needed
+   \splitstring#1\at*\to\column\and\row
+   \bgroup
+     \ifx\column\empty\else\expanded{\doOTRSETgotoCOLUMN{\column}}\fi
+   \egroup
+   \bgroup
+     \ifx\row   \empty\else\expanded{\doOTRSETgotoROW   {\row   }}\fi
+   \egroup
+   \egroup}
+
+\def\doOTRSETgotoCOLUMN#1%
+  {\ifnum\mofcolumns=#1\else
+     \vfill\eject % \doejectpage\eject
+     \doloop
+       {\ifnum\mofcolumns=#1\relax
+          \exitloop \else \OTRSETdummycolumn
+        \fi}%
+   \fi}
+
+\def\doOTRSETgotoROW#1%
+  {\ifnum#1>1
+     \scratchcounter\zerocount
+     \currenthcell\mofcolumns
+     \currentvcell#1\advance\currentvcell \minusone
+     \dorecurse\currentvcell
+       {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing
+          {\advance\scratchcounter\plusone}}
+     \getnoflines\pagetotal
+     \advance\scratchcounter-\noflines
+     \ifnum\scratchcounter>\zerocount
+       \dorecurse\scratchcounter{\line{\strut}}%
+     \fi
+   \fi
+   \OTRSETsetvsize}
+
+\def\doOTRSETgotocolumn[#1]% yes|force|first|last||*
+  {\processallactionsinset
+     [#1]
+     [    \v!yes=>\OTRSETdummycolumn,
+           \v!no=>,% not supported
+        \v!force=>\OTRSETdummycolumn,
+        \v!first=>\expanded{\doOTRSETgotoCOLUMN{1}},
+         \v!last=>\expanded{\doOTRSETgotoCOLUMN{\the\nofcolumns}},
+      \s!default=>\OTRSETdummycolumn,
+      \s!unknown=>\expanded{\doOTRSETgotoCOLROW{\commalistelement}}]}
+
+% to be documented and tested, not yet that robust
+
+% \def\OTRSETgotocell#1#2%
+%   {\endgraf
+%    \gdef\gotocellcounter{0}%
+%    \doloop
+%      {\ifnum\mofcolumns<#1\relax
+%         \doglobal\increment\gotocellcounter\relax
+%         \ifnum\gotocellcounter>#1\relax
+%           \line{\strut}\crlf
+%           \line{\strut}\crlf
+%           \column
+%           \writestatus{columnset}{quitting goto cell}%
+%           \exitloop
+%         \else
+%           \column
+%         \fi
+%       \else
+%         \exitloop
+%       \fi}%
+%    \ifnum\mofcolumns=#1\relax
+%      \ifnum#2>1
+%        \scratchcounter\zerocount
+%        \currenthcell\mofcolumns
+%        \currentvcell#2\advance\currentvcell \minusone
+%        \dorecurse\currentvcell
+%          {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing
+%             {\advance\scratchcounter\plusone}}
+%        \getnoflines\pagetotal
+%        \advance\scratchcounter-\noflines
+%        \ifnum\scratchcounter>\zerocount
+%          \dorecurse\scratchcounter{\line{\strut}}%
+%        \fi
+%      \fi
+%    \fi
+%    \OTRSETsetvsize}
+
+\def\OTRSETgotocell#1#2% obsolete: now \column[#1*#2]
+  {\endgraf
+   \doOTRSETgotoCOLUMN{#1}%
+   \doOTRSETgotoROW   {#2}}
+
+\def\OTRSETdummycolumn
+  {\verticalstrut
+   \vskip-\struttotal
+   \vfill
+   \eject}
+
+\newcounter\columnsetlevel
+\let\currentcolumnset\empty
+\chardef\OTRSETfinish\zerocount
+
+\def\startcolumnset
+  {\dodoubleempty\dostartcolumnset}
+
+\def\dostartcolumnset[#1][#2]%
+  {\increment\columnsetlevel\relax
+   \globallet\localcolumnmaxcells\!!zerocount
+   \global\chardef\OTRSETfinish\zerocount
+   \resetOTRSETmarks
+   \ifnum\columnsetlevel=\plusone
+     \bgroup
+     \saveinterlinespace
+     \globallet\columnsetpage\!!plusone
+     \def\currentcolumnset{#2}%
+     \insidecolumnstrue % will be different flag in addition
+     \activateotr{SET}{ONE}% andere naam, activate or so
+     \doifelsenothing{#1}
+       {\globallet\OTRSETlist\s!default}
+       {\xdef\OTRSETlist{#1}}%
+     \OTRSETstartnextpage
+     \OTRSETassignwidths
+     \OTRSETsethsize
+   \else
+     \bgroup
+   \fi}
+
+% \setuplayout[grid=yes] \definecolumnset[example] \showgrid
+
+% \starttext
+%     \startcolumnset[example]
+%         \input knuth \endgraf \input knuth
+%         \placetable{table}{\framed[width=\makeupwidth,height=4cm]{Hello}}
+%         \input knuth \endgraf \input knuth
+%     \stopcolumnset
+%     \input knuth \endgraf \input knuth
+% \stoptext
+
+
+\def\OTRSETflushleftovers % new per 13/4/2006
+  {\OTRSETdoifcellelse{1}{1}
+     {\bgroup
+      \OTRSETcentergridcells
+      \chardef\OTRSETbalancemethod\plusone
+      \OTRSETreducegridbox
+      \global\setbox\OTRfinalpagebox\OTRSETmakegridbox
+      \global\ht\OTRfinalpagebox\textheight % signals output that there is content
+      \OTRSETdofinaloutput
+      \globallet\OTRSETbalht\zeropoint
+      \egroup}
+     {}}
+
+\def\stopcolumnset
+  {\relax
+   \ifnum\columnsetlevel=\plusone
+     \endgraf % needed, else wrong vsize in one par case
+     \global\chardef\OTRSETfinish\plusone
+     % no, extra page \pagebreak % (test on pascal toc)
+     \dostopcolumnset
+     \egroup
+     \global\notelimittrue % brrr, untested and fuzzy
+     \setvsize
+     \sethsize
+     \ifvoid\OTRfinalpagebox\else
+       % probably balanced
+       \ifdim\ht\OTRfinalpagebox<\textheight
+         \snaptogrid[\v!page]\hbox{\box\OTRfinalpagebox}%
+       \else
+         \box\OTRfinalpagebox
+       \fi
+     \fi
+     \global\chardef\OTRSETfinish\zerocount
+     \ifsomefloatwaiting \setvsize \pagebreak \setvsize \fi
+     \OTRSETflushleftovers
+   \else
+     \egroup
+   \fi
+   \decrement\columnsetlevel\relax}
+
+\chardef\OTRSETbalancemethod\zerocount
+
+\def\dostopcolumnset
+  {%\OTRSETdofinalflushfloats % yes/no
+   \ifcase\OTRSETbalancemethod
+     \OTRSETnobalance
+   \else
+     \OTRSETdobalance
+   \fi}
+
+\def\OTRSETdobalance
+  {\OTRSETnobalance}
+
+\def\localcolumnmaxcells{0}
+
+% currently line represents real line, i.e. on the grid, and
+% not something noflines (also, watch out for switching from
+% 2-3 columns on one page with both sets balanced: the
+% second set does not see the first set
+
+% \def\OTRSETinitbalancing
+%   {\ifcase\OTRSETbalancemethod\or
+%      \let\savedcolumnmaxcells\columnmaxcells
+%      \ifnum\realpageno=\balancingpageno\relax
+%        \ifnum\mofcolumns=\plusone
+%          \dorecurse\nofcolumns
+%            {\!!counta\recurselevel\relax
+%             \!!countb\getvalue{\??mc\OTRSETidentifier\number\!!counta\c!regels}\relax
+%             \ifcase\!!countb
+%               \!!countb\getvalue{\??mc\OTRSETidentifier\c!regels}\relax
+%             \fi
+%             \ifcase\!!countb
+%               \!!countb \savedcolumnmaxcells\relax
+%             \fi
+%             % can be an option: absolute versus relative
+%             \ifnum\OTRSETbalancemethod=\plusthree
+%               \advance\!!countb\precolumnlines
+%               \ifnum\!!countb>\localcolumnmaxcells\relax
+%                 \xdef\localcolumnmaxcells{\the\!!countb}%
+%               \fi
+%               \advance\!!countb \plusone
+%               \dostepwiserecurse\!!countb\columnmaxcells\plusone
+%                 {\ifvoid\OTRSETgridcell\!!counta\recurselevel
+%                    \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe
+%                  \fi}%
+%             \else
+%               \globallet\localcolumnmaxcells\columnmaxcells
+%               \advance\!!countb-\columnmaxcells
+%               \!!countb-\!!countb
+%               \advance\!!countb \minusone
+%               \ifnum\!!countb>\zerocount
+%                 \dostepwiserecurse\plusone\!!countb\plusone
+%                   {\ifvoid\OTRSETgridcell\!!counta\recurselevel
+%                      \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe
+%                    \fi}%
+%               \fi
+%             \fi}%
+%          \OTRSETsetvsize % ! ! !
+%        \fi
+%      \fi
+%    \fi}
+%
+%  \def\OTRSETpresetbalancing
+%    {\doifvaluesomething{\??mc\OTRSETidentifier\c!regels}%
+%       {\getcommacommandsize[\csname\??mc\OTRSETidentifier\c!regels\endcsname]%
+%        \ifnum\commalistsize>\plusone
+%          \scratchcounter\zerocount
+%          \def\docommand##1%
+%            {\advance\scratchcounter\plusone
+%             \setvalue{\??mc\OTRSETidentifier\the\scratchcounter\c!regels}{##1}}%
+%          \processcommacommand
+%            [\csname\??mc\OTRSETidentifier\c!regels\endcsname]\docommand
+%          \setvalue{\??mc\OTRSETidentifier\c!regels}{0}%
+%        \fi}}
+
+% don't loose empty 1page/1column with area (example **)
+%
+% \definecolumntextarea[title][x=1,y=4,nx=2,ny=7,state=start]
+% \setupcolumntextareatext[title][\vtop to 5cm{a\\b\\b\\d}]
+%
+% \starttext
+% \startcolumnset \dorecurse{1}{\input tufte \par} \stopcolumnset
+% \stoptext
+
+% better:
+
+\def\definecolumnsetarea   {\definecolumntextarea}
+\def\setupcolumnsetarea    {\setupcolumntextarea}
+\def\setupcolumnsetareatext{\setupcolumntextareatext}
+
+% so this will be changed
+
+% \def\OTRSETnobalance
+%   {\iflastcolumnfootnotes % testen ! optie
+%      % inhibit flush of floats !
+%      % todo: nothing if no footnotes, else empty page
+%      \dostepwiserecurse\mofcolumns\nofcolumns\plusone
+%        {\vskip-\struttotal\verticalstrut\vfill\eject}%
+%    \else
+%      \ifdim\pagetotal>\zeropoint % no, see example **
+%        \ifnum\mofcolumns=\nofcolumns
+%          \OTRSETflushfinalfootnotes
+%        \else
+%          % probably todo
+%        \fi
+%        \vfill
+%        \eject
+%        % brr, may result in empty page after nicely fit text
+%        % or if left, then lost of first column only text
+%        \ifnum\mofcolumns>1
+%          \OTRSETdofinalflush
+%          \OTRSETdofinaloutput
+%        \fi
+%      \fi
+%    \fi}
+
+\def\OTRSETnobalance
+  {\iflastcolumnfootnotes % testen ! optie
+     % inhibit flush of floats !
+     % todo: nothing if no footnotes, else empty page
+     \dostepwiserecurse\mofcolumns\nofcolumns\plusone
+       {\vskip-\struttotal\verticalstrut\vfill\eject}%
+   \else
+     \ifnum\mofcolumns>\plusone
+       \donetrue
+     \else\ifdim\pagetotal>\zeropoint % too dangerous, we loose data
+       \donetrue
+     \else
+       \donefalse
+     \fi\fi
+     \ifdone
+       \ifnum\mofcolumns=\nofcolumns
+         \OTRSETflushfinalfootnotes
+       \else
+         % probably todo
+       \fi
+       \vfill
+       \eject
+\registerOTRSETmarks
+       % brr, may result in empty page after nicely fit text
+       % or if left, then lost of first column only text
+       \ifnum\mofcolumns>\plusone
+         \OTRSETdofinalflush
+         \OTRSETdofinaloutput
+       \fi
+     \fi
+   \fi}
+
+\def\OTRSETstartnextpage
+  {\doifsomething\OTRSETlist
+     {\getfromcommacommand[\OTRSETlist][1]%
+      \global\let\OTRSETidentifier\commalistelement
+      \doifundefined{\??mc\OTRSETidentifier\c!n}
+        {\globallet\OTRSETidentifier\s!default}%
+      \let\newcommalistelement\empty
+      \doglobal\replaceincommalist\OTRSETlist1%
+      \OTRSETrestart}}
+
+\def\OTRSETrestart % weed
+  {\OTRSETinitializefeatures
+   \OTRSETflushpreposttext
+   \OTRSETinitializecolumns
+   \OTRSETcheckinsert
+   \OTRSETcheckgrid
+   \OTRSETsetvsize
+   \OTRSETsethsize % or local ?
+   \OTRSETsetplaceholders
+   \OTRSEThandlepreposttext
+   \initializecolumntextareas % name !
+   \OTRSETcheckstartcells
+   \OTRSETsetvsize}
+
+% \def\OTRSETcheckstartcells
+%   {\dorecurse\nofcolumns
+%      {\bgroup
+%       \mofcolumns\recurselevel
+%       \scratchcounter\currentcolumnstartcell % uses \mofcolumns, returns 1 or more
+%       \advance\scratchcounter \minusone
+%       \dorecurse\scratchcounter
+%         {\OTRSETdoifcellelse\mofcolumns\recurselevel
+%            \donothing{\OTRSETsetgridcell\mofcolumns\recurselevel\copy\placeholderboxe}}%
+%       \egroup}}
+
+\def\OTRSETcheckstartcells
+  {\dorecurse\nofcolumns
+     {\bgroup
+      \mofcolumns\recurselevel
+\OTRSETsetcorrectnofcells\currentcolumnstartcell
+\advance\scratchcounter \minusone
+      \dorecurse\scratchcounter
+        {\OTRSETdoifcellelse\mofcolumns\recurselevel
+           \donothing{\OTRSETsetgridcell\mofcolumns\recurselevel\copy\placeholderboxe}}%
+      \egroup}}
+
+% \OTRSEToutput
+%   {\dontcomplain % new, get rid of overfull message (to be sorted out)
+%    \OTRSETnaturalflush
+%   %\OTRSETstartnextpage
+%    \OTRSETdoflushfloats % actually belongs in \flushsavedfloats (but goes wrong)
+%    \OTRSETcheckfreelines
+%    \OTRSETchecksidefloat}
+
+\OTRSEToutput
+  {\dontcomplain % new, get rid of overfull message (to be sorted out)
+   \doloop
+     {\OTRSETnaturalflush
+     %\OTRSETstartnextpage %  no
+      \OTRSETdoflushfloats % actually belongs in \flushsavedfloats (but goes wrong)
+      \OTRSETcheckfreelines
+      \ifsomefreecolumncells
+        \exitloop
+      \else
+        % flush page and get rid of more floats if present
+      \fi}%
+   \OTRSETchecksidefloat}
+
+\def\OTRSETinitializefeatures
+  {% number of lines
+   % new: raw
+   \getrawnoflines\textheight\xdef\columnmaxcells{\the\noflines}%
+   % direction
+   \doifelsevalue{\??mc\OTRSETidentifier\c!direction}\v!right
+     {\chardef\columndirection\zerocount}
+     {\chardef\columndirection\plusone}%
+   % balancing
+   \chardef\OTRSETbalancemethod\zerocount
+   \processaction
+     [\getvalue{\??mc\OTRSETidentifier\c!balance}]
+     [    \v!yes=>\chardef\OTRSETbalancemethod\plusone,
+          \v!top=>\chardef\OTRSETbalancemethod\plustwo,
+       \v!bottom=>\chardef\OTRSETbalancemethod\plusthree]}
+
+% keep 'm for a while
+%
+% \installoutput\OTRSETflushpreposttext
+%  {\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}%
+%   \ifcarryoverfootnotes \else
+%     \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+%   \fi}
+%
+% to be tested on 'boekinhoud' in 'pascal/demo-bbi'
+%
+% junk ! ! ! ! !
+%
+%\installoutput\OTRSETflushpreposttext
+%  {\global\setbox\precolumnbox\vbox
+%     {\unvbox\normalpagebox
+%      \strut\vskip-2\lineheight\strut}% we want a proper depth
+%   \ifcarryoverfootnotes \else
+%     \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+%   \fi}
+%
+% \starttext
+%   \definecolumnset[two][n=2]
+%   \startcolumnset[two] \dorecurse{4}{\input tufte } \stopcolumnset
+%   \input tufte
+%   \startcolumnset[two] \input tufte \stopcolumnset
+% \stoptext
+%
+% \installoutput\OTRSETflushpreposttext
+%   {\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}%
+%    \global\dp\precolumnbox\strutdepth
+%    \ifcarryoverfootnotes \else
+%      \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+%    \fi}
+
+% test:
+%
+% \definecolumnset[two]  [n=2,balance=yes]
+% \definecolumnset[three][n=3,balance=yes]
+% \setupcolumnset [two]  [1] [lines=10]
+% \setupcolumnset [two]  [2] [lines=10]
+%
+% \startcolumnset[two]   \dorecurse{14}{\input tufte \par} \stopcolumnset
+% \startcolumnset[three] \dorecurse{12}{\input tufte \par} \stopcolumnset
+%
+% with:
+%
+% \installoutput\OTRSETflushpreposttext
+%   {%\ifvoid\normalpagebox
+%    %  \global\setbox\precolumnbox\vbox{}%
+%    %\else
+%      \global\setbox\precolumnbox\vbox
+%        {\unvcopy\normalpagebox}%
+%      \global\setbox\precolumnbox\vbox to \ht\precolumnbox
+%        {\box\normalpagebox}%
+%    %\fi
+%    \global\dp\precolumnbox\strutdepth
+%    \ifcarryoverfootnotes \else
+%      \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+%    \fi}
+
+% testcase : pascal demo-bbi, paragraaf/aanduiding koppen
+
+\ifx\lastskipinotr\undefined \newskip\lastskipinotr \fi
+
+\installoutput\OTRSETflushpreposttext
+  {\global\setbox\precolumnbox\vbox
+     {\unvbox\normalpagebox
+      \global\lastskipinotr\lastskip}%
+   \ifdim\lastskipinotr>\zeropoint
+     \global\setbox\precolumnbox\hbox
+       {\lower\strutdepth\box\precolumnbox}%
+   \fi
+   \global\dp\precolumnbox\strutdepth
+   \ifcarryoverfootnotes \else
+     \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+   \fi}
+
+\let\precolumnlines \!!zerocount
+\let\postcolumnlines\!!zerocount
+
+% \def\OTRSEThandlepreposttext
+%   {\ifdim\ht\precolumnbox>\zeropoint % new
+%      \getnoflines{\ht\precolumnbox}%
+%      \edef\precolumnlines{\the\noflines}%
+%      \doOTRSETsetgridcells
+%        {\copy\placeholderboxe}
+%        \plusone\plusone\nofcolumns\noflines
+%        {\box\precolumnbox}%
+%    \else
+%      \let\precolumnlines\!!zerocount
+%    \fi
+%    \ifdim\ht\postcolumnbox>\zeropoint % new, otherwise empty bottom line
+%      \getnoflines{\ht\postcolumnbox}%
+%      \edef\postcolumnlines{\the\noflines}%
+%      \advance\columnfreecells -\noflines
+%      \advance\columnfreecells \plusone
+%      \doOTRSETsetgridcells
+%        {\copy\placeholderboxe}
+%        \plusone\columnfreecells\nofcolumns\noflines
+%        {\box\postcolumnbox}%
+%    \else
+%      \let\postcolumnlines\!!zerocount
+%    \fi}
+
+\def\OTRSEThandlepreposttext
+  {\ifdim\ht\precolumnbox>\zeropoint % new
+     \getnoflines{\ht\precolumnbox}%
+     \edef\precolumnlines{\the\noflines}%
+     \doOTRSETsetgridcells
+       {\copy\placeholderboxe}
+       \plusone\plusone\nofcolumns\noflines
+     % normal version (single column set)
+     % {\box\precolumnbox}%
+     % compensated for bodyfont change
+       {\hbox
+          {\OTRSETsetcorrectcellht
+           \raise\scratchdimen\box\precolumnbox}}%
+   \else
+     \let\precolumnlines\!!zerocount
+   \fi
+   \ifdim\ht\postcolumnbox>\zeropoint % new, otherwise empty bottom line
+     \getnoflines{\ht\postcolumnbox}%
+     \edef\postcolumnlines{\the\noflines}%
+     \advance\columnfreecells -\noflines
+     \advance\columnfreecells \plusone
+     \doOTRSETsetgridcells
+       {\copy\placeholderboxe}
+       \plusone\columnfreecells\nofcolumns\noflines
+       {\box\postcolumnbox}%
+   \else
+     \let\postcolumnlines\!!zerocount
+   \fi}
+
+\def\OTRSETchecksidefloat
+  {} % {\sidefloatoutput}
+
+\def\OTRSETfinalsidefloatoutput
+  {}
+
+\def\OTRSETcheckgrid
+  {\topskip1\topskip
+   \ifforcecolumngrid
+     \widowpenalty\zerocount
+     \clubpenalty\zerocount
+     \brokenpenalty\zerocount
+   \fi}
+
+\def\OTRSETcheckinsert
+  {\iflastcolumnfootnotes
+     \ifnum\nofcolumns=\mofcolumns
+       \OTRSETforceinserts
+     \else
+       \OTRSETinhibitinserts
+     \fi
+   \else
+     \OTRSETforceinserts
+   \fi}
+
+\def\OTRSETforceinserts
+  {\enablenotes}
+
+\def\OTRSETinhibitinserts
+  {\disablenotes}
+
+% interface to footnotes
+
+\def\OTRSETassignwidths
+  {%\scratchdimen\makeupwidth
+   \freezetextwidth \scratchdimen\textwidth
+   %
+   \scratchcounter\zerocount
+   \dorecurse\nofcolumns
+     {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit
+        {\advance\scratchcounter \plusone }
+        {\advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}%
+      \advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!distance}}%
+   \ifcase\scratchcounter\else
+     \divide\scratchdimen \scratchcounter
+   \fi
+   \setgvalue{\??mc\??mc\c!width}{0}%
+   \dorecurse\nofcolumns
+     {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit
+        {\dimen0=\scratchdimen}
+        {\setgvalue{\??mc\??mc\c!width}{1}%
+         \dimen0=\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}%
+      \setxvalue{\??mc\recurselevel\??mc\c!width}{\the\dimen0}}}
+
+\def\OTRSETlocalwidth#1%
+  {\getvalue{\??mc\number#1\??mc\c!width}}
+
+\newbox\placeholderboxa
+\newbox\placeholderboxb
+\newbox\placeholderboxc
+\newbox\placeholderboxd
+\newbox\placeholderboxe
+\newbox\placeholderboxf
+
+\def\columnplaceholder#1#2%
+  {\hbox
+     {\localcolortrue
+      \setbox\scratchbox\hbox to \hsize
+        {\iftracecolumnset \incolortrue \localcolortrue
+           \hskip-.5ex%
+           \startcolor[columnset:#2]\vrule\!!width1ex\!!height.5ex\!!depth.5ex\stopcolor
+         \fi
+         \hss}%
+      \ifcase#1\relax
+        \ht\scratchbox\zeropoint
+        \dp\scratchbox\zeropoint
+        \wd\scratchbox\zeropoint
+      \else
+        \wd\scratchbox\hsize
+        \ht\scratchbox\strutht
+        \dp\scratchbox\strutdp
+      \fi
+      \box\scratchbox}}
+
+\definepalet
+  [columnset]
+  [a=cyan,b=green,c=blue,d=red,e=magenta,f=darkgray]
+
+\def\OTRSETsetplaceholders
+  {\global\setbox\placeholderboxa\columnplaceholder0a%
+   \global\setbox\placeholderboxb\columnplaceholder0b%
+   \global\setbox\placeholderboxc\columnplaceholder0c%
+   \global\setbox\placeholderboxd\columnplaceholder0d%
+   \global\setbox\placeholderboxe\columnplaceholder0e%
+   \global\setbox\placeholderboxf\columnplaceholder1f}
+
+\def\doOTRSETshowstatus
+  {\llap{\incolortrue \localcolortrue \tt\tfxx
+     \startcolor[blue](\the\vsize->\number\columnfirstcell\#\number\columnfreecells)\stopcolor
+     \hskip\leftskip}}
+
+\def\OTRSETshowstatus
+  {\iftracecolumnset \doOTRSETshowstatus \fi}
+
+% \appendtoks \OTRSETshowstatus \to \everypar
+
+% page contents
+
+\def\OTRSETdopagecontents#1#2% takes two args: \box \unvbox
+  {\vbox to \textheight{\forgetall#1#2\pushproperties}}
+
+\def\OTRSETsomepagefloat  {\def\floatmethod{PAGE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomeherefloat  {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomeelsefloat  {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomefixdfloat  {\def\floatmethod{FIXD}\OTRSETsomeslotfloat} % check
+\def\OTRSETsometopfloat   {\def\floatmethod{TOPS}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomebottomfloat{\def\floatmethod{BOTS}\OTRSETsomeslotfloat} % check
+
+\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge
+  {\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
+
+\def\OTRSETsomeslotfloat[#1]%
+  {\setbox\floatbox\vbox{\flushfloatbox}%
+   \dp\floatbox\strutdp
+   \@EA\uppercasestring\floatmethod\to\floatmethod
+   \OTRSETstoreincolumnslot\floatmethod\floatbox
+   \doinsertfloatinfo}
+
+% kind of new, looks much like OTRONE, but not entirely
+
+\def\OTRSETdosettopinserts
+  {\bgroup
+   \ifsomefloatwaiting
+     \noffloatinserts\zerocount
+     \let\totaltopinserted\!!zeropoint
+     \OTRSETdodosettopinserts
+     \ifnum\@@bknbottom=\zerocount
+       \ifnum\@@bknlines>\zerocount
+         \ifdim\totaltopinserted>\zeropoint\relax
+           \dimen0\lineheight
+           \dimen0=\@@bknlines\dimen0
+           \advance\dimen0 \totaltopinserted\relax
+           \ifdim\dimen0>\textheight % \vsize  %%%%%%%%% \textheight
+             \showmessage\m!floatblocks8{\@@bknlines}%
+             \vfilll\eject
+           \fi
+         \fi
+       \fi
+     \fi
+   \fi
+   \egroup}
+
+\def\OTRSETdodosettopinserts
+  {\ifnum\noffloatinserts<\noftopfloats
+     \dogetfloat
+     \ifdim\topinserted=\zeropoint\relax
+       \topofinserttrue
+     \else
+       \topofinsertfalse
+     \fi
+     \setbox\scratchbox\vbox % kan beter !
+       {\forgetall
+        \iftopofinsert
+          \ifdim\OTRSETtopoffset=\zeropoint
+            \moveongrid[\v!top]
+          \fi
+        \else
+          \betweenfloatblanko % inserts can't look back
+        \fi
+        \flushfloatbox
+        \blank[\@@bkspaceafter]}%
+     \global\advance\topinserted \ht\scratchbox\relax
+     \ifdim\topinserted>\vsize % was \textheight\relax
+       \OTRSETresavebox\floatbox
+       \noffloatinserts\noftopfloats\relax
+       \global\advance\topinserted -\ht\scratchbox
+       \let\OTRSETdodosettopinserts\relax % to be tested
+     \else
+       \xdef\totaltopinserted{\the\topinserted}%
+       \insert\topins{\forgetall\box\scratchbox}% interlineskip ?
+       \ifsomefloatwaiting
+         \advance\noffloatinserts \plusone
+       \else
+         \noffloatinserts\noftopfloats\relax
+       \fi
+       \dofloatflushedinfo
+     \fi
+   \else
+     \ifsomefloatwaiting
+       \showmessage\m!floatblocks6{\the\noftopfloats}%
+     \fi
+     \let\OTRSETdodosettopinserts\relax
+   \fi
+   \OTRSETdodosettopinserts}
+
+\def\OTRSETdosetbotinserts
+  {\bgroup
+   \ifsomefloatwaiting
+     \noffloatinserts\zerocount
+     \OTRSETdodosetbotinserts
+   \fi
+   \egroup}
+
+\def\OTRSETdodosetbotinserts
+  {\ifnum\noffloatinserts<\nofbotfloats\relax
+     \dogetfloat
+     \global\advance\botinserted \ht\floatbox\relax
+     \global\advance\botinserted \dp\floatbox\relax
+     \global\advance\botinserted \floattopskip\relax
+     \ifdim\botinserted<\pagegoal\relax
+       \insert\botins
+         {\forgetall
+          \blank[\@@bkspacebefore]%
+          \flushfloatbox}%
+       \ifsomefloatwaiting
+         \advance\noffloatinserts \plusone
+       \else
+         \noffloatinserts\nofbotfloats
+       \fi
+       \dofloatflushedinfo
+     \else
+       \OTRSETresavebox\floatbox
+       \noffloatinserts\nofbotfloats\relax
+     \fi
+     \global\nofloatpermittedtrue % vgl topfloats s!
+   \else
+     \ifsomefloatwaiting
+       \showmessage\m!floatblocks7{\the\nofbotfloats}%
+     \fi
+     \let\OTRSETdodosetbotinserts\relax
+   \fi
+   \OTRSETdodosetbotinserts}
+
+\let\OTRSETdosetbothinserts\relax
+
+\def\OTRSETdotopinsertions
+  {\ifvoid\topins\else
+     \ifvoid\columntopbox\mofcolumns
+       \columnsettopbox\mofcolumns\box\topins
+     \else
+       \columnsettopbox\mofcolumns\vbox % temp, must be better
+         {\forgetall
+          \offinterlineskip
+          \box\columntopbox\mofcolumns
+          \box\topins}
+     \fi
+   \fi
+   \global\topinserted\zeropoint\relax} % goes away
+
+\def\OTRSETdobotinsertions
+  {\ifvoid\botins \else
+     \columnsetbotbox\mofcolumns\box\botins
+%   \else
+%     \columnsetbotbox\mofcolumns\vbox % temp, must be better
+%       {\forgetall
+%        \offinterlineskip
+%        \box\botins
+%        \box\columnbotbox\mofcolumns}
+   \fi
+   \global\botinserted\zeropoint\relax} % goes away
+
+% set ipv text
+
+% left right 1 2 3 +1 +2 +3
+
+\let\columnleftareas \empty
+\let\columnrightareas\empty
+
+% links rechts => odd, even, n, named
+
+\def\definecolumntextarea
+  {\dotripleempty\dodefinecolumntextarea}
+
+\def\dodefinecolumntextarea[#1][#2][#3]% y=0 is mogelijke en handig !
+  {\ifthirdargument
+     \doifinsetelse{#2}{\v!both,\v!fixed}
+       {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]%
+        \definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
+       {\doifelse{#2}\v!next
+          {\doifoddpageelse
+             {\definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
+             {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]}}
+          {\presetlocalframed
+             [\??mt#1#2]%
+           \processaction[#2] % \doglobal voorkomt stack build up
+             [ \v!left=>\doglobal\addtocommalist{#1}\columnleftareas,
+              \v!right=>\doglobal\addtocommalist{#1}\columnrightareas]%
+           \getparameters[\??mt#1#2]
+             [\c!x=1,\c!y=1,\c!nx=1,\c!ny=1,\c!clipoffset=2\lineheight,
+              \c!offset=\v!overlay,\c!strut=\v!no,\c!frame=\v!off,
+              \c!type=#2,\c!page=1,\c!state=\v!stop,#3]}}%
+   \else
+     \definecolumntextarea[#1][\v!next][#2]%
+   \fi}
+
+\def\setupcolumntextarea
+  {\dotripleempty\dosetupcolumntextarea}
+
+\def\dosetupcolumntextarea[#1][#2][#3]%
+  {\ifthirdargument
+     \doifelse{#2}\v!both
+       {\setupcolumntextarea[#1][\v!left ][#3]%
+        \setupcolumntextarea[#1][\v!right][#3]}
+       {\doifelse{#2}\v!next
+          {\doifoddpageelse
+             {\setupcolumntextarea[#1][\v!right][#3]}
+             {\setupcolumntextarea[#1][\v!left][#3]}}
+          {\getparameters[\??mt#1#2][#3]}}%
+   \else
+     \setupcolumntextarea[#1][\v!next][#2]%
+   \fi}
+
+\def\docheckcolumnsetareapage#1#2%
+  {\ifnum\getvalue{\??mt#1\c!page}>\plusone
+     \doifelsevalue{\??mt#1\c!type}\v!fixed
+       {\ifnum\columnsetpage=\getvalue{\??mt#1\c!page}\relax
+          \donetrue\else\donefalse
+        \fi}
+       {\ifnum\columnsetpage<\getvalue{\??mt#1\c!page}\relax
+          \donefalse\else\donetrue
+        \fi}%
+   \else
+     \donetrue
+   \fi}
+
+\def\initializecolumntextareas
+  {\ifodd\realpageno
+     \doinitializecolumntextareas\columnrightareas\v!right
+   \else
+     \doinitializecolumntextareas\columnleftareas\v!left
+   \fi}
+
+\def\doinitializecolumntextareas#1#2%
+  {\def\docommand##1%
+     {\docheckcolumnsetareapage{##1#2}\plusone
+      \ifdone
+        \donefalse
+        \processaction
+          [\getvalue{\??mt##1#2\c!state}]
+          [  \v!start=>\donetrue,
+            \v!repeat=>\donetrue,
+           \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]%
+        \ifdone\dodoinitializecolumntextareas{##1}{#2}\fi
+      \fi}%
+   \processcommacommand[#1]\docommand}
+
+\def\dodoinitializecolumntextareas#1#2%
+  {\doOTRSETsetgridcells
+     {\copy\placeholderboxd}
+     {\getvalue{\??mt#1#2\c!x }}{\getvalue{\??mt#1#2\c!y }}
+     {\getvalue{\??mt#1#2\c!nx}}{\getvalue{\??mt#1#2\c!ny}}
+     {\copy\placeholderboxd}}
+
+\def\placecolumntextareas
+  {\ifodd\realpageno
+     \doplacecolumntextareas\columnrightareas\v!right
+   \else
+     \doplacecolumntextareas\columnleftareas\v!left
+   \fi}
+
+\def\doplacecolumntextareas#1#2% global ?
+  {\bgroup
+   \forgetall
+   \def\docommand##1%
+     {\docheckcolumnsetareapage{##1#2}\zerocount
+      \ifdone
+        \donefalse
+        \processaction
+          [\getvalue{\??mt##1#2\c!state}]
+          [  \v!start=>\donetrue\doglobal\removefromcommalist{##1}#1,
+            \v!repeat=>\donetrue,
+           \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]%
+        \ifdone
+          \dodoplacecolumntextareas{##1}{#2}%
+        \else
+          \doglobal\removefromcommalist{##1}#1%
+        \fi
+      \fi}%
+   \processcommacommand[#1]\docommand
+   \egroup}
+
+% \page[left]
+% \definecolumntextarea[intro][left][x=1,y=1,nx=4,ny=20,state=start,background=introlayer]
+% \setupcolumntextareatext[intro][left][\setups{intro}]
+% \flushcolumntextareas
+
+\def\flushcolumntextareas
+  {\initializecolumntextareas
+   \setvsize}
+
+\def\columntextlastbackspace{\backspace}
+
+% beware, we have clipping offsets of 2\lineheight by default
+
+\def\columntextareaparameter#1%
+  {\csname\??mt\currentcolumntestarea#1\endcsname}
+
+\def\dodoplacecolumntextareas#1#2%
+  {\def\currentcolumntestarea{#1#2}%
+   \!!counta\columntextareaparameter\c!x
+   \!!countb\columntextareaparameter\c!nx
+   \docalculatecolumnsetspan
+   \!!heighta\columntextareaparameter\c!ny\lineheight
+   % wrong
+   % \ifnum\columntextareaparameter\c!y=\zerocount
+   %   \advance\!!heighta -\lineheight
+   %   \advance\!!heighta \topskip
+   % \fi
+   % \advance\!!heighta -\lineheight % option
+   \ifnum\columntextareaparameter\c!y=\plusone
+     \advance\!!heighta -\lineheight
+     \advance\!!heighta \topskip
+   \fi
+   %
+   \setbox\scratchbox\vbox
+     {\donetrue\localframed
+        [\??mt\currentcolumntestarea]
+        [\c!location=,% new (*)
+            \c!width=\!!widtha,\c!height=\!!heighta,\c!lines=]
+        {\columntextareaparameter\empty}}%
+   \!!counta\columntextareaparameter\c!x
+   \!!countb\columntextareaparameter\c!y
+   \advance\!!countb \columntextareaparameter\c!ny
+   \advance\!!countb \minusone
+   % new (*)
+   \doif{\columntextareaparameter\c!location}\v!depth
+     {\setbox\scratchbox\hbox{\lower\strutdepth\box\scratchbox}%
+      \dp\scratchbox\zeropoint
+      \ht\scratchbox\!!heighta}%
+   %
+   \setbox0\hbox
+     {\ifcase\!!countc
+        \copy\scratchbox % \box
+      \else
+        \clip
+          [   %\c!topoffset=\columntextareaparameter\c!clipoffset,%
+           %\c!bottomoffset=\columntextareaparameter\c!clipoffset,%
+             %\c!leftoffset=\columntextareaparameter\c!clipoffset,%
+                  \c!offset=\columntextareaparameter\c!clipoffset,%
+             \c!rightoffset=\zeropoint,%
+                   \c!width=\!!widthb,%
+                  \c!height=\!!heighta]%
+          {\copy\scratchbox}%
+      \fi}%
+   \OTRSETsetgridcell\!!counta\!!countb\box0
+   \ifcase\!!countc\else
+     \advance\!!counta \columntextareaparameter\c!nx
+     \advance\!!counta -\!!countc
+     \advance\!!widtha -\!!widthb
+     \setbox0\hbox
+       {\hskip-\namedlayoutparameter\v!odd\c!backspace
+        \clip
+          [   %\c!topoffset=\columntextareaparameter\c!clipoffset,%
+           %\c!bottomoffset=\columntextareaparameter\c!clipoffset,%
+            %\c!rightoffset=\columntextareaparameter\c!clipoffset,%
+                  \c!offset=\columntextareaparameter\c!clipoffset,%
+              \c!leftoffset=\zeropoint,%
+                   \c!width=\!!widtha,%
+                  \c!height=\!!heighta,%
+                 \c!hoffset=\!!widthb]%
+          {\copy\scratchbox}}%
+     \OTRSETsetgridcell\!!counta\!!countb\box0%
+   \fi}
+
+\def\setupcolumntextareatext
+  {\dotripleempty\dosetupcolumntextareatext}
+
+\long\def\dosetupcolumntextareatext[#1][#2][#3]%
+  {\ifthirdargument
+     \doifelse{#2}\v!both
+       {\setvalue{\??mt#1\v!left }{#3}%
+        \setvalue{\??mt#1\v!right}{#3}}
+       {\doifelse{#2}\v!next
+          {\doifoddpageelse
+             {\setvalue{\??mt#1\v!right}{#3}}%
+             {\setvalue{\??mt#1\v!left }{#3}}}%
+          {\setvalue{\??mt#1#2}{#3}}}%
+   \else
+     \setupcolumntextareatext[#1][\v!next][{#2}]%
+   \fi}
+
+\def\docalculatecolumnsetspan
+  {% \!!counta <= x
+   % \!!countb <= nx
+   % \!!widtha => total width
+   % \!!widthb => left width
+   % \!!countc => left cols
+   \!!widtha\!!countb\textwidth % we assume equal widths
+   \advance\!!countb \!!counta
+   \advance\!!countb \minusone
+   \ifnum\!!countb>\nofcolumns
+     \!!countc\!!countb
+     \advance\!!countc -\nofcolumns
+     \!!countb\nofcolumns
+   \else
+     \!!countc\zerocount
+   \fi
+   \advance\!!counta \plusone
+   \dostepwiserecurse\!!counta\!!countb\plusone
+     {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}%
+   \!!widthb\!!widtha
+   \advance\!!widthb -\!!countc\textwidth
+   \ifodd\realpageno \else % tricky, assumes that we keep there
+     \ifcase\!!countc\else
+       % nog niet ok voor enkel/doublesided
+       \advance\!!widtha \namedlayoutparameter\v!even\c!backspace
+       \advance\!!widtha \namedlayoutparameter\v!odd \c!backspace
+       \advance\!!widthb \namedlayoutparameter\v!even\c!backspace
+       \dorecurse\!!countc
+         {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}%
+     \fi
+   \fi}
+
+\def\columnsetspanhsize{\textwidth}
+
+\def\setcolumnsetspanhsize#1#2% x nx / uses counta/b
+  {\!!counta#1\!!countb#2\docalculatecolumnsetspan
+   \edef\columnsetspanhsize{\the\!!widtha}}
+
+\def\definecolumnsetspan
+  {\dodoubleempty\dodefinecolumnsetspan}
+
+\def\dodefinecolumnsetspan[#1][#2]%
+  {%\ifsecondargument
+     \defineframedtext
+       [cs:#1]
+       [\c!frame=\v!off,
+        \c!before=,
+        \c!after=,
+        \c!offset=\v!overlay,
+        \c!location=\v!left,
+        \c!linecorrection=\v!off,
+        \c!depthcorrection=\v!off,
+        \c!n=2,
+        \c!nlines=0,
+        \c!indenting=,
+        \c!indentnext=\v!yes,
+        \c!default=HERE,
+        \c!alternative=\v!a,
+        #2]%
+   %\else
+   %  \definecolumnspan[][#1]%
+  }%\fi}
+
+\definecolumnsetspan[\s!default]
+
+\def\setupcolumnsetspan
+  {\dodoubleempty\dosetupcolumnsetspan}
+
+\def\dosetupcolumnsetspan[#1][#2]%
+  {\ifsecondargument
+     \setupframedtexts[cs:#1][#2]%
+   \else
+     \setupcolumnsetspan[\s!default][#1]%
+   \fi}
+
+\def\startcolumnsetspan
+  {\dotripleempty\dostartcolumnsetspan}
+
+%%%%%%%%%%%%%%%% TODO
+
+\def\dostartcolumnsetspan[#1][#2][#3]% [#3] gobbles space
+  {\endgraf % else rubish output if forgotten
+   \vskip \zeropoint % make sure otr is done, otherwise last line problems
+   \bgroup
+   \forgetall
+   \ifnum\columnsetlevel>\zerocount\else
+     % of course we needed a one-column fall back for tm
+     \columnsetspanhsize\hsize
+     \nofcolumns\plusone
+     \mofcolumns\plusone
+   \fi
+   \setupframedtexts[cs:#1]
+     [\c!width=\columnsetspanhsize,
+      \c!linecorrection=\v!off,
+      \c!depthcorrection=\v!off,
+      #2]%
+   % determine widths
+   \!!countc\framedtextparameter{cs:#1}\c!n
+    % \!!countd\numexpr(\nofcolumns-\mofcolumns+\plusone)%
+   \!!countd\nofcolumns
+   % n <= n of columns
+   \ifnum\!!countc>\!!countd \!!countc\!!countd \fi
+   \advance\!!countd -\mofcolumns
+   \advance\!!countd \plusone
+   % n <= n of available columns (alternative a)
+   \doif{\framedtextparameter{cs:#1}\c!alternative}\v!a
+     {\ifnum\!!countc>\!!countd \!!countc\!!countd \fi}%
+   % here it all starts
+   \setcolumnsetspanhsize\mofcolumns\!!countc % a/b used
+   \hsize\columnsetspanhsize
+   \setbox\scratchbox\vbox\bgroup
+     \dostartframedtext[cs:#1][\v!none]% geen nils placement
+     % spoils spacing : \vskip-\struttotal\par\verticalstrut\par
+     \ifnum\columnsetlevel>\zerocount
+       \framedtextparameter{cs:#1}\c!before
+     \fi
+     \def\stopcolumnsetspan{\dostopcolumnsetspan{#1}}}
+
+\def\dostopcolumnsetspan#1%
+  {\par
+   \verticalstrut
+   \kern-2\struttotal
+   \verticalstrut
+   \ifnum\columnsetlevel>\zerocount
+     \doifsomething{\framedtextparameter{cs:#1}\c!after}
+       {\framedtextparameter{cs:#1}\c!after
+        \kern\zeropoint}% otherwise blanks disappear, better be a switch
+   \else
+     \endgraf
+   \fi
+   \dostopframedtext
+   \egroup
+   \setbox\scratchbox\frozenhbox to \hsize
+     {\dontcomplain
+      \alignedline{\framedtextparameter{cs:#1}\c!location}\v!middle
+        {\lower\strutdepth\box\scratchbox}}%
+   \dp\scratchbox\zeropoint % else wrong snap insidefloat
+%
+% to be tested first (strange in grid mode)
+%
+% \setbox\scratchbox\frozenhbox to \hsize
+%   {\dontcomplain
+%    \chardef\alignstrutmode\zerocount
+%    \alignedline{\framedtextparameter{cs:#1}\c!plaats}\v!midden
+%      {\box\scratchbox}}%
+%
+   \ifinsidefloat
+     \box\scratchbox
+   \else\ifnum\columnsetlevel>\zerocount
+     % we only set \columnsetspacing when asked for, else bottom problems
+     % don't change this any more (test naw)
+     \chardef\columnslotspacing\framedtextparameter{cs:#1}\c!nlines\relax
+     % todo: nboven/onder & \chardef\columnslotlocation2
+     %\OTRSETstoreincolumnslotHERE\scratchbox
+     \edef\floatmethod{\framedtextparameter{cs:#1}\c!default}%
+     \@EA\uppercasestring\floatmethod\to\floatmethod
+     % todo : \v!here -> here enzovoorts
+     \OTRSETstoreincolumnslot\floatmethod\scratchbox
+     % watch out: no \dochecknextindentation{tag}
+     \checknextindentation[\framedtextparameter{cs:#1}\c!indentnext]%
+   \else
+     % of course we needed a one-column fall back for tm; brrr, the box has now too
+     % much height (try \ruledvbox); don't change this without testing techniek
+     \scratchdimen\ht\scratchbox
+     \advance\scratchdimen-\strutdp
+     \ht\scratchbox\scratchdimen
+     \framedtextparameter{cs:#1}\c!before
+     \snaptogrid\vbox{\box\scratchbox}%
+     \framedtextparameter{cs:#1}\c!after
+   \fi\fi
+   \egroup
+   \endgraf}
+
+% \startcolumnset[two]
+%   \input tufte
+%   \startcolumnsetspan[two][width=20cm,location=middle] \input tufte \stopcolumnsetspan
+%   \startcolumnsetspan[two][default=btlr] \input tufte \stopcolumnsetspan
+%   \input tufte \par
+%   \input tufte \par
+%   \startcolumnsetspan[two] \emptylines[5] \stopcolumnsetspan
+%   \startcolumnsetspan[two] \input tufte   \stopcolumnsetspan
+% \stopcolumnset
+
+% We need to set the \dimen globally since we are in the
+% OTR. Unfortunately this interferes with local settings,
+% although we may assume that they will not cross page
+% boundaries.
+
+\def\OTRSETcheckcontent
+  {\bgroup
+   \donefalse
+   \def\OTRSETcheckcontent##1%
+     {\setbox\scratchbox##1\recurselevel
+      \setbox\scratchbox\vbox{\unvbox\scratchbox}%
+      \ifdim\ht\scratchbox>\zeropoint\donetrue\fi}%
+   \dorecurse{\nofcolumns}
+     {\OTRSETcheckcontent\columngettextbox
+      \OTRSETcheckcontent\columngetfootbox
+      \OTRSETcheckcontent\columngettopbox
+      \OTRSETcheckcontent\columngetbotbox}%
+   \ifdone\egroup\donefalse\else\egroup\donetrue\fi}
+
+\def\OTRSETgetcolumntextheight#1% max - boven - top
+  {\scratchdimen=\OTRSETgetparameter\c!maxhoogte#1%
+   \advance\scratchdimen -\OTRSETgetparameter\c!bovenoffset#1%
+   \advance\scratchdimen -\ht\columntopbox#1%
+   \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}%
+   \advance\scratchdimen -\ht\columnbotbox#1} % not used
+
+\def\OTRSETgetcolumnnaturalheight#1% max - boven - top
+  {\setbox\scratchbox\vbox{\unvcopy\columntextbox#1}%
+   \scratchdimen\ht\scratchbox
+   \advance\scratchdimen \OTRSETgetparameter\c!bovenoffset#1%
+   \advance\scratchdimen \ht\columntopbox#1%
+   \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}%
+   \advance\scratchdimen \ht\columnbotbox#1} % not used
+
+\def\OTRSETdobalance% splitten in met en zonder footnotes
+  {\bgroup
+   \maxdeadcycles=1000
+   % collect content and notes
+   \bgroup
+   \OTRSEToutput
+     {\global\setbox1\vbox{\unvbox\normalpagebox}%
+      \global\setbox3\vbox{\unvbox\footins}}%
+   \verticalstrut\vskip-\struttotal % makes footnotes flush
+   \eject
+   \global\collectingcontentfalse
+   % check for footnotes only
+   \ifdim\ht1<\topskip % real dirty
+     \global\setbox1=\vbox{}
+     % fix height of first line
+     \ifdim\ht3>\!!zeropoint
+       \global\setbox3\vbox
+         {\setfootnotebodyfont
+          \kern-\strutht
+          \kern\topskip
+          \unvbox3}
+   \fi
+   % prepare trial box
+   \global\setbox5\vbox
+     {\ifdim\ht1>\zeropoint
+        \unvcopy1 \ifdim\ht3>\zeropoint \kern\skip\footins \fi
+      \fi
+      \ifdim\ht3>\zeropoint \unvcopy3 \fi}
+   \egroup
+   % erase old stuff
+   \columnerasetextboxes
+   \columnerasefootboxes
+   % prepare floats
+   \OTRSETdotopinsertions
+   \OTRSETdobotinsertions % not used can be removed
+   % calculate available space
+   \!!heighta\zeropoint % available total height
+   \dorecurse{\nofcolumns}
+     {\OTRSETgetcolumntextheight\recurselevel
+      \OTRSETcalculatelines\scratchdimen
+      \advance\!!heighta \scratchdimen}
+   % quick check
+   \ifdim\ht5>\!!heighta
+     % use normal routine
+     \columnerasetextboxes
+     \columnerasefootboxes
+     % TEMP, TODO, FORCE NEXT PASS !
+     \unvbox1
+     \unvbox3
+     \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist
+     \donefalse
+    %\writestatus\m!columns{no balancing, text overflows height}%
+   \else\ifdim\ht5>\zeropoint \relax
+     % some text and/or notes
+     \donetrue
+   \else
+     \donefalse
+     \dorecurse\nofcolumns
+       {\ifdim\ht\columntopbox\recurselevel>\zeropoint \donetrue \fi}%
+     \ifdone
+       % no text and notes, but figures
+     \else
+       % no text, no notes, no figures
+       \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist
+       \writestatus\m!columns{no balancing, nothing to be placed}%
+     \fi
+   \fi\fi
+   \ifdone
+     \ifdim\ht5>\zeropoint \relax
+       % balancing text and notes
+      %\writestatus\m!columns{text may fit, balancing}%
+       \newcounter\loopcounter
+       \newcounter\balancinglines
+       \doloop
+         {\increment\loopcounter\relax
+          % initialize
+          \columnerasetextboxes
+          \columnerasefootboxes
+          \setbox0=\copy5
+          \splittopskip\topskip
+          % pre-split loop and quality calculation
+         %\writestatus\m!columns{pass \loopcounter: correction -\balancinglines}
+          \dorecurse\nofcolumns
+            {\OTRSETgetcolumntextheight\recurselevel
+             \OTRSETcalculatelines\scratchdimen
+             \!!heightc\scratchdimen
+             \ifnum\recurselevel<\nofcolumns
+               \advance\!!heightc -\balancinglines\lineheight
+             \fi
+             \columnsettextbox\recurselevel\vsplit0 to \!!heightc}
+          % just one method
+          \OTRSETgetcolumnnaturalheight1           \dimen4\scratchdimen
+          \OTRSETgetcolumnnaturalheight\nofcolumns \dimen6\scratchdimen
+         %\writestatus\m!columns{first column: \the\dimen4}%
+         %\writestatus\m!columns{last  column: \the\dimen6}%
+          \ifdim\dimen4=\dimen6
+            \donetrue  % perfect balance
+          \else\ifdim\dimen4>\dimen6
+            \donefalse % not yet good enough
+            \increment\balancinglines % try again
+            \edef\balancingcount{\the\!!counta}
+          \else
+            \donetrue  % worse balance
+            \ifnum\balancinglines>0 % take previous
+              \decrement\balancinglines
+            \fi
+          \fi\fi
+          % extra check
+          % \ifdim\ht0>\zeropoint\relax \donefalse \fi
+          % another check
+          \ifdone
+           %\writestatus\m!columns{balancing finished in pass \loopcounter}%
+          \else \ifnum\loopcounter>100 \donetrue
+           %\writestatus\m!columns{balancing aborted after pass \loopcounter}%
+          \else
+           %\writestatus\m!columns{balancing continued after pass \loopcounter}%
+          \fi \fi
+          % final balancing pass
+          \ifdone
+            \setbox0\copy1
+            \setbox2\copy3
+            \columnerasetextboxes
+            \columnerasefootboxes
+            \dorecurse\nofcolumns
+              {\OTRSETgetcolumntextheight\recurselevel
+               \OTRSETcalculatelines\scratchdimen
+               \!!heightc\scratchdimen
+               \ifnum\recurselevel<\nofcolumns
+                 \advance\!!heightc -\balancinglines\lineheight
+               \fi
+               % split off text
+               \ifdim\ht0>\zeropoint
+                 \columnsettextbox\recurselevel\vsplit0 to \!!heightc
+                 \setbox4\vbox{\unvcopy\columntextbox\recurselevel}
+                 \advance\!!heightc -\ht4
+                 \ifdim\ht0>\zeropoint
+                   \columnsettextbox\recurselevel\box4
+                   \advance\!!heightc \skip\footins
+                 \fi
+               \fi
+               % split off footnotes
+               \ifdim\ht0>\zeropoint\relax \else
+                 \ifdim\ht2>\zeropoint\relax
+                   \setbox4\vsplit2 to \!!heightc
+                   \setbox\footins=\vbox{\unvbox4} % ugly and dirty trick
+                   \ifdim\ht\columntextbox\recurselevel=\zeropoint\relax
+                     \columnsettextbox\recurselevel\hbox
+                       {\raise\strutdp\hbox % ugly but needed
+                          {\setfootnotebodyfont % both these moves
+                           \lower\strutdp\hbox{\placebottomnotes}}}
+                   \else
+                     \columnsetfootbox\recurselevel\hbox{\placebottomnotes}
+                   \fi
+                 \fi
+               \fi}
+            \exitloop
+          \fi}
+       \else
+         % no reason to balance floats
+       \fi
+     \fi
+     \doglobal\addtocommalist{\realfolio}\OTRSETbalancinglist
+     \OTRSETdoflush
+   \fi
+   \egroup}
+
+\protect \endinput
+
+% extreme examples (1)
+%
+% \setupfloats[numbering=nocheck]
+%
+% \definecolumnset [first] [n=2,start=0]
+% \definecolumnset [next]  [n=2,start=3]
+%
+% \setuptexttexts[\vbox to \textheight{\topskipcorrection \hsize\makeupwidth left \hfill right\vfill}]
+%
+% \setuphead[chapter][text=empty]
+%
+% \starttext
+%
+% \startcolumnset[first,next]
+%   \placefigure[btrl]{}{}
+%   \placefigure[tblr]{}{}
+%   \chapter{thuan} \dorecurse{25}{\recurselevel: \input thuan \endgraf}
+% \stopcolumnset
+%
+% \startcolumnset[first,next]
+%   \chapter{thuan} \dorecurse{25}{\input thuan \endgraf\placefigure{}{}}
+% \stopcolumnset
+
+\unprotect
+
+% only in columnsets
+
+% \def\cornerfigure
+%   {\dotripleempty\docornerfigure}
+%
+% \def\docornerfigure[#1][#2][#3]% [layer] [location] [settings]
+%   {\bgroup
+%    \dowithnextbox
+%      {\!!doneafalse
+%       \!!donebfalse
+%       \processallactionsinset
+%         [\v!left,\v!bottom,#2]
+%         [ \v!left=>\!!doneatrue ,
+%          \v!right=>\!!doneafalse,
+%           \v!top=>\!!donebtrue ,
+%           \v!bottom=>\!!donebfalse]%
+%       \!!widtha\nextboxwd
+%       \if!!donea
+%         % unchecked
+%         \advance\!!widtha-\backspace
+%       \else
+%         % unchecked
+%         \advance\!!widtha-\backspace
+%       \fi
+%       \!!widtha\textwidth % could be an option
+%       \!!heighta\nextboxht
+%       % zou een macro moeten zijn \getnoflayoutlines
+%       \ifnum\layoutparameter\c!lines=\zerocount
+%         \getnoflines\textheight
+%       \else
+%         \noflines\layoutparameter\c!lines
+%       \fi
+%       %
+%       \advance\noflines \plusone % wordt default, instelbaar
+%       \!!heightb\noflines\lineheight\relax
+%       \if!!doneb % boven
+%         % unchecked
+%         \advance\!!heighta-\topspace
+%         \advance\!!heighta-\headerheight
+%         \advance\!!heighta-\headerdistance
+%       \else % onder
+%         % checked
+%         \advance\!!heighta-\paperheight
+%         \advance\!!heighta+\!!heightb
+%         \advance\!!heighta+\topspace
+%         \advance\!!heighta+\headerheight
+%         \advance\!!heighta+\headerdistance
+%         \advance\!!heighta-\footerdistance
+%         \advance\!!heighta-\footerheight
+%       \fi
+%       \getnoflines\!!heighta
+%       \!!heighta\noflines\lineheight\relax
+%       \def\docornerfigure[####1]%
+%         {\expanded{\plaatsfiguur[####1,\v!none]{}
+%            {\noexpand\phantombox[\c!width=\the\!!widtha,\c!height=\the\!!heighta]}}}%
+%       \if!!donea
+%         \if!!doneb % links  boven / rb
+%           \setlayer[#1]
+%             [\c!corner={\v!left,\v!top},\c!location=rb,#3]
+%             {\flushnextbox}%
+%           \docornerfigure[tblr]%
+%         \else      % links  onder / rt
+%           \setlayer[#1]
+%             [\c!corner={\v!left,\v!bottom},\c!location=rt,#3]
+%             {\flushnextbox}%
+%           \docornerfigure[btlr]%
+%         \fi
+%       \else
+%         \if!!doneb % rechts boven / lt
+%           \setlayer[#1]
+%             [\c!corner={\v!right,\v!top},\c!location=lb,#3]
+%             {\flushnextbox}%
+%           \docornerfigure[tbrl]%
+%         \else      % rechts onder / lb
+%           \setlayer[#1]
+%             [\c!corner={\v!right,\v!bottom},\c!location=lt,#3]
+%             {\flushnextbox}%
+%           \docornerfigure[btrl]%
+%         \fi
+%       \fi
+%       \egroup}
+%    \vbox}
diff --git a/tex/context/base/page-set.mkiv b/tex/context/base/page-set.mkiv
new file mode 100644
index 000000000..e50c5ec21
--- /dev/null
+++ b/tex/context/base/page-set.mkiv
@@ -0,0 +1,3104 @@
+%D \module
+%D   [       file=page-set,
+%D        version=2000.10.20,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Column Sets,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% getnoflines vs getrawnoflines
+
+% some day: cleanup and go etex
+
+\writestatus{loading}{ConTeXt Page Macros / Column Sets}
+
+% todo : last longer than previous
+% todo : block span over last column if footnotes
+% todo : diagnosis balancing run
+% todo : separate footnote placement
+% todo : go on on same page with colset
+% todo : test page areas per page
+% todo : leftmargin/rightmargin (better than afstand(1))
+
+% use the OTRSET layer for more purposes, like the footnotes !
+
+\unprotect
+
+\newcount\tofcolumns % total
+\newcount\lofcolumns % left
+\newcount\rofcolumns % right
+
+\newcount\columnfirstcell \columnfirstcell=1
+\newcount\columnlastcell
+\newcount\columnfreecells
+\newcount\currenthcell
+\newcount\currentvcell
+\newcount\columnhcells
+\newcount\columnvcells
+
+\newif\ifenoughcolumncells
+\newif\ifsomefreecolumncells
+\newif\ifcolumnspread
+\newif\iftracecolumnset    %   \tracecolumnsettrue
+
+\def\columnmaxcells    {75} % runtime
+\def\columnmaxfreecells {0} % runtime
+\def\columngaplimit     {0} % {5}
+
+\def\@otr@{otr}
+
+\def\OTRSETmakeupwidth{\innermakeupwidth}
+
+\let\OTRSETflushsidefloats      \forgetsidefloats % \relax
+\let\OTRSETsynchronizesidefloats\forgetsidefloats % \relax
+
+\def\OTRSETgridcell   #1#2{\csname              \@otr@:\number#1:\number#2\endcsname}
+\def\OTRSETgetgridcell#1#2{\box\csname          \@otr@:\number#1:\number#2\endcsname}
+\def\OTRSETsetgridcell#1#2{\global\setbox\csname\@otr@:\number#1:\number#2\endcsname}
+
+\long\def\OTRSETdoifcellelse#1#2%
+  {\relax\ifvoid\csname\@otr@:\number#1:\number#2\endcsname
+     \@EA\secondoftwoarguments\else\@EA\firstoftwoarguments
+   \fi}
+
+% The following two macros are used to compensate for a switch in body fonts
+% as in:
+%
+% \definecolumnset [two]  [n=2,balancing=yes]
+% \definecolumnset [three] [n=3,balancing=yes]
+%
+% \setupcolumnsetlines[two][1][1][7]
+% \setupcolumnsetlines[two][1][2][10]
+%
+% \setupcolumnsetlines[three][1][1][40]
+% \setupcolumnsetlines[three][1][2][40]
+% \setupcolumnsetlines[three][1][3][40]
+%
+% \setupcolumnsetstart[three][1][1][15]
+% \setupcolumnsetstart[three][1][2][20]
+% \setupcolumnsetstart[three][1][3][20]
+%
+% \starttext
+%   \startcolumnset [two] \dorecurse {1}{\input tufte \par} \stopcolumnset
+%   \switchtobodyfont[small]
+%   \startcolumnset [three] \dorecurse {1}{\input tufte \par} \stopcolumnset
+% \stoptext
+
+%D Marks in columnsets:
+%D
+%D \starttyping
+%D \definemarking[M]
+%D \setupheadertexts[\setups{show-M-marks}]
+%D \definecolumnset[test][n=3]
+%D
+%D \startsetups show-M-marks
+%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][1][last]\quad
+%D \getmarking[M][2][previous]/\getmarking[M][2][first]/\getmarking[M][2][last]\quad
+%D \getmarking[M][3][previous]/\getmarking[M][3][first]/\getmarking[M][3][last]\quad
+%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][last]\quad
+%D \getsavedmarking[M][previous]/\getsavedmarking[M][first]/\getsavedmarking[M][last]
+%D \stopsetups
+%D
+%D \startbuffer
+%D \section{Knuth} [K1]\marking[M]{k1} [K2]\marking[M]{k2} \input knuth
+%D \section{Zapf}  [Z]\marking[M]{z} \input zapf
+%D \stopbuffer
+%D
+%D \startbuffer
+%D \section{Ward} [W]\marking[M]{w} \input ward
+%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D \section{Davis} [D]\marking[M]{d} \input davis
+%D \section{Zapf} [Z]\marking[M]{z} \input zapf
+%D \stopbuffer
+%D
+%D \startbuffer
+%D \section{Ward} [W]\marking[M]{w} \input ward
+%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D \section{Davis} [D]\marking[M]{d} \input davis
+%D \section{Zapf} [Z]\marking[M]{z} \input zapf
+%D \section{Douglas} [O]\marking[M]{o} \input douglas
+%D \stopbuffer
+%D
+%D \starttext
+%D   \startcolumnset[test]
+%D     \dorecurse{5}{\getbuffer}
+%D     \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D     % \column % sometimes needed
+%D   \stopcolumnset
+%D \stoptext
+%D \stoptyping
+
+% not ok yet, for column sets we need a special case: within a column we
+% need to bubble-up the marks; the indirectness permits overloading here
+
+\let\saveOTRSETmark  \refreshsavedmark
+\let\bubbleOTRSETmark\bubblesavedmark
+\let\resetOTRSETmark \resetsavedmark
+\let\presetOTRSETmark\presetsavedmark
+
+\def\doregisterOTRSETmarks#1{\saveOTRSETmark  [#1][\number\mofcolumns]}
+\def\dobubbleOTRSETmarks  #1{\bubbleOTRSETmark[#1][\number\mofcolumns]}
+\def\doresetOTRSETmarks   #1{\resetOTRSETmark [#1][\recurselevel]}
+\def\dopresetOTRSETmarks  #1{\presetOTRSETmark[#1][\recurselevel]}
+
+\def\registerOTRSETmarks
+  {\processcommacommand[\alldefinedmarks]\doregisterOTRSETmarks}
+\def\bubbleOTRSETmarks
+  {\processcommacommand[\alldefinedmarks]\dobubbleOTRSETmarks}
+\def\resetOTRSETmarks
+  {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\doresetOTRSETmarks}}
+\def\presetOTRSETmarks
+  {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\dopresetOTRSETmarks}}
+
+%D test case of Vit Zika (context list):
+%D
+%D \starttyping
+%D \setuplayout[height=middle,width=middle,grid=yes]
+%D
+%D \starttext
+%D   \startcolumnset
+%D     \dorecurse{10}
+%D       {\input thuan \endgraf
+%D        \bgroup
+%D        \ss\restoreinterlinespace
+%D        \dorecurse{3}{\input hawking \endgraf}
+%D        \egroup
+%D        \input bryson \endgraf}
+%D   \stopcolumnset
+%D \stoptext
+%D \stoptyping
+
+\def\OTRSETsetcorrectnofcells#1%
+  {\bgroup
+   \!!counta#1\relax
+   \ifdim\globalbodyfontsize=\localbodyfontsize
+     \restoreinterlinespace
+   \else
+     \!!dimena-\!!counta\lineheight
+     \restoreglobalbodyfont % slow, we need a fast one
+     \advance\!!dimena\!!counta\lineheight
+     \getnoflines\!!dimena
+     \advance\!!counta\noflines
+     \ifnum\!!counta<#1\else
+       \!!counta#1\relax
+     \fi
+   \fi
+   \relax % needed ! ! ! ! else lookahead over \fi and \@EA
+   \@EA\egroup\@EA\scratchcounter\the\!!counta\relax}
+
+\def\OTRSETsetcorrectcellht
+  {\bgroup
+   \!!dimena-\strutht\relax
+   \ifdim\globalbodyfontsize=\localbodyfontsize
+     \restoreinterlinespace
+   \else
+     \restoreglobalbodyfont
+   \fi
+   \advance\!!dimena\strutht
+   \relax % needed ! ! ! ! else lookahead over \fi and \@EA
+   \@EA\egroup\@EA\scratchdimen\the\!!dimena\relax}
+
+\def\columnerasegridboxes % maybe dedicated loops
+  {\bgroup
+   \increment\columnmaxcells\relax
+   \ifodd\realpageno
+   \else % we are on the other page
+     \columnspreadfalse
+   \fi
+   \ifcolumnspread
+     \dorecurse\nofcolumns
+       {\let\!!stringa\recurselevel
+        \scratchcounter\recurselevel \advance\scratchcounter\lofcolumns
+        \edef\!!stringb{\the\scratchcounter}%
+        \dostepwiserecurse \zerocount \columnmaxcells \plusone
+          {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname
+             \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+             \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname
+               \box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+              %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+             \else
+               \emptybox
+              %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox
+               \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
+             \fi
+           \else
+             \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+             \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname
+               \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+             \else
+               \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
+             \fi
+           \fi}}%
+   \else
+     \dorecurse \tofcolumns
+       {\let\!!stringa\recurselevel
+        \dostepwiserecurse \zerocount \columnmaxcells \plusone
+          {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname
+             \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox
+           \else
+             \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+           \fi}}%
+   \fi
+   \dorecurse\tofcolumns
+     {\global\setbox\csname\@otr@:\recurselevel:\columnmaxcells\endcsname\copy\placeholderboxa}%
+   \global\columnfirstcell\zerocount
+   \global\columnlastcell\columnfirstcell
+   \global\columnfreecells\columnfirstcell
+   \egroup}
+
+\def\doOTRSETsetgridcells#1#2#3#4#5#6% placeholder col row wid hei {data}
+  {\!!countd#2\advance\!!countd#4\advance\!!countd\minusone
+   \!!counte#3\advance\!!counte#5\advance\!!counte\minusone
+   \dostepwiserecurse{#2}\!!countd\plusone
+     {\!!countf\recurselevel
+      \dostepwiserecurse{#3}\!!counte\plusone
+        {\OTRSETsetgridcell\!!countf\recurselevel#1}}%
+   \dostepwiserecurse{#3}\!!counte\plusone
+     {\global\wd\OTRSETgridcell{#2}\recurselevel\hsize}%
+   \OTRSETsetgridcell{#2}\!!counte#6}
+
+\def\OTRSETsetgridcells
+  {\doOTRSETsetgridcells{\copy\placeholderboxb}}
+
+\def\OTRSETerasegridcells#1#2#3#4%
+  {\doOTRSETsetgridcells{\emptybox}{#1}{#2}{#3}{#4}{\emptybox}}
+
+\def\setupcolumnsetlines{\doquintupleempty\dosetupcolumnsettrick[l]}
+\def\setupcolumnsetstart{\doquintupleempty\dosetupcolumnsettrick[s]}
+
+\def\dosetupcolumnsettrick[#1][#2][#3][#4][#5]% tag id page col value
+  {% not needed, is already relative
+   % \doifinstringelse{+}{#3}{\scratchcounter\realpageno}{\scratchcounter\zerocount}%
+   % \advance\scratchcounter#3\relax % \relax needed
+   % \setevalue{\??mc:#1:#2:\the\scratchcounter:\number#4}{\number#5}}
+   \iffifthargument
+     \setevalue{\??mc:#1:#2:\number#3:\number#4}{\number#5}%
+   \else
+     \setevalue{\??mc:#1:#2:\number#3:0}{\number#4}%
+   \fi}
+
+\def\currentcolumnmaxcellstag #1{\??mc:l:\OTRSETidentifier:\columnsetpage:\number#1}
+\def\currentcolumnstartcelltag#1{\??mc:s:\OTRSETidentifier:\columnsetpage:\number#1}
+
+\def\doresetcolumnsetlines#1%
+  {\ifcsname\currentcolumnmaxcellstag{#1}\endcsname
+     \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
+   \fi
+   \ifcsname\currentcolumnmaxcellstag{#1}\endcsname
+     \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
+   \fi}
+
+\def\currentcolumnsomecells#1#2%
+  {\ifcsname#1\mofcolumns\endcsname
+     \ifnum\csname#1\mofcolumns\endcsname=\zerocount
+       #2%
+     \else
+       \number\numexpr\ifnum\csname#1\mofcolumns\endcsname<\zerocount
+         \columnmaxcells+\fi\csname#1\mofcolumns\endcsname\relax
+     \fi
+   \else\ifcsname#10\endcsname
+     \ifnum\csname#10\endcsname=\zerocount
+       #2%
+     \else
+       \number\numexpr\ifnum\csname#10\endcsname<\zerocount
+         \columnmaxcells+\fi\csname#10\endcsname\relax
+     \fi
+   \else
+     #2%
+   \fi\fi}
+
+\def\currentcolumnmaxcells {\currentcolumnsomecells\currentcolumnmaxcellstag \columnmaxcells}
+\def\currentcolumnstartcell{\currentcolumnsomecells\currentcolumnstartcelltag\plusone}
+
+\def\OTRSETsetfreecells#1#2% col start
+  {\bgroup
+   \global\columnfirstcell\ifnum#2=0 1\else#2\fi\relax
+   \OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter
+   \edef\columnmaxcells{\the\scratchcounter}%
+   \ifnum\columnfirstcell>\columnmaxcells
+     \global\columnfreecells\zerocount
+     \global\columnfirstcell\plusone
+     \global\columnlastcell \zerocount
+     \global\somefreecolumncellsfalse
+    %\message{no cells a}%
+   \else
+     \doloop
+       {\ifnum\columnfirstcell>\columnmaxcells\relax
+          \exitloop
+        \else
+          \OTRSETdoifcellelse{#1}\columnfirstcell
+            {\global\advance\columnfirstcell\plusone}\exitloop
+        \fi}%
+     \global\columnlastcell\columnfirstcell
+     \doloop
+       {\ifnum\columnlastcell>\columnmaxcells\relax
+          \exitloop
+        \else
+          \OTRSETdoifcellelse{#1}\columnlastcell
+            {\global\advance\columnlastcell \minusone \exitloop}
+            {\global\advance\columnlastcell \plusone }%
+        \fi}%
+     \ifnum\columnfirstcell>\columnmaxcells
+       \global\columnfreecells\zerocount
+       \global\columnfirstcell\plusone
+       \global\columnlastcell \zerocount
+       \global\somefreecolumncellsfalse
+      %\message{no cells b}%
+     \else
+       \ifnum\columnlastcell>\columnmaxcells
+         \global\columnlastcell\columnmaxcells
+       \fi
+       \global\columnfreecells\columnlastcell
+       \global\advance\columnfreecells -\columnfirstcell
+       \global\advance\columnfreecells \plusone
+       \global\somefreecolumncellstrue
+      %\message{\number\columnfirstcell-\number\columnlastcell=\number\columnfreecells}%
+     \fi
+   \fi
+   \egroup}
+
+\def\OTRSETgetmaxfreecells#1#2% col start
+  {\let\columnmaxfreecells\!!zerocount
+   \let\columnfrmfreecells\!!zerocount
+   \pushmacro \columnmaxcells
+\OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter
+\edef\columnmaxcells{\the\scratchcounter}%
+   \scratchcounter\zerocount
+   \dostepwiserecurse{#2}\columnmaxcells\plusone
+     {\OTRSETdoifcellelse{#1}\recurselevel
+        {\ifnum\columnmaxfreecells<\scratchcounter
+           \edef\columnmaxfreecells{\the\scratchcounter}%
+           \let\columnfrmfreecells\recurselevel
+         \fi
+         \scratchcounter\zerocount}
+        {\advance\scratchcounter\plusone}}%
+   \popmacro\columnmaxcells}
+
+\long\def\OTRSETrecurseRL#1%
+  {\dostepwiserecurse\nofcolumns\plusone\minusone
+     {#1\hskip\OTRSETgetparameter\c!distance\recurselevel}}
+
+\def\OTRSETmakegridbox
+  {\ifcase\columndirection
+     \OTRSETdomakegridbox\plusone\nofcolumns\plusone
+   \else
+     \OTRSETdomakegridbox\nofcolumns\plusone\minusone
+   \fi}
+
+\def\OTRSETmakeupwidth{\makeupwidth} % temporary indirectness
+
+\def\OTRSETdomakegridbox#1#2#3%
+  {\hbox\bgroup
+   \dontcomplain
+   \forgetall % can go once in \flush
+   \!!heighta \textheight
+   % test first !
+   \hbox to \OTRSETmakeupwidth
+     {\dostepwiserecurse{#1}{#2}{#3}
+        {\mofcolumns\recurselevel
+         \localcolumnwidth\OTRSETlocalwidth\mofcolumns
+         \setbox\scratchbox\hbox\localframed
+           [\??mc\OTRSETidentifier\number\mofcolumns]%
+           [\c!width=\localcolumnwidth,\c!height=\!!heighta,\c!lines=]%
+           {}%
+         \wd\scratchbox\localcolumnwidth
+         \ht\scratchbox\!!heighta
+         \ifcase\columndirection
+           \hskip\OTRSETgetparameter\c!distance\recurselevel
+           \box\scratchbox
+         \else
+           \box\scratchbox
+           \hskip\OTRSETgetparameter\c!distance\recurselevel
+         \fi}}%
+   \hskip-\OTRSETmakeupwidth
+   % main text
+   \hbox to \OTRSETmakeupwidth
+     {\dostepwiserecurse{#1}{#2}{#3}
+        {\mofcolumns\recurselevel
+         \localcolumnwidth\OTRSETlocalwidth\mofcolumns
+         \offinterlineskip
+         \setbox\scratchbox\vbox to \!!heighta
+           {\topskipcorrection % not needed
+            \ifcase\OTRSETbalancemethod
+              % no
+            \or
+              % yes
+              \doifelselayerdata{OTRTEXT}\vfill\relax % temp hack
+            \or
+              % top
+            \or
+              % bottom
+              \vfill
+            \fi
+            \dorecurse\columnmaxcells
+              {\setbox\scratchbox\hbox{\OTRSETgetgridcell\mofcolumns\recurselevel}%
+               \ht\scratchbox\strutht
+               \dp\scratchbox\strutdp
+               \ifcase\columndirection
+                 \box\scratchbox
+               \else
+                 \hbox to \localcolumnwidth
+                   {\hskip\localcolumnwidth\llap{\box\scratchbox}}%
+               \fi
+               \par}%
+            \ifcase\OTRSETbalancemethod
+              % no
+            \else
+              % yes, top, bottom
+              \ifdim\globalbodyfontsize=\localbodyfontsize
+                \removedepth
+                \restoreglobalbodyfont
+                \vskip\strutdepth
+              \fi
+              \kern\zeropoint
+              \vss
+            \fi}%
+         \wd\scratchbox\localcolumnwidth % \textwidth
+         \ifcase\columndirection
+           \hskip\OTRSETgetparameter\c!distance\recurselevel\box\scratchbox
+         \else
+           \box\scratchbox\hskip\OTRSETgetparameter\c!distance\recurselevel
+         \fi}}%
+   \egroup}
+
+\let\OTRSETbalht\zeropoint
+
+\def\OTRSETreducegridbox % for the moment no difference between methods
+  {\globallet\OTRSETbalht\zeropoint
+   \ifcase\OTRSETbalancemethod
+     % no balancing
+   \else
+     \bgroup
+     \!!counta\columnmaxcells
+     \donetrue
+     \doloop
+       {\dorecurse\nofcolumns{\OTRSETdoifcellelse\recurselevel\!!counta\donefalse\donothing}%
+        \ifdone
+          \ifnum\!!counta>\plusone\advance\!!counta\minusone\else\exitloop\fi
+        \else
+          \exitloop
+        \fi}%
+     \ifnum\!!counta>\plusone
+       \!!heighta\lineheight
+       \multiply\!!heighta \!!counta
+       \advance\!!heighta \topskip
+       \advance\!!heighta -\lineheight
+     \else
+       \!!heighta\zeropoint
+     \fi
+     \xdef\OTRSETbalht{\the\!!heighta}%
+     \egroup
+   \fi}
+
+\def\OTRSETflushfinalfootnotes
+  {\ifcase\lastcolumnlastcell \else
+     \setbox\scratchbox\hbox
+       {\placebottomnotes}%
+     \ifdim\ht\scratchbox>\zeropoint
+       \setbox\scratchbox\hbox
+         {\hbox to \zeropoint{\OTRSETgetgridcell\nofcolumns\lastcolumnlastcell}%
+          \box\scratchbox}%
+       \ht\scratchbox\strutht
+       \dp\scratchbox\strutdp
+       \OTRSETsetgridcell\nofcolumns\lastcolumnlastcell\box\scratchbox
+     \fi
+     \global\lastcolumnlastcell\zerocount
+   \fi}
+
+\def\OTRSETdoflush
+  {\ifcollectingcontent
+     \registerOTRSETmarks
+     \global\mofcolumns\plusone
+   \else
+     \OTRSETdofinalflush
+     \OTRSETdofinaloutput
+     \ifnum\columnsetpage>0
+       \dorecurse\nofcolumns{\doresetcolumnsetlines\recurselevel}%
+     \fi
+     \doglobal\increment\columnsetpage
+     \OTRSETinitializecolumns
+    %\OTRSETdoflushfloats
+     \OTRSETstartnextpage
+\presetOTRSETmarks
+     \initializecolumntextareas
+   \fi}
+
+\newbox\OTRfinalpagebox
+
+\def\OTRSETdofinalflush % see \OTRSETdoflush
+  {\OTRSETflushfinalfootnotes
+   \placecolumntextareas
+   \OTRSETcentergridcells
+   \bgroup % we want to keep the reduction local
+     \OTRSETreducegridbox
+     \global\setbox\OTRfinalpagebox\OTRSETmakegridbox
+   \egroup % otherwise we get the wrong number of free cells
+  %\gdef\localcolumnmaxcells{0}% here ?
+   \global\mofcolumns\nofcolumns} % otherwise problems in finaloutput
+
+% \def\OTRSETdofinaloutput
+%   {\ifdim\ht\OTRfinalpagebox=\teksthoogte
+%    % \bgroup \let\OTRSETsetvsize\relax % prevents useless search for gap
+%      \ifcase\OTRSETbalancemethod
+%        \finaloutput\box\OTRfinalpagebox
+%      \else\ifdim\OTRSETbalht>\zeropoint
+%        \global\setbox\OTRfinalpagebox \iftracecolumnset\ruledvbox\else\vbox\fi to \OTRSETbalht
+%          {\box\OTRfinalpagebox}%
+%        \global\dp\OTRfinalpagebox\strutdepth
+%        \box\OTRfinalpagebox
+%      \else
+%        \finaloutput\box\OTRfinalpagebox
+%      \fi \fi
+%      \globallet\OTRSETbalht\zeropoint
+%    % \egroup
+%    \fi}
+
+\def\OTRSETdofinaloutput
+  {\ifdim\ht\OTRfinalpagebox=\textheight
+    \bgroup % \let\OTRSETsetvsize\relax % prevents useless search for gap
+     \ifcase\OTRSETbalancemethod
+       \finaloutput\box\OTRfinalpagebox
+     \else\ifdim\OTRSETbalht>\zeropoint
+       % catch a bordercase
+       \scratchdimen\OTRSETbalht
+       \advance\scratchdimen\lineheight\relax
+       \ifdim\scratchdimen>\textheight
+         % full page
+         \finaloutput\box\OTRfinalpagebox
+       \else
+         % same page
+         \global\setbox\OTRfinalpagebox \iftracecolumnset\ruledvbox\else\vbox\fi to \OTRSETbalht
+           {\box\OTRfinalpagebox\vss}%
+         \setlayer[OTRTEXT]{\box\OTRfinalpagebox}%
+         \snaptogrid\vbox{\vskip\OTRSETbalht}% hack
+       \fi
+     \else
+       \finaloutput\box\OTRfinalpagebox
+     \fi \fi
+     \globallet\OTRSETbalht\zeropoint
+    \egroup
+   \fi}
+
+\definesystemvariable {mc}
+\definesystemvariable {mt}
+\definesystemconstant {colset}
+
+\definetwopasslist\s!colset
+
+\newdimen  \OTRSETtextswidth
+\newdimen  \OTRSETtextsheight
+\let       \OTRSETidentifier=\empty
+
+\newtoks   \OTRSEToutput
+
+\def\OTRSETgetparameter#1#2{\csname\??mc\OTRSETidentifier\number#2#1\endcsname}
+\def\OTRSETsetparameter#1#2{\setvalue{\??mc\OTRSETidentifier\number#2#1}}
+
+\def\OTRSETskipstart
+  {\scratchcounter\executeifdefined{\??mc\OTRSETidentifier\c!start}\zerocount
+   \relax % needed !
+   \ifcase\scratchcounter\else
+     \advance\scratchcounter\plusone
+     \doOTRSETsetgridcells
+       {\copy\placeholderboxe}
+       \plusone\plusone\nofcolumns\scratchcounter
+       \null
+   \fi}
+
+\def\OTRSETsetvsize % snap per sectie (gap here?)
+  {\ifcollectingcontent \else % can be assigndimen
+\OTRSETskipstart % not that well tested
+     \OTRSETcheckinsert % added
+     \OTRSETsetfreecells\mofcolumns\columnfirstcell
+     \ifsomefreecolumncells
+       \global\vsize\columnfreecells\lineheight
+       \ifinotr % else problems with floats, see extreme
+         \global\pagegoal\vsize % niet nodig, tenzij binnen otr
+       \fi
+       \synchronizeoutput % fails on example
+      % \allowbreak % hm
+     \fi
+     \synchronizenotes
+   \fi}
+
+\def\OTRSETsethsize % of course this does not migrate outside the otr
+  {\localcolumnwidth\OTRSETlocalwidth\mofcolumns
+   \textwidth\localcolumnwidth
+   \hsize\localcolumnwidth}
+
+\def\OTRSETsynchronizehsize
+  {\ifcase0\getvalue{\??mc\??mc\c!width}\else % some width set
+     \bgroup
+     \scratchdimen\OTRSETlocalwidth\mofcolumns
+     \ifdim\scratchdimen=\textwidth
+       \egroup
+     \else
+       % only if change in width and \column/\break
+       \egroup \OTRSETsethsize
+     \fi
+   \fi}
+
+\def\OTRSETcheckfreelines
+  {\OTRSETsetvsize}
+
+\def\doOTRSETcolumnseparator
+  {\hbox to \zeropoint{\hss\red\vl\hss}}
+
+\let\OTRSETcolumnseparator\relax
+
+\def\showbreaks
+  {\let\OTRSETcolumnseparator\doOTRSETcolumnseparator}
+
+% \installcolumnbreakhandler {SET} \v!ja
+%   {% hmmm:
+%    \ifhmode
+%      \bgroup
+%      \removeunwantedspaces
+%      \parfillskip\zeropoint
+%      \OTRSETcolumnseparator
+%      \par
+%      \egroup
+%    \fi
+%    % brrr:
+%    \ejectinsert
+%    \ejectpage
+%    \OTRSETsynchronizehsize} % no \OTRSETsethsize, can be mid smaller (like tabulate)
+%
+% \installcolumnbreakhandler {SET} \v!forceer
+%   {\OTRSETgotocolumn[\v!forceer]}
+% \installcolumnbreakhandler {SET} \v!eerste
+%   {\OTRSETgotocolumn[\v!eerste]}
+% \installcolumnbreakhandler {SET} \v!laatste
+%   {\OTRSETgotocolumn[\v!laatste]}
+%
+% \installcolumnbreakhandler {SET} \v!pagina
+%   {\simplepagebreak % \flushnotes \executepagebreakhandler\v!ja
+%    \ifnum\mofcolumns>\plusone
+%      \OTRSETgotocolumn[\v!laatste,\v!forceer]%
+%    \fi}
+
+\def\OTRSETcolumnhbreak
+  {\ifhmode
+     \bgroup
+     \removeunwantedspaces
+     \parfillskip\zeropoint
+     \OTRSETcolumnseparator
+     \par
+     \egroup
+   \fi}
+
+\installcolumnbreakhandler {SET} \v!local
+  {\OTRSETcolumnhbreak
+   \ejectinsert
+   \ejectpage % brrr
+   % no \OTRSETsethsize, can be mid smaller (like tabulate)
+   % also, this one should be executed at the outer level
+   % (setting hsize inside otr does not work)
+   \OTRSETsynchronizehsize}
+
+% We need to make sure that we really leave the column; mid
+% column we may end up in an empty gap, and we don't want to
+% stay there (basically such a gap is a small empty page
+% then).
+
+\installcolumnbreakhandler {SET} \v!yes
+  {\OTRSETcolumnhbreak
+   \edef\savedmofcolumns{\the\mofcolumns}%
+   \edef\savedrealpageno{\the\realpageno}%
+   \ejectinsert
+   \ejectpage % brrr
+   \doloop
+     {\ifnum\savedmofcolumns=\mofcolumns
+        \ifnum\savedrealpageno=\realpageno
+          \OTRSETdummycolumn
+        \else
+          \exitloop
+        \fi
+      \else
+        \exitloop
+      \fi}%
+   \OTRSETsynchronizehsize}
+
+\installcolumnbreakhandler {SET} \s!unknown
+  {\expanded{\OTRSETgotocolumn[\@@columnspecification]}}
+
+\installcolumnbreakhandler {SET} \v!page
+  {\vfill\eject % \doejectpage\eject
+   \OTRSETgotonextpage}
+
+\newtoks\OTRSETeverystartofcolumn
+
+\newbox\OTRSETsavedfootnotes
+
+% \installoutput\OTRSETflushtextsofar % spacing goes wrong
+
+%\def\OTRSETflushtextsofar
+%  {\ifvoid\normalpagebox \else
+%     \setbox\scratchbox\vbox{\unvbox\normalpagebox}%
+%     \OTRSETsavenotes
+%     \OTRSEThandleflushedtext0
+%   \fi}
+
+% The complication is in the fact that when the HERE float
+% is placed, the otr is not invoked when there is not yet
+% enough content; this can lead to a change in order (turning
+% on the tracer with option 0 is very instructive, watch the
+% small numbers in the margin)
+%
+% 0 = no flushing, so no interference but user should handle
+%     border cases of placement
+% 1 = the normal otr, rather untested
+% 2 = a solution that works ok, is experimental and above
+%     all messy
+
+\chardef\OTRSETflushtextmode=0
+
+\def\OTRSETflushtextsofar
+  {\ifcase\OTRSETflushtextmode
+     % don't mess around
+   \or
+     % the normal one
+     \ifvoid\normalpagebox\else
+       \OTRSETnaturalflush
+       \OTRSETcheckfreelines
+     \fi
+   \or
+     % way to complicated, but kind of ok
+     \doOTRSETflushtextsofar
+   \fi}
+
+\newskip\lastskipinotr
+
+\installoutput\doOTRSETflushtextsofar % experimental
+  {\ifvoid\normalpagebox\else
+     \scratchdimen\dp\normalpagebox
+     \setbox\scratchbox\vbox
+       {\forgetall
+        \unvbox\normalpagebox
+        \global\lastskipinotr\lastskip\relax
+        \ifdim\lastskipinotr>\zeropoint\relax
+          \removelastskip
+        \else
+          \kern-\scratchdimen % handle depth
+        \fi}%
+     \ifdim\lastskipinotr>\zeropoint
+       \scratchskip\ht\scratchbox
+       \setbox\scratchbox\hbox
+         {\lower\strutdepth\box\scratchbox}%
+       \dp\scratchbox\scratchdimen
+       \ht\scratchbox\scratchskip
+     \fi
+     \OTRSETsavenotes
+     \OTRSEThandleflushedtext\zerocount
+     \ifdim\lastskipinotr>\zeropoint
+       %\vskip \lastskipinotr % hm, gets lost anyway
+     \else
+       % we should not discard skips after here; tricky
+     \fi
+     \OTRSETsetvsize
+   \fi}
+
+\def\OTRSETplacebottomnotes
+  {\iflastcolumnfootnotes
+     \ifnum\nofcolumns=\mofcolumns
+       \ifintermediatefootnotes \placebottomnotes \fi
+     \fi
+   \else
+     \placebottomnotes
+   \fi}
+
+\def\OTRSETflushsavednotes
+  {\iflastcolumnfootnotes
+     \ifnum\nofcolumns=\mofcolumns
+       \flushsavednotes
+     \fi
+   \else
+     \flushsavednotes
+   \fi}
+
+\def\OTRSETsavenotes
+  {\iflastcolumnfootnotes
+     \ifnum\nofcolumns=\mofcolumns \else
+       \savenotes
+     \fi
+   \fi}
+
+\appendtoks \OTRSETflushsavednotes \to \OTRSETeverystartofcolumn
+
+\def\OTRSETnaturalflush
+  {\bgroup
+   \forgetall % new, needed !
+   \setbox0\vbox to \columnfreecells\lineheight
+     {\vskip-\topskip
+      \vskip\lineheight
+      \prevdepth\strutdp
+      \unvbox\normalpagebox
+      \vfill}%
+   \setbox2\hbox
+     {\OTRSETplacebottomnotes}%
+   \setbox\scratchbox\hbox
+     {\wd0\zeropoint\box0\box2}%
+   \dp\scratchbox\strutdp
+   \OTRSEThandleflushedtext\plusone
+   \egroup}
+
+\newcount\lastcolumnlastcell
+
+\def\OTRSEThandleflushedtext#1%
+  {\getnoflines{\ht\scratchbox}%
+  %\wd\scratchbox\textwidth % geen \hsize kan < zijn in bv split tabulate
+   \wd\scratchbox\OTRSETlocalwidth\mofcolumns
+   \doOTRSETsetgridcells
+     {\copy\placeholderboxf}
+     \mofcolumns\columnfirstcell\plusone\noflines
+     {\registeredtextarea1\columnfirstcell\scratchbox}% == \hbox / tricky htcorr == \columnfirstcell
+   \global\columnlastcell\columnfirstcell
+   \global\advance\columnlastcell \noflines
+   \global\lastcolumnlastcell\columnlastcell
+   \global\advance\lastcolumnlastcell \minusone
+   % find next (acceptable) gap, todo: deadcycle
+   \ifcase#1\else
+     \OTRSETfillgapsbetweencells\mofcolumns\columnlastcell
+   \fi
+   \OTRSETfindnextgap
+   % \message{\the\mofcolumns,\the\columnfirstcell,\the\columnfreecells}%
+   % \wait
+   % we cannot adapt the hsize since it may have changed (like
+   % inside a tabulate) so we only change it when there is a
+   % reason to do so
+   \OTRSETsynchronizehsize
+   \OTRSETsetvsize}
+
+\def\OTRSETfindnextgap
+  {\OTRSETsetfreecells\mofcolumns\columnlastcell
+   \ifsomefreecolumncells
+     % okay
+     \bubbleOTRSETmarks % not robust because we reenter
+   \else
+     \registerOTRSETmarks % not robust because we reenter
+     \global\advance\mofcolumns \plusone
+     \ifnum\mofcolumns>\nofcolumns
+       \OTRSETdoflush
+       \global\columnlastcell\plusone
+       \global\columnfirstcell\zerocount
+       \OTRSETdoflushfloats
+     \else
+       \the\OTRSETeverystartofcolumn
+       \global\columnlastcell\plusone
+       \global\columnfirstcell\zerocount
+     \fi
+   \fi}
+
+\let\OTRSETcheckfreelines\donothing
+
+\def\OTRSETfillgapsbetweencells#1#2% col
+  {\ifnum\columngaplimit>\zerocount
+     \donefalse
+     \dostepwiserecurse{#2}\columnmaxcells\plusone
+       {\OTRSETdoifcellelse{#1}\recurselevel
+          {\ifdone
+             \!!countb\recurselevel \advance\!!countb -\!!counta\relax
+             \ifnum\!!countb>\plusone
+               \advance\!!countb \minusone
+               \ifnum\!!countb<\columngaplimit\relax
+                 \!!countb\recurselevel \advance\!!countb \minusone
+                 \dostepwiserecurse\!!counta\!!countb\plusone
+                   {\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}%
+                %\message{[gap]}%
+               \fi
+             \fi
+           \fi
+           \donefalse}
+          {\ifdone \else
+             \donetrue
+             \!!counta\recurselevel
+           \fi}}%
+   \fi}
+
+\appendtoks
+  \OTRSETfillgapsbetweencells\mofcolumns\plusone
+\to \OTRSETeverystartofcolumn
+
+%\def\OTRSETfreezeminimumgap#1%
+%  {\OTRSETgetmaxfreecells{#1}{1}%
+%   \ifnum\columnmaxfreecells>0
+%     \!!countb=\columnfrmfreecells
+%     \!!counta=\!!counta \advance\!!counta -\columnmaxfreecells
+%     \dorecurse{\columnmaxcells}
+%       {\ifnum\recurselevel<\!!counta\relax
+%          \donetrue
+%        \else\ifnum\recurselevel>\!!countb
+%          \donetrue
+%        \else
+%          \donefalse
+%        \fi\fi
+%        \ifdone
+%          \OTRSETdoifcellelse{#1}{\recurselevel}
+%            {}{\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}%
+%        \fi}%
+%   \fi}
+%
+%\def\OTRSETfillgaps#1#2#3% col from to
+%  {\dostepwiserecurse{#2}{#3}{1}
+%     {\OTRSETdoifcellelse{#1}{\recurselevel}
+%        {}{\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}}}
+%
+%\def\OTRSETfillbotgaps#1#2% col first
+%  {\OTRSETfillgaps{#1}{#2}{\columnmaxcells}}
+%
+%\def\OTRSETfilltopgaps#1#2% col last
+%  {\OTRSETfillgaps{#1}{1}{#2}}
+
+\newif\ifspancolumnslots \spancolumnslotstrue
+\newif\ifcheckcolumnspan \checkcolumnspantrue
+
+\def\OTRSETcheckwidthgap#1#2% box size
+  {\ifcheckcolumnspan
+     \bgroup
+     \scratchdimen#2%
+     \advance\scratchdimen-\wd#1\relax
+     \ifdim-10\scaledpoint>\scratchdimen
+       \egroup
+     \else\ifdim10\scaledpoint<\scratchdimen
+       \egroup
+     \else
+       \egroup
+       \wd#1=#2%
+     \fi\fi
+   \fi}
+
+\def\OTRSETcheckcolumnslot#1%
+  {\enoughcolumncellstrue
+   \ifspancolumnslots\else
+     \OTRSETcheckwidthgap#1\hsize
+     \ifdim\wd#1>\hsize
+       \enoughcolumncellsfalse
+     \fi
+   \fi
+   \ifenoughcolumncells
+     \getnoflines\pagetotal
+     \scratchcounter\noflines
+     \getnoflines{\ht#1}%
+     \columnvcells\noflines
+     \columnhcells\plusone
+     \advance\scratchcounter \columnvcells \relax
+     \ifnum\scratchcounter>\columnfreecells
+       \enoughcolumncellsfalse
+     \fi
+   \fi}
+
+\def\OTRSETstoreincolumnslotPAGE#1%
+  {\ifenoughcolumncells
+     % to do
+     \OTRSETsavebox{#1}%
+   \else
+     \OTRSETsavebox{#1}%
+   \fi}
+
+\def\OTRSETstoreincolumnslotTOPS#1%
+  {\OTRSETprepareforcolumnslot1{#1}%
+   \OTRSETcheckcolumnslot{#1}%
+   \ifenoughcolumncells
+     \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}%
+   \fi
+   \ifenoughcolumncells
+     \OTRSETsetgridcells\mofcolumns\columnfirstcell\columnhcells\columnvcells
+       {\hbox{\copy#1}}%
+     \OTRSETsetvsize
+   \else
+     \OTRSETsavebox{#1}%
+   \fi}
+
+\def\OTRSETstoreincolumnslotBOTS#1%
+  {\OTRSETprepareforcolumnslot3{#1}%
+   \edef\savedcolumnlastcell{\the\columnlastcell}%
+   \OTRSETcheckcolumnslot{#1}%
+   \ifenoughcolumncells
+     \advance\columnlastcell -\columnvcells \advance\columnlastcell \plusone
+%     \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}%
+     \OTRSETcheckcolumnspace\mofcolumns\columnlastcell{#1}%
+   \fi
+   \ifenoughcolumncells
+     \OTRSETsetgridcells\mofcolumns\columnlastcell\columnhcells\columnvcells{\copy#1}%
+     \OTRSETfillgapsbetweencells\mofcolumns\savedcolumnlastcell % -)
+     \OTRSETsetvsize
+   \else
+     \columnlastcell\savedcolumnlastcell
+     \OTRSETsavebox{#1}%
+   \fi}
+
+\newdimen\totalcolumnspace
+
+\def\columnspacetopoffset{0}
+\def\columnspacebotoffset{0}
+
+\def\OTRSETcheckcolumnspace#1#2#3% col row box
+  {\columnhcells\plusone
+   \totalcolumnspace\zeropoint
+   \scratchcounter#1%
+   \enoughcolumncellstrue
+   \doloop
+     {\advance\totalcolumnspace \OTRSETlocalwidth\scratchcounter\relax % needed
+\OTRSETcheckwidthgap#3\totalcolumnspace
+      \ifnum\wd#3>\totalcolumnspace\relax
+        \ifnum\scratchcounter=\nofcolumns
+          \enoughcolumncellsfalse
+          \exitloop
+        \else
+          \advance\columnhcells \plusone
+          \advance\scratchcounter \plusone
+          \advance\totalcolumnspace \OTRSETgetparameter\c!distance\scratchcounter
+        \fi
+      \else
+        \exitloop
+      \fi}%
+   \ifenoughcolumncells
+     \getnoflines{\ht#3}%
+     \columnvcells\noflines
+     \OTRSETcheckcolumncells{#1}{#2}\columnhcells\columnvcells
+   \fi}
+
+\def\OTRSETcheckcolumncells#1#2#3#4% col row wid hei
+  {\!!countd#1\advance\!!countd#3\advance\!!countd\minusone
+   \!!counte#2\advance\!!counte#4\advance\!!counte\minusone
+   \ifnum\!!counte>\columnmaxcells\relax
+     \enoughcolumncellsfalse
+   \else
+     \enoughcolumncellstrue
+%\let\columnspacetopoffset\zerocount
+%\scratchcounter#2\advance\scratchcounter\minusone
+%\ifnum\scratchcounter>0
+%  \dostepwiserecurse{#1}\!!countd\plusone
+%    {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+%       \let\columnspacetopoffset\plusone
+%     \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+%       \let\columnspacetopoffset\plusone
+%     \fi\fi}%
+%  \advance\!!counte \columnspacetopoffset \relax
+%  \advance\columnvcells \columnspacetopoffset \relax
+%\fi
+%\let\columnspacebotoffset\zerocount
+%\scratchcounter\!!counte
+%\advance\scratchcounter \columnvcells \relax
+%\ifnum\scratchcounter>\columnmaxcells\else
+%  \dostepwiserecurse{#1}\!!countd\plusone
+%    {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+%       \let\columnspacebotoffset\plusone
+%     \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+%       \let\columnspacebotoffset\plusone
+%     \fi\fi}%
+%  \advance\!!counte \columnspacebotoffset \relax
+%  \advance\columnvcells \columnspacebotoffset \relax
+%\fi
+     \dostepwiserecurse{#1}\!!countd\plusone % cols
+       {\ifenoughcolumncells
+          \!!countf\recurselevel\relax
+          \dostepwiserecurse{#2}\!!counte\plusone % rows
+            {\ifenoughcolumncells
+               \OTRSETdoifcellelse\!!countf\recurselevel
+                 {\enoughcolumncellsfalse}{}%
+             \fi}%
+        \fi}%
+   \fi}
+
+\def\OTRSETsetpreferedcolumnslot#1#2%
+  {\doifsomething{#1}{\edef\preferedcolumn{#1}}%
+   \doifsomething{#2}{\edef\preferedrow   {#2}}}
+
+\OTRSETsetpreferedcolumnslot{\nofcolumns}{1} % default ?
+
+\let\pofcolumns\mofcolumns
+\let\qofcolumns\mofcolumns
+
+\newif\ifquitincurrentcolumn
+
+\def\OTRSETstoreincolumnslotLRTB#1%
+  {\OTRSETprepareforcolumnslot1{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \mofcolumns\nofcolumns+\currenthcell
+     \plusone\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotLRBT#1%
+  {\OTRSETprepareforcolumnslot3{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \mofcolumns\nofcolumns+\currenthcell
+     \columnmaxcells\plusone-\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotRLTB#1%
+  {\OTRSETprepareforcolumnslot1{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETcheckprefered
+   \OTRSETstoreincolumnslotindeed
+     \nofcolumns\qofcolumns-\currenthcell
+     \plusone\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotRLBT#1%
+  {\OTRSETprepareforcolumnslot3{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETcheckprefered
+   \OTRSETstoreincolumnslotindeed
+     \nofcolumns\qofcolumns-\currenthcell
+     \columnmaxcells\plusone-\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotTBLR#1%
+  {\OTRSETprepareforcolumnslot1{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \plusone\columnmaxcells+\currentvcell
+     \mofcolumns\nofcolumns+\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotTBRL#1%
+  {\OTRSETprepareforcolumnslot1{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETcheckprefered
+   \OTRSETstoreincolumnslotindeed
+     \plusone\columnmaxcells+\currentvcell
+     \nofcolumns\qofcolumns-\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotBTLR#1%
+  {\OTRSETprepareforcolumnslot3{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \columnmaxcells\plusone-\currentvcell
+     \mofcolumns\nofcolumns+\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotBTRL#1%
+  {\OTRSETprepareforcolumnslot3{#1}%
+   \OTRSETflushtextsofar
+   \OTRSETcheckprefered
+   \OTRSETstoreincolumnslotindeed
+     \columnmaxcells\plusone-\currentvcell
+     \nofcolumns\qofcolumns-\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotFXTB#1% fixed column
+  {\OTRSETcheckprefered
+   \OTRSETdoifcellelse\pofcolumns\plusone
+     {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot1}{#1}% % 1/2 dependent of place, todo
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \pofcolumns \pofcolumns    +\currenthcell
+     \preferedrow\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotFXBT#1% fixed column
+  {\OTRSETcheckprefered
+   \OTRSETdoifcellelse\pofcolumns\columnmaxcells
+     {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot3}{#1}% % 3/2 dependent of place, todo
+   \OTRSETflushtextsofar
+   \OTRSETstoreincolumnslotindeed
+     \pofcolumns    \pofcolumns +\currenthcell
+     \columnmaxcells\preferedrow-\currentvcell{#1}}
+
+% \def\OTRSETstoreincolumnslotHERE#1% fixed column
+%   {\OTRSETprepareforcolumnslot2{#1}%
+%    \OTRSETflushtextsofar
+%    \getnoflines\pagetotal \advance\noflines\columnfirstcell
+%    \OTRSETstoreincolumnslotindeed
+%      \mofcolumns\mofcolumns+\currenthcell
+%      \noflines\columnmaxcells+\currentvcell{#1}%
+%    \OTRSETsetvsize}
+
+\chardef\OTRSETforcefixedfloats=0
+
+\def\OTRSETstoreincolumnslotHERE#1% fixed column
+  {\ifcase\OTRSETforcefixedfloats
+     \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+   \else
+     \OTRSETstoreincolumnslotFIXD{#1}%
+   \fi}
+
+% this one looses too wide graphics
+%
+% \def\OTRSETstoreincolumnslotFIXD#1% fixed column
+%   {\OTRSETprepareforcolumnslot2{#1}%
+%    % no flush text sofar here, beware: no width test
+%    \snaptogrid\vbox{\box#1}}
+%
+% still imperfect
+
+\def\OTRSETstoreincolumnslotFIXD#1% fixed column
+  {\OTRSETflushtextsofar
+   \ifdim\wd#1>\textwidth
+     \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+   \else
+     % crappy test / needed for o-pbu-f / will be replaced
+     \getnoflines{\ht#1}%
+     \scratchdimen\noflines\lineheight
+     \advance\scratchdimen\lineheight
+     \advance\scratchdimen\pagetotal\relax
+     \ifdim\scratchdimen<\pagegoal
+       %OTRSETprepareforcolumnslot3{#1}%
+       %ruledvskip\columnslotspacing\lineheight
+       \blank[\columnslotspacing*\v!line]%
+       \snaptogrid\hbox to \hsize{\hss\box#1\hss}% strange, why the centering
+       \blank[\columnslotspacing*\v!line]%
+     \else
+       \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+     \fi
+   \fi}
+
+\def\OTRSETstoreincolumnslotSOMEWHERE#1#2%
+  {\OTRSETprepareforcolumnslot{#1}{#2}%
+   \OTRSETflushtextsofar
+   \getnoflines\pagetotal \advance\noflines\columnfirstcell
+   \OTRSETstoreincolumnslotindeed
+     \mofcolumns\mofcolumns+\currenthcell
+     \noflines\columnmaxcells+\currentvcell{#2}%
+   \OTRSETsetvsize}
+
+\def\OTRSETcheckprefered
+  {\ifnum\preferedcolumn<\mofcolumns
+     \let\pofcolumns\mofcolumns
+   \else
+     \let\pofcolumns\preferedcolumn
+   \fi
+   \ifquitincurrentcolumn
+     \ifnum\mofcolumns=\nofcolumns
+       \def\qofcolumns{\mofcolumns}%
+     \else
+       \scratchcounter\mofcolumns
+       \advance\scratchcounter \plusone
+       \edef\qofcolumns{\the\scratchcounter}%
+     \fi
+   \else
+     \let\qofcolumns\mofcolumns
+   \fi}
+
+\def\OTRSETstoreincolumnslotindeed#1#2#3#4#5#6#7#8#9%
+  {\OTRSETcheckprefered
+   \enoughcolumncellsfalse
+   \donefalse
+   \dostepwiserecurse{#1}{#2}{#31}
+     {\ifdone
+        \exitloop
+      \else
+        #4=\recurselevel
+        \dostepwiserecurse{#5}{#6}{#71}
+          {\ifdone
+             \exitloop
+           \else
+             #8=\recurselevel
+             \OTRSETcheckcolumnspace\currenthcell\currentvcell{#9}%
+             \ifenoughcolumncells \donetrue \fi
+           \fi}%
+      \fi}%
+   \ifdone
+     \enoughcolumncellstrue
+   \else
+     \enoughcolumncellsfalse
+   \fi
+   \ifenoughcolumncells
+%    \ifnum\columnspacetopoffset>0\message{[+++]}\fi
+%    \ifnum\columnspacebotoffset>0\message{[---]}\fi
+%    \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells
+%      {\vbox
+%         {\ifcase\columnspacetopoffset\else\ruledvskip\columnspacetopoffset\lineheight\fi
+%          \copy#9
+%          \ifcase\columnspacebotoffset\else\ruledvskip\columnspacebotoffset\lineheight\fi}}%
+     \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells
+       {\copy#9}%
+     \ifnum\currenthcell=\mofcolumns\relax
+       \ifdim\ht\OTRSETsavedfootnotes>\zeropoint
+         \OTRSETsetfreecells\mofcolumns\columnfirstcell
+         \ifsomefreecolumncells
+           \getnoflines{\ht\OTRSETsavedfootnotes}\relax
+           \ifnum\columnfreecells<\noflines
+             \global\somefreecolumncellsfalse
+           \else
+            %\message{[flt]}% float
+           \fi
+         \fi
+         \ifsomefreecolumncells
+           % ok, enough room for notes
+          %\message{[flt]}% float
+         \else % ?
+           \OTRSETsavebox{#9}%
+           \OTRSETerasegridcells\currenthcell\currentvcell\columnhcells\columnvcells
+          %\message{[clr]}% save box
+         \fi
+       \else
+        %\message{[flt]}% float
+       \fi
+     \else
+      %\message{[flt]}% float
+     \fi
+     \OTRSETsetvsize
+    %\message{[fnt]}% float
+   \else
+    %\message{[rej]}% save box
+     \OTRSETsavebox{#9}%
+   \fi}
+
+\chardef\columnslotspacing \plusone
+
+\def\OTRSETstoreincolumnslot#1% #2 % {method} {box} % alleen last
+  {% no messing around here
+   % \dp#2=\zeropoint
+   % \ifcase\columnslotspacing\else
+   %   \setbox#2=\vbox spread \columnslotspacing\lineheight
+   %     {\vss\box#2\vss}%
+   % \fi
+   % and don't change this any more
+%   \doifdefinedelse{\strippedcsname\OTRSETstoreincolumnslot#1}
+%     {\getvalue{\strippedcsname\OTRSETstoreincolumnslot#1}{#2}}
+%     {\OTRSETstoreincolumnslotUNKNOWN{#2}}}
+   \executeifdefined{\strippedcsname\OTRSETstoreincolumnslot#1}
+     \OTRSETstoreincolumnslotUNKNOWN} % {#2}}
+
+\def\OTRSETstoreincolumnslotUNKNOWN#1%
+  {\OTRSETprepareforcolumnslot2{#1}\copy#1} % {} ?
+
+% \def\OTRSETprepareforcolumnslot#1#2% 1=hoog 2=midden 3=laag
+%   {\dp#2\zeropoint
+%    \ifcase\columnslotspacing\else
+%      \scratchdimen\columnslotspacing\lineheight
+%      \ifnum#1=2 \scratchdimen2\scratchdimen \fi
+%      \setbox#2\vbox spread \scratchdimen
+%        {\ifnum#1>1\vss\fi\box#2\relax\ifnum#1<3\vss\fi}%
+%    \fi}
+
+\def\OTRSETprepareforcolumnslot#1#2% 1=hoog 2=midden 3=laag
+  {\dp#2\zeropoint
+   \ifcase\columnslotspacing\else
+     \scratchdimen\columnslotspacing\lineheight
+     \ifnum#1=2 \scratchdimen2\scratchdimen \fi
+     \begingroup
+     \advance\scratchdimen\ht#2\relax
+     \ifdim\scratchdimen<\columnmaxcells\lineheight
+       \endgroup \setbox#2\vbox spread \scratchdimen \bgroup
+     \else
+       \endgroup \setbox#2\vbox to \columnmaxcells\lineheight \bgroup
+       \vskip\strutdepth
+     \fi
+     \ifnum#1>1\vss\fi
+     \box#2\relax
+     \ifnum#1<3\vss\fi
+     \egroup
+   \fi}
+
+\def\OTRSETdocheckiffloatfits % eigenlijk moet else float anders
+  {\global\ifnofloatpermitted\roomforfloatfalse\else\roomforfloattrue\fi}
+
+\def\OTRSETunpreparebox#1%
+  {\ifhbox#1% spans and so
+     \global\setbox\floatbox\vbox{\box#1}%
+   \else
+     \setbox\scratchbox\vbox
+       {\unvbox#1\unskip\unskip\unskip
+        \global\setbox\floatbox\lastbox}%
+   \fi}
+
+\def\OTRSETsavebox#1% clean up the skips
+  {\OTRSETunpreparebox{#1}%
+   \dosavefloat}
+
+\def\OTRSETresavebox#1% clean up the skips
+  {\OTRSETunpreparebox{#1}%
+   \doresavefloat}
+
+\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge
+  {\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
+
+\def\OTRSETdoflushfloats
+  {\bgroup
+   \def\OTRSETsavebox##1{\!!doneafalse}%
+   \doloop
+     {\ifsomefloatwaiting
+\OTRSETskipstart
+        \dogetfloat
+        \ifdim\wd\floatbox>\zeropoint
+          \!!doneatrue
+          \dp\floatbox\zeropoint
+          \OTRSETstoreincolumnslot{TBLR}\floatbox
+          \if!!donea
+           %\message{[flu]}%
+          \else
+            \OTRSETresavebox\floatbox
+            \exitloop
+          \fi
+        \else
+         %\message{[err]}% happens but why?
+        \fi
+      \else
+        \exitloop
+      \fi}
+   \egroup}
+
+\newif\ifcentergridcells \centergridcellstrue
+
+\newif\ifcentergridcellonly     \centergridcellonlyfalse
+\newif\ifautocentergridcellonly \autocentergridcellonlytrue
+
+\def\OTRSETcentergridcells
+  {\ifcentergridcells
+     \dorecurse\nofcolumns
+       {\currenthcell\recurselevel
+        \ifautocentergridcellonly
+          % we prevent centering when the next column is empty
+          % to be checked ! ! ! !
+          \advance\currenthcell \plusone
+          \centergridcellonlytrue
+          \ifnum\currenthcell>\nofcolumns
+            % ok already
+          \else
+            % only span if there is a next column with content
+            \dorecurse\columnmaxcells
+              {\ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+                 \centergridcellonlyfalse
+               \else\ifdim\dp\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+                 \centergridcellonlyfalse
+               \fi\fi}%
+          \fi
+        \fi
+        \currenthcell\recurselevel
+        \dorecurse\columnmaxcells
+          {\currentvcell\recurselevel\relax
+           \ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+           \ifdim\dp\OTRSETgridcell\currenthcell\currentvcell=\zeropoint
+             \bgroup
+             \setbox\scratchbox\OTRSETgetgridcell\currenthcell\currentvcell
+             \getnoflines{\ht\scratchbox}%
+             \!!counta\currentvcell
+             \advance\!!counta -\noflines
+             \advance\!!counta \plusone
+             % first col always ok
+             \!!countb\currenthcell
+             \!!countc\currenthcell
+             \advance\!!countc \plusone
+             \!!donebtrue
+             \ifcentergridcellonly
+               \!!countc\maxdimen
+             \fi
+             \dostepwiserecurse\!!countc\nofcolumns\plusone
+               {\if!!doneb
+                  \let\xrecurselevel\recurselevel
+                  \dostepwiserecurse\!!counta\currentvcell\plusone
+                    {\ifdim\ht\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint
+                       \!!donebfalse
+                     \else\ifdim\wd\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint
+                       \!!donebfalse
+                     \fi\fi}%
+                  \if!!doneb
+                    \!!countb\xrecurselevel
+                  \fi
+                \fi}%
+             \totalcolumnspace\OTRSETlocalwidth\currenthcell
+             \dostepwiserecurse\!!countc\!!countb\plusone
+               {\advance\totalcolumnspace \OTRSETlocalwidth\recurselevel
+                \advance\totalcolumnspace \OTRSETgetparameter\c!distance\recurselevel}%
+             \ifdim\totalcolumnspace>\wd\scratchbox
+               \setbox\scratchbox\hbox to \totalcolumnspace{\hss\box\scratchbox\hss}%
+             \fi
+             \OTRSETsetgridcell\currenthcell\currentvcell\box\scratchbox
+           \egroup
+           \fi
+           \fi}}%
+   \fi}
+
+\def\OTRSETinitializecolumns% once per page
+  {\columnspreadtrue % todo
+   \ifcolumnspread
+     \global\rofcolumns\getvalue{\??mc\OTRSETidentifier\c!nright}%
+     \global\lofcolumns\getvalue{\??mc\OTRSETidentifier\c!nleft}%
+     \global\tofcolumns\rofcolumns \relax
+     \ifodd\realpageno\relax
+       \global\nofcolumns\rofcolumns
+     \else
+       \global\advance\tofcolumns\lofcolumns
+       \global\nofcolumns\lofcolumns
+     \fi
+   \else
+     \global\nofcolumns\getvalue{\??mc\OTRSETidentifier\c!n}%
+     \global\rofcolumns\nofcolumns
+     \global\lofcolumns\nofcolumns
+     \global\tofcolumns\nofcolumns
+   \fi
+   \OTRSETassignwidths
+   \global\mofcolumns\plusone
+   \columnerasegridboxes}
+
+% vanaf hier:
+
+\def\definecolumnset
+  {\dodoubleargument\dodefinecolumnset}
+
+\def\dodefinecolumnset[#1][#2]%
+  {\getparameters[\??mc#1]
+     [\c!direction=\v!right,
+      \c!balance=\v!no,
+      \c!distance=1.5\bodyfontsize, % controleren
+      \c!n=2,
+      \c!nleft=\getvalue{\??mc#1\c!n},
+      \c!nright=\getvalue{\??mc#1\c!n},
+      \c!width=\v!fit,
+      \c!lines=0,
+      \c!start=0,
+      #2]%
+   \dorecurse{\getvalue{\??mc#1\c!nleft}} % todo
+     {\dododefinecolumnset[#1][\recurselevel]}%
+   \dorecurse{\getvalue{\??mc#1\c!nright}} % todo
+     {\dododefinecolumnset[#1][\recurselevel]}%
+   % redo framed settings
+   \setupcolumnset[#1][1][\c!distance=\!!zeropoint]}
+
+\def\dododefinecolumnset[#1][#2]%
+  {\presetlocalframed
+     [\??mc#1#2]%
+   \setupcolumnset
+     [#1][#2]
+     [\c!offset=\v!overlay,
+      \c!frame=\v!off,
+      \c!align=,
+      \c!lines=0,% really needed since c!regels is now part of framed
+      \c!width=\getvalue{\??mc#1\c!width},
+      \c!distance=\getvalue{\??mc#1\c!distance}]}
+
+\def\setupcolumnset
+  {\dotripleargument\dosetupcolumnset}
+
+\def\dosetupcolumnset[#1][#2][#3]%
+  {\ifthirdargument
+     \def\docommand##1%
+       {\doifelse{##1}\v!each
+          {\dorecurse{\getvalue{\??mc#1\c!n}}{\docommand\recurselevel}}
+          {\getparameters[\??mc#1##1][#3]}}%
+     \processcommalist[#2]\docommand
+   \else
+     \getparameters[\??mc#1][#2]%
+   \fi}
+
+\definecolumnset[\s!default][\c!n=2] % fallback
+
+\def\OTRSETgotonextpage
+  {\vfill\eject
+   \relax\ifnum\mofcolumns>\plusone
+     \OTRSETgotocolumn[\v!last]%
+     \ifnum\mofcolumns>\plusone
+       \OTRSETgotocolumn[\v!force]%
+     \fi
+   \fi}
+
+\let\OTRSETgotonextpageX\OTRSETgotonextpage % will become obsolete
+
+\def\OTRSETgotocolumn
+  {\dosingleempty\doOTRSETgotocolumn}
+
+\def\doOTRSETgotoCOLROW#1% |*
+  {\bgroup % really needed
+   \splitstring#1\at*\to\column\and\row
+   \bgroup
+     \ifx\column\empty\else\expanded{\doOTRSETgotoCOLUMN{\column}}\fi
+   \egroup
+   \bgroup
+     \ifx\row   \empty\else\expanded{\doOTRSETgotoROW   {\row   }}\fi
+   \egroup
+   \egroup}
+
+\def\doOTRSETgotoCOLUMN#1%
+  {\ifnum\mofcolumns=#1\else
+     \vfill\eject % \doejectpage\eject
+     \doloop
+       {\ifnum\mofcolumns=#1\relax
+          \exitloop \else \OTRSETdummycolumn
+        \fi}%
+   \fi}
+
+\def\doOTRSETgotoROW#1%
+  {\ifnum#1>1
+     \scratchcounter\zerocount
+     \currenthcell\mofcolumns
+     \currentvcell#1\advance\currentvcell \minusone
+     \dorecurse\currentvcell
+       {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing
+          {\advance\scratchcounter\plusone}}
+     \getnoflines\pagetotal
+     \advance\scratchcounter-\noflines
+     \ifnum\scratchcounter>\zerocount
+       \dorecurse\scratchcounter{\line{\strut}}%
+     \fi
+   \fi
+   \OTRSETsetvsize}
+
+\def\doOTRSETgotocolumn[#1]% yes|force|first|last||*
+  {\processallactionsinset
+     [#1]
+     [    \v!yes=>\OTRSETdummycolumn,
+           \v!no=>,% not supported
+        \v!force=>\OTRSETdummycolumn,
+        \v!first=>\expanded{\doOTRSETgotoCOLUMN{1}},
+         \v!last=>\expanded{\doOTRSETgotoCOLUMN{\the\nofcolumns}},
+      \s!default=>\OTRSETdummycolumn,
+      \s!unknown=>\expanded{\doOTRSETgotoCOLROW{\commalistelement}}]}
+
+% to be documented and tested, not yet that robust
+
+% \def\OTRSETgotocell#1#2%
+%   {\endgraf
+%    \gdef\gotocellcounter{0}%
+%    \doloop
+%      {\ifnum\mofcolumns<#1\relax
+%         \doglobal\increment\gotocellcounter\relax
+%         \ifnum\gotocellcounter>#1\relax
+%           \line{\strut}\crlf
+%           \line{\strut}\crlf
+%           \column
+%           \writestatus{columnset}{quitting goto cell}%
+%           \exitloop
+%         \else
+%           \column
+%         \fi
+%       \else
+%         \exitloop
+%       \fi}%
+%    \ifnum\mofcolumns=#1\relax
+%      \ifnum#2>1
+%        \scratchcounter\zerocount
+%        \currenthcell\mofcolumns
+%        \currentvcell#2\advance\currentvcell \minusone
+%        \dorecurse\currentvcell
+%          {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing
+%             {\advance\scratchcounter\plusone}}
+%        \getnoflines\pagetotal
+%        \advance\scratchcounter-\noflines
+%        \ifnum\scratchcounter>\zerocount
+%          \dorecurse\scratchcounter{\line{\strut}}%
+%        \fi
+%      \fi
+%    \fi
+%    \OTRSETsetvsize}
+
+\def\OTRSETgotocell#1#2% obsolete: now \column[#1*#2]
+  {\endgraf
+   \doOTRSETgotoCOLUMN{#1}%
+   \doOTRSETgotoROW   {#2}}
+
+\def\OTRSETdummycolumn
+  {\verticalstrut
+   \vskip-\struttotal
+   \vfill
+   \eject}
+
+\newcounter\columnsetlevel
+\let\currentcolumnset\empty
+\chardef\OTRSETfinish\zerocount
+
+\def\startcolumnset
+  {\dodoubleempty\dostartcolumnset}
+
+\def\dostartcolumnset[#1][#2]%
+  {\increment\columnsetlevel\relax
+   \globallet\localcolumnmaxcells\!!zerocount
+   \global\chardef\OTRSETfinish\zerocount
+   \resetOTRSETmarks
+   \ifnum\columnsetlevel=\plusone
+     \bgroup
+     \saveinterlinespace
+     \globallet\columnsetpage\!!plusone
+     \def\currentcolumnset{#2}%
+     \insidecolumnstrue % will be different flag in addition
+     \activateotr{SET}{ONE}% andere naam, activate or so
+     \doifelsenothing{#1}
+       {\globallet\OTRSETlist\s!default}
+       {\xdef\OTRSETlist{#1}}%
+     \OTRSETstartnextpage
+     \OTRSETassignwidths
+     \OTRSETsethsize
+   \else
+     \bgroup
+   \fi}
+
+% \setuplayout[grid=yes] \definecolumnset[example] \showgrid
+
+% \starttext
+%     \startcolumnset[example]
+%         \input knuth \endgraf \input knuth
+%         \placetable{table}{\framed[width=\makeupwidth,height=4cm]{Hello}}
+%         \input knuth \endgraf \input knuth
+%     \stopcolumnset
+%     \input knuth \endgraf \input knuth
+% \stoptext
+
+
+\def\OTRSETflushleftovers % new per 13/4/2006
+  {\OTRSETdoifcellelse{1}{1}
+     {\bgroup
+      \OTRSETcentergridcells
+      \chardef\OTRSETbalancemethod\plusone
+      \OTRSETreducegridbox
+      \global\setbox\OTRfinalpagebox\OTRSETmakegridbox
+      \global\ht\OTRfinalpagebox\textheight % signals output that there is content
+      \OTRSETdofinaloutput
+      \globallet\OTRSETbalht\zeropoint
+      \egroup}
+     {}}
+
+\def\stopcolumnset
+  {\relax
+   \ifnum\columnsetlevel=\plusone
+     \endgraf % needed, else wrong vsize in one par case
+     \global\chardef\OTRSETfinish\plusone
+     % no, extra page \pagebreak % (test on pascal toc)
+     \dostopcolumnset
+     \egroup
+     \global\notelimittrue % brrr, untested and fuzzy
+     \setvsize
+     \sethsize
+     \ifvoid\OTRfinalpagebox\else
+       % probably balanced
+       \ifdim\ht\OTRfinalpagebox<\textheight
+         \snaptogrid[\v!page]\hbox{\box\OTRfinalpagebox}%
+       \else
+         \box\OTRfinalpagebox
+       \fi
+     \fi
+     \global\chardef\OTRSETfinish\zerocount
+     \ifsomefloatwaiting \setvsize \pagebreak \setvsize \fi
+     \OTRSETflushleftovers
+   \else
+     \egroup
+   \fi
+   \decrement\columnsetlevel\relax}
+
+\chardef\OTRSETbalancemethod\zerocount
+
+\def\dostopcolumnset
+  {%\OTRSETdofinalflushfloats % yes/no
+   \ifcase\OTRSETbalancemethod
+     \OTRSETnobalance
+   \else
+     \OTRSETdobalance
+   \fi}
+
+\def\OTRSETdobalance
+  {\OTRSETnobalance}
+
+\def\localcolumnmaxcells{0}
+
+% currently line represents real line, i.e. on the grid, and
+% not something noflines (also, watch out for switching from
+% 2-3 columns on one page with both sets balanced: the
+% second set does not see the first set
+
+% \def\OTRSETinitbalancing
+%   {\ifcase\OTRSETbalancemethod\or
+%      \let\savedcolumnmaxcells\columnmaxcells
+%      \ifnum\realpageno=\balancingpageno\relax
+%        \ifnum\mofcolumns=\plusone
+%          \dorecurse\nofcolumns
+%            {\!!counta\recurselevel\relax
+%             \!!countb\getvalue{\??mc\OTRSETidentifier\number\!!counta\c!regels}\relax
+%             \ifcase\!!countb
+%               \!!countb\getvalue{\??mc\OTRSETidentifier\c!regels}\relax
+%             \fi
+%             \ifcase\!!countb
+%               \!!countb \savedcolumnmaxcells\relax
+%             \fi
+%             % can be an option: absolute versus relative
+%             \ifnum\OTRSETbalancemethod=\plusthree
+%               \advance\!!countb\precolumnlines
+%               \ifnum\!!countb>\localcolumnmaxcells\relax
+%                 \xdef\localcolumnmaxcells{\the\!!countb}%
+%               \fi
+%               \advance\!!countb \plusone
+%               \dostepwiserecurse\!!countb\columnmaxcells\plusone
+%                 {\ifvoid\OTRSETgridcell\!!counta\recurselevel
+%                    \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe
+%                  \fi}%
+%             \else
+%               \globallet\localcolumnmaxcells\columnmaxcells
+%               \advance\!!countb-\columnmaxcells
+%               \!!countb-\!!countb
+%               \advance\!!countb \minusone
+%               \ifnum\!!countb>\zerocount
+%                 \dostepwiserecurse\plusone\!!countb\plusone
+%                   {\ifvoid\OTRSETgridcell\!!counta\recurselevel
+%                      \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe
+%                    \fi}%
+%               \fi
+%             \fi}%
+%          \OTRSETsetvsize % ! ! !
+%        \fi
+%      \fi
+%    \fi}
+%
+%  \def\OTRSETpresetbalancing
+%    {\doifvaluesomething{\??mc\OTRSETidentifier\c!regels}%
+%       {\getcommacommandsize[\csname\??mc\OTRSETidentifier\c!regels\endcsname]%
+%        \ifnum\commalistsize>\plusone
+%          \scratchcounter\zerocount
+%          \def\docommand##1%
+%            {\advance\scratchcounter\plusone
+%             \setvalue{\??mc\OTRSETidentifier\the\scratchcounter\c!regels}{##1}}%
+%          \processcommacommand
+%            [\csname\??mc\OTRSETidentifier\c!regels\endcsname]\docommand
+%          \setvalue{\??mc\OTRSETidentifier\c!regels}{0}%
+%        \fi}}
+
+% don't loose empty 1page/1column with area (example **)
+%
+% \definecolumntextarea[title][x=1,y=4,nx=2,ny=7,state=start]
+% \setupcolumntextareatext[title][\vtop to 5cm{a\\b\\b\\d}]
+%
+% \starttext
+% \startcolumnset \dorecurse{1}{\input tufte \par} \stopcolumnset
+% \stoptext
+
+% better:
+
+\def\definecolumnsetarea   {\definecolumntextarea}
+\def\setupcolumnsetarea    {\setupcolumntextarea}
+\def\setupcolumnsetareatext{\setupcolumntextareatext}
+
+% so this will be changed
+
+% \def\OTRSETnobalance
+%   {\iflastcolumnfootnotes % testen ! optie
+%      % inhibit flush of floats !
+%      % todo: nothing if no footnotes, else empty page
+%      \dostepwiserecurse\mofcolumns\nofcolumns\plusone
+%        {\vskip-\struttotal\verticalstrut\vfill\eject}%
+%    \else
+%      \ifdim\pagetotal>\zeropoint % no, see example **
+%        \ifnum\mofcolumns=\nofcolumns
+%          \OTRSETflushfinalfootnotes
+%        \else
+%          % probably todo
+%        \fi
+%        \vfill
+%        \eject
+%        % brr, may result in empty page after nicely fit text
+%        % or if left, then lost of first column only text
+%        \ifnum\mofcolumns>1
+%          \OTRSETdofinalflush
+%          \OTRSETdofinaloutput
+%        \fi
+%      \fi
+%    \fi}
+
+\def\OTRSETnobalance
+  {\iflastcolumnfootnotes % testen ! optie
+     % inhibit flush of floats !
+     % todo: nothing if no footnotes, else empty page
+     \dostepwiserecurse\mofcolumns\nofcolumns\plusone
+       {\vskip-\struttotal\verticalstrut\vfill\eject}%
+   \else
+     \ifnum\mofcolumns>\plusone
+       \donetrue
+     \else\ifdim\pagetotal>\zeropoint % too dangerous, we loose data
+       \donetrue
+     \else
+       \donefalse
+     \fi\fi
+     \ifdone
+       \ifnum\mofcolumns=\nofcolumns
+         \OTRSETflushfinalfootnotes
+       \else
+         % probably todo
+       \fi
+       \vfill
+       \eject
+\registerOTRSETmarks
+       % brr, may result in empty page after nicely fit text
+       % or if left, then lost of first column only text
+       \ifnum\mofcolumns>\plusone
+         \OTRSETdofinalflush
+         \OTRSETdofinaloutput
+       \fi
+     \fi
+   \fi}
+
+\def\OTRSETstartnextpage
+  {\doifsomething\OTRSETlist
+     {\getfromcommacommand[\OTRSETlist][1]%
+      \global\let\OTRSETidentifier\commalistelement
+      \doifundefined{\??mc\OTRSETidentifier\c!n}
+        {\globallet\OTRSETidentifier\s!default}%
+      \let\newcommalistelement\empty
+      \doglobal\replaceincommalist\OTRSETlist1%
+      \OTRSETrestart}}
+
+\def\OTRSETrestart % weed
+  {\OTRSETinitializefeatures
+   \OTRSETflushpreposttext
+   \OTRSETinitializecolumns
+   \OTRSETcheckinsert
+   \OTRSETcheckgrid
+   \OTRSETsetvsize
+   \OTRSETsethsize % or local ?
+   \OTRSETsetplaceholders
+   \OTRSEThandlepreposttext
+   \initializecolumntextareas % name !
+   \OTRSETcheckstartcells
+   \OTRSETsetvsize}
+
+% \def\OTRSETcheckstartcells
+%   {\dorecurse\nofcolumns
+%      {\bgroup
+%       \mofcolumns\recurselevel
+%       \scratchcounter\currentcolumnstartcell % uses \mofcolumns, returns 1 or more
+%       \advance\scratchcounter \minusone
+%       \dorecurse\scratchcounter
+%         {\OTRSETdoifcellelse\mofcolumns\recurselevel
+%            \donothing{\OTRSETsetgridcell\mofcolumns\recurselevel\copy\placeholderboxe}}%
+%       \egroup}}
+
+\def\OTRSETcheckstartcells
+  {\dorecurse\nofcolumns
+     {\bgroup
+      \mofcolumns\recurselevel
+\OTRSETsetcorrectnofcells\currentcolumnstartcell
+\advance\scratchcounter \minusone
+      \dorecurse\scratchcounter
+        {\OTRSETdoifcellelse\mofcolumns\recurselevel
+           \donothing{\OTRSETsetgridcell\mofcolumns\recurselevel\copy\placeholderboxe}}%
+      \egroup}}
+
+% \OTRSEToutput
+%   {\dontcomplain % new, get rid of overfull message (to be sorted out)
+%    \OTRSETnaturalflush
+%   %\OTRSETstartnextpage
+%    \OTRSETdoflushfloats % actually belongs in \flushsavedfloats (but goes wrong)
+%    \OTRSETcheckfreelines
+%    \OTRSETchecksidefloat}
+
+\OTRSEToutput
+  {\dontcomplain % new, get rid of overfull message (to be sorted out)
+   \doloop
+     {\OTRSETnaturalflush
+     %\OTRSETstartnextpage %  no
+      \OTRSETdoflushfloats % actually belongs in \flushsavedfloats (but goes wrong)
+      \OTRSETcheckfreelines
+      \ifsomefreecolumncells
+        \exitloop
+      \else
+        % flush page and get rid of more floats if present
+      \fi}%
+   \OTRSETchecksidefloat}
+
+\def\OTRSETinitializefeatures
+  {% number of lines
+   % new: raw
+   \getrawnoflines\textheight\xdef\columnmaxcells{\the\noflines}%
+   % direction
+   \doifelsevalue{\??mc\OTRSETidentifier\c!direction}\v!right
+     {\chardef\columndirection\zerocount}
+     {\chardef\columndirection\plusone}%
+   % balancing
+   \chardef\OTRSETbalancemethod\zerocount
+   \processaction
+     [\getvalue{\??mc\OTRSETidentifier\c!balance}]
+     [    \v!yes=>\chardef\OTRSETbalancemethod\plusone,
+          \v!top=>\chardef\OTRSETbalancemethod\plustwo,
+       \v!bottom=>\chardef\OTRSETbalancemethod\plusthree]}
+
+% keep 'm for a while
+%
+% \installoutput\OTRSETflushpreposttext
+%  {\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}%
+%   \ifcarryoverfootnotes \else
+%     \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+%   \fi}
+%
+% to be tested on 'boekinhoud' in 'pascal/demo-bbi'
+%
+% junk ! ! ! ! !
+%
+%\installoutput\OTRSETflushpreposttext
+%  {\global\setbox\precolumnbox\vbox
+%     {\unvbox\normalpagebox
+%      \strut\vskip-2\lineheight\strut}% we want a proper depth
+%   \ifcarryoverfootnotes \else
+%     \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+%   \fi}
+%
+% \starttext
+%   \definecolumnset[two][n=2]
+%   \startcolumnset[two] \dorecurse{4}{\input tufte } \stopcolumnset
+%   \input tufte
+%   \startcolumnset[two] \input tufte \stopcolumnset
+% \stoptext
+%
+% \installoutput\OTRSETflushpreposttext
+%   {\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}%
+%    \global\dp\precolumnbox\strutdepth
+%    \ifcarryoverfootnotes \else
+%      \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+%    \fi}
+
+% test:
+%
+% \definecolumnset[two]  [n=2,balance=yes]
+% \definecolumnset[three][n=3,balance=yes]
+% \setupcolumnset [two]  [1] [lines=10]
+% \setupcolumnset [two]  [2] [lines=10]
+%
+% \startcolumnset[two]   \dorecurse{14}{\input tufte \par} \stopcolumnset
+% \startcolumnset[three] \dorecurse{12}{\input tufte \par} \stopcolumnset
+%
+% with:
+%
+% \installoutput\OTRSETflushpreposttext
+%   {%\ifvoid\normalpagebox
+%    %  \global\setbox\precolumnbox\vbox{}%
+%    %\else
+%      \global\setbox\precolumnbox\vbox
+%        {\unvcopy\normalpagebox}%
+%      \global\setbox\precolumnbox\vbox to \ht\precolumnbox
+%        {\box\normalpagebox}%
+%    %\fi
+%    \global\dp\precolumnbox\strutdepth
+%    \ifcarryoverfootnotes \else
+%      \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+%    \fi}
+
+% testcase : pascal demo-bbi, paragraaf/aanduiding koppen
+
+\ifx\lastskipinotr\undefined \newskip\lastskipinotr \fi
+
+\installoutput\OTRSETflushpreposttext
+  {\global\setbox\precolumnbox\vbox
+     {\unvbox\normalpagebox
+      \global\lastskipinotr\lastskip}%
+   \ifdim\lastskipinotr>\zeropoint
+     \global\setbox\precolumnbox\hbox
+       {\lower\strutdepth\box\precolumnbox}%
+   \fi
+   \global\dp\precolumnbox\strutdepth
+   \ifcarryoverfootnotes \else
+     \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+   \fi}
+
+\let\precolumnlines \!!zerocount
+\let\postcolumnlines\!!zerocount
+
+% \def\OTRSEThandlepreposttext
+%   {\ifdim\ht\precolumnbox>\zeropoint % new
+%      \getnoflines{\ht\precolumnbox}%
+%      \edef\precolumnlines{\the\noflines}%
+%      \doOTRSETsetgridcells
+%        {\copy\placeholderboxe}
+%        \plusone\plusone\nofcolumns\noflines
+%        {\box\precolumnbox}%
+%    \else
+%      \let\precolumnlines\!!zerocount
+%    \fi
+%    \ifdim\ht\postcolumnbox>\zeropoint % new, otherwise empty bottom line
+%      \getnoflines{\ht\postcolumnbox}%
+%      \edef\postcolumnlines{\the\noflines}%
+%      \advance\columnfreecells -\noflines
+%      \advance\columnfreecells \plusone
+%      \doOTRSETsetgridcells
+%        {\copy\placeholderboxe}
+%        \plusone\columnfreecells\nofcolumns\noflines
+%        {\box\postcolumnbox}%
+%    \else
+%      \let\postcolumnlines\!!zerocount
+%    \fi}
+
+\def\OTRSEThandlepreposttext
+  {\ifdim\ht\precolumnbox>\zeropoint % new
+     \getnoflines{\ht\precolumnbox}%
+     \edef\precolumnlines{\the\noflines}%
+     \doOTRSETsetgridcells
+       {\copy\placeholderboxe}
+       \plusone\plusone\nofcolumns\noflines
+     % normal version (single column set)
+     % {\box\precolumnbox}%
+     % compensated for bodyfont change
+       {\hbox
+          {\OTRSETsetcorrectcellht
+           \raise\scratchdimen\box\precolumnbox}}%
+   \else
+     \let\precolumnlines\!!zerocount
+   \fi
+   \ifdim\ht\postcolumnbox>\zeropoint % new, otherwise empty bottom line
+     \getnoflines{\ht\postcolumnbox}%
+     \edef\postcolumnlines{\the\noflines}%
+     \advance\columnfreecells -\noflines
+     \advance\columnfreecells \plusone
+     \doOTRSETsetgridcells
+       {\copy\placeholderboxe}
+       \plusone\columnfreecells\nofcolumns\noflines
+       {\box\postcolumnbox}%
+   \else
+     \let\postcolumnlines\!!zerocount
+   \fi}
+
+\def\OTRSETchecksidefloat
+  {} % {\sidefloatoutput}
+
+\def\OTRSETfinalsidefloatoutput
+  {}
+
+\def\OTRSETcheckgrid
+  {\topskip1\topskip
+   \ifforcecolumngrid
+     \widowpenalty\zerocount
+     \clubpenalty\zerocount
+     \brokenpenalty\zerocount
+   \fi}
+
+\def\OTRSETcheckinsert
+  {\iflastcolumnfootnotes
+     \ifnum\nofcolumns=\mofcolumns
+       \OTRSETforceinserts
+     \else
+       \OTRSETinhibitinserts
+     \fi
+   \else
+     \OTRSETforceinserts
+   \fi}
+
+\def\OTRSETforceinserts
+  {\enablenotes}
+
+\def\OTRSETinhibitinserts
+  {\disablenotes}
+
+% interface to footnotes
+
+\def\OTRSETassignwidths
+  {%\scratchdimen\makeupwidth
+   \freezetextwidth \scratchdimen\textwidth
+   %
+   \scratchcounter\zerocount
+   \dorecurse\nofcolumns
+     {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit
+        {\advance\scratchcounter \plusone }
+        {\advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}%
+      \advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!distance}}%
+   \ifcase\scratchcounter\else
+     \divide\scratchdimen \scratchcounter
+   \fi
+   \setgvalue{\??mc\??mc\c!width}{0}%
+   \dorecurse\nofcolumns
+     {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit
+        {\dimen0=\scratchdimen}
+        {\setgvalue{\??mc\??mc\c!width}{1}%
+         \dimen0=\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}%
+      \setxvalue{\??mc\recurselevel\??mc\c!width}{\the\dimen0}}}
+
+\def\OTRSETlocalwidth#1%
+  {\getvalue{\??mc\number#1\??mc\c!width}}
+
+\newbox\placeholderboxa
+\newbox\placeholderboxb
+\newbox\placeholderboxc
+\newbox\placeholderboxd
+\newbox\placeholderboxe
+\newbox\placeholderboxf
+
+\def\columnplaceholder#1#2%
+  {\hbox
+     {\setbox\scratchbox\hbox to \hsize
+        {\iftracecolumnset
+           \hskip-.5ex%
+           \startcolor[columnset:#2]\vrule\!!width1ex\!!height.5ex\!!depth.5ex\stopcolor
+         \fi
+         \hss}%
+      \ifcase#1\relax
+        \ht\scratchbox\zeropoint
+        \dp\scratchbox\zeropoint
+        \wd\scratchbox\zeropoint
+      \else
+        \wd\scratchbox\hsize
+        \ht\scratchbox\strutht
+        \dp\scratchbox\strutdp
+      \fi
+      \box\scratchbox}}
+
+\definepalet
+  [columnset]
+  [a=cyan,b=green,c=blue,d=red,e=magenta,f=darkgray]
+
+\def\OTRSETsetplaceholders
+  {\global\setbox\placeholderboxa\columnplaceholder0a%
+   \global\setbox\placeholderboxb\columnplaceholder0b%
+   \global\setbox\placeholderboxc\columnplaceholder0c%
+   \global\setbox\placeholderboxd\columnplaceholder0d%
+   \global\setbox\placeholderboxe\columnplaceholder0e%
+   \global\setbox\placeholderboxf\columnplaceholder1f}
+
+\def\doOTRSETshowstatus
+  {\llap{\tt\tfxx
+     \startcolor[blue](\the\vsize->\number\columnfirstcell\#\number\columnfreecells)\stopcolor
+     \hskip\leftskip}}
+
+\def\OTRSETshowstatus
+  {\iftracecolumnset \doOTRSETshowstatus \fi}
+
+% \appendtoks \OTRSETshowstatus \to \everypar
+
+% page contents
+
+\def\OTRSETdopagecontents#1#2% takes two args: \box \unvbox
+  {\vbox to \textheight{\forgetall#1#2}}
+
+\def\OTRSETsomepagefloat  {\def\floatmethod{PAGE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomeherefloat  {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomeelsefloat  {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomefixdfloat  {\def\floatmethod{FIXD}\OTRSETsomeslotfloat} % check
+\def\OTRSETsometopfloat   {\def\floatmethod{TOPS}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomebottomfloat{\def\floatmethod{BOTS}\OTRSETsomeslotfloat} % check
+
+\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge
+  {\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
+
+\def\OTRSETsomeslotfloat[#1]%
+  {\setbox\floatbox\vbox{\flushfloatbox}%
+   \dp\floatbox\strutdp
+   \@EA\uppercasestring\floatmethod\to\floatmethod
+   \OTRSETstoreincolumnslot\floatmethod\floatbox
+   \doinsertfloatinfo}
+
+% kind of new, looks much like OTRONE, but not entirely
+
+\def\OTRSETdosettopinserts
+  {\bgroup
+   \ifsomefloatwaiting
+     \noffloatinserts\zerocount
+     \let\totaltopinserted\!!zeropoint
+     \OTRSETdodosettopinserts
+     \ifnum\@@bknbottom=\zerocount
+       \ifnum\@@bknlines>\zerocount
+         \ifdim\totaltopinserted>\zeropoint\relax
+           \dimen0\lineheight
+           \dimen0=\@@bknlines\dimen0
+           \advance\dimen0 \totaltopinserted\relax
+           \ifdim\dimen0>\textheight % \vsize  %%%%%%%%% \textheight
+             \showmessage\m!floatblocks8{\@@bknlines}%
+             \vfilll\eject
+           \fi
+         \fi
+       \fi
+     \fi
+   \fi
+   \egroup}
+
+\def\OTRSETdodosettopinserts
+  {\ifnum\noffloatinserts<\noftopfloats
+     \dogetfloat
+     \ifdim\topinserted=\zeropoint\relax
+       \topofinserttrue
+     \else
+       \topofinsertfalse
+     \fi
+     \setbox\scratchbox\vbox % kan beter !
+       {\forgetall
+        \iftopofinsert
+          \ifdim\OTRSETtopoffset=\zeropoint
+            \moveongrid[\v!top]
+          \fi
+        \else
+          \betweenfloatblanko % inserts can't look back
+        \fi
+        \flushfloatbox
+        \blank[\@@bkspaceafter]}%
+     \global\advance\topinserted \ht\scratchbox\relax
+     \ifdim\topinserted>\vsize % was \textheight\relax
+       \OTRSETresavebox\floatbox
+       \noffloatinserts\noftopfloats\relax
+       \global\advance\topinserted -\ht\scratchbox
+       \let\OTRSETdodosettopinserts\relax % to be tested
+     \else
+       \xdef\totaltopinserted{\the\topinserted}%
+       \insert\topins{\forgetall\box\scratchbox}% interlineskip ?
+       \ifsomefloatwaiting
+         \advance\noffloatinserts \plusone
+       \else
+         \noffloatinserts\noftopfloats\relax
+       \fi
+       \dofloatflushedinfo
+     \fi
+   \else
+     \ifsomefloatwaiting
+       \showmessage\m!floatblocks6{\the\noftopfloats}%
+     \fi
+     \let\OTRSETdodosettopinserts\relax
+   \fi
+   \OTRSETdodosettopinserts}
+
+\def\OTRSETdosetbotinserts
+  {\bgroup
+   \ifsomefloatwaiting
+     \noffloatinserts\zerocount
+     \OTRSETdodosetbotinserts
+   \fi
+   \egroup}
+
+\def\OTRSETdodosetbotinserts
+  {\ifnum\noffloatinserts<\nofbotfloats\relax
+     \dogetfloat
+     \global\advance\botinserted \ht\floatbox\relax
+     \global\advance\botinserted \dp\floatbox\relax
+     \global\advance\botinserted \floattopskip\relax
+     \ifdim\botinserted<\pagegoal\relax
+       \insert\botins
+         {\forgetall
+          \blank[\@@bkspacebefore]%
+          \flushfloatbox}%
+       \ifsomefloatwaiting
+         \advance\noffloatinserts \plusone
+       \else
+         \noffloatinserts\nofbotfloats
+       \fi
+       \dofloatflushedinfo
+     \else
+       \OTRSETresavebox\floatbox
+       \noffloatinserts\nofbotfloats\relax
+     \fi
+     \global\nofloatpermittedtrue % vgl topfloats s!
+   \else
+     \ifsomefloatwaiting
+       \showmessage\m!floatblocks7{\the\nofbotfloats}%
+     \fi
+     \let\OTRSETdodosetbotinserts\relax
+   \fi
+   \OTRSETdodosetbotinserts}
+
+\let\OTRSETdosetbothinserts\relax
+
+\def\OTRSETdotopinsertions
+  {\ifvoid\topins\else
+     \ifvoid\columntopbox\mofcolumns
+       \columnsettopbox\mofcolumns\box\topins
+     \else
+       \columnsettopbox\mofcolumns\vbox % temp, must be better
+         {\forgetall
+          \offinterlineskip
+          \box\columntopbox\mofcolumns
+          \box\topins}
+     \fi
+   \fi
+   \global\topinserted\zeropoint\relax} % goes away
+
+\def\OTRSETdobotinsertions
+  {\ifvoid\botins \else
+     \columnsetbotbox\mofcolumns\box\botins
+%   \else
+%     \columnsetbotbox\mofcolumns\vbox % temp, must be better
+%       {\forgetall
+%        \offinterlineskip
+%        \box\botins
+%        \box\columnbotbox\mofcolumns}
+   \fi
+   \global\botinserted\zeropoint\relax} % goes away
+
+% set ipv text
+
+% left right 1 2 3 +1 +2 +3
+
+\let\columnleftareas \empty
+\let\columnrightareas\empty
+
+% links rechts => odd, even, n, named
+
+\def\definecolumntextarea
+  {\dotripleempty\dodefinecolumntextarea}
+
+\def\dodefinecolumntextarea[#1][#2][#3]% y=0 is mogelijke en handig !
+  {\ifthirdargument
+     \doifinsetelse{#2}{\v!both,\v!fixed}
+       {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]%
+        \definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
+       {\doifelse{#2}\v!next
+          {\doifoddpageelse
+             {\definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
+             {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]}}
+          {\presetlocalframed
+             [\??mt#1#2]%
+           \processaction[#2] % \doglobal voorkomt stack build up
+             [ \v!left=>\doglobal\addtocommalist{#1}\columnleftareas,
+              \v!right=>\doglobal\addtocommalist{#1}\columnrightareas]%
+           \getparameters[\??mt#1#2]
+             [\c!x=1,\c!y=1,\c!nx=1,\c!ny=1,\c!clipoffset=2\lineheight,
+              \c!offset=\v!overlay,\c!strut=\v!no,\c!frame=\v!off,
+              \c!type=#2,\c!page=1,\c!state=\v!stop,#3]}}%
+   \else
+     \definecolumntextarea[#1][\v!next][#2]%
+   \fi}
+
+\def\setupcolumntextarea
+  {\dotripleempty\dosetupcolumntextarea}
+
+\def\dosetupcolumntextarea[#1][#2][#3]%
+  {\ifthirdargument
+     \doifelse{#2}\v!both
+       {\setupcolumntextarea[#1][\v!left ][#3]%
+        \setupcolumntextarea[#1][\v!right][#3]}
+       {\doifelse{#2}\v!next
+          {\doifoddpageelse
+             {\setupcolumntextarea[#1][\v!right][#3]}
+             {\setupcolumntextarea[#1][\v!left][#3]}}
+          {\getparameters[\??mt#1#2][#3]}}%
+   \else
+     \setupcolumntextarea[#1][\v!next][#2]%
+   \fi}
+
+\def\docheckcolumnsetareapage#1#2%
+  {\ifnum\getvalue{\??mt#1\c!page}>\plusone
+     \doifelsevalue{\??mt#1\c!type}\v!fixed
+       {\ifnum\columnsetpage=\getvalue{\??mt#1\c!page}\relax
+          \donetrue\else\donefalse
+        \fi}
+       {\ifnum\columnsetpage<\getvalue{\??mt#1\c!page}\relax
+          \donefalse\else\donetrue
+        \fi}%
+   \else
+     \donetrue
+   \fi}
+
+\def\initializecolumntextareas
+  {\ifodd\realpageno
+     \doinitializecolumntextareas\columnrightareas\v!right
+   \else
+     \doinitializecolumntextareas\columnleftareas\v!left
+   \fi}
+
+\def\doinitializecolumntextareas#1#2%
+  {\def\docommand##1%
+     {\docheckcolumnsetareapage{##1#2}\plusone
+      \ifdone
+        \donefalse
+        \processaction
+          [\getvalue{\??mt##1#2\c!state}]
+          [  \v!start=>\donetrue,
+            \v!repeat=>\donetrue,
+           \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]%
+        \ifdone\dodoinitializecolumntextareas{##1}{#2}\fi
+      \fi}%
+   \processcommacommand[#1]\docommand}
+
+\def\dodoinitializecolumntextareas#1#2%
+  {\doOTRSETsetgridcells
+     {\copy\placeholderboxd}
+     {\getvalue{\??mt#1#2\c!x }}{\getvalue{\??mt#1#2\c!y }}
+     {\getvalue{\??mt#1#2\c!nx}}{\getvalue{\??mt#1#2\c!ny}}
+     {\copy\placeholderboxd}}
+
+\def\placecolumntextareas
+  {\ifodd\realpageno
+     \doplacecolumntextareas\columnrightareas\v!right
+   \else
+     \doplacecolumntextareas\columnleftareas\v!left
+   \fi}
+
+\def\doplacecolumntextareas#1#2% global ?
+  {\bgroup
+   \forgetall
+   \def\docommand##1%
+     {\docheckcolumnsetareapage{##1#2}\zerocount
+      \ifdone
+        \donefalse
+        \processaction
+          [\getvalue{\??mt##1#2\c!state}]
+          [  \v!start=>\donetrue\doglobal\removefromcommalist{##1}#1,
+            \v!repeat=>\donetrue,
+           \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]%
+        \ifdone
+          \dodoplacecolumntextareas{##1}{#2}%
+        \else
+          \doglobal\removefromcommalist{##1}#1%
+        \fi
+      \fi}%
+   \processcommacommand[#1]\docommand
+   \egroup}
+
+% \page[left]
+% \definecolumntextarea[intro][left][x=1,y=1,nx=4,ny=20,state=start,background=introlayer]
+% \setupcolumntextareatext[intro][left][\setups{intro}]
+% \flushcolumntextareas
+
+\def\flushcolumntextareas
+  {\initializecolumntextareas
+   \setvsize}
+
+\def\columntextlastbackspace{\backspace}
+
+% beware, we have clipping offsets of 2\lineheight by default
+
+\def\columntextareaparameter#1%
+  {\csname\??mt\currentcolumntestarea#1\endcsname}
+
+\def\dodoplacecolumntextareas#1#2%
+  {\def\currentcolumntestarea{#1#2}%
+   \!!counta\columntextareaparameter\c!x
+   \!!countb\columntextareaparameter\c!nx
+   \docalculatecolumnsetspan
+   \!!heighta\columntextareaparameter\c!ny\lineheight
+   % wrong
+   % \ifnum\columntextareaparameter\c!y=\zerocount
+   %   \advance\!!heighta -\lineheight
+   %   \advance\!!heighta \topskip
+   % \fi
+   % \advance\!!heighta -\lineheight % option
+   \ifnum\columntextareaparameter\c!y=\plusone
+     \advance\!!heighta -\lineheight
+     \advance\!!heighta \topskip
+   \fi
+   %
+   \setbox\scratchbox\vbox
+     {\donetrue\localframed
+        [\??mt\currentcolumntestarea]
+        [\c!location=,% new (*)
+            \c!width=\!!widtha,\c!height=\!!heighta,\c!lines=]
+        {\columntextareaparameter\empty}}%
+   \!!counta\columntextareaparameter\c!x
+   \!!countb\columntextareaparameter\c!y
+   \advance\!!countb \columntextareaparameter\c!ny
+   \advance\!!countb \minusone
+   % new (*)
+   \doif{\columntextareaparameter\c!location}\v!depth
+     {\setbox\scratchbox\hbox{\lower\strutdepth\box\scratchbox}%
+      \dp\scratchbox\zeropoint
+      \ht\scratchbox\!!heighta}%
+   %
+   \setbox0\hbox
+     {\ifcase\!!countc
+        \copy\scratchbox % \box
+      \else
+        \clip
+          [   %\c!topoffset=\columntextareaparameter\c!clipoffset,%
+           %\c!bottomoffset=\columntextareaparameter\c!clipoffset,%
+             %\c!leftoffset=\columntextareaparameter\c!clipoffset,%
+                  \c!offset=\columntextareaparameter\c!clipoffset,%
+             \c!rightoffset=\zeropoint,%
+                   \c!width=\!!widthb,%
+                  \c!height=\!!heighta]%
+          {\copy\scratchbox}%
+      \fi}%
+   \OTRSETsetgridcell\!!counta\!!countb\box0
+   \ifcase\!!countc\else
+     \advance\!!counta \columntextareaparameter\c!nx
+     \advance\!!counta -\!!countc
+     \advance\!!widtha -\!!widthb
+     \setbox0\hbox
+       {\hskip-\namedlayoutparameter\v!odd\c!backspace
+        \clip
+          [   %\c!topoffset=\columntextareaparameter\c!clipoffset,%
+           %\c!bottomoffset=\columntextareaparameter\c!clipoffset,%
+            %\c!rightoffset=\columntextareaparameter\c!clipoffset,%
+                  \c!offset=\columntextareaparameter\c!clipoffset,%
+              \c!leftoffset=\zeropoint,%
+                   \c!width=\!!widtha,%
+                  \c!height=\!!heighta,%
+                 \c!hoffset=\!!widthb]%
+          {\copy\scratchbox}}%
+     \OTRSETsetgridcell\!!counta\!!countb\box0%
+   \fi}
+
+\def\setupcolumntextareatext
+  {\dotripleempty\dosetupcolumntextareatext}
+
+\long\def\dosetupcolumntextareatext[#1][#2][#3]%
+  {\ifthirdargument
+     \doifelse{#2}\v!both
+       {\setvalue{\??mt#1\v!left }{#3}%
+        \setvalue{\??mt#1\v!right}{#3}}
+       {\doifelse{#2}\v!next
+          {\doifoddpageelse
+             {\setvalue{\??mt#1\v!right}{#3}}%
+             {\setvalue{\??mt#1\v!left }{#3}}}%
+          {\setvalue{\??mt#1#2}{#3}}}%
+   \else
+     \setupcolumntextareatext[#1][\v!next][{#2}]%
+   \fi}
+
+\def\docalculatecolumnsetspan
+  {% \!!counta <= x
+   % \!!countb <= nx
+   % \!!widtha => total width
+   % \!!widthb => left width
+   % \!!countc => left cols
+   \!!widtha\!!countb\textwidth % we assume equal widths
+   \advance\!!countb \!!counta
+   \advance\!!countb \minusone
+   \ifnum\!!countb>\nofcolumns
+     \!!countc\!!countb
+     \advance\!!countc -\nofcolumns
+     \!!countb\nofcolumns
+   \else
+     \!!countc\zerocount
+   \fi
+   \advance\!!counta \plusone
+   \dostepwiserecurse\!!counta\!!countb\plusone
+     {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}%
+   \!!widthb\!!widtha
+   \advance\!!widthb -\!!countc\textwidth
+   \ifodd\realpageno \else % tricky, assumes that we keep there
+     \ifcase\!!countc\else
+       % nog niet ok voor enkel/doublesided
+       \advance\!!widtha \namedlayoutparameter\v!even\c!backspace
+       \advance\!!widtha \namedlayoutparameter\v!odd \c!backspace
+       \advance\!!widthb \namedlayoutparameter\v!even\c!backspace
+       \dorecurse\!!countc
+         {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}%
+     \fi
+   \fi}
+
+\def\columnsetspanhsize{\textwidth}
+
+\def\setcolumnsetspanhsize#1#2% x nx / uses counta/b
+  {\!!counta#1\!!countb#2\docalculatecolumnsetspan
+   \edef\columnsetspanhsize{\the\!!widtha}}
+
+\def\definecolumnsetspan
+  {\dodoubleempty\dodefinecolumnsetspan}
+
+\def\dodefinecolumnsetspan[#1][#2]%
+  {%\ifsecondargument
+     \defineframedtext
+       [cs:#1]
+       [\c!frame=\v!off,
+        \c!before=,
+        \c!after=,
+        \c!offset=\v!overlay,
+        \c!location=\v!left,
+        \c!linecorrection=\v!off,
+        \c!depthcorrection=\v!off,
+        \c!n=2,
+        \c!nlines=0,
+        \c!indenting=,
+        \c!indentnext=\v!yes,
+        \c!default=HERE,
+        \c!alternative=\v!a,
+        #2]%
+   %\else
+   %  \definecolumnspan[][#1]%
+  }%\fi}
+
+\definecolumnsetspan[\s!default]
+
+\def\setupcolumnsetspan
+  {\dodoubleempty\dosetupcolumnsetspan}
+
+\def\dosetupcolumnsetspan[#1][#2]%
+  {\ifsecondargument
+     \setupframedtexts[cs:#1][#2]%
+   \else
+     \setupcolumnsetspan[\s!default][#1]%
+   \fi}
+
+\def\startcolumnsetspan
+  {\dotripleempty\dostartcolumnsetspan}
+
+%%%%%%%%%%%%%%%% TODO
+
+\def\dostartcolumnsetspan[#1][#2][#3]% [#3] gobbles space
+  {\endgraf % else rubish output if forgotten
+   \vskip \zeropoint % make sure otr is done, otherwise last line problems
+   \bgroup
+   \forgetall
+   \ifnum\columnsetlevel>\zerocount\else
+     % of course we needed a one-column fall back for tm
+     \columnsetspanhsize\hsize
+     \nofcolumns\plusone
+     \mofcolumns\plusone
+   \fi
+   \setupframedtexts[cs:#1]
+     [\c!width=\columnsetspanhsize,
+      \c!linecorrection=\v!off,
+      \c!depthcorrection=\v!off,
+      #2]%
+   % determine widths
+   \!!countc\framedtextparameter{cs:#1}\c!n
+    % \!!countd\numexpr(\nofcolumns-\mofcolumns+\plusone)%
+   \!!countd\nofcolumns
+   % n <= n of columns
+   \ifnum\!!countc>\!!countd \!!countc\!!countd \fi
+   \advance\!!countd -\mofcolumns
+   \advance\!!countd \plusone
+   % n <= n of available columns (alternative a)
+   \doif{\framedtextparameter{cs:#1}\c!alternative}\v!a
+     {\ifnum\!!countc>\!!countd \!!countc\!!countd \fi}%
+   % here it all starts
+   \setcolumnsetspanhsize\mofcolumns\!!countc % a/b used
+   \hsize\columnsetspanhsize
+   \setbox\scratchbox\vbox\bgroup
+     \dostartframedtext[cs:#1][\v!none]% geen nils placement
+     % spoils spacing : \vskip-\struttotal\par\verticalstrut\par
+     \ifnum\columnsetlevel>\zerocount
+       \framedtextparameter{cs:#1}\c!before
+     \fi
+     \def\stopcolumnsetspan{\dostopcolumnsetspan{#1}}}
+
+\def\dostopcolumnsetspan#1%
+  {\par
+   \verticalstrut
+   \kern-2\struttotal
+   \verticalstrut
+   \ifnum\columnsetlevel>\zerocount
+     \doifsomething{\framedtextparameter{cs:#1}\c!after}
+       {\framedtextparameter{cs:#1}\c!after
+        \kern\zeropoint}% otherwise blanks disappear, better be a switch
+   \else
+     \endgraf
+   \fi
+   \dostopframedtext
+   \egroup
+   \setbox\scratchbox\frozenhbox to \hsize
+     {\dontcomplain
+      \alignedline{\framedtextparameter{cs:#1}\c!location}\v!middle
+        {\lower\strutdepth\box\scratchbox}}%
+   \dp\scratchbox\zeropoint % else wrong snap insidefloat
+%
+% to be tested first (strange in grid mode)
+%
+% \setbox\scratchbox\frozenhbox to \hsize
+%   {\dontcomplain
+%    \chardef\alignstrutmode\zerocount
+%    \alignedline{\framedtextparameter{cs:#1}\c!plaats}\v!midden
+%      {\box\scratchbox}}%
+%
+   \ifinsidefloat
+     \box\scratchbox
+   \else\ifnum\columnsetlevel>\zerocount
+     % we only set \columnsetspacing when asked for, else bottom problems
+     % don't change this any more (test naw)
+     \chardef\columnslotspacing\framedtextparameter{cs:#1}\c!nlines\relax
+     % todo: nboven/onder & \chardef\columnslotlocation2
+     %\OTRSETstoreincolumnslotHERE\scratchbox
+     \edef\floatmethod{\framedtextparameter{cs:#1}\c!default}%
+     \@EA\uppercasestring\floatmethod\to\floatmethod
+     % todo : \v!here -> here enzovoorts
+     \OTRSETstoreincolumnslot\floatmethod\scratchbox
+     % watch out: no \dochecknextindentation{tag}
+     \checknextindentation[\framedtextparameter{cs:#1}\c!indentnext]%
+   \else
+     % of course we needed a one-column fall back for tm; brrr, the box has now too
+     % much height (try \ruledvbox); don't change this without testing techniek
+     \scratchdimen\ht\scratchbox
+     \advance\scratchdimen-\strutdp
+     \ht\scratchbox\scratchdimen
+     \framedtextparameter{cs:#1}\c!before
+     \snaptogrid\vbox{\box\scratchbox}%
+     \framedtextparameter{cs:#1}\c!after
+   \fi\fi
+   \egroup
+   \endgraf}
+
+% \startcolumnset[two]
+%   \input tufte
+%   \startcolumnsetspan[two][width=20cm,location=middle] \input tufte \stopcolumnsetspan
+%   \startcolumnsetspan[two][default=btlr] \input tufte \stopcolumnsetspan
+%   \input tufte \par
+%   \input tufte \par
+%   \startcolumnsetspan[two] \emptylines[5] \stopcolumnsetspan
+%   \startcolumnsetspan[two] \input tufte   \stopcolumnsetspan
+% \stopcolumnset
+
+% We need to set the \dimen globally since we are in the
+% OTR. Unfortunately this interferes with local settings,
+% although we may assume that they will not cross page
+% boundaries.
+
+\def\OTRSETcheckcontent
+  {\bgroup
+   \donefalse
+   \def\OTRSETcheckcontent##1%
+     {\setbox\scratchbox##1\recurselevel
+      \setbox\scratchbox\vbox{\unvbox\scratchbox}%
+      \ifdim\ht\scratchbox>\zeropoint\donetrue\fi}%
+   \dorecurse{\nofcolumns}
+     {\OTRSETcheckcontent\columngettextbox
+      \OTRSETcheckcontent\columngetfootbox
+      \OTRSETcheckcontent\columngettopbox
+      \OTRSETcheckcontent\columngetbotbox}%
+   \ifdone\egroup\donefalse\else\egroup\donetrue\fi}
+
+\def\OTRSETgetcolumntextheight#1% max - boven - top
+  {\scratchdimen=\OTRSETgetparameter\c!maxhoogte#1%
+   \advance\scratchdimen -\OTRSETgetparameter\c!bovenoffset#1%
+   \advance\scratchdimen -\ht\columntopbox#1%
+   \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}%
+   \advance\scratchdimen -\ht\columnbotbox#1} % not used
+
+\def\OTRSETgetcolumnnaturalheight#1% max - boven - top
+  {\setbox\scratchbox\vbox{\unvcopy\columntextbox#1}%
+   \scratchdimen\ht\scratchbox
+   \advance\scratchdimen \OTRSETgetparameter\c!bovenoffset#1%
+   \advance\scratchdimen \ht\columntopbox#1%
+   \advance\scratchdimen -\getvalue{\??mc\number\mofcolumns-f}%
+   \advance\scratchdimen \ht\columnbotbox#1} % not used
+
+\def\OTRSETdobalance% splitten in met en zonder footnotes
+  {\bgroup
+   \maxdeadcycles=1000
+   % collect content and notes
+   \bgroup
+   \OTRSEToutput
+     {\global\setbox1\vbox{\unvbox\normalpagebox}%
+      \global\setbox3\vbox{\unvbox\footins}}%
+   \verticalstrut\vskip-\struttotal % makes footnotes flush
+   \eject
+   \global\collectingcontentfalse
+   % check for footnotes only
+   \ifdim\ht1<\topskip % real dirty
+     \global\setbox1=\vbox{}
+     % fix height of first line
+     \ifdim\ht3>\!!zeropoint
+       \global\setbox3\vbox
+         {\setfootnotebodyfont
+          \kern-\strutht
+          \kern\topskip
+          \unvbox3}
+   \fi
+   % prepare trial box
+   \global\setbox5\vbox
+     {\ifdim\ht1>\zeropoint
+        \unvcopy1 \ifdim\ht3>\zeropoint \kern\skip\footins \fi
+      \fi
+      \ifdim\ht3>\zeropoint \unvcopy3 \fi}
+   \egroup
+   % erase old stuff
+   \columnerasetextboxes
+   \columnerasefootboxes
+   % prepare floats
+   \OTRSETdotopinsertions
+   \OTRSETdobotinsertions % not used can be removed
+   % calculate available space
+   \!!heighta\zeropoint % available total height
+   \dorecurse{\nofcolumns}
+     {\OTRSETgetcolumntextheight\recurselevel
+      \OTRSETcalculatelines\scratchdimen
+      \advance\!!heighta \scratchdimen}
+   % quick check
+   \ifdim\ht5>\!!heighta
+     % use normal routine
+     \columnerasetextboxes
+     \columnerasefootboxes
+     % TEMP, TODO, FORCE NEXT PASS !
+     \unvbox1
+     \unvbox3
+     \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist
+     \donefalse
+    %\writestatus\m!columns{no balancing, text overflows height}%
+   \else\ifdim\ht5>\zeropoint \relax
+     % some text and/or notes
+     \donetrue
+   \else
+     \donefalse
+     \dorecurse\nofcolumns
+       {\ifdim\ht\columntopbox\recurselevel>\zeropoint \donetrue \fi}%
+     \ifdone
+       % no text and notes, but figures
+     \else
+       % no text, no notes, no figures
+       \doglobal\addtocommalist{-\realfolio}\OTRSETbalancinglist
+       \writestatus\m!columns{no balancing, nothing to be placed}%
+     \fi
+   \fi\fi
+   \ifdone
+     \ifdim\ht5>\zeropoint \relax
+       % balancing text and notes
+      %\writestatus\m!columns{text may fit, balancing}%
+       \newcounter\loopcounter
+       \newcounter\balancinglines
+       \doloop
+         {\increment\loopcounter\relax
+          % initialize
+          \columnerasetextboxes
+          \columnerasefootboxes
+          \setbox0=\copy5
+          \splittopskip\topskip
+          % pre-split loop and quality calculation
+         %\writestatus\m!columns{pass \loopcounter: correction -\balancinglines}
+          \dorecurse\nofcolumns
+            {\OTRSETgetcolumntextheight\recurselevel
+             \OTRSETcalculatelines\scratchdimen
+             \!!heightc\scratchdimen
+             \ifnum\recurselevel<\nofcolumns
+               \advance\!!heightc -\balancinglines\lineheight
+             \fi
+             \columnsettextbox\recurselevel\vsplit0 to \!!heightc}
+          % just one method
+          \OTRSETgetcolumnnaturalheight1           \dimen4\scratchdimen
+          \OTRSETgetcolumnnaturalheight\nofcolumns \dimen6\scratchdimen
+         %\writestatus\m!columns{first column: \the\dimen4}%
+         %\writestatus\m!columns{last  column: \the\dimen6}%
+          \ifdim\dimen4=\dimen6
+            \donetrue  % perfect balance
+          \else\ifdim\dimen4>\dimen6
+            \donefalse % not yet good enough
+            \increment\balancinglines % try again
+            \edef\balancingcount{\the\!!counta}
+          \else
+            \donetrue  % worse balance
+            \ifnum\balancinglines>0 % take previous
+              \decrement\balancinglines
+            \fi
+          \fi\fi
+          % extra check
+          % \ifdim\ht0>\zeropoint\relax \donefalse \fi
+          % another check
+          \ifdone
+           %\writestatus\m!columns{balancing finished in pass \loopcounter}%
+          \else \ifnum\loopcounter>100 \donetrue
+           %\writestatus\m!columns{balancing aborted after pass \loopcounter}%
+          \else
+           %\writestatus\m!columns{balancing continued after pass \loopcounter}%
+          \fi \fi
+          % final balancing pass
+          \ifdone
+            \setbox0\copy1
+            \setbox2\copy3
+            \columnerasetextboxes
+            \columnerasefootboxes
+            \dorecurse\nofcolumns
+              {\OTRSETgetcolumntextheight\recurselevel
+               \OTRSETcalculatelines\scratchdimen
+               \!!heightc\scratchdimen
+               \ifnum\recurselevel<\nofcolumns
+                 \advance\!!heightc -\balancinglines\lineheight
+               \fi
+               % split off text
+               \ifdim\ht0>\zeropoint
+                 \columnsettextbox\recurselevel\vsplit0 to \!!heightc
+                 \setbox4\vbox{\unvcopy\columntextbox\recurselevel}
+                 \advance\!!heightc -\ht4
+                 \ifdim\ht0>\zeropoint
+                   \columnsettextbox\recurselevel\box4
+                   \advance\!!heightc \skip\footins
+                 \fi
+               \fi
+               % split off footnotes
+               \ifdim\ht0>\zeropoint\relax \else
+                 \ifdim\ht2>\zeropoint\relax
+                   \setbox4\vsplit2 to \!!heightc
+                   \setbox\footins=\vbox{\unvbox4} % ugly and dirty trick
+                   \ifdim\ht\columntextbox\recurselevel=\zeropoint\relax
+                     \columnsettextbox\recurselevel\hbox
+                       {\raise\strutdp\hbox % ugly but needed
+                          {\setfootnotebodyfont % both these moves
+                           \lower\strutdp\hbox{\placebottomnotes}}}
+                   \else
+                     \columnsetfootbox\recurselevel\hbox{\placebottomnotes}
+                   \fi
+                 \fi
+               \fi}
+            \exitloop
+          \fi}
+       \else
+         % no reason to balance floats
+       \fi
+     \fi
+     \doglobal\addtocommalist{\realfolio}\OTRSETbalancinglist
+     \OTRSETdoflush
+   \fi
+   \egroup}
+
+\protect \endinput
+
+% extreme examples (1)
+%
+% \setupfloats[numbering=nocheck]
+%
+% \definecolumnset [first] [n=2,start=0]
+% \definecolumnset [next]  [n=2,start=3]
+%
+% \setuptexttexts[\vbox to \textheight{\topskipcorrection \hsize\makeupwidth left \hfill right\vfill}]
+%
+% \setuphead[chapter][text=empty]
+%
+% \starttext
+%
+% \startcolumnset[first,next]
+%   \placefigure[btrl]{}{}
+%   \placefigure[tblr]{}{}
+%   \chapter{thuan} \dorecurse{25}{\recurselevel: \input thuan \endgraf}
+% \stopcolumnset
+%
+% \startcolumnset[first,next]
+%   \chapter{thuan} \dorecurse{25}{\input thuan \endgraf\placefigure{}{}}
+% \stopcolumnset
+
+\unprotect
+
+% only in columnsets
+
+% \def\cornerfigure
+%   {\dotripleempty\docornerfigure}
+%
+% \def\docornerfigure[#1][#2][#3]% [layer] [location] [settings]
+%   {\bgroup
+%    \dowithnextbox
+%      {\!!doneafalse
+%       \!!donebfalse
+%       \processallactionsinset
+%         [\v!left,\v!bottom,#2]
+%         [ \v!left=>\!!doneatrue ,
+%          \v!right=>\!!doneafalse,
+%           \v!top=>\!!donebtrue ,
+%           \v!bottom=>\!!donebfalse]%
+%       \!!widtha\nextboxwd
+%       \if!!donea
+%         % unchecked
+%         \advance\!!widtha-\backspace
+%       \else
+%         % unchecked
+%         \advance\!!widtha-\backspace
+%       \fi
+%       \!!widtha\textwidth % could be an option
+%       \!!heighta\nextboxht
+%       % zou een macro moeten zijn \getnoflayoutlines
+%       \ifnum\layoutparameter\c!lines=\zerocount
+%         \getnoflines\textheight
+%       \else
+%         \noflines\layoutparameter\c!lines
+%       \fi
+%       %
+%       \advance\noflines \plusone % wordt default, instelbaar
+%       \!!heightb\noflines\lineheight\relax
+%       \if!!doneb % boven
+%         % unchecked
+%         \advance\!!heighta-\topspace
+%         \advance\!!heighta-\headerheight
+%         \advance\!!heighta-\headerdistance
+%       \else % onder
+%         % checked
+%         \advance\!!heighta-\paperheight
+%         \advance\!!heighta+\!!heightb
+%         \advance\!!heighta+\topspace
+%         \advance\!!heighta+\headerheight
+%         \advance\!!heighta+\headerdistance
+%         \advance\!!heighta-\footerdistance
+%         \advance\!!heighta-\footerheight
+%       \fi
+%       \getnoflines\!!heighta
+%       \!!heighta\noflines\lineheight\relax
+%       \def\docornerfigure[####1]%
+%         {\expanded{\plaatsfiguur[####1,\v!none]{}
+%            {\noexpand\phantombox[\c!width=\the\!!widtha,\c!height=\the\!!heighta]}}}%
+%       \if!!donea
+%         \if!!doneb % links  boven / rb
+%           \setlayer[#1]
+%             [\c!corner={\v!left,\v!top},\c!location=rb,#3]
+%             {\flushnextbox}%
+%           \docornerfigure[tblr]%
+%         \else      % links  onder / rt
+%           \setlayer[#1]
+%             [\c!corner={\v!left,\v!bottom},\c!location=rt,#3]
+%             {\flushnextbox}%
+%           \docornerfigure[btlr]%
+%         \fi
+%       \else
+%         \if!!doneb % rechts boven / lt
+%           \setlayer[#1]
+%             [\c!corner={\v!right,\v!top},\c!location=lb,#3]
+%             {\flushnextbox}%
+%           \docornerfigure[tbrl]%
+%         \else      % rechts onder / lb
+%           \setlayer[#1]
+%             [\c!corner={\v!right,\v!bottom},\c!location=lt,#3]
+%             {\flushnextbox}%
+%           \docornerfigure[btrl]%
+%         \fi
+%       \fi
+%       \egroup}
+%    \vbox}
diff --git a/tex/context/base/page-set.tex b/tex/context/base/page-set.tex
deleted file mode 100644
index a9d42bce8..000000000
--- a/tex/context/base/page-set.tex
+++ /dev/null
@@ -1,2815 +0,0 @@
-%D \module
-%D   [       file=page-set,
-%D        version=2000.10.20,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Column Sets,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% getnoflines vs getrawnoflines
-
-% some day: cleanup and go etex
-
-\writestatus{loading}{ConTeXt Page Macros / Column Sets}
-
-% todo : last longer than previous
-% todo : block span over last column if footnotes
-% todo : diagnosis balancing run
-% todo : separate footnote placement
-% todo : go on on same page with colset
-% todo : test page areas per page
-% todo : leftmargin/rightmargin (better than afstand(1))
-
-% use the OTRSET layer for more purposes, like the footnotes !
-
-\unprotect
-
-\newcount\tofcolumns % total
-\newcount\lofcolumns % left
-\newcount\rofcolumns % right
-
-\newcount\columnfirstcell \columnfirstcell=1
-\newcount\columnlastcell
-\newcount\columnfreecells
-\newcount\currenthcell
-\newcount\currentvcell
-\newcount\columnhcells
-\newcount\columnvcells
-
-\newif\ifenoughcolumncells
-\newif\ifsomefreecolumncells
-\newif\ifcolumnspread
-\newif\iftracecolumnset    %   \tracecolumnsettrue
-
-\def\columnmaxcells    {75} % runtime
-\def\columnmaxfreecells {0} % runtime
-\def\columngaplimit     {0} % {5}
-
-\def\@otr@{otr}
-
-\def\OTRSETmakeupwidth{\innermakeupwidth}
-
-\let\OTRSETflushsidefloats      \forgetsidefloats % \relax
-\let\OTRSETsynchronizesidefloats\forgetsidefloats % \relax
-
-\def\OTRSETgridcell   #1#2{\csname              \@otr@:\number#1:\number#2\endcsname}
-\def\OTRSETgetgridcell#1#2{\box\csname          \@otr@:\number#1:\number#2\endcsname}
-\def\OTRSETsetgridcell#1#2{\global\setbox\csname\@otr@:\number#1:\number#2\endcsname}
-
-\long\def\OTRSETdoifcellelse#1#2%
-  {\relax\ifvoid\csname\@otr@:\number#1:\number#2\endcsname
-     \@EA\secondoftwoarguments\else\@EA\firstoftwoarguments
-   \fi}
-
-% The following two macros are used to compensate for a switch in body fonts
-% as in:
-%
-% \definecolumnset [two]  [n=2,balancing=yes]
-% \definecolumnset [three] [n=3,balancing=yes]
-%
-% \setupcolumnsetlines[two][1][1][7]
-% \setupcolumnsetlines[two][1][2][10]
-%
-% \setupcolumnsetlines[three][1][1][40]
-% \setupcolumnsetlines[three][1][2][40]
-% \setupcolumnsetlines[three][1][3][40]
-%
-% \setupcolumnsetstart[three][1][1][15]
-% \setupcolumnsetstart[three][1][2][20]
-% \setupcolumnsetstart[three][1][3][20]
-%
-% \starttext
-%   \startcolumnset [two] \dorecurse {1}{\input tufte \par} \stopcolumnset
-%   \switchtobodyfont[small]
-%   \startcolumnset [three] \dorecurse {1}{\input tufte \par} \stopcolumnset
-% \stoptext
-
-%D Marks in columnsets:
-%D
-%D \starttyping
-%D \definemarking[M]
-%D \setupheadertexts[\setups{show-M-marks}]
-%D \definecolumnset[test][n=3]
-%D
-%D \startsetups show-M-marks
-%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][1][last]\quad
-%D \getmarking[M][2][previous]/\getmarking[M][2][first]/\getmarking[M][2][last]\quad
-%D \getmarking[M][3][previous]/\getmarking[M][3][first]/\getmarking[M][3][last]\quad
-%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][last]\quad
-%D \getsavedmarking[M][previous]/\getsavedmarking[M][first]/\getsavedmarking[M][last]
-%D \stopsetups
-%D
-%D \startbuffer
-%D \section{Knuth} [K1]\marking[M]{k1} [K2]\marking[M]{k2} \input knuth
-%D \section{Zapf}  [Z]\marking[M]{z} \input zapf
-%D \stopbuffer
-%D
-%D \startbuffer
-%D \section{Ward} [W]\marking[M]{w} \input ward
-%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
-%D \section{Davis} [D]\marking[M]{d} \input davis
-%D \section{Zapf} [Z]\marking[M]{z} \input zapf
-%D \stopbuffer
-%D
-%D \startbuffer
-%D \section{Ward} [W]\marking[M]{w} \input ward
-%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
-%D \section{Davis} [D]\marking[M]{d} \input davis
-%D \section{Zapf} [Z]\marking[M]{z} \input zapf
-%D \section{Douglas} [O]\marking[M]{o} \input douglas
-%D \stopbuffer
-%D
-%D \starttext
-%D   \startcolumnset[test]
-%D     \dorecurse{5}{\getbuffer}
-%D     \placefigure[here]{none}{\externalfigure[a][height=2cm]}
-%D     % \column % sometimes needed
-%D   \stopcolumnset
-%D \stoptext
-%D \stoptyping
-
-% not ok yet, for column sets we need a special case: within a column we
-% need to bubble-up the marks; the indirectness permits overloading here
-
-\let\saveOTRSETmark  \refreshsavedmark
-\let\bubbleOTRSETmark\bubblesavedmark
-\let\resetOTRSETmark \resetsavedmark
-\let\presetOTRSETmark\presetsavedmark
-
-\def\doregisterOTRSETmarks#1{\saveOTRSETmark  [#1][\number\mofcolumns]}
-\def\dobubbleOTRSETmarks  #1{\bubbleOTRSETmark[#1][\number\mofcolumns]}
-\def\doresetOTRSETmarks   #1{\resetOTRSETmark [#1][\recurselevel]}
-\def\dopresetOTRSETmarks  #1{\presetOTRSETmark[#1][\recurselevel]}
-
-\def\registerOTRSETmarks
-  {\processcommacommand[\alldefinedmarks]\doregisterOTRSETmarks}
-\def\bubbleOTRSETmarks
-  {\processcommacommand[\alldefinedmarks]\dobubbleOTRSETmarks}
-\def\resetOTRSETmarks
-  {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\doresetOTRSETmarks}}
-\def\presetOTRSETmarks
-  {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\dopresetOTRSETmarks}}
-
-%D test case of Vit Zika (context list):
-%D
-%D \starttyping
-%D \setuplayout[height=middle,width=middle,grid=yes]
-%D
-%D \starttext
-%D   \startcolumnset
-%D     \dorecurse{10}
-%D       {\input thuan \endgraf
-%D        \bgroup
-%D        \ss\restoreinterlinespace
-%D        \dorecurse{3}{\input hawking \endgraf}
-%D        \egroup
-%D        \input bryson \endgraf}
-%D   \stopcolumnset
-%D \stoptext
-%D \stoptyping
-
-\def\OTRSETsetcorrectnofcells#1%
-  {\bgroup
-   \!!counta#1\relax
-   \ifdim\globalbodyfontsize=\localbodyfontsize
-     \restoreinterlinespace
-   \else
-     \!!dimena-\!!counta\lineheight
-     \restoreglobalbodyfont % slow, we need a fast one
-     \advance\!!dimena\!!counta\lineheight
-     \getnoflines\!!dimena
-     \advance\!!counta\noflines
-     \ifnum\!!counta<#1\else
-       \!!counta#1\relax
-     \fi
-   \fi
-   \relax % needed ! ! ! ! else lookahead over \fi and \@EA
-   \@EA\egroup\@EA\scratchcounter\the\!!counta\relax}
-
-\def\OTRSETsetcorrectcellht
-  {\bgroup
-   \!!dimena-\strutht\relax
-   \ifdim\globalbodyfontsize=\localbodyfontsize
-     \restoreinterlinespace
-   \else
-     \restoreglobalbodyfont
-   \fi
-   \advance\!!dimena\strutht
-   \relax % needed ! ! ! ! else lookahead over \fi and \@EA
-   \@EA\egroup\@EA\scratchdimen\the\!!dimena\relax}
-
-\def\columnerasegridboxes % maybe dedicated loops
-  {\bgroup
-   \increment\columnmaxcells\relax
-   \ifodd\realpageno
-   \else % we are on the other page
-     \columnspreadfalse
-   \fi
-   \ifcolumnspread
-     \dorecurse\nofcolumns
-       {\let\!!stringa\recurselevel
-        \scratchcounter\recurselevel \advance\scratchcounter\lofcolumns
-        \edef\!!stringb{\the\scratchcounter}%
-        \dostepwiserecurse \zerocount \columnmaxcells \plusone
-          {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname
-             \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
-             \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname
-               \box\csname\@otr@:\!!stringb:\recurselevel\endcsname
-              %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
-             \else
-               \emptybox
-              %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox
-               \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
-             \fi
-           \else
-             \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
-             \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname
-               \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
-             \else
-               \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
-             \fi
-           \fi}}%
-   \else
-     \dorecurse \tofcolumns
-       {\let\!!stringa\recurselevel
-        \dostepwiserecurse \zerocount \columnmaxcells \plusone
-          {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname
-             \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox
-           \else
-             \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
-           \fi}}%
-   \fi
-   \dorecurse\tofcolumns
-     {\global\setbox\csname\@otr@:\recurselevel:\columnmaxcells\endcsname\copy\placeholderboxa}%
-   \global\columnfirstcell\zerocount
-   \global\columnlastcell\columnfirstcell
-   \global\columnfreecells\columnfirstcell
-   \egroup}
-
-\def\doOTRSETsetgridcells#1#2#3#4#5#6% placeholder col row wid hei {data}
-  {\!!countd#2\advance\!!countd#4\advance\!!countd\minusone
-   \!!counte#3\advance\!!counte#5\advance\!!counte\minusone
-   \dostepwiserecurse{#2}\!!countd\plusone
-     {\!!countf\recurselevel
-      \dostepwiserecurse{#3}\!!counte\plusone
-        {\OTRSETsetgridcell\!!countf\recurselevel#1}}%
-   \dostepwiserecurse{#3}\!!counte\plusone
-     {\global\wd\OTRSETgridcell{#2}\recurselevel\hsize}%
-   \OTRSETsetgridcell{#2}\!!counte#6}
-
-\def\OTRSETsetgridcells
-  {\doOTRSETsetgridcells{\copy\placeholderboxb}}
-
-\def\OTRSETerasegridcells#1#2#3#4%
-  {\doOTRSETsetgridcells{\emptybox}{#1}{#2}{#3}{#4}{\emptybox}}
-
-\def\setupcolumnsetlines{\doquintupleempty\dosetupcolumnsettrick[l]}
-\def\setupcolumnsetstart{\doquintupleempty\dosetupcolumnsettrick[s]}
-
-\def\dosetupcolumnsettrick[#1][#2][#3][#4][#5]% tag id page col value
-  {% not needed, is already relative
-   % \doifinstringelse{+}{#3}{\scratchcounter\realpageno}{\scratchcounter\zerocount}%
-   % \advance\scratchcounter#3\relax % \relax needed
-   % \setevalue{\??mc:#1:#2:\the\scratchcounter:\number#4}{\number#5}}
-   \iffifthargument
-     \setevalue{\??mc:#1:#2:\number#3:\number#4}{\number#5}%
-   \else
-     \setevalue{\??mc:#1:#2:\number#3:0}{\number#4}%
-   \fi}
-
-\def\currentcolumnmaxcellstag #1{\??mc:l:\OTRSETidentifier:\columnsetpage:\number#1}
-\def\currentcolumnstartcelltag#1{\??mc:s:\OTRSETidentifier:\columnsetpage:\number#1}
-
-\def\doresetcolumnsetlines#1%
-  {\ifcsname\currentcolumnmaxcellstag{#1}\endcsname
-     \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
-   \fi
-   \ifcsname\currentcolumnmaxcellstag{#1}\endcsname
-     \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
-   \fi}
-
-\def\currentcolumnsomecells#1#2%
-  {\ifcsname#1\mofcolumns\endcsname
-     \ifnum\csname#1\mofcolumns\endcsname=\zerocount
-       #2%
-     \else
-       \number\numexpr\ifnum\csname#1\mofcolumns\endcsname<\zerocount
-         \columnmaxcells+\fi\csname#1\mofcolumns\endcsname\relax
-     \fi
-   \else\ifcsname#10\endcsname
-     \ifnum\csname#10\endcsname=\zerocount
-       #2%
-     \else
-       \number\numexpr\ifnum\csname#10\endcsname<\zerocount
-         \columnmaxcells+\fi\csname#10\endcsname\relax
-     \fi
-   \else
-     #2%
-   \fi\fi}
-
-\def\currentcolumnmaxcells {\currentcolumnsomecells\currentcolumnmaxcellstag \columnmaxcells}
-\def\currentcolumnstartcell{\currentcolumnsomecells\currentcolumnstartcelltag\plusone}
-
-\def\OTRSETsetfreecells#1#2% col start
-  {\bgroup
-   \global\columnfirstcell\ifnum#2=0 1\else#2\fi\relax
-   \OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter
-   \edef\columnmaxcells{\the\scratchcounter}%
-   \ifnum\columnfirstcell>\columnmaxcells
-     \global\columnfreecells\zerocount
-     \global\columnfirstcell\plusone
-     \global\columnlastcell \zerocount
-     \global\somefreecolumncellsfalse
-    %\message{no cells a}%
-   \else
-     \doloop
-       {\ifnum\columnfirstcell>\columnmaxcells\relax
-          \exitloop
-        \else
-          \OTRSETdoifcellelse{#1}\columnfirstcell
-            {\global\advance\columnfirstcell\plusone}\exitloop
-        \fi}%
-     \global\columnlastcell\columnfirstcell
-     \doloop
-       {\ifnum\columnlastcell>\columnmaxcells\relax
-          \exitloop
-        \else
-          \OTRSETdoifcellelse{#1}\columnlastcell
-            {\global\advance\columnlastcell \minusone \exitloop}
-            {\global\advance\columnlastcell \plusone }%
-        \fi}%
-     \ifnum\columnfirstcell>\columnmaxcells
-       \global\columnfreecells\zerocount
-       \global\columnfirstcell\plusone
-       \global\columnlastcell \zerocount
-       \global\somefreecolumncellsfalse
-      %\message{no cells b}%
-     \else
-       \ifnum\columnlastcell>\columnmaxcells
-         \global\columnlastcell\columnmaxcells
-       \fi
-       \global\columnfreecells\columnlastcell
-       \global\advance\columnfreecells -\columnfirstcell
-       \global\advance\columnfreecells \plusone
-       \global\somefreecolumncellstrue
-      %\message{\number\columnfirstcell-\number\columnlastcell=\number\columnfreecells}%
-     \fi
-   \fi
-   \egroup}
-
-\def\OTRSETgetmaxfreecells#1#2% col start
-  {\let\columnmaxfreecells\!!zerocount
-   \let\columnfrmfreecells\!!zerocount
-   \pushmacro \columnmaxcells
-\OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter
-\edef\columnmaxcells{\the\scratchcounter}%
-   \scratchcounter\zerocount
-   \dostepwiserecurse{#2}\columnmaxcells\plusone
-     {\OTRSETdoifcellelse{#1}\recurselevel
-        {\ifnum\columnmaxfreecells<\scratchcounter
-           \edef\columnmaxfreecells{\the\scratchcounter}%
-           \let\columnfrmfreecells\recurselevel
-         \fi
-         \scratchcounter\zerocount}
-        {\advance\scratchcounter\plusone}}%
-   \popmacro\columnmaxcells}
-
-\long\def\OTRSETrecurseRL#1%
-  {\dostepwiserecurse\nofcolumns\plusone\minusone
-     {#1\hskip\OTRSETgetparameter\c!distance\recurselevel}}
-
-\def\OTRSETmakegridbox
-  {\ifcase\columndirection
-     \OTRSETdomakegridbox\plusone\nofcolumns\plusone
-   \else
-     \OTRSETdomakegridbox\nofcolumns\plusone\minusone
-   \fi}
-
-\def\OTRSETmakeupwidth{\makeupwidth} % temporary indirectness
-
-\def\OTRSETdomakegridbox#1#2#3%
-  {\hbox\bgroup
-   \dontcomplain
-   \forgetall % can go once in \flush
-   \!!heighta \textheight
-   % test first !
-   \hbox to \OTRSETmakeupwidth
-     {\dostepwiserecurse{#1}{#2}{#3}
-        {\mofcolumns\recurselevel
-         \localcolumnwidth\OTRSETlocalwidth\mofcolumns
-         \setbox\scratchbox\hbox\localframed
-           [\??mc\OTRSETidentifier\number\mofcolumns]%
-           [\c!width=\localcolumnwidth,\c!height=\!!heighta,\c!lines=]%
-           {}%
-         \wd\scratchbox\localcolumnwidth
-         \ht\scratchbox\!!heighta
-         \ifcase\columndirection
-           \hskip\OTRSETgetparameter\c!distance\recurselevel
-           \box\scratchbox
-         \else
-           \box\scratchbox
-           \hskip\OTRSETgetparameter\c!distance\recurselevel
-         \fi}}%
-   \hskip-\OTRSETmakeupwidth
-   % main text
-   \hbox to \OTRSETmakeupwidth
-     {\dostepwiserecurse{#1}{#2}{#3}
-        {\mofcolumns\recurselevel
-         \localcolumnwidth\OTRSETlocalwidth\mofcolumns
-         \offinterlineskip
-         \setbox\scratchbox\vbox to \!!heighta
-           {\topskipcorrection % not needed
-            \ifcase\OTRSETbalancemethod
-              % no
-            \or
-              % yes
-              \doifelselayerdata{OTRTEXT}\vfill\relax % temp hack
-            \or
-              % top
-            \or
-              % bottom
-              \vfill
-            \fi
-            \dorecurse\columnmaxcells
-              {\setbox\scratchbox\hbox{\OTRSETgetgridcell\mofcolumns\recurselevel}%
-%               {\setbox\scratchbox\hbox
-%                  {\localstarttextcolor
-%                   \OTRSETgetgridcell\mofcolumns\recurselevel
-%                   \localstoptextcolor}%
-               \ht\scratchbox\strutht
-               \dp\scratchbox\strutdp
-               \ifcase\columndirection
-                 \box\scratchbox
-               \else
-                 \hbox to \localcolumnwidth
-                   {\hskip\localcolumnwidth\llap{\box\scratchbox}}%
-               \fi
-               \par}%
-            \ifcase\OTRSETbalancemethod
-              % no
-            \else
-              % yes, top, bottom
-              \ifdim\globalbodyfontsize=\localbodyfontsize
-                \removedepth
-                \restoreglobalbodyfont
-                \vskip\strutdepth
-              \fi
-              \kern\zeropoint
-              \vss
-            \fi}%
-         \wd\scratchbox\localcolumnwidth % \textwidth
-         \ifcase\columndirection
-           \hskip\OTRSETgetparameter\c!distance\recurselevel\box\scratchbox
-         \else
-           \box\scratchbox\hskip\OTRSETgetparameter\c!distance\recurselevel
-         \fi}}%
-   \egroup}
-
-\let\OTRSETbalht\zeropoint
-
-\def\OTRSETreducegridbox % for the moment no difference between methods
-  {\globallet\OTRSETbalht\zeropoint
-   \ifcase\OTRSETbalancemethod
-     % no balancing
-   \else
-     \bgroup
-     \!!counta\columnmaxcells
-     \donetrue
-     \doloop
-       {\dorecurse\nofcolumns{\OTRSETdoifcellelse\recurselevel\!!counta\donefalse\donothing}%
-        \ifdone
-          \ifnum\!!counta>\plusone\advance\!!counta\minusone\else\exitloop\fi
-        \else
-          \exitloop
-        \fi}%
-     \ifnum\!!counta>\plusone
-       \!!heighta\lineheight
-       \multiply\!!heighta \!!counta
-       \advance\!!heighta \topskip
-       \advance\!!heighta -\lineheight
-     \else
-       \!!heighta\zeropoint
-     \fi
-     \xdef\OTRSETbalht{\the\!!heighta}%
-     \egroup
-   \fi}
-
-\def\OTRSETflushfinalfootnotes
-  {\ifcase\lastcolumnlastcell \else
-     \setbox\scratchbox\hbox
-       {\placebottomnotes}%
-     \ifdim\ht\scratchbox>\zeropoint
-       \setbox\scratchbox\hbox
-         {\hbox to \zeropoint{\OTRSETgetgridcell\nofcolumns\lastcolumnlastcell}%
-          \box\scratchbox}%
-       \ht\scratchbox\strutht
-       \dp\scratchbox\strutdp
-       \OTRSETsetgridcell\nofcolumns\lastcolumnlastcell\box\scratchbox
-     \fi
-     \global\lastcolumnlastcell\zerocount
-   \fi}
-
-\def\OTRSETdoflush
-  {\ifcollectingcontent
-     \registerOTRSETmarks
-     \global\mofcolumns\plusone
-   \else
-     \OTRSETdofinalflush
-     \OTRSETdofinaloutput
-     \ifnum\columnsetpage>0
-       \dorecurse\nofcolumns{\doresetcolumnsetlines\recurselevel}%
-     \fi
-     \doglobal\increment\columnsetpage
-     \OTRSETinitializecolumns
-    %\OTRSETdoflushfloats
-     \OTRSETstartnextpage
-\presetOTRSETmarks
-     \initializecolumntextareas
-   \fi}
-
-\newbox\OTRfinalpagebox
-
-\def\OTRSETdofinalflush % see \OTRSETdoflush
-  {\OTRSETflushfinalfootnotes
-   \placecolumntextareas
-   \OTRSETcentergridcells
-   \bgroup % we want to keep the reduction local
-     \OTRSETreducegridbox
-     \global\setbox\OTRfinalpagebox\OTRSETmakegridbox
-   \egroup % otherwise we get the wrong number of free cells
-  %\gdef\localcolumnmaxcells{0}% here ?
-   \global\mofcolumns\nofcolumns} % otherwise problems in finaloutput
-
-% \def\OTRSETdofinaloutput
-%   {\ifdim\ht\OTRfinalpagebox=\teksthoogte
-%    % \bgroup \let\OTRSETsetvsize\relax % prevents useless search for gap
-%      \ifcase\OTRSETbalancemethod
-%        \finaloutput\box\OTRfinalpagebox
-%      \else\ifdim\OTRSETbalht>\zeropoint
-%        \global\setbox\OTRfinalpagebox \iftracecolumnset\ruledvbox\else\vbox\fi to \OTRSETbalht
-%          {\box\OTRfinalpagebox}%
-%        \global\dp\OTRfinalpagebox\strutdepth
-%        \box\OTRfinalpagebox
-%      \else
-%        \finaloutput\box\OTRfinalpagebox
-%      \fi \fi
-%      \globallet\OTRSETbalht\zeropoint
-%    % \egroup
-%    \fi}
-
-\def\OTRSETdofinaloutput
-  {\ifdim\ht\OTRfinalpagebox=\textheight
-    \bgroup % \let\OTRSETsetvsize\relax % prevents useless search for gap
-     \ifcase\OTRSETbalancemethod
-       \finaloutput\box\OTRfinalpagebox
-     \else\ifdim\OTRSETbalht>\zeropoint
-       % catch a bordercase
-       \scratchdimen\OTRSETbalht
-       \advance\scratchdimen\lineheight\relax
-       \ifdim\scratchdimen>\textheight
-         % full page
-         \finaloutput\box\OTRfinalpagebox
-       \else
-         % same page
-         \global\setbox\OTRfinalpagebox \iftracecolumnset\ruledvbox\else\vbox\fi to \OTRSETbalht
-           {\box\OTRfinalpagebox\vss}%
-         \setlayer[OTRTEXT]{\box\OTRfinalpagebox}%
-         \snaptogrid\vbox{\vskip\OTRSETbalht}% hack
-       \fi
-     \else
-       \finaloutput\box\OTRfinalpagebox
-     \fi \fi
-     \globallet\OTRSETbalht\zeropoint
-    \egroup
-   \fi}
-
-\definesystemvariable {mc}
-\definesystemvariable {mt}
-\definesystemconstant {colset}
-
-\definetwopasslist\s!colset
-
-\newdimen  \OTRSETtextswidth
-\newdimen  \OTRSETtextsheight
-\let       \OTRSETidentifier=\empty
-
-\newtoks   \OTRSEToutput
-
-\def\OTRSETgetparameter#1#2{\csname\??mc\OTRSETidentifier\number#2#1\endcsname}
-\def\OTRSETsetparameter#1#2{\setvalue{\??mc\OTRSETidentifier\number#2#1}}
-
-\def\OTRSETskipstart
-  {\scratchcounter\executeifdefined{\??mc\OTRSETidentifier\c!start}\zerocount
-   \relax % needed !
-   \ifcase\scratchcounter\else
-     \advance\scratchcounter\plusone
-     \doOTRSETsetgridcells
-       {\copy\placeholderboxe}
-       \plusone\plusone\nofcolumns\scratchcounter
-       \null
-   \fi}
-
-\def\OTRSETsetvsize % snap per sectie (gap here?)
-  {\ifcollectingcontent \else % can be assigndimen
-\OTRSETskipstart % not that well tested
-     \OTRSETcheckinsert % added
-     \OTRSETsetfreecells\mofcolumns\columnfirstcell
-     \ifsomefreecolumncells
-       \global\vsize\columnfreecells\lineheight
-       \ifinotr % else problems with floats, see extreme
-         \global\pagegoal\vsize % niet nodig, tenzij binnen otr
-       \fi
-       \synchronizeoutput % fails on example
-      % \allowbreak % hm
-     \fi
-     \synchronizenotes
-   \fi}
-
-\def\OTRSETsethsize % of course this does not migrate outside the otr
-  {\localcolumnwidth\OTRSETlocalwidth\mofcolumns
-   \textwidth\localcolumnwidth
-   \hsize\localcolumnwidth}
-
-\def\OTRSETsynchronizehsize
-  {\ifcase0\getvalue{\??mc\??mc\c!width}\else % some width set
-     \bgroup
-     \scratchdimen\OTRSETlocalwidth\mofcolumns
-     \ifdim\scratchdimen=\textwidth
-       \egroup
-     \else
-       % only if change in width and \column/\break
-       \egroup \OTRSETsethsize
-     \fi
-   \fi}
-
-\def\OTRSETcheckfreelines
-  {\OTRSETsetvsize}
-
-\def\doOTRSETcolumnseparator
-  {\hbox to \zeropoint{\hss\red\vl\hss}}
-
-\let\OTRSETcolumnseparator\relax
-
-\def\showbreaks
-  {\let\OTRSETcolumnseparator\doOTRSETcolumnseparator}
-
-% \installcolumnbreakhandler {SET} \v!ja
-%   {% hmmm:
-%    \ifhmode
-%      \bgroup
-%      \removeunwantedspaces
-%      \parfillskip\zeropoint
-%      \OTRSETcolumnseparator
-%      \par
-%      \egroup
-%    \fi
-%    % brrr:
-%    \ejectinsert
-%    \ejectpage
-%    \OTRSETsynchronizehsize} % no \OTRSETsethsize, can be mid smaller (like tabulate)
-%
-% \installcolumnbreakhandler {SET} \v!forceer
-%   {\OTRSETgotocolumn[\v!forceer]}
-% \installcolumnbreakhandler {SET} \v!eerste
-%   {\OTRSETgotocolumn[\v!eerste]}
-% \installcolumnbreakhandler {SET} \v!laatste
-%   {\OTRSETgotocolumn[\v!laatste]}
-%
-% \installcolumnbreakhandler {SET} \v!pagina
-%   {\simplepagebreak % \flushnotes \executepagebreakhandler\v!ja
-%    \ifnum\mofcolumns>\plusone
-%      \OTRSETgotocolumn[\v!laatste,\v!forceer]%
-%    \fi}
-
-\def\OTRSETcolumnhbreak
-  {\ifhmode
-     \bgroup
-     \removeunwantedspaces
-     \parfillskip\zeropoint
-     \OTRSETcolumnseparator
-     \par
-     \egroup
-   \fi}
-
-\installcolumnbreakhandler {SET} \v!local
-  {\OTRSETcolumnhbreak
-   \ejectinsert
-   \ejectpage % brrr
-   % no \OTRSETsethsize, can be mid smaller (like tabulate)
-   % also, this one should be executed at the outer level
-   % (setting hsize inside otr does not work)
-   \OTRSETsynchronizehsize}
-
-% We need to make sure that we really leave the column; mid
-% column we may end up in an empty gap, and we don't want to
-% stay there (basically such a gap is a small empty page
-% then).
-
-\installcolumnbreakhandler {SET} \v!yes
-  {\OTRSETcolumnhbreak
-   \edef\savedmofcolumns{\the\mofcolumns}%
-   \edef\savedrealpageno{\the\realpageno}%
-   \ejectinsert
-   \ejectpage % brrr
-   \doloop
-     {\ifnum\savedmofcolumns=\mofcolumns
-        \ifnum\savedrealpageno=\realpageno
-          \OTRSETdummycolumn
-        \else
-          \exitloop
-        \fi
-      \else
-        \exitloop
-      \fi}%
-   \OTRSETsynchronizehsize}
-
-\installcolumnbreakhandler {SET} \s!unknown
-  {\expanded{\OTRSETgotocolumn[\@@columnspecification]}}
-
-\installcolumnbreakhandler {SET} \v!page
-  {\vfill\eject % \doejectpage\eject
-   \OTRSETgotonextpage}
-
-\newtoks\OTRSETeverystartofcolumn
-
-\newbox\OTRSETsavedfootnotes
-
-% \installoutput\OTRSETflushtextsofar % spacing goes wrong
-
-%\def\OTRSETflushtextsofar
-%  {\ifvoid\normalpagebox \else
-%     \setbox\scratchbox\vbox{\unvbox\normalpagebox}%
-%     \OTRSETsavenotes
-%     \OTRSEThandleflushedtext0
-%   \fi}
-
-% The complication is in the fact that when the HERE float
-% is placed, the otr is not invoked when there is not yet
-% enough content; this can lead to a change in order (turning
-% on the tracer with option 0 is very instructive, watch the
-% small numbers in the margin)
-%
-% 0 = no flushing, so no interference but user should handle
-%     border cases of placement
-% 1 = the normal otr, rather untested
-% 2 = a solution that works ok, is experimental and above
-%     all messy
-
-\chardef\OTRSETflushtextmode=0
-
-\def\OTRSETflushtextsofar
-  {\ifcase\OTRSETflushtextmode
-     % don't mess around
-   \or
-     % the normal one
-     \ifvoid\normalpagebox\else
-       \OTRSETnaturalflush
-       \OTRSETcheckfreelines
-     \fi
-   \or
-     % way to complicated, but kind of ok
-     \doOTRSETflushtextsofar
-   \fi}
-
-\newskip\lastskipinotr
-
-\installoutput\doOTRSETflushtextsofar % experimental
-  {\ifvoid\normalpagebox\else
-     \scratchdimen\dp\normalpagebox
-     \setbox\scratchbox\vbox
-       {\forgetall
-        \unvbox\normalpagebox
-        \global\lastskipinotr\lastskip\relax
-        \ifdim\lastskipinotr>\zeropoint\relax
-          \removelastskip
-        \else
-          \kern-\scratchdimen % handle depth
-        \fi}%
-     \ifdim\lastskipinotr>\zeropoint
-       \scratchskip\ht\scratchbox
-       \setbox\scratchbox\hbox
-         {\lower\strutdepth\box\scratchbox}%
-       \dp\scratchbox\scratchdimen
-       \ht\scratchbox\scratchskip
-     \fi
-     \OTRSETsavenotes
-     \OTRSEThandleflushedtext\zerocount
-     \ifdim\lastskipinotr>\zeropoint
-       %\vskip \lastskipinotr % hm, gets lost anyway
-     \else
-       % we should not discard skips after here; tricky
-     \fi
-     \OTRSETsetvsize
-   \fi}
-
-\def\OTRSETplacebottomnotes
-  {\iflastcolumnfootnotes
-     \ifnum\nofcolumns=\mofcolumns
-       \ifintermediatefootnotes \placebottomnotes \fi
-     \fi
-   \else
-     \placebottomnotes
-   \fi}
-
-\def\OTRSETflushsavednotes
-  {\iflastcolumnfootnotes
-     \ifnum\nofcolumns=\mofcolumns
-       \flushsavednotes
-     \fi
-   \else
-     \flushsavednotes
-   \fi}
-
-\def\OTRSETsavenotes
-  {\iflastcolumnfootnotes
-     \ifnum\nofcolumns=\mofcolumns \else
-       \savenotes
-     \fi
-   \fi}
-
-\appendtoks \OTRSETflushsavednotes \to \OTRSETeverystartofcolumn
-
-\def\OTRSETnaturalflush
-  {\bgroup
-   \forgetall % new, needed !
-   \setbox0\vbox to \columnfreecells\lineheight
-     {\vskip-\topskip
-      \vskip\lineheight
-      \prevdepth\strutdp
-      \unvbox\normalpagebox
-      \vfill}%
-   \setbox2\hbox
-     {\OTRSETplacebottomnotes}%
-   \setbox\scratchbox\hbox
-     {\wd0\zeropoint\box0\box2}%
-   \dp\scratchbox\strutdp
-   \OTRSEThandleflushedtext\plusone
-   \egroup}
-
-\newcount\lastcolumnlastcell
-
-\def\OTRSEThandleflushedtext#1%
-  {\getnoflines{\ht\scratchbox}%
-  %\wd\scratchbox\textwidth % geen \hsize kan < zijn in bv split tabulate
-   \wd\scratchbox\OTRSETlocalwidth\mofcolumns
-   \doOTRSETsetgridcells
-     {\copy\placeholderboxf}
-     \mofcolumns\columnfirstcell\plusone\noflines
-     {\registeredtextarea1\columnfirstcell\scratchbox}% == \hbox / tricky htcorr == \columnfirstcell
-   \global\columnlastcell\columnfirstcell
-   \global\advance\columnlastcell \noflines
-   \global\lastcolumnlastcell\columnlastcell
-   \global\advance\lastcolumnlastcell \minusone
-   % find next (acceptable) gap, todo: deadcycle
-   \ifcase#1\else
-     \OTRSETfillgapsbetweencells\mofcolumns\columnlastcell
-   \fi
-   \OTRSETfindnextgap
-   % \message{\the\mofcolumns,\the\columnfirstcell,\the\columnfreecells}%
-   % \wait
-   % we cannot adapt the hsize since it may have changed (like
-   % inside a tabulate) so we only change it when there is a
-   % reason to do so
-   \OTRSETsynchronizehsize
-   \OTRSETsetvsize}
-
-\def\OTRSETfindnextgap
-  {\OTRSETsetfreecells\mofcolumns\columnlastcell
-   \ifsomefreecolumncells
-     % okay
-     \bubbleOTRSETmarks % not robust because we reenter
-   \else
-     \registerOTRSETmarks % not robust because we reenter
-     \global\advance\mofcolumns \plusone
-     \ifnum\mofcolumns>\nofcolumns
-       \OTRSETdoflush
-       \global\columnlastcell\plusone
-       \global\columnfirstcell\zerocount
-       \OTRSETdoflushfloats
-     \else
-       \the\OTRSETeverystartofcolumn
-       \global\columnlastcell\plusone
-       \global\columnfirstcell\zerocount
-     \fi
-   \fi}
-
-\let\OTRSETcheckfreelines\donothing
-
-\def\OTRSETfillgapsbetweencells#1#2% col
-  {\ifnum\columngaplimit>\zerocount
-     \donefalse
-     \dostepwiserecurse{#2}\columnmaxcells\plusone
-       {\OTRSETdoifcellelse{#1}\recurselevel
-          {\ifdone
-             \!!countb\recurselevel \advance\!!countb -\!!counta\relax
-             \ifnum\!!countb>\plusone
-               \advance\!!countb \minusone
-               \ifnum\!!countb<\columngaplimit\relax
-                 \!!countb\recurselevel \advance\!!countb \minusone
-                 \dostepwiserecurse\!!counta\!!countb\plusone
-                   {\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}%
-                %\message{[gap]}%
-               \fi
-             \fi
-           \fi
-           \donefalse}
-          {\ifdone \else
-             \donetrue
-             \!!counta\recurselevel
-           \fi}}%
-   \fi}
-
-\appendtoks
-  \OTRSETfillgapsbetweencells\mofcolumns\plusone
-\to \OTRSETeverystartofcolumn
-
-%\def\OTRSETfreezeminimumgap#1%
-%  {\OTRSETgetmaxfreecells{#1}{1}%
-%   \ifnum\columnmaxfreecells>0
-%     \!!countb=\columnfrmfreecells
-%     \!!counta=\!!counta \advance\!!counta -\columnmaxfreecells
-%     \dorecurse{\columnmaxcells}
-%       {\ifnum\recurselevel<\!!counta\relax
-%          \donetrue
-%        \else\ifnum\recurselevel>\!!countb
-%          \donetrue
-%        \else
-%          \donefalse
-%        \fi\fi
-%        \ifdone
-%          \OTRSETdoifcellelse{#1}{\recurselevel}
-%            {}{\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}%
-%        \fi}%
-%   \fi}
-%
-%\def\OTRSETfillgaps#1#2#3% col from to
-%  {\dostepwiserecurse{#2}{#3}{1}
-%     {\OTRSETdoifcellelse{#1}{\recurselevel}
-%        {}{\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}}}
-%
-%\def\OTRSETfillbotgaps#1#2% col first
-%  {\OTRSETfillgaps{#1}{#2}{\columnmaxcells}}
-%
-%\def\OTRSETfilltopgaps#1#2% col last
-%  {\OTRSETfillgaps{#1}{1}{#2}}
-
-\newif\ifspancolumnslots \spancolumnslotstrue
-\newif\ifcheckcolumnspan \checkcolumnspantrue
-
-\def\OTRSETcheckwidthgap#1#2% box size
-  {\ifcheckcolumnspan
-     \bgroup
-     \scratchdimen#2%
-     \advance\scratchdimen-\wd#1\relax
-     \ifdim-10\scaledpoint>\scratchdimen
-       \egroup
-     \else\ifdim10\scaledpoint<\scratchdimen
-       \egroup
-     \else
-       \egroup
-       \wd#1=#2%
-     \fi\fi
-   \fi}
-
-\def\OTRSETcheckcolumnslot#1%
-  {\enoughcolumncellstrue
-   \ifspancolumnslots\else
-     \OTRSETcheckwidthgap#1\hsize
-     \ifdim\wd#1>\hsize
-       \enoughcolumncellsfalse
-     \fi
-   \fi
-   \ifenoughcolumncells
-     \getnoflines\pagetotal
-     \scratchcounter\noflines
-     \getnoflines{\ht#1}%
-     \columnvcells\noflines
-     \columnhcells\plusone
-     \advance\scratchcounter \columnvcells \relax
-     \ifnum\scratchcounter>\columnfreecells
-       \enoughcolumncellsfalse
-     \fi
-   \fi}
-
-\def\OTRSETstoreincolumnslotPAGE#1%
-  {\ifenoughcolumncells
-     % to do
-     \OTRSETsavebox{#1}%
-   \else
-     \OTRSETsavebox{#1}%
-   \fi}
-
-\def\OTRSETstoreincolumnslotTOPS#1%
-  {\OTRSETprepareforcolumnslot1{#1}%
-   \OTRSETcheckcolumnslot{#1}%
-   \ifenoughcolumncells
-     \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}%
-   \fi
-   \ifenoughcolumncells
-     \OTRSETsetgridcells\mofcolumns\columnfirstcell\columnhcells\columnvcells
-       {\hbox{\copy#1}}%
-     \OTRSETsetvsize
-   \else
-     \OTRSETsavebox{#1}%
-   \fi}
-
-\def\OTRSETstoreincolumnslotBOTS#1%
-  {\OTRSETprepareforcolumnslot3{#1}%
-   \edef\savedcolumnlastcell{\the\columnlastcell}%
-   \OTRSETcheckcolumnslot{#1}%
-   \ifenoughcolumncells
-     \advance\columnlastcell -\columnvcells \advance\columnlastcell \plusone
-%     \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}%
-     \OTRSETcheckcolumnspace\mofcolumns\columnlastcell{#1}%
-   \fi
-   \ifenoughcolumncells
-     \OTRSETsetgridcells\mofcolumns\columnlastcell\columnhcells\columnvcells{\copy#1}%
-     \OTRSETfillgapsbetweencells\mofcolumns\savedcolumnlastcell % -)
-     \OTRSETsetvsize
-   \else
-     \columnlastcell\savedcolumnlastcell
-     \OTRSETsavebox{#1}%
-   \fi}
-
-\newdimen\totalcolumnspace
-
-\def\columnspacetopoffset{0}
-\def\columnspacebotoffset{0}
-
-\def\OTRSETcheckcolumnspace#1#2#3% col row box
-  {\columnhcells\plusone
-   \totalcolumnspace\zeropoint
-   \scratchcounter#1%
-   \enoughcolumncellstrue
-   \doloop
-     {\advance\totalcolumnspace \OTRSETlocalwidth\scratchcounter\relax % needed
-\OTRSETcheckwidthgap#3\totalcolumnspace
-      \ifnum\wd#3>\totalcolumnspace\relax
-        \ifnum\scratchcounter=\nofcolumns
-          \enoughcolumncellsfalse
-          \exitloop
-        \else
-          \advance\columnhcells \plusone
-          \advance\scratchcounter \plusone
-          \advance\totalcolumnspace \OTRSETgetparameter\c!distance\scratchcounter
-        \fi
-      \else
-        \exitloop
-      \fi}%
-   \ifenoughcolumncells
-     \getnoflines{\ht#3}%
-     \columnvcells\noflines
-     \OTRSETcheckcolumncells{#1}{#2}\columnhcells\columnvcells
-   \fi}
-
-\def\OTRSETcheckcolumncells#1#2#3#4% col row wid hei
-  {\!!countd#1\advance\!!countd#3\advance\!!countd\minusone
-   \!!counte#2\advance\!!counte#4\advance\!!counte\minusone
-   \ifnum\!!counte>\columnmaxcells\relax
-     \enoughcolumncellsfalse
-   \else
-     \enoughcolumncellstrue
-%\let\columnspacetopoffset\zerocount
-%\scratchcounter#2\advance\scratchcounter\minusone
-%\ifnum\scratchcounter>0
-%  \dostepwiserecurse{#1}\!!countd\plusone
-%    {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
-%       \let\columnspacetopoffset\plusone
-%     \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
-%       \let\columnspacetopoffset\plusone
-%     \fi\fi}%
-%  \advance\!!counte \columnspacetopoffset \relax
-%  \advance\columnvcells \columnspacetopoffset \relax
-%\fi
-%\let\columnspacebotoffset\zerocount
-%\scratchcounter\!!counte
-%\advance\scratchcounter \columnvcells \relax
-%\ifnum\scratchcounter>\columnmaxcells\else
-%  \dostepwiserecurse{#1}\!!countd\plusone
-%    {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
-%       \let\columnspacebotoffset\plusone
-%     \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
-%       \let\columnspacebotoffset\plusone
-%     \fi\fi}%
-%  \advance\!!counte \columnspacebotoffset \relax
-%  \advance\columnvcells \columnspacebotoffset \relax
-%\fi
-     \dostepwiserecurse{#1}\!!countd\plusone % cols
-       {\ifenoughcolumncells
-          \!!countf\recurselevel\relax
-          \dostepwiserecurse{#2}\!!counte\plusone % rows
-            {\ifenoughcolumncells
-               \OTRSETdoifcellelse\!!countf\recurselevel
-                 {\enoughcolumncellsfalse}{}%
-             \fi}%
-        \fi}%
-   \fi}
-
-\def\OTRSETsetpreferedcolumnslot#1#2%
-  {\doifsomething{#1}{\edef\preferedcolumn{#1}}%
-   \doifsomething{#2}{\edef\preferedrow   {#2}}}
-
-\OTRSETsetpreferedcolumnslot{\nofcolumns}{1} % default ?
-
-\let\pofcolumns\mofcolumns
-\let\qofcolumns\mofcolumns
-
-\newif\ifquitincurrentcolumn
-
-\def\OTRSETstoreincolumnslotLRTB#1%
-  {\OTRSETprepareforcolumnslot1{#1}%
-   \OTRSETflushtextsofar
-   \OTRSETstoreincolumnslotindeed
-     \mofcolumns\nofcolumns+\currenthcell
-     \plusone\columnmaxcells+\currentvcell{#1}}
-
-\def\OTRSETstoreincolumnslotLRBT#1%
-  {\OTRSETprepareforcolumnslot3{#1}%
-   \OTRSETflushtextsofar
-   \OTRSETstoreincolumnslotindeed
-     \mofcolumns\nofcolumns+\currenthcell
-     \columnmaxcells\plusone-\currentvcell{#1}}
-
-\def\OTRSETstoreincolumnslotRLTB#1%
-  {\OTRSETprepareforcolumnslot1{#1}%
-   \OTRSETflushtextsofar
-   \OTRSETcheckprefered
-   \OTRSETstoreincolumnslotindeed
-     \nofcolumns\qofcolumns-\currenthcell
-     \plusone\columnmaxcells+\currentvcell{#1}}
-
-\def\OTRSETstoreincolumnslotRLBT#1%
-  {\OTRSETprepareforcolumnslot3{#1}%
-   \OTRSETflushtextsofar
-   \OTRSETcheckprefered
-   \OTRSETstoreincolumnslotindeed
-     \nofcolumns\qofcolumns-\currenthcell
-     \columnmaxcells\plusone-\currentvcell{#1}}
-
-\def\OTRSETstoreincolumnslotTBLR#1%
-  {\OTRSETprepareforcolumnslot1{#1}%
-   \OTRSETflushtextsofar
-   \OTRSETstoreincolumnslotindeed
-     \plusone\columnmaxcells+\currentvcell
-     \mofcolumns\nofcolumns+\currenthcell{#1}}
-
-\def\OTRSETstoreincolumnslotTBRL#1%
-  {\OTRSETprepareforcolumnslot1{#1}%
-   \OTRSETflushtextsofar
-   \OTRSETcheckprefered
-   \OTRSETstoreincolumnslotindeed
-     \plusone\columnmaxcells+\currentvcell
-     \nofcolumns\qofcolumns-\currenthcell{#1}}
-
-\def\OTRSETstoreincolumnslotBTLR#1%
-  {\OTRSETprepareforcolumnslot3{#1}%
-   \OTRSETflushtextsofar
-   \OTRSETstoreincolumnslotindeed
-     \columnmaxcells\plusone-\currentvcell
-     \mofcolumns\nofcolumns+\currenthcell{#1}}
-
-\def\OTRSETstoreincolumnslotBTRL#1%
-  {\OTRSETprepareforcolumnslot3{#1}%
-   \OTRSETflushtextsofar
-   \OTRSETcheckprefered
-   \OTRSETstoreincolumnslotindeed
-     \columnmaxcells\plusone-\currentvcell
-     \nofcolumns\qofcolumns-\currenthcell{#1}}
-
-\def\OTRSETstoreincolumnslotFXTB#1% fixed column
-  {\OTRSETcheckprefered
-   \OTRSETdoifcellelse\pofcolumns\plusone
-     {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot1}{#1}% % 1/2 dependent of place, todo
-   \OTRSETflushtextsofar
-   \OTRSETstoreincolumnslotindeed
-     \pofcolumns \pofcolumns    +\currenthcell
-     \preferedrow\columnmaxcells+\currentvcell{#1}}
-
-\def\OTRSETstoreincolumnslotFXBT#1% fixed column
-  {\OTRSETcheckprefered
-   \OTRSETdoifcellelse\pofcolumns\columnmaxcells
-     {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot3}{#1}% % 3/2 dependent of place, todo
-   \OTRSETflushtextsofar
-   \OTRSETstoreincolumnslotindeed
-     \pofcolumns    \pofcolumns +\currenthcell
-     \columnmaxcells\preferedrow-\currentvcell{#1}}
-
-% \def\OTRSETstoreincolumnslotHERE#1% fixed column
-%   {\OTRSETprepareforcolumnslot2{#1}%
-%    \OTRSETflushtextsofar
-%    \getnoflines\pagetotal \advance\noflines\columnfirstcell
-%    \OTRSETstoreincolumnslotindeed
-%      \mofcolumns\mofcolumns+\currenthcell
-%      \noflines\columnmaxcells+\currentvcell{#1}%
-%    \OTRSETsetvsize}
-
-\chardef\OTRSETforcefixedfloats=0
-
-\def\OTRSETstoreincolumnslotHERE#1% fixed column
-  {\ifcase\OTRSETforcefixedfloats
-     \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
-   \else
-     \OTRSETstoreincolumnslotFIXD{#1}%
-   \fi}
-
-% this one looses too wide graphics
-%
-% \def\OTRSETstoreincolumnslotFIXD#1% fixed column
-%   {\OTRSETprepareforcolumnslot2{#1}%
-%    % no flush text sofar here, beware: no width test
-%    \snaptogrid\vbox{\box#1}}
-%
-% still imperfect
-
-\def\OTRSETstoreincolumnslotFIXD#1% fixed column
-  {\OTRSETflushtextsofar
-   \ifdim\wd#1>\textwidth
-     \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
-   \else
-     % crappy test / needed for o-pbu-f / will be replaced
-     \getnoflines{\ht#1}%
-     \scratchdimen\noflines\lineheight
-     \advance\scratchdimen\lineheight
-     \advance\scratchdimen\pagetotal\relax
-     \ifdim\scratchdimen<\pagegoal
-       %OTRSETprepareforcolumnslot3{#1}%
-       %ruledvskip\columnslotspacing\lineheight
-       \blank[\columnslotspacing*\v!line]%
-       \snaptogrid\hbox to \hsize{\hss\box#1\hss}% strange, why the centering
-       \blank[\columnslotspacing*\v!line]%
-     \else
-       \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
-     \fi
-   \fi}
-
-\def\OTRSETstoreincolumnslotSOMEWHERE#1#2%
-  {\OTRSETprepareforcolumnslot{#1}{#2}%
-   \OTRSETflushtextsofar
-   \getnoflines\pagetotal \advance\noflines\columnfirstcell
-   \OTRSETstoreincolumnslotindeed
-     \mofcolumns\mofcolumns+\currenthcell
-     \noflines\columnmaxcells+\currentvcell{#2}%
-   \OTRSETsetvsize}
-
-\def\OTRSETcheckprefered
-  {\ifnum\preferedcolumn<\mofcolumns
-     \let\pofcolumns\mofcolumns
-   \else
-     \let\pofcolumns\preferedcolumn
-   \fi
-   \ifquitincurrentcolumn
-     \ifnum\mofcolumns=\nofcolumns
-       \def\qofcolumns{\mofcolumns}%
-     \else
-       \scratchcounter\mofcolumns
-       \advance\scratchcounter \plusone
-       \edef\qofcolumns{\the\scratchcounter}%
-     \fi
-   \else
-     \let\qofcolumns\mofcolumns
-   \fi}
-
-\def\OTRSETstoreincolumnslotindeed#1#2#3#4#5#6#7#8#9%
-  {\OTRSETcheckprefered
-   \enoughcolumncellsfalse
-   \donefalse
-   \dostepwiserecurse{#1}{#2}{#31}
-     {\ifdone
-        \exitloop
-      \else
-        #4=\recurselevel
-        \dostepwiserecurse{#5}{#6}{#71}
-          {\ifdone
-             \exitloop
-           \else
-             #8=\recurselevel
-             \OTRSETcheckcolumnspace\currenthcell\currentvcell{#9}%
-             \ifenoughcolumncells \donetrue \fi
-           \fi}%
-      \fi}%
-   \ifdone
-     \enoughcolumncellstrue
-   \else
-     \enoughcolumncellsfalse
-   \fi
-   \ifenoughcolumncells
-%    \ifnum\columnspacetopoffset>0\message{[+++]}\fi
-%    \ifnum\columnspacebotoffset>0\message{[---]}\fi
-%    \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells
-%      {\vbox
-%         {\ifcase\columnspacetopoffset\else\ruledvskip\columnspacetopoffset\lineheight\fi
-%          \copy#9
-%          \ifcase\columnspacebotoffset\else\ruledvskip\columnspacebotoffset\lineheight\fi}}%
-     \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells
-       {\copy#9}%
-     \ifnum\currenthcell=\mofcolumns\relax
-       \ifdim\ht\OTRSETsavedfootnotes>\zeropoint
-         \OTRSETsetfreecells\mofcolumns\columnfirstcell
-         \ifsomefreecolumncells
-           \getnoflines{\ht\OTRSETsavedfootnotes}\relax
-           \ifnum\columnfreecells<\noflines
-             \global\somefreecolumncellsfalse
-           \else
-            %\message{[flt]}% float
-           \fi
-         \fi
-         \ifsomefreecolumncells
-           % ok, enough room for notes
-          %\message{[flt]}% float
-         \else % ?
-           \OTRSETsavebox{#9}%
-           \OTRSETerasegridcells\currenthcell\currentvcell\columnhcells\columnvcells
-          %\message{[clr]}% save box
-         \fi
-       \else
-        %\message{[flt]}% float
-       \fi
-     \else
-      %\message{[flt]}% float
-     \fi
-     \OTRSETsetvsize
-    %\message{[fnt]}% float
-   \else
-    %\message{[rej]}% save box
-     \OTRSETsavebox{#9}%
-   \fi}
-
-\chardef\columnslotspacing \plusone
-
-\def\OTRSETstoreincolumnslot#1% #2 % {method} {box} % alleen last
-  {% no messing around here
-   % \dp#2=\zeropoint
-   % \ifcase\columnslotspacing\else
-   %   \setbox#2=\vbox spread \columnslotspacing\lineheight
-   %     {\vss\box#2\vss}%
-   % \fi
-   % and don't change this any more
-%   \doifdefinedelse{\strippedcsname\OTRSETstoreincolumnslot#1}
-%     {\getvalue{\strippedcsname\OTRSETstoreincolumnslot#1}{#2}}
-%     {\OTRSETstoreincolumnslotUNKNOWN{#2}}}
-   \executeifdefined{\strippedcsname\OTRSETstoreincolumnslot#1}
-     \OTRSETstoreincolumnslotUNKNOWN} % {#2}}
-
-\def\OTRSETstoreincolumnslotUNKNOWN#1%
-  {\OTRSETprepareforcolumnslot2{#1}\copy#1} % {} ?
-
-% \def\OTRSETprepareforcolumnslot#1#2% 1=hoog 2=midden 3=laag
-%   {\dp#2\zeropoint
-%    \ifcase\columnslotspacing\else
-%      \scratchdimen\columnslotspacing\lineheight
-%      \ifnum#1=2 \scratchdimen2\scratchdimen \fi
-%      \setbox#2\vbox spread \scratchdimen
-%        {\ifnum#1>1\vss\fi\box#2\relax\ifnum#1<3\vss\fi}%
-%    \fi}
-
-\def\OTRSETprepareforcolumnslot#1#2% 1=hoog 2=midden 3=laag
-  {\dp#2\zeropoint
-   \ifcase\columnslotspacing\else
-     \scratchdimen\columnslotspacing\lineheight
-     \ifnum#1=2 \scratchdimen2\scratchdimen \fi
-     \begingroup
-     \advance\scratchdimen\ht#2\relax
-     \ifdim\scratchdimen<\columnmaxcells\lineheight
-       \endgroup \setbox#2\vbox spread \scratchdimen \bgroup
-     \else
-       \endgroup \setbox#2\vbox to \columnmaxcells\lineheight \bgroup
-       \vskip\strutdepth
-     \fi
-     \ifnum#1>1\vss\fi
-     \box#2\relax
-     \ifnum#1<3\vss\fi
-     \egroup
-   \fi}
-
-\def\OTRSETdocheckiffloatfits % eigenlijk moet else float anders
-  {\global\ifnofloatpermitted\roomforfloatfalse\else\roomforfloattrue\fi}
-
-\def\OTRSETunpreparebox#1%
-  {\ifhbox#1% spans and so
-     \global\setbox\floatbox\vbox{\box#1}%
-   \else
-     \setbox\scratchbox\vbox
-       {\unvbox#1\unskip\unskip\unskip
-        \global\setbox\floatbox\lastbox}%
-   \fi}
-
-\def\OTRSETsavebox#1% clean up the skips
-  {\OTRSETunpreparebox{#1}%
-   \dosavefloat}
-
-\def\OTRSETresavebox#1% clean up the skips
-  {\OTRSETunpreparebox{#1}%
-   \doresavefloat}
-
-\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge
-  {\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
-
-\def\OTRSETdoflushfloats
-  {\bgroup
-   \def\OTRSETsavebox##1{\!!doneafalse}%
-   \doloop
-     {\ifsomefloatwaiting
-\OTRSETskipstart
-        \dogetfloat
-        \ifdim\wd\floatbox>\zeropoint
-          \!!doneatrue
-          \dp\floatbox\zeropoint
-          \OTRSETstoreincolumnslot{TBLR}\floatbox
-          \if!!donea
-           %\message{[flu]}%
-          \else
-            \OTRSETresavebox\floatbox
-            \exitloop
-          \fi
-        \else
-         %\message{[err]}% happens but why?
-        \fi
-      \else
-        \exitloop
-      \fi}
-   \egroup}
-
-\newif\ifcentergridcells \centergridcellstrue
-
-\newif\ifcentergridcellonly     \centergridcellonlyfalse
-\newif\ifautocentergridcellonly \autocentergridcellonlytrue
-
-\def\OTRSETcentergridcells
-  {\ifcentergridcells
-     \dorecurse\nofcolumns
-       {\currenthcell\recurselevel
-        \ifautocentergridcellonly
-          % we prevent centering when the next column is empty
-          % to be checked ! ! ! !
-          \advance\currenthcell \plusone
-          \centergridcellonlytrue
-          \ifnum\currenthcell>\nofcolumns
-            % ok already
-          \else
-            % only span if there is a next column with content
-            \dorecurse\columnmaxcells
-              {\ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
-                 \centergridcellonlyfalse
-               \else\ifdim\dp\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
-                 \centergridcellonlyfalse
-               \fi\fi}%
-          \fi
-        \fi
-        \currenthcell\recurselevel
-        \dorecurse\columnmaxcells
-          {\currentvcell\recurselevel\relax
-           \ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
-           \ifdim\dp\OTRSETgridcell\currenthcell\currentvcell=\zeropoint
-             \bgroup
-             \setbox\scratchbox\OTRSETgetgridcell\currenthcell\currentvcell
-             \getnoflines{\ht\scratchbox}%
-             \!!counta\currentvcell
-             \advance\!!counta -\noflines
-             \advance\!!counta \plusone
-             % first col always ok
-             \!!countb\currenthcell
-             \!!countc\currenthcell
-             \advance\!!countc \plusone
-             \!!donebtrue
-             \ifcentergridcellonly
-               \!!countc\maxdimen
-             \fi
-             \dostepwiserecurse\!!countc\nofcolumns\plusone
-               {\if!!doneb
-                  \let\xrecurselevel\recurselevel
-                  \dostepwiserecurse\!!counta\currentvcell\plusone
-                    {\ifdim\ht\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint
-                       \!!donebfalse
-                     \else\ifdim\wd\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint
-                       \!!donebfalse
-                     \fi\fi}%
-                  \if!!doneb
-                    \!!countb\xrecurselevel
-                  \fi
-                \fi}%
-             \totalcolumnspace\OTRSETlocalwidth\currenthcell
-             \dostepwiserecurse\!!countc\!!countb\plusone
-               {\advance\totalcolumnspace \OTRSETlocalwidth\recurselevel
-                \advance\totalcolumnspace \OTRSETgetparameter\c!distance\recurselevel}%
-             \ifdim\totalcolumnspace>\wd\scratchbox
-               \setbox\scratchbox\hbox to \totalcolumnspace{\hss\box\scratchbox\hss}%
-             \fi
-             \OTRSETsetgridcell\currenthcell\currentvcell\box\scratchbox
-           \egroup
-           \fi
-           \fi}}%
-   \fi}
-
-\def\OTRSETinitializecolumns% once per page
-  {\columnspreadtrue % todo
-   \ifcolumnspread
-     \global\rofcolumns\getvalue{\??mc\OTRSETidentifier\c!nright}%
-     \global\lofcolumns\getvalue{\??mc\OTRSETidentifier\c!nleft}%
-     \global\tofcolumns\rofcolumns \relax
-     \ifodd\realpageno\relax
-       \global\nofcolumns\rofcolumns
-     \else
-       \global\advance\tofcolumns\lofcolumns
-       \global\nofcolumns\lofcolumns
-     \fi
-   \else
-     \global\nofcolumns\getvalue{\??mc\OTRSETidentifier\c!n}%
-     \global\rofcolumns\nofcolumns
-     \global\lofcolumns\nofcolumns
-     \global\tofcolumns\nofcolumns
-   \fi
-   \OTRSETassignwidths
-   \global\mofcolumns\plusone
-   \columnerasegridboxes}
-
-% vanaf hier:
-
-\def\definecolumnset
-  {\dodoubleargument\dodefinecolumnset}
-
-\def\dodefinecolumnset[#1][#2]%
-  {\getparameters[\??mc#1]
-     [\c!direction=\v!right,
-      \c!balance=\v!no,
-      \c!distance=1.5\bodyfontsize, % controleren
-      \c!n=2,
-      \c!nleft=\getvalue{\??mc#1\c!n},
-      \c!nright=\getvalue{\??mc#1\c!n},
-      \c!width=\v!fit,
-      \c!lines=0,
-      \c!start=0,
-      #2]%
-   \dorecurse{\getvalue{\??mc#1\c!nleft}} % todo
-     {\dododefinecolumnset[#1][\recurselevel]}%
-   \dorecurse{\getvalue{\??mc#1\c!nright}} % todo
-     {\dododefinecolumnset[#1][\recurselevel]}%
-   % redo framed settings
-   \setupcolumnset[#1][1][\c!distance=\!!zeropoint]}
-
-\def\dododefinecolumnset[#1][#2]%
-  {\presetlocalframed
-     [\??mc#1#2]%
-   \setupcolumnset
-     [#1][#2]
-     [\c!offset=\v!overlay,
-      \c!frame=\v!off,
-      \c!align=,
-      \c!lines=0,% really needed since c!regels is now part of framed
-      \c!width=\getvalue{\??mc#1\c!width},
-      \c!distance=\getvalue{\??mc#1\c!distance}]}
-
-\def\setupcolumnset
-  {\dotripleargument\dosetupcolumnset}
-
-\def\dosetupcolumnset[#1][#2][#3]%
-  {\ifthirdargument
-     \def\docommand##1%
-       {\doifelse{##1}\v!each
-          {\dorecurse{\getvalue{\??mc#1\c!n}}{\docommand\recurselevel}}
-          {\getparameters[\??mc#1##1][#3]}}%
-     \processcommalist[#2]\docommand
-   \else
-     \getparameters[\??mc#1][#2]%
-   \fi}
-
-\definecolumnset[\s!default][\c!n=2] % fallback
-
-\def\OTRSETgotonextpage
-  {\vfill\eject
-   \relax\ifnum\mofcolumns>\plusone
-     \OTRSETgotocolumn[\v!last]%
-     \ifnum\mofcolumns>\plusone
-       \OTRSETgotocolumn[\v!force]%
-     \fi
-   \fi}
-
-\let\OTRSETgotonextpageX\OTRSETgotonextpage % will become obsolete
-
-\def\OTRSETgotocolumn
-  {\dosingleempty\doOTRSETgotocolumn}
-
-\def\doOTRSETgotoCOLROW#1% |*
-  {\bgroup % really needed
-   \splitstring#1\at*\to\column\and\row
-   \bgroup
-     \ifx\column\empty\else\expanded{\doOTRSETgotoCOLUMN{\column}}\fi
-   \egroup
-   \bgroup
-     \ifx\row   \empty\else\expanded{\doOTRSETgotoROW   {\row   }}\fi
-   \egroup
-   \egroup}
-
-\def\doOTRSETgotoCOLUMN#1%
-  {\ifnum\mofcolumns=#1\else
-     \vfill\eject % \doejectpage\eject
-     \doloop
-       {\ifnum\mofcolumns=#1\relax
-          \exitloop \else \OTRSETdummycolumn
-        \fi}%
-   \fi}
-
-\def\doOTRSETgotoROW#1%
-  {\ifnum#1>1
-     \scratchcounter\zerocount
-     \currenthcell\mofcolumns
-     \currentvcell#1\advance\currentvcell \minusone
-     \dorecurse\currentvcell
-       {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing
-          {\advance\scratchcounter\plusone}}
-     \getnoflines\pagetotal
-     \advance\scratchcounter-\noflines
-     \ifnum\scratchcounter>\zerocount
-       \dorecurse\scratchcounter{\line{\strut}}%
-     \fi
-   \fi
-   \OTRSETsetvsize}
-
-\def\doOTRSETgotocolumn[#1]% yes|force|first|last||*
-  {\processallactionsinset
-     [#1]
-     [    \v!yes=>\OTRSETdummycolumn,
-           \v!no=>,% not supported
-        \v!force=>\OTRSETdummycolumn,
-        \v!first=>\expanded{\doOTRSETgotoCOLUMN{1}},
-         \v!last=>\expanded{\doOTRSETgotoCOLUMN{\the\nofcolumns}},
-      \s!default=>\OTRSETdummycolumn,
-      \s!unknown=>\expanded{\doOTRSETgotoCOLROW{\commalistelement}}]}
-
-% to be documented and tested, not yet that robust
-
-% \def\OTRSETgotocell#1#2%
-%   {\endgraf
-%    \gdef\gotocellcounter{0}%
-%    \doloop
-%      {\ifnum\mofcolumns<#1\relax
-%         \doglobal\increment\gotocellcounter\relax
-%         \ifnum\gotocellcounter>#1\relax
-%           \line{\strut}\crlf
-%           \line{\strut}\crlf
-%           \column
-%           \writestatus{columnset}{quitting goto cell}%
-%           \exitloop
-%         \else
-%           \column
-%         \fi
-%       \else
-%         \exitloop
-%       \fi}%
-%    \ifnum\mofcolumns=#1\relax
-%      \ifnum#2>1
-%        \scratchcounter\zerocount
-%        \currenthcell\mofcolumns
-%        \currentvcell#2\advance\currentvcell \minusone
-%        \dorecurse\currentvcell
-%          {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing
-%             {\advance\scratchcounter\plusone}}
-%        \getnoflines\pagetotal
-%        \advance\scratchcounter-\noflines
-%        \ifnum\scratchcounter>\zerocount
-%          \dorecurse\scratchcounter{\line{\strut}}%
-%        \fi
-%      \fi
-%    \fi
-%    \OTRSETsetvsize}
-
-\def\OTRSETgotocell#1#2% obsolete: now \column[#1*#2]
-  {\endgraf
-   \doOTRSETgotoCOLUMN{#1}%
-   \doOTRSETgotoROW   {#2}}
-
-\def\OTRSETdummycolumn
-  {\verticalstrut
-   \vskip-\struttotal
-   \vfill
-   \eject}
-
-\newcounter\columnsetlevel
-\let\currentcolumnset\empty
-\chardef\OTRSETfinish\zerocount
-
-\def\startcolumnset
-  {\dodoubleempty\dostartcolumnset}
-
-\def\dostartcolumnset[#1][#2]%
-  {\increment\columnsetlevel\relax
-   \globallet\localcolumnmaxcells\!!zerocount
-   \global\chardef\OTRSETfinish\zerocount
-   \resetOTRSETmarks
-   \ifnum\columnsetlevel=\plusone
-     \bgroup
-     \saveinterlinespace
-     \globallet\columnsetpage\!!plusone
-     \def\currentcolumnset{#2}%
-     \insidecolumnstrue % will be different flag in addition
-     \activateotr{SET}{ONE}% andere naam, activate or so
-     \doifelsenothing{#1}
-       {\globallet\OTRSETlist\s!default}
-       {\xdef\OTRSETlist{#1}}%
-     \OTRSETstartnextpage
-     \OTRSETassignwidths
-     \OTRSETsethsize
-   \else
-     \bgroup
-   \fi}
-
-% \setuplayout[grid=yes] \definecolumnset[example] \showgrid
-
-% \starttext
-%     \startcolumnset[example]
-%         \input knuth \endgraf \input knuth
-%         \placetable{table}{\framed[width=\makeupwidth,height=4cm]{Hello}}
-%         \input knuth \endgraf \input knuth
-%     \stopcolumnset
-%     \input knuth \endgraf \input knuth
-% \stoptext
-
-
-\def\OTRSETflushleftovers % new per 13/4/2006
-  {\OTRSETdoifcellelse{1}{1}
-     {\bgroup
-      \OTRSETcentergridcells
-      \chardef\OTRSETbalancemethod\plusone
-      \OTRSETreducegridbox
-      \global\setbox\OTRfinalpagebox\OTRSETmakegridbox
-      \global\ht\OTRfinalpagebox\textheight % signals output that there is content
-      \OTRSETdofinaloutput
-      \globallet\OTRSETbalht\zeropoint
-      \egroup}
-     {}}
-
-\def\stopcolumnset
-  {\relax
-   \ifnum\columnsetlevel=\plusone
-     \endgraf % needed, else wrong vsize in one par case
-     \global\chardef\OTRSETfinish\plusone
-     % no, extra page \pagebreak % (test on pascal toc)
-     \dostopcolumnset
-     \egroup
-     \global\notelimittrue % brrr, untested and fuzzy
-     \setvsize
-     \sethsize
-     \ifvoid\OTRfinalpagebox\else
-       % probably balanced
-       \ifdim\ht\OTRfinalpagebox<\textheight
-         \snaptogrid[\v!page]\hbox{\box\OTRfinalpagebox}%
-       \else
-         \box\OTRfinalpagebox
-       \fi
-     \fi
-     \global\chardef\OTRSETfinish\zerocount
-     \ifsomefloatwaiting \setvsize \pagebreak \setvsize \fi
-     \OTRSETflushleftovers
-   \else
-     \egroup
-   \fi
-   \decrement\columnsetlevel\relax}
-
-\chardef\OTRSETbalancemethod\zerocount
-
-\def\dostopcolumnset
-  {%\OTRSETdofinalflushfloats % yes/no
-   \ifcase\OTRSETbalancemethod
-     \OTRSETnobalance
-   \else
-     \OTRSETdobalance
-   \fi}
-
-\def\OTRSETdobalance
-  {\OTRSETnobalance}
-
-\def\localcolumnmaxcells{0}
-
-% currently line represents real line, i.e. on the grid, and
-% not something noflines (also, watch out for switching from
-% 2-3 columns on one page with both sets balanced: the
-% second set does not see the first set
-
-% \def\OTRSETinitbalancing
-%   {\ifcase\OTRSETbalancemethod\or
-%      \let\savedcolumnmaxcells\columnmaxcells
-%      \ifnum\realpageno=\balancingpageno\relax
-%        \ifnum\mofcolumns=\plusone
-%          \dorecurse\nofcolumns
-%            {\!!counta\recurselevel\relax
-%             \!!countb\getvalue{\??mc\OTRSETidentifier\number\!!counta\c!regels}\relax
-%             \ifcase\!!countb
-%               \!!countb\getvalue{\??mc\OTRSETidentifier\c!regels}\relax
-%             \fi
-%             \ifcase\!!countb
-%               \!!countb \savedcolumnmaxcells\relax
-%             \fi
-%             % can be an option: absolute versus relative
-%             \ifnum\OTRSETbalancemethod=\plusthree
-%               \advance\!!countb\precolumnlines
-%               \ifnum\!!countb>\localcolumnmaxcells\relax
-%                 \xdef\localcolumnmaxcells{\the\!!countb}%
-%               \fi
-%               \advance\!!countb \plusone
-%               \dostepwiserecurse\!!countb\columnmaxcells\plusone
-%                 {\ifvoid\OTRSETgridcell\!!counta\recurselevel
-%                    \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe
-%                  \fi}%
-%             \else
-%               \globallet\localcolumnmaxcells\columnmaxcells
-%               \advance\!!countb-\columnmaxcells
-%               \!!countb-\!!countb
-%               \advance\!!countb \minusone
-%               \ifnum\!!countb>\zerocount
-%                 \dostepwiserecurse\plusone\!!countb\plusone
-%                   {\ifvoid\OTRSETgridcell\!!counta\recurselevel
-%                      \OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe
-%                    \fi}%
-%               \fi
-%             \fi}%
-%          \OTRSETsetvsize % ! ! !
-%        \fi
-%      \fi
-%    \fi}
-%
-%  \def\OTRSETpresetbalancing
-%    {\doifvaluesomething{\??mc\OTRSETidentifier\c!regels}%
-%       {\getcommacommandsize[\csname\??mc\OTRSETidentifier\c!regels\endcsname]%
-%        \ifnum\commalistsize>\plusone
-%          \scratchcounter\zerocount
-%          \def\docommand##1%
-%            {\advance\scratchcounter\plusone
-%             \setvalue{\??mc\OTRSETidentifier\the\scratchcounter\c!regels}{##1}}%
-%          \processcommacommand
-%            [\csname\??mc\OTRSETidentifier\c!regels\endcsname]\docommand
-%          \setvalue{\??mc\OTRSETidentifier\c!regels}{0}%
-%        \fi}}
-
-% don't loose empty 1page/1column with area (example **)
-%
-% \definecolumntextarea[title][x=1,y=4,nx=2,ny=7,state=start]
-% \setupcolumntextareatext[title][\vtop to 5cm{a\\b\\b\\d}]
-%
-% \starttext
-% \startcolumnset \dorecurse{1}{\input tufte \par} \stopcolumnset
-% \stoptext
-
-% better:
-
-\def\definecolumnsetarea   {\definecolumntextarea}
-\def\setupcolumnsetarea    {\setupcolumntextarea}
-\def\setupcolumnsetareatext{\setupcolumntextareatext}
-
-% so this will be changed
-
-% \def\OTRSETnobalance
-%   {\iflastcolumnfootnotes % testen ! optie
-%      % inhibit flush of floats !
-%      % todo: nothing if no footnotes, else empty page
-%      \dostepwiserecurse\mofcolumns\nofcolumns\plusone
-%        {\vskip-\struttotal\verticalstrut\vfill\eject}%
-%    \else
-%      \ifdim\pagetotal>\zeropoint % no, see example **
-%        \ifnum\mofcolumns=\nofcolumns
-%          \OTRSETflushfinalfootnotes
-%        \else
-%          % probably todo
-%        \fi
-%        \vfill
-%        \eject
-%        % brr, may result in empty page after nicely fit text
-%        % or if left, then lost of first column only text
-%        \ifnum\mofcolumns>1
-%          \OTRSETdofinalflush
-%          \OTRSETdofinaloutput
-%        \fi
-%      \fi
-%    \fi}
-
-\def\OTRSETnobalance
-  {\iflastcolumnfootnotes % testen ! optie
-     % inhibit flush of floats !
-     % todo: nothing if no footnotes, else empty page
-     \dostepwiserecurse\mofcolumns\nofcolumns\plusone
-       {\vskip-\struttotal\verticalstrut\vfill\eject}%
-   \else
-     \ifnum\mofcolumns>\plusone
-       \donetrue
-     \else\ifdim\pagetotal>\zeropoint % too dangerous, we loose data
-       \donetrue
-     \else
-       \donefalse
-     \fi\fi
-     \ifdone
-       \ifnum\mofcolumns=\nofcolumns
-         \OTRSETflushfinalfootnotes
-       \else
-         % probably todo
-       \fi
-       \vfill
-       \eject
-\registerOTRSETmarks
-       % brr, may result in empty page after nicely fit text
-       % or if left, then lost of first column only text
-       \ifnum\mofcolumns>\plusone
-         \OTRSETdofinalflush
-         \OTRSETdofinaloutput
-       \fi
-     \fi
-   \fi}
-
-\def\OTRSETstartnextpage
-  {\doifsomething\OTRSETlist
-     {\getfromcommacommand[\OTRSETlist][1]%
-      \global\let\OTRSETidentifier\commalistelement
-      \doifundefined{\??mc\OTRSETidentifier\c!n}
-        {\globallet\OTRSETidentifier\s!default}%
-      \let\newcommalistelement\empty
-      \doglobal\replaceincommalist\OTRSETlist1%
-      \OTRSETrestart}}
-
-\def\OTRSETrestart % weed
-  {\OTRSETinitializefeatures
-   \OTRSETflushpreposttext
-   \OTRSETinitializecolumns
-   \OTRSETcheckinsert
-   \OTRSETcheckgrid
-   \OTRSETsetvsize
-   \OTRSETsethsize % or local ?
-   \OTRSETsetplaceholders
-   \OTRSEThandlepreposttext
-   \initializecolumntextareas % name !
-   \OTRSETcheckstartcells
-   \OTRSETsetvsize}
-
-% \def\OTRSETcheckstartcells
-%   {\dorecurse\nofcolumns
-%      {\bgroup
-%       \mofcolumns\recurselevel
-%       \scratchcounter\currentcolumnstartcell % uses \mofcolumns, returns 1 or more
-%       \advance\scratchcounter \minusone
-%       \dorecurse\scratchcounter
-%         {\OTRSETdoifcellelse\mofcolumns\recurselevel
-%            \donothing{\OTRSETsetgridcell\mofcolumns\recurselevel\copy\placeholderboxe}}%
-%       \egroup}}
-
-\def\OTRSETcheckstartcells
-  {\dorecurse\nofcolumns
-     {\bgroup
-      \mofcolumns\recurselevel
-\OTRSETsetcorrectnofcells\currentcolumnstartcell
-\advance\scratchcounter \minusone
-      \dorecurse\scratchcounter
-        {\OTRSETdoifcellelse\mofcolumns\recurselevel
-           \donothing{\OTRSETsetgridcell\mofcolumns\recurselevel\copy\placeholderboxe}}%
-      \egroup}}
-
-% \OTRSEToutput
-%   {\dontcomplain % new, get rid of overfull message (to be sorted out)
-%    \OTRSETnaturalflush
-%   %\OTRSETstartnextpage
-%    \OTRSETdoflushfloats % actually belongs in \flushsavedfloats (but goes wrong)
-%    \OTRSETcheckfreelines
-%    \OTRSETchecksidefloat}
-
-\OTRSEToutput
-  {\dontcomplain % new, get rid of overfull message (to be sorted out)
-   \doloop
-     {\OTRSETnaturalflush
-     %\OTRSETstartnextpage %  no
-      \OTRSETdoflushfloats % actually belongs in \flushsavedfloats (but goes wrong)
-      \OTRSETcheckfreelines
-      \ifsomefreecolumncells
-        \exitloop
-      \else
-        % flush page and get rid of more floats if present
-      \fi}%
-   \OTRSETchecksidefloat}
-
-\def\OTRSETinitializefeatures
-  {% number of lines
-   % new: raw
-   \getrawnoflines\textheight\xdef\columnmaxcells{\the\noflines}%
-   % direction
-   \doifelsevalue{\??mc\OTRSETidentifier\c!direction}\v!right
-     {\chardef\columndirection\zerocount}
-     {\chardef\columndirection\plusone}%
-   % balancing
-   \chardef\OTRSETbalancemethod\zerocount
-   \processaction
-     [\getvalue{\??mc\OTRSETidentifier\c!balance}]
-     [    \v!yes=>\chardef\OTRSETbalancemethod\plusone,
-          \v!top=>\chardef\OTRSETbalancemethod\plustwo,
-       \v!bottom=>\chardef\OTRSETbalancemethod\plusthree]}
-
-% keep 'm for a while
-%
-% \installoutput\OTRSETflushpreposttext
-%  {\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}%
-%   \ifcarryoverfootnotes \else
-%     \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
-%   \fi}
-%
-% to be tested on 'boekinhoud' in 'pascal/demo-bbi'
-%
-% junk ! ! ! ! !
-%
-%\installoutput\OTRSETflushpreposttext
-%  {\global\setbox\precolumnbox\vbox
-%     {\unvbox\normalpagebox
-%      \strut\vskip-2\lineheight\strut}% we want a proper depth
-%   \ifcarryoverfootnotes \else
-%     \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
-%   \fi}
-%
-% \starttext
-%   \definecolumnset[two][n=2]
-%   \startcolumnset[two] \dorecurse{4}{\input tufte } \stopcolumnset
-%   \input tufte
-%   \startcolumnset[two] \input tufte \stopcolumnset
-% \stoptext
-%
-% \installoutput\OTRSETflushpreposttext
-%   {\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}%
-%    \global\dp\precolumnbox\strutdepth
-%    \ifcarryoverfootnotes \else
-%      \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
-%    \fi}
-
-% test:
-%
-% \definecolumnset[two]  [n=2,balance=yes]
-% \definecolumnset[three][n=3,balance=yes]
-% \setupcolumnset [two]  [1] [lines=10]
-% \setupcolumnset [two]  [2] [lines=10]
-%
-% \startcolumnset[two]   \dorecurse{14}{\input tufte \par} \stopcolumnset
-% \startcolumnset[three] \dorecurse{12}{\input tufte \par} \stopcolumnset
-%
-% with:
-%
-% \installoutput\OTRSETflushpreposttext
-%   {%\ifvoid\normalpagebox
-%    %  \global\setbox\precolumnbox\vbox{}%
-%    %\else
-%      \global\setbox\precolumnbox\vbox
-%        {\unvcopy\normalpagebox}%
-%      \global\setbox\precolumnbox\vbox to \ht\precolumnbox
-%        {\box\normalpagebox}%
-%    %\fi
-%    \global\dp\precolumnbox\strutdepth
-%    \ifcarryoverfootnotes \else
-%      \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
-%    \fi}
-
-% testcase : pascal demo-bbi, paragraaf/aanduiding koppen
-
-\ifx\lastskipinotr\undefined \newskip\lastskipinotr \fi
-
-\installoutput\OTRSETflushpreposttext
-  {\global\setbox\precolumnbox\vbox
-     {\unvbox\normalpagebox
-      \global\lastskipinotr\lastskip}%
-   \ifdim\lastskipinotr>\zeropoint
-     \global\setbox\precolumnbox\hbox
-       {\lower\strutdepth\box\precolumnbox}%
-   \fi
-   \global\dp\precolumnbox\strutdepth
-   \ifcarryoverfootnotes \else
-     \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
-   \fi}
-
-\let\precolumnlines \!!zerocount
-\let\postcolumnlines\!!zerocount
-
-% \def\OTRSEThandlepreposttext
-%   {\ifdim\ht\precolumnbox>\zeropoint % new
-%      \getnoflines{\ht\precolumnbox}%
-%      \edef\precolumnlines{\the\noflines}%
-%      \doOTRSETsetgridcells
-%        {\copy\placeholderboxe}
-%        \plusone\plusone\nofcolumns\noflines
-%        {\box\precolumnbox}%
-%    \else
-%      \let\precolumnlines\!!zerocount
-%    \fi
-%    \ifdim\ht\postcolumnbox>\zeropoint % new, otherwise empty bottom line
-%      \getnoflines{\ht\postcolumnbox}%
-%      \edef\postcolumnlines{\the\noflines}%
-%      \advance\columnfreecells -\noflines
-%      \advance\columnfreecells \plusone
-%      \doOTRSETsetgridcells
-%        {\copy\placeholderboxe}
-%        \plusone\columnfreecells\nofcolumns\noflines
-%        {\box\postcolumnbox}%
-%    \else
-%      \let\postcolumnlines\!!zerocount
-%    \fi}
-
-\def\OTRSEThandlepreposttext
-  {\ifdim\ht\precolumnbox>\zeropoint % new
-     \getnoflines{\ht\precolumnbox}%
-     \edef\precolumnlines{\the\noflines}%
-     \doOTRSETsetgridcells
-       {\copy\placeholderboxe}
-       \plusone\plusone\nofcolumns\noflines
-     % normal version (single column set)
-     % {\box\precolumnbox}%
-     % compensated for bodyfont change
-       {\hbox
-          {\OTRSETsetcorrectcellht
-           \raise\scratchdimen\box\precolumnbox}}%
-   \else
-     \let\precolumnlines\!!zerocount
-   \fi
-   \ifdim\ht\postcolumnbox>\zeropoint % new, otherwise empty bottom line
-     \getnoflines{\ht\postcolumnbox}%
-     \edef\postcolumnlines{\the\noflines}%
-     \advance\columnfreecells -\noflines
-     \advance\columnfreecells \plusone
-     \doOTRSETsetgridcells
-       {\copy\placeholderboxe}
-       \plusone\columnfreecells\nofcolumns\noflines
-       {\box\postcolumnbox}%
-   \else
-     \let\postcolumnlines\!!zerocount
-   \fi}
-
-\def\OTRSETchecksidefloat
-  {} % {\sidefloatoutput}
-
-\def\OTRSETfinalsidefloatoutput
-  {}
-
-\def\OTRSETcheckgrid
-  {\topskip1\topskip
-   \ifforcecolumngrid
-     \widowpenalty\zerocount
-     \clubpenalty\zerocount
-     \brokenpenalty\zerocount
-   \fi}
-
-\def\OTRSETcheckinsert
-  {\iflastcolumnfootnotes
-     \ifnum\nofcolumns=\mofcolumns
-       \OTRSETforceinserts
-     \else
-       \OTRSETinhibitinserts
-     \fi
-   \else
-     \OTRSETforceinserts
-   \fi}
-
-\def\OTRSETforceinserts
-  {\enablenotes}
-
-\def\OTRSETinhibitinserts
-  {\disablenotes}
-
-% interface to footnotes
-
-\def\OTRSETassignwidths
-  {%\scratchdimen\makeupwidth
-   \freezetextwidth \scratchdimen\textwidth
-   %
-   \scratchcounter\zerocount
-   \dorecurse\nofcolumns
-     {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit
-        {\advance\scratchcounter \plusone }
-        {\advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}%
-      \advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!distance}}%
-   \ifcase\scratchcounter\else
-     \divide\scratchdimen \scratchcounter
-   \fi
-   \setgvalue{\??mc\??mc\c!width}{0}%
-   \dorecurse\nofcolumns
-     {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit
-        {\dimen0=\scratchdimen}
-        {\setgvalue{\??mc\??mc\c!width}{1}%
-         \dimen0=\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}%
-      \setxvalue{\??mc\recurselevel\??mc\c!width}{\the\dimen0}}}
-
-\def\OTRSETlocalwidth#1%
-  {\getvalue{\??mc\number#1\??mc\c!width}}
-
-\newbox\placeholderboxa
-\newbox\placeholderboxb
-\newbox\placeholderboxc
-\newbox\placeholderboxd
-\newbox\placeholderboxe
-\newbox\placeholderboxf
-
-\def\columnplaceholder#1#2%
-  {\hbox
-     {\localcolortrue
-      \setbox\scratchbox\hbox to \hsize
-        {\iftracecolumnset \incolortrue \localcolortrue
-           \hskip-.5ex%
-           \startcolor[columnset:#2]\vrule\!!width1ex\!!height.5ex\!!depth.5ex\stopcolor
-         \fi
-         \hss}%
-      \ifcase#1\relax
-        \ht\scratchbox\zeropoint
-        \dp\scratchbox\zeropoint
-        \wd\scratchbox\zeropoint
-      \else
-        \wd\scratchbox\hsize
-        \ht\scratchbox\strutht
-        \dp\scratchbox\strutdp
-      \fi
-      \box\scratchbox}}
-
-\definepalet
-  [columnset]
-  [a=cyan,b=green,c=blue,d=red,e=magenta,f=darkgray]
-
-\def\OTRSETsetplaceholders
-  {\global\setbox\placeholderboxa\columnplaceholder0a%
-   \global\setbox\placeholderboxb\columnplaceholder0b%
-   \global\setbox\placeholderboxc\columnplaceholder0c%
-   \global\setbox\placeholderboxd\columnplaceholder0d%
-   \global\setbox\placeholderboxe\columnplaceholder0e%
-   \global\setbox\placeholderboxf\columnplaceholder1f}
-
-\def\doOTRSETshowstatus
-  {\llap{\incolortrue \localcolortrue \tt\tfxx
-     \startcolor[blue](\the\vsize->\number\columnfirstcell\#\number\columnfreecells)\stopcolor
-     \hskip\leftskip}}
-
-\def\OTRSETshowstatus
-  {\iftracecolumnset \doOTRSETshowstatus \fi}
-
-% \appendtoks \OTRSETshowstatus \to \everypar
-
-% page contents
-
-\def\OTRSETdopagecontents#1#2% takes two args: \box \unvbox
-  {\vbox to \textheight{\forgetall#1#2\pushproperties}}
-
-\def\OTRSETsomepagefloat  {\def\floatmethod{PAGE}\OTRSETsomeslotfloat} % check
-\def\OTRSETsomeherefloat  {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check
-\def\OTRSETsomeelsefloat  {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check
-\def\OTRSETsomefixdfloat  {\def\floatmethod{FIXD}\OTRSETsomeslotfloat} % check
-\def\OTRSETsometopfloat   {\def\floatmethod{TOPS}\OTRSETsomeslotfloat} % check
-\def\OTRSETsomebottomfloat{\def\floatmethod{BOTS}\OTRSETsomeslotfloat} % check
-
-\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge
-  {\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
-
-\def\OTRSETsomeslotfloat[#1]%
-  {\setbox\floatbox\vbox{\flushfloatbox}%
-   \dp\floatbox\strutdp
-   \@EA\uppercasestring\floatmethod\to\floatmethod
-   \OTRSETstoreincolumnslot\floatmethod\floatbox
-   \doinsertfloatinfo}
-
-% kind of new, looks much like OTRONE, but not entirely
-
-\def\OTRSETdosettopinserts
-  {\bgroup
-   \ifsomefloatwaiting
-     \noffloatinserts\zerocount
-     \let\totaltopinserted\!!zeropoint
-     \OTRSETdodosettopinserts
-     \ifnum\@@bknbottom=\zerocount
-       \ifnum\@@bknlines>\zerocount
-         \ifdim\totaltopinserted>\zeropoint\relax
-           \dimen0\lineheight
-           \dimen0=\@@bknlines\dimen0
-           \advance\dimen0 \totaltopinserted\relax
-           \ifdim\dimen0>\textheight % \vsize  %%%%%%%%% \textheight
-             \showmessage\m!floatblocks8{\@@bknlines}%
-             \vfilll\eject
-           \fi
-         \fi
-       \fi
-     \fi
-   \fi
-   \egroup}
-
-\def\OTRSETdodosettopinserts
-  {\ifnum\noffloatinserts<\noftopfloats
-     \dogetfloat
-     \ifdim\topinserted=\zeropoint\relax
-       \topofinserttrue
-     \else
-       \topofinsertfalse
-     \fi
-     \setbox\scratchbox\vbox % kan beter !
-       {\forgetall
-        \iftopofinsert
-          \ifdim\OTRSETtopoffset=\zeropoint
-            \moveongrid[\v!top]
-          \fi
-        \else
-          \betweenfloatblanko % inserts can't look back
-        \fi
-        \flushfloatbox
-        \blank[\@@bkspaceafter]}%
-     \global\advance\topinserted \ht\scratchbox\relax
-     \ifdim\topinserted>\vsize % was \textheight\relax
-       \OTRSETresavebox\floatbox
-       \noffloatinserts\noftopfloats\relax
-       \global\advance\topinserted -\ht\scratchbox
-       \let\OTRSETdodosettopinserts\relax % to be tested
-     \else
-       \xdef\totaltopinserted{\the\topinserted}%
-       \insert\topins{\forgetall\box\scratchbox}% interlineskip ?
-       \ifsomefloatwaiting
-         \advance\noffloatinserts \plusone
-       \else
-         \noffloatinserts\noftopfloats\relax
-       \fi
-       \dofloatflushedinfo
-     \fi
-   \else
-     \ifsomefloatwaiting
-       \showmessage\m!floatblocks6{\the\noftopfloats}%
-     \fi
-     \let\OTRSETdodosettopinserts\relax
-   \fi
-   \OTRSETdodosettopinserts}
-
-\def\OTRSETdosetbotinserts
-  {\bgroup
-   \ifsomefloatwaiting
-     \noffloatinserts\zerocount
-     \OTRSETdodosetbotinserts
-   \fi
-   \egroup}
-
-\def\OTRSETdodosetbotinserts
-  {\ifnum\noffloatinserts<\nofbotfloats\relax
-     \dogetfloat
-     \global\advance\botinserted \ht\floatbox\relax
-     \global\advance\botinserted \dp\floatbox\relax
-     \global\advance\botinserted \floattopskip\relax
-     \ifdim\botinserted<\pagegoal\relax
-       \insert\botins
-         {\forgetall
-          \blank[\@@bkspacebefore]%
-          \flushfloatbox}%
-       \ifsomefloatwaiting
-         \advance\noffloatinserts \plusone
-       \else
-         \noffloatinserts\nofbotfloats
-       \fi
-       \dofloatflushedinfo
-     \else
-       \OTRSETresavebox\floatbox
-       \noffloatinserts\nofbotfloats\relax
-     \fi
-     \global\nofloatpermittedtrue % vgl topfloats s!
-   \else
-     \ifsomefloatwaiting
-       \showmessage\m!floatblocks7{\the\nofbotfloats}%
-     \fi
-     \let\OTRSETdodosetbotinserts\relax
-   \fi
-   \OTRSETdodosetbotinserts}
-
-\let\OTRSETdosetbothinserts\relax
-
-\def\OTRSETdotopinsertions
-  {\ifvoid\topins\else
-     \ifvoid\columntopbox\mofcolumns
-       \columnsettopbox\mofcolumns\box\topins
-     \else
-       \columnsettopbox\mofcolumns\vbox % temp, must be better
-         {\forgetall
-          \offinterlineskip
-          \box\columntopbox\mofcolumns
-          \box\topins}
-     \fi
-   \fi
-   \global\topinserted\zeropoint\relax} % goes away
-
-\def\OTRSETdobotinsertions
-  {\ifvoid\botins \else
-     \columnsetbotbox\mofcolumns\box\botins
-%   \else
-%     \columnsetbotbox\mofcolumns\vbox % temp, must be better
-%       {\forgetall
-%        \offinterlineskip
-%        \box\botins
-%        \box\columnbotbox\mofcolumns}
-   \fi
-   \global\botinserted\zeropoint\relax} % goes away
-
-% set ipv text
-
-% left right 1 2 3 +1 +2 +3
-
-\let\columnleftareas \empty
-\let\columnrightareas\empty
-
-% links rechts => odd, even, n, named
-
-\def\definecolumntextarea
-  {\dotripleempty\dodefinecolumntextarea}
-
-\def\dodefinecolumntextarea[#1][#2][#3]% y=0 is mogelijke en handig !
-  {\ifthirdargument
-     \doifinsetelse{#2}{\v!both,\v!fixed}
-       {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]%
-        \definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
-       {\doifelse{#2}\v!next
-          {\doifoddpageelse
-             {\definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
-             {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]}}
-          {\presetlocalframed
-             [\??mt#1#2]%
-           \processaction[#2] % \doglobal voorkomt stack build up
-             [ \v!left=>\doglobal\addtocommalist{#1}\columnleftareas,
-              \v!right=>\doglobal\addtocommalist{#1}\columnrightareas]%
-           \getparameters[\??mt#1#2]
-             [\c!x=1,\c!y=1,\c!nx=1,\c!ny=1,\c!clipoffset=2\lineheight,
-              \c!offset=\v!overlay,\c!strut=\v!no,\c!frame=\v!off,
-              \c!type=#2,\c!page=1,\c!state=\v!stop,#3]}}%
-   \else
-     \definecolumntextarea[#1][\v!next][#2]%
-   \fi}
-
-\def\setupcolumntextarea
-  {\dotripleempty\dosetupcolumntextarea}
-
-\def\dosetupcolumntextarea[#1][#2][#3]%
-  {\ifthirdargument
-     \doifelse{#2}\v!both
-       {\setupcolumntextarea[#1][\v!left ][#3]%
-        \setupcolumntextarea[#1][\v!right][#3]}
-       {\doifelse{#2}\v!next
-          {\doifoddpageelse
-             {\setupcolumntextarea[#1][\v!right][#3]}
-             {\setupcolumntextarea[#1][\v!left][#3]}}
-          {\getparameters[\??mt#1#2][#3]}}%
-   \else
-     \setupcolumntextarea[#1][\v!next][#2]%
-   \fi}
-
-\def\docheckcolumnsetareapage#1#2%
-  {\ifnum\getvalue{\??mt#1\c!page}>\plusone
-     \doifelsevalue{\??mt#1\c!type}\v!fixed
-       {\ifnum\columnsetpage=\getvalue{\??mt#1\c!page}\relax
-          \donetrue\else\donefalse
-        \fi}
-       {\ifnum\columnsetpage<\getvalue{\??mt#1\c!page}\relax
-          \donefalse\else\donetrue
-        \fi}%
-   \else
-     \donetrue
-   \fi}
-
-\def\initializecolumntextareas
-  {\ifodd\realpageno
-     \doinitializecolumntextareas\columnrightareas\v!right
-   \else
-     \doinitializecolumntextareas\columnleftareas\v!left
-   \fi}
-
-\def\doinitializecolumntextareas#1#2%
-  {\def\docommand##1%
-     {\docheckcolumnsetareapage{##1#2}\plusone
-      \ifdone
-        \donefalse
-        \processaction
-          [\getvalue{\??mt##1#2\c!state}]
-          [  \v!start=>\donetrue,
-            \v!repeat=>\donetrue,
-           \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]%
-        \ifdone\dodoinitializecolumntextareas{##1}{#2}\fi
-      \fi}%
-   \processcommacommand[#1]\docommand}
-
-\def\dodoinitializecolumntextareas#1#2%
-  {\doOTRSETsetgridcells
-     {\copy\placeholderboxd}
-     {\getvalue{\??mt#1#2\c!x }}{\getvalue{\??mt#1#2\c!y }}
-     {\getvalue{\??mt#1#2\c!nx}}{\getvalue{\??mt#1#2\c!ny}}
-     {\copy\placeholderboxd}}
-
-\def\placecolumntextareas
-  {\ifodd\realpageno
-     \doplacecolumntextareas\columnrightareas\v!right
-   \else
-     \doplacecolumntextareas\columnleftareas\v!left
-   \fi}
-
-\def\doplacecolumntextareas#1#2% global ?
-  {\bgroup
-   \forgetall
-   \def\docommand##1%
-     {\docheckcolumnsetareapage{##1#2}\zerocount
-      \ifdone
-        \donefalse
-        \processaction
-          [\getvalue{\??mt##1#2\c!state}]
-          [  \v!start=>\donetrue\doglobal\removefromcommalist{##1}#1,
-            \v!repeat=>\donetrue,
-           \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]%
-        \ifdone
-          \dodoplacecolumntextareas{##1}{#2}%
-        \else
-          \doglobal\removefromcommalist{##1}#1%
-        \fi
-      \fi}%
-   \processcommacommand[#1]\docommand
-   \egroup}
-
-\def\columntextlastbackspace{\backspace}
-
-% beware, we have clipping offsets of 2\lineheight by default
-
-\def\columntextareaparameter#1%
-  {\csname\??mt\currentcolumntestarea#1\endcsname}
-
-\def\dodoplacecolumntextareas#1#2%
-  {\def\currentcolumntestarea{#1#2}%
-   \!!counta\columntextareaparameter\c!x
-   \!!countb\columntextareaparameter\c!nx
-   \docalculatecolumnsetspan
-   \!!heighta\columntextareaparameter\c!ny\lineheight
-   % wrong
-   % \ifnum\columntextareaparameter\c!y=\zerocount
-   %   \advance\!!heighta -\lineheight
-   %   \advance\!!heighta \topskip
-   % \fi
-   % \advance\!!heighta -\lineheight % option
-   \ifnum\columntextareaparameter\c!y=\plusone
-     \advance\!!heighta -\lineheight
-     \advance\!!heighta \topskip
-   \fi
-   %
-   \setbox\scratchbox\vbox
-     {\donetrue\localframed
-        [\??mt\currentcolumntestarea]
-        [\c!location=,% new (*)
-            \c!width=\!!widtha,\c!height=\!!heighta,\c!lines=]
-        {\columntextareaparameter\empty}}%
-   \!!counta\columntextareaparameter\c!x
-   \!!countb\columntextareaparameter\c!y
-   \advance\!!countb \columntextareaparameter\c!ny
-   \advance\!!countb \minusone
-   % new (*)
-   \doif{\columntextareaparameter\c!location}\v!depth
-     {\setbox\scratchbox\hbox{\lower\strutdepth\box\scratchbox}%
-      \dp\scratchbox\zeropoint
-      \ht\scratchbox\!!heighta}%
-   %
-   \setbox0\hbox
-     {\ifcase\!!countc
-        \copy\scratchbox % \box
-      \else
-        \clip
-          [   %\c!topoffset=\columntextareaparameter\c!clipoffset,%
-           %\c!bottomoffset=\columntextareaparameter\c!clipoffset,%
-             %\c!leftoffset=\columntextareaparameter\c!clipoffset,%
-                  \c!offset=\columntextareaparameter\c!clipoffset,%
-             \c!rightoffset=\zeropoint,%
-                   \c!width=\!!widthb,%
-                  \c!height=\!!heighta]%
-          {\copy\scratchbox}%
-      \fi}%
-   \OTRSETsetgridcell\!!counta\!!countb\box0
-   \ifcase\!!countc\else
-     \advance\!!counta \columntextareaparameter\c!nx
-     \advance\!!counta -\!!countc
-     \advance\!!widtha -\!!widthb
-     \setbox0\hbox
-       {\hskip-\namedlayoutparameter\v!odd\c!backspace
-        \clip
-          [   %\c!topoffset=\columntextareaparameter\c!clipoffset,%
-           %\c!bottomoffset=\columntextareaparameter\c!clipoffset,%
-            %\c!rightoffset=\columntextareaparameter\c!clipoffset,%
-                  \c!offset=\columntextareaparameter\c!clipoffset,%
-              \c!leftoffset=\zeropoint,%
-                   \c!width=\!!widtha,%
-                  \c!height=\!!heighta,%
-                 \c!hoffset=\!!widthb]%
-          {\copy\scratchbox}}%
-     \OTRSETsetgridcell\!!counta\!!countb\box0%
-   \fi}
-
-\def\setupcolumntextareatext
-  {\dotripleempty\dosetupcolumntextareatext}
-
-\long\def\dosetupcolumntextareatext[#1][#2][#3]%
-  {\ifthirdargument
-     \doifelse{#2}\v!both
-       {\setvalue{\??mt#1\v!left }{#3}%
-        \setvalue{\??mt#1\v!right}{#3}}
-       {\doifelse{#2}\v!next
-          {\doifoddpageelse
-             {\setvalue{\??mt#1\v!right}{#3}}%
-             {\setvalue{\??mt#1\v!left }{#3}}}%
-          {\setvalue{\??mt#1#2}{#3}}}%
-   \else
-     \setupcolumntextareatext[#1][\v!next][{#2}]%
-   \fi}
-
-\def\docalculatecolumnsetspan
-  {% \!!counta <= x
-   % \!!countb <= nx
-   % \!!widtha => total width
-   % \!!widthb => left width
-   % \!!countc => left cols
-   \!!widtha\!!countb\textwidth % we assume equal widths
-   \advance\!!countb \!!counta
-   \advance\!!countb \minusone
-   \ifnum\!!countb>\nofcolumns
-     \!!countc\!!countb
-     \advance\!!countc -\nofcolumns
-     \!!countb\nofcolumns
-   \else
-     \!!countc\zerocount
-   \fi
-   \advance\!!counta \plusone
-   \dostepwiserecurse\!!counta\!!countb\plusone
-     {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}%
-   \!!widthb\!!widtha
-   \advance\!!widthb -\!!countc\textwidth
-   \ifodd\realpageno \else % tricky, assumes that we keep there
-     \ifcase\!!countc\else
-       % nog niet ok voor enkel/doublesided
-       \advance\!!widtha \namedlayoutparameter\v!even\c!backspace
-       \advance\!!widtha \namedlayoutparameter\v!odd \c!backspace
-       \advance\!!widthb \namedlayoutparameter\v!even\c!backspace
-       \dorecurse\!!countc
-         {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}%
-     \fi
-   \fi}
-
-\def\columnsetspanhsize{\textwidth}
-
-\def\setcolumnsetspanhsize#1#2% x nx / uses counta/b
-  {\!!counta#1\!!countb#2\docalculatecolumnsetspan
-   \edef\columnsetspanhsize{\the\!!widtha}}
-
-\def\definecolumnsetspan
-  {\dodoubleempty\dodefinecolumnsetspan}
-
-\def\dodefinecolumnsetspan[#1][#2]%
-  {%\ifsecondargument
-     \defineframedtext
-       [cs:#1]
-       [\c!frame=\v!off,
-        \c!before=,
-        \c!after=,
-        \c!offset=\v!overlay,
-        \c!location=\v!left,
-        \c!linecorrection=\v!off,
-        \c!depthcorrection=\v!off,
-        \c!n=2,
-        \c!nlines=0,
-        \c!indenting=,
-        \c!indentnext=\v!yes,
-        \c!default=HERE,
-        \c!alternative=\v!a,
-        #2]%
-   %\else
-   %  \definecolumnspan[][#1]%
-  }%\fi}
-
-\definecolumnsetspan[\s!default]
-
-\def\setupcolumnsetspan
-  {\dodoubleempty\dosetupcolumnsetspan}
-
-\def\dosetupcolumnsetspan[#1][#2]%
-  {\ifsecondargument
-     \setupframedtexts[cs:#1][#2]%
-   \else
-     \setupcolumnsetspan[\s!default][#1]%
-   \fi}
-
-\def\startcolumnsetspan
-  {\dotripleempty\dostartcolumnsetspan}
-
-%%%%%%%%%%%%%%%% TODO
-
-\def\dostartcolumnsetspan[#1][#2][#3]% [#3] gobbles space
-  {\endgraf % else rubish output if forgotten
-   \vskip \zeropoint % make sure otr is done, otherwise last line problems
-   \bgroup
-   \forgetall
-   \ifnum\columnsetlevel>\zerocount\else
-     % of course we needed a one-column fall back for tm
-     \columnsetspanhsize\hsize
-     \nofcolumns\plusone
-     \mofcolumns\plusone
-   \fi
-   \setupframedtexts[cs:#1]
-     [\c!width=\columnsetspanhsize,
-      \c!linecorrection=\v!off,
-      \c!depthcorrection=\v!off,
-      #2]%
-   % determine widths
-   \!!countc\framedtextparameter{cs:#1}\c!n
-    % \!!countd\numexpr(\nofcolumns-\mofcolumns+\plusone)%
-   \!!countd\nofcolumns
-   % n <= n of columns
-   \ifnum\!!countc>\!!countd \!!countc\!!countd \fi
-   \advance\!!countd -\mofcolumns
-   \advance\!!countd \plusone
-   % n <= n of available columns (alternative a)
-   \doif{\framedtextparameter{cs:#1}\c!alternative}\v!a
-     {\ifnum\!!countc>\!!countd \!!countc\!!countd \fi}%
-   % here it all starts
-   \setcolumnsetspanhsize\mofcolumns\!!countc % a/b used
-   \hsize\columnsetspanhsize
-   \setbox\scratchbox\vbox\bgroup
-     \dostartframedtext[cs:#1][\v!none]% geen nils placement
-     % spoils spacing : \vskip-\struttotal\par\verticalstrut\par
-     \ifnum\columnsetlevel>\zerocount
-       \framedtextparameter{cs:#1}\c!before
-     \fi
-     \def\stopcolumnsetspan{\dostopcolumnsetspan{#1}}}
-
-\def\dostopcolumnsetspan#1%
-  {\par
-   \verticalstrut
-   \kern-2\struttotal
-   \verticalstrut
-   \ifnum\columnsetlevel>\zerocount
-     \doifsomething{\framedtextparameter{cs:#1}\c!after}
-       {\framedtextparameter{cs:#1}\c!after
-        \kern\zeropoint}% otherwise blanks disappear, better be a switch
-   \else
-     \endgraf
-   \fi
-   \dostopframedtext
-   \egroup
-   \setbox\scratchbox\frozenhbox to \hsize
-     {\dontcomplain
-      \alignedline{\framedtextparameter{cs:#1}\c!location}\v!middle
-        {\lower\strutdepth\box\scratchbox}}%
-   \dp\scratchbox\zeropoint % else wrong snap insidefloat
-%
-% to be tested first (strange in grid mode)
-%
-% \setbox\scratchbox\frozenhbox to \hsize
-%   {\dontcomplain
-%    \chardef\alignstrutmode\zerocount
-%    \alignedline{\framedtextparameter{cs:#1}\c!plaats}\v!midden
-%      {\box\scratchbox}}%
-%
-   \ifinsidefloat
-     \box\scratchbox
-   \else\ifnum\columnsetlevel>\zerocount
-     % we only set \columnsetspacing when asked for, else bottom problems
-     % don't change this any more (test naw)
-     \chardef\columnslotspacing\framedtextparameter{cs:#1}\c!nlines\relax
-     % todo: nboven/onder & \chardef\columnslotlocation2
-     %\OTRSETstoreincolumnslotHERE\scratchbox
-     \edef\floatmethod{\framedtextparameter{cs:#1}\c!default}%
-     \@EA\uppercasestring\floatmethod\to\floatmethod
-     % todo : \v!here -> here enzovoorts
-     \OTRSETstoreincolumnslot\floatmethod\scratchbox
-     % watch out: no \dochecknextindentation{tag}
-     \checknextindentation[\framedtextparameter{cs:#1}\c!indentnext]%
-   \else
-     % of course we needed a one-column fall back for tm; brrr, the box has now too
-     % much height (try \ruledvbox); don't change this without testing techniek
-     \scratchdimen\ht\scratchbox
-     \advance\scratchdimen-\strutdp
-     \ht\scratchbox\scratchdimen
-     \framedtextparameter{cs:#1}\c!before
-     \snaptogrid\vbox{\box\scratchbox}%
-     \framedtextparameter{cs:#1}\c!after
-   \fi\fi
-   \egroup
-   \endgraf}
-
-% \startcolumnset[two]
-%   \input tufte
-%   \startcolumnsetspan[two][width=20cm,location=middle] \input tufte \stopcolumnsetspan
-%   \startcolumnsetspan[two][default=btlr] \input tufte \stopcolumnsetspan
-%   \input tufte \par
-%   \input tufte \par
-%   \startcolumnsetspan[two] \emptylines[5] \stopcolumnsetspan
-%   \startcolumnsetspan[two] \input tufte   \stopcolumnsetspan
-% \stopcolumnset
-
-\protect \endinput
-
-% extreme examples (1)
-%
-% \setupfloats[numbering=nocheck]
-%
-% \definecolumnset [first] [n=2,start=0]
-% \definecolumnset [next]  [n=2,start=3]
-%
-% \setuptexttexts[\vbox to \textheight{\topskipcorrection \hsize\makeupwidth left \hfill right\vfill}]
-%
-% \setuphead[chapter][text=empty]
-%
-% \starttext
-%
-% \startcolumnset[first,next]
-%   \placefigure[btrl]{}{}
-%   \placefigure[tblr]{}{}
-%   \chapter{thuan} \dorecurse{25}{\recurselevel: \input thuan \endgraf}
-% \stopcolumnset
-%
-% \startcolumnset[first,next]
-%   \chapter{thuan} \dorecurse{25}{\input thuan \endgraf\placefigure{}{}}
-% \stopcolumnset
diff --git a/tex/context/base/page-sid.mkii b/tex/context/base/page-sid.mkii
new file mode 100644
index 000000000..0848c9d8c
--- /dev/null
+++ b/tex/context/base/page-sid.mkii
@@ -0,0 +1,931 @@
+%D \module
+%D   [       file=page-sid,
+%D        version=2000.10.20,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Side Floats,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Side Floats}
+
+\unprotect
+
+% problem: when too small, side effects; we need to determine the
+% shift earlier so that we can act when shift < size
+%
+% \definefloat[edgefigure]
+% \setupfloat
+%     [edgefigure]
+%     [rightmargindistance=-\rightmargintotal,
+%      leftmargindistance=-\rightmargintotal,
+%      default=outer]
+% \starttext
+% \placeedgefigure{}{\framed[width=12cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=5cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=4cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=2cm]{}} \input tufte
+% \stoptext
+
+% todo: dimexpr an dnumexpr
+
+% These macro deal with side floats. We started with Daniel
+% Comenetz macros as published in TUGBoat Volume 14 (1993),
+% No.\ 1: Anchored Figures at Either Margin. I extended and
+% patched the macros to suite our needs which results in a
+% messy module. Therefore, this module badly needs an update
+% because it's now a mixture of old and new macros.
+
+% afhankelijke variabelen
+%
+% \overgap    vervangen door   \floatsidetopskip
+% \sidegap    vervangen door   \floatsideskip
+% \undergap   vervangen door   \floatsidebottomskip
+%
+% \prskp      vervangen door   \ctxparskip
+
+% toegevoegde macro's/aanroepen
+%
+% \logsidefloat       : loginformatie
+% \flushsidefloats    : nodig voor koppen
+
+% recente wijzigingen:
+%
+% namen aangepast: \float... enz. i.p.v. \pic
+
+% Pas op: \EveryPar{\EveryPar{}\margetitel{whatever}}
+% \plaatsfiguur[links]{}{} moet goed gaan. In dat geval
+% begint de tekst terecht wat lager.
+
+\newdimen\sidefloatheight      % includes the topskip
+\newdimen\sidefloatwidth
+\newdimen\sidefloathsize
+\newdimen\sidefloatshift
+\newdimen\sidefloatextrashift
+\newdimen\sidefloatvsize       \def\nofloatvsize{-1pt }
+\newdimen\sidefloatprogress
+\newdimen\sidefloatpagetotal
+
+\newbox\floatbottom
+
+\newcount\sidefloatsidelines
+\newcount\sidefloatlinesdone
+
+% 1 = backspace
+% 2 = leftedge
+% 3 = leftmargin
+% 4 = leftside
+% 5 = rightside
+% 6 = rightmargin
+% 7 = rightedge
+% 8 = cutspace
+
+\chardef\sidefloattype\zerocount
+
+\def\backspacefloat    {\global\chardef\sidefloattype1 \putsidefloat}
+\def\leftedgefloat     {\global\chardef\sidefloattype2 \putsidefloat}
+\def\leftmarginfloat   {\global\chardef\sidefloattype3 \putsidefloat}
+\def\leftfloat         {\global\chardef\sidefloattype4 \putsidefloat}
+\def\rightfloat        {\global\chardef\sidefloattype5 \putsidefloat}
+\def\rightmarginfloat  {\global\chardef\sidefloattype6 \putsidefloat}
+\def\rightedgefloat    {\global\chardef\sidefloattype7 \putsidefloat}
+\def\cutspacefloat     {\global\chardef\sidefloattype8 \putsidefloat}
+
+\let\marginfloat       \cutspacefloat
+
+\newif\ifroomforfloat
+\newif\iffloatshort
+\newif\iffloatflag
+\newif\iffloatrighteqo
+\newif\iffloatlefteqo
+
+\newdimen\sidefloatleftskip
+\newdimen\sidefloatrightskip
+\newdimen\sidefloatmaximum
+
+% \def\checksidefloatshift
+%   {\ifdim\sidefloatmaximum>\zeropoint
+%      \ifcase\sidefloattype
+%        % invalid
+%      \or
+%        % backspace
+%      \or
+%        \global\sidefloatshift-\sidefloatmaximum
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance   \rightedgedistance
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+%      \or
+%        \global\sidefloatshift-\sidefloatmaximum
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+%      \or
+%        % left
+%      \or
+%        % right
+%      \or
+%        \global\sidefloatshift-\sidefloatmaximum
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+%      \or
+%        \global\sidefloatshift-\sidefloatmaximum
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance   \rightedgedistance
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+%      \or
+%        % cutspace
+%      \fi
+%    \fi}
+
+\def\checksidefloatshift
+  {\ifdim\sidefloatmaximum>\zeropoint
+     \ifcase\sidefloattype
+       % invalid
+     \or
+       % backspace
+     \or
+       \global\sidefloatshift\dimexpr
+         -\sidefloatmaximum
+         -\rightorleftpageaction \leftedgedistance   \rightedgedistance
+         -\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
+         -\rightorleftpageaction \leftmargindistance \rightmargindistance
+         -\compensatedinnermakeupmargin
+       \relax
+     \or
+       \global\sidefloatshift\dimexpr
+         -\sidefloatmaximum
+         -\rightorleftpageaction \leftmargindistance \rightmargindistance
+         -\compensatedinnermakeupmargin
+       \relax
+     \or
+       % left
+     \or
+       % right
+     \or
+       \global\sidefloatshift\dimexpr
+         -\sidefloatmaximum
+         -\rightorleftpageaction \leftmargindistance \rightmargindistance
+         -\compensatedinnermakeupmargin
+       \relax
+     \or
+       \global\sidefloatshift\dimexpr
+         -\sidefloatmaximum
+         -\rightorleftpageaction \leftedgedistance   \rightedgedistance
+         -\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
+         -\rightorleftpageaction \leftmargindistance \rightmargindistance
+         -\compensatedinnermakeupmargin
+       \relax
+     \or
+       % cutspace
+     \fi
+   \fi}
+
+% \def\setsidefloatskips
+%   {\global\sidefloatrightskip\zeropoint
+%    \global\sidefloatleftskip \zeropoint
+%    \ifcase\sidefloattype
+%    \or % backspace
+%      \global        \sidefloatleftskip \rightorleftpageaction \backspace \cutspace
+%    \or % leftedge
+%      \global        \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance
+%      \global\advance\sidefloatleftskip \rightorleftpageaction \leftmarginwidth\rightmarginwidth
+%      \global\advance\sidefloatleftskip \rightorleftpageaction \leftedgedistance\rightedgedistance
+%    \or % leftmargin
+%      \global        \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance
+%    \or % leftside
+%    \or % rightside
+%    \or % rightmargin
+%      \global        \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance
+%    \or % rightedge
+%      \global        \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance
+%      \global\advance\sidefloatrightskip\rightorleftpageaction \rightmarginwidth\leftmarginwidth
+%      \global\advance\sidefloatrightskip\rightorleftpageaction \rightedgedistance\leftedgedistance
+%    \or % cutspace
+%      \global        \sidefloatrightskip\rightorleftpageaction \cutspace\backspace
+%    \fi
+%    \ifdim\sidefloatrightskip>\zeropoint
+%      \doglobal\advance\sidefloatrightskip\rightskip
+%    \fi
+%    \ifdim\sidefloatleftskip>\zeropoint
+%      \doglobal\advance\sidefloatleftskip\leftskip
+%    \fi}
+
+
+% use \outermarginwidth etc here
+
+\def\setsidefloatskips
+  {\global\sidefloatrightskip\zeropoint
+   \global\sidefloatleftskip \zeropoint
+   \ifcase\sidefloattype
+   \or % backspace
+     \global\sidefloatleftskip\dimexpr
+       +\rightorleftpageaction \backspace           \cutspace
+       +\compensatedinnermakeupmargin
+     \relax
+   \or % leftedge
+     \global\sidefloatleftskip\dimexpr
+       +\rightorleftpageaction \leftmargindistance  \rightmargindistance
+       +\rightorleftpageaction \leftmarginwidth     \rightmarginwidth
+       +\rightorleftpageaction \leftedgedistance    \rightedgedistance
+       +\compensatedinnermakeupmargin
+     \relax
+   \or % leftmargin
+     \global\sidefloatleftskip\dimexpr
+       +\rightorleftpageaction \leftmargindistance  \rightmargindistance
+       +\compensatedinnermakeupmargin
+     \relax
+   \or % leftside
+   \or % rightside
+   \or % rightmargin
+     \global\sidefloatrightskip\dimexpr
+       +\rightorleftpageaction \rightmargindistance \leftmargindistance
+       +\compensatedinnermakeupmargin
+     \relax
+   \or % rightedge
+     \global\sidefloatrightskip\dimexpr
+       +\rightorleftpageaction \rightmargindistance \leftmargindistance
+       +\rightorleftpageaction \rightmarginwidth    \leftmarginwidth
+       +\rightorleftpageaction \rightedgedistance   \leftedgedistance
+       +\compensatedinnermakeupmargin
+     \relax
+   \or % cutspace
+     \global\sidefloatrightskip\dimexpr
+       +\rightorleftpageaction \cutspace            \backspace
+       +\compensatedinnermakeupmargin
+     \relax
+   \fi
+   \ifdim\sidefloatrightskip>\zeropoint \doglobal\advance\sidefloatrightskip\rightskip \fi
+   \ifdim\sidefloatleftskip >\zeropoint \doglobal\advance\sidefloatleftskip \leftskip  \fi}
+
+% eq is still crap
+
+\ifx\normalleqno\undefined
+
+  \let\floatrighteqo=\eqno
+  \let\floatleftleqo=\leqno
+
+\else
+
+  \let\floatrighteqo=\normaleqno
+  \let\floatleftleqo=\normalleqno
+
+\fi
+
+% Watch it even more! In inner, gaat't mis omdat daar
+% pagetotal enz niet zijn aangepast. Inner kan overigens niet
+% betrouwbaar worden getest!
+
+% \def\flushsidefloats%
+%   {\par
+%    \sidefloatprogress=\sidefloatvsize
+%    \advance\sidefloatprogress by -\pagetotal
+%    \ifdim\sidefloatprogress>\zeropoint
+%      \witruimte % nog checken op interferentie
+%      \kern\sidefloatprogress
+%    \fi
+%    \global\sidefloatvsize=\nofloatvsize
+%    \global\floatflagfalse}
+%
+% no, too buggy, leads to top of page crap
+%
+%\def\flushsidefloats
+%  {\par
+%   \dochecksidefloat
+%   \scratchcounter=-\hangafter
+%   \dorecurse{\scratchcounter}{\strut\hfill\strut\par}}
+%
+%\def\flushsidefloats
+%  {\par
+%   \!!heighta\sidefloatvsize
+%   \advance\!!heighta -\pagetotal
+%   \ifdim\!!heighta>\zeropoint
+%     % to be checked for interference
+%     \witruimte
+%     % will be option
+%     \getnoflines\!!heighta
+%     \!!heighta\noflines\lineheight
+%     % so far for option
+%     \kern\!!heighta
+%   \fi
+%   % == \forgetsidefloats
+%   \global\sidefloatvsize\nofloatvsize
+%   \global\floatshortfalse
+%   \global\floatflagfalse}
+
+% \def\flushsidefloats
+%   {\par
+%    \!!heighta\sidefloatvsize
+%    \advance\!!heighta -\pagetotal
+%    \ifdim\!!heighta>\zeropoint
+%      % to be checked for interference
+%      \witruimte
+%      % will be option
+%      \getnoflines\!!heighta
+%      \!!heighta\noflines\lineheight
+%      % so far for option
+%      \ifdim\sidefloatbottomskip>\zeropoint\relax
+%        \ifdim\!!heighta>\sidefloatbottomskip
+%          \advance\!!heighta-\sidefloatbottomskip
+%          \kern\!!heighta
+%          \vskip\sidefloatbottomskip
+%        \else
+%          \kern\!!heighta
+%        \fi
+%      \else
+%        \kern\!!heighta
+%      \fi
+%    \fi
+%    % == \forgetsidefloats
+%    \global\sidefloatvsize\nofloatvsize
+%    \global\floatshortfalse
+%    \global\floatflagfalse}
+
+\newif\iftracesidefloats
+
+\def\flushsidefloats
+  {\par
+   \!!heighta\sidefloatvsize
+   \advance\!!heighta -\pagetotal
+   \ifnum\!!heighta>\zeropoint
+     \global\advance\sidefloatvsize -\sidefloatbottomskip
+     \ifdim\!!heighta>\zeropoint
+       \bgroup
+       \let\flushsidefloats\relax
+       \forgetall
+       \doloop
+         {\strut
+          \iftracesidefloats
+            \color[darkgray]%
+              {\baselinerulefalse
+               \boxrulewidth.5\points
+               \ruledhbox{\strut\kern\sidefloatwidth}}%
+          \fi
+          \par
+          \!!heighta\sidefloatvsize
+          \advance\!!heighta -\pagetotal
+          \ifdim\!!heighta>\zeropoint
+            \ifnum\recurselevel>\plushundred
+              \exitloop
+            \fi
+          \else
+            \exitloop
+          \fi}%
+       \egroup
+       \ifdim\parskip>\zeropoint
+         \ifdim\sidefloatbottomskip>\parskip
+           \nowhitespace
+           \vskip\sidefloatbottomskip
+         \fi
+       \fi
+     \else\ifdim\sidefloatbottomskip>\parskip
+       \vskip\sidefloatbottomskip
+     \fi\fi
+   \fi
+   % not entirely the same as \forgetsidefloats
+   \global\sidefloatvsize\nofloatvsize
+   % \global\sidefloatsidelines\zerocount % no, we flush before a side float
+   \global\floatshortfalse                % so this will get lost
+   % also here if used at all \global\holdinginserts\zerocount
+   \global\floatflagfalse}
+
+\def\flushsidefloatsafterpar
+  {\xdef\oldpagetotal{\the\pagetotal}%
+   \gdef\checksidefloat
+     {\dochecksidefloat
+      \ifdim\oldpagetotal=\pagetotal \else
+        \global\let\checksidefloat\dochecksidefloat
+        \flushsidefloats
+        \global\sidefloatsidelines\zerocount % here !
+      \fi}}
+
+\def\forgetsidefloats
+  {\global\sidefloatvsize\nofloatvsize
+   \global\sidefloatsidelines\zerocount
+   % also here if used at all \global\holdinginserts\zerocount
+   \global\floatshortfalse
+   \global\floatflagfalse}
+
+\let\logsidefloat=\relax
+
+\def\pushpenalties % needed ? and right
+  {\widowpenalty\plusone
+   \clubpenalty\plustwo
+   \brokenpenalty\plusone
+   \let\pushpenalties\relax
+   \edef\poppenalties
+     {\widowpenalty \the\widowpenalty
+      \clubpenalty  \the\clubpenalty
+      \brokenpenalty\the\brokenpenalty
+      \let\poppenalties\relax}}
+
+% shouldn;t that be:
+%
+% \def\pushpenalties % needed?
+%   {\let\pushpenalties\relax
+%    \edef\poppenalties
+%      {\widowpenalty \the\widowpenalty
+%       \clubpenalty  \the\clubpenalty
+%       \brokenpenalty\the\brokenpenalty
+%       \let\poppenalties\relax}%
+%    \widowpenalty\plusone
+%    \clubpenalty\plustwo
+%    \brokenpenalty\plusone}
+
+\let\poppenalties=\relax
+
+\def\restorepenalties
+  {\ifnum\outputpenalty=\!!tenthousand\else
+     \penalty\outputpenalty
+   \fi}
+
+\def\sidefloatoutput
+  {\iffloatshort
+     \unvbox\normalpagebox
+     \setbox\floatbottom\lastbox
+     \ifdim\wd\floatbottom>\sidefloathsize
+       \penalty-201
+       \box\floatbottom
+     \else
+       \ifvoid\floatbottom
+       \else
+         \restoreleftindent
+         \ifdim\wd\floatbottom<\sidefloathsize
+           \parskip\zeropoint
+           %\noindent
+           \ifinner\else\vadjust{\penalty\minusone}\fi
+           \iffloatlefteqo
+             \global\floatlefteqofalse
+           \else
+             \global\advance\sidefloathsize -\wd\floatbottom
+             \iffloatrighteqo
+               \global\floatrighteqofalse
+             \else
+               \global\divide\sidefloathsize \plustwo
+             \fi
+             \hskip\sidefloathsize
+           \fi
+         \fi
+         \box\floatbottom
+         \restorepenalties
+       \fi
+     \fi
+     % why was this \global\holdinginserts\zerocount
+     \global\floatshortfalse
+   \else
+     \finalsidefloatoutput % new
+     \global\sidefloatvsize\nofloatvsize
+     \global\sidefloatsidelines\zerocount
+     % we can end up in fig lock, so \global\holdinginserts\zerocount here too ?
+     \poppenalties
+   \fi}
+
+\def\finalsidefloatoutput% new
+  {\finaloutput\unvbox\normalpagebox}
+
+\def\restoreleftindent
+  {\relax \ifnum\sidefloattype>4 \else
+     \parskip\zeropoint % here ?
+     \ifdim\sidefloatwidth>\zeropoint % new, see prikkels
+       \noindent
+       \ifinner\else\vadjust{\penalty\minusone}\fi
+       \hskip\sidefloatwidth
+    %\else
+    %  we have a margin or edge float
+     \fi
+   \fi}
+
+\ifx\normaleqno\undefined
+
+  \def\normaleqno
+    {\iffloatshort
+       \global\floatrighteqotrue
+     \fi
+     \floatrighteqo}
+
+\else
+
+  \def\eqno
+    {\iffloatshort
+       \global\floatrighteqotrue
+     \fi
+     \floatrighteqo}
+
+\fi
+
+% externfiguur     -> grid        =ja|hoogte|diepte|halveregel|passend -> helemaal in details
+% stelplaatsblokin -> zijuitlijnen=hoogte|diepte|regel|halveregel|grid -> halveregel in 'details'
+
+% replacement for below
+%
+%    \global\setbox\floatbox\hbox % no \hskip, but \kern here
+%      {\ifcase\sidefloattype
+%         \vbox{#1}%
+%       \or % 1
+%         \hskip\sidefloatleftshift
+%         \hskip\sidefloatshift
+%         \vbox{#1}%
+%         \kern-\sidefloatextrashift
+%       \or % 2
+%         \hskip\sidefloatshift
+%         \vbox{#1}%
+%         \kern-\sidefloatextrashift
+%       \or % 3
+%         \hskip\sidefloatshift
+%         \vbox{#1}%
+%         \kern-\sidefloatextrashift
+%       \or % 4
+%         \hskip\sidefloatleftshift
+%         \hskip\sidefloatshift
+%         \vbox{#1\removedepth}%
+%         \kern-\sidefloatextrashift
+%       \or % 5
+%         \hskip-\sidefloatextrashift
+%         \vbox{#1}%
+%         \kern\sidefloatshift
+%         \kern\sidefloatrightshift
+%       \or % 6
+%         \hskip-\sidefloatextrashift
+%         \vbox{#1}%
+%         \kern\sidefloatshift
+%       \or % 7
+%         \hskip-\sidefloatextrashift
+%         \vbox{#1}%
+%         \kern\sidefloatshift
+%       \or % 8
+%         \hskip-\sidefloatextrashift
+%         \vbox{#1}%
+%         \kern\sidefloatshift
+%         \kern\sidefloatrightshift
+%       \fi}%
+%
+% keep this ^
+
+\def\putsidefloat#1% grid (4) is rather experimental
+  {\par
+   \whitespace
+   % moved here dec 2001
+   {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}% moved
+   \checksidefloatshift
+   \ifdim\sidefloatshift=\zeropoint \relax
+     \ifnum\sidefloattype=4
+       \global\advance\sidefloatshift\sidefloatextrashift
+       \global\sidefloatextrashift\zeropoint
+     \else\ifnum\sidefloattype=5
+       \global\advance\sidefloatshift\sidefloatextrashift
+       \global\sidefloatextrashift\zeropoint
+     \fi\fi
+   \else
+     \ifnum\sidefloattype<4
+       \global\chardef\sidefloattype4
+     \else\ifnum\sidefloattype>5
+       \global\chardef\sidefloattype5
+     \fi\fi
+   \fi
+   \previoussidefloat
+   \stallsidefloat
+  %\global\setbox\floatbox\hbox
+  %  {\ifmarginfloat\else\ifrightfloat\else\kern\sidefloatleftshift\fi\fi
+  %   \hskip\ifrightfloat-\sidefloatextrashift\else\sidefloatshift\fi
+  %   \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}%
+  %   \kern\ifrightfloat\sidefloatshift\else-\sidefloatextrashift\fi
+  %   \ifmarginfloat\else\ifrightfloat\kern\sidefloatrightshift\fi\fi}%
+   \global\setbox\floatbox\hbox % no \hskip, but \kern here
+     {\ifnum\sidefloattype=4
+        \hskip\sidefloatleftshift
+      \else\ifnum\sidefloattype=1
+        \hskip\sidefloatleftshift
+      \fi\fi
+      \ifnum\sidefloattype>4
+        \hskip-\sidefloatextrashift
+      \else
+        \hskip\sidefloatshift
+      \fi
+      \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}%
+      \ifnum\sidefloattype>4
+        \kern\sidefloatshift
+      \else
+        \kern-\sidefloatextrashift
+      \fi
+      \ifnum\sidefloattype=8
+        \kern\sidefloatrightshift
+      \else\ifnum\sidefloattype=5
+        \kern\sidefloatrightshift
+      \fi\fi}%
+   \ifnum\sidefloatalign=4
+     \getnoflines{\ht\floatbox}%
+     \scratchdimen\noflines\lineheight
+     \advance\scratchdimen-\strutdepth
+     \getrawnoflines\sidefloattopskip
+     \advance\scratchdimen\noflines\lineheight
+     % todo: maybe rounding problem here
+     % \global\setbox\floatbox\hbox{\lower\lineheight\box\floatbox}%
+     \global\setbox\floatbox\hbox{\lower\strutdepth\box\floatbox}%
+     \global\ht\floatbox\scratchdimen
+     \global\dp\floatbox\zeropoint
+   \fi
+   \ifcase\sidefloatalign \else
+     \global\sidefloattopskip\zeropoint
+   \fi
+   \scratchdimen
+     \ifnum\sidefloattype<4
+       \sidefloattopskip
+     \else\ifnum\sidefloattype>5
+       \sidefloattopskip
+     \else
+       \zeropoint
+     \fi\fi
+   % the top of the box is at the previous baseline
+   \ifcase\sidefloatalign
+       % 0 normal
+     \advance\scratchdimen\strutdepth % == \sidefloattopoffset
+   \or % 1 height
+     \advance\scratchdimen\strutdepth % == \sidefloattopoffset
+   \or % 2 line
+   \or % 3 depth
+     \advance\scratchdimen\lineheight
+     \advance\scratchdimen\strutdepth
+   \or % 4 grid
+     \scratchdimen\zeropoint
+   \or
+     \advance\scratchdimen\strutheight
+   \fi
+   % new
+   \global\sidefloatlinesdone\zerocount
+   \ifnum\sidefloatsidelines>\zerocount
+     \advance\scratchdimen\sidefloatsidelines\lineheight
+   \fi
+   % new
+   \global\setbox\floatbox\hbox
+     {\vbox
+        {\vskip\scratchdimen
+         \nointerlineskip
+         \box\floatbox
+         \ifnum\sidefloatalign=5 \vskip-\lineheight \fi}}%
+   \ifnum\sidefloattype<4
+     \global\sidefloattopskip\zeropoint
+   \else\ifnum\sidefloattype>5
+     \global\sidefloattopskip\zeropoint
+   \fi\fi
+   \global\sidefloatdownshift\zeropoint
+   \measuresidefloat
+   \ifroomforfloat \else
+     \tosssidefloat
+     \measuresidefloat
+     \stallsidefloat
+   \fi
+   \setsidefloat}
+
+\def\progresssidefloat
+  {\sidefloatprogress\sidefloatvsize
+   \iffloatflag
+     \advance\sidefloatprogress -\sidefloatpagetotal
+     \global\floatflagfalse
+   \else
+     \advance\sidefloatprogress -\pagetotal
+   \fi}
+
+\def\tosssidefloat
+  {\vfill\eject}
+
+\def\measuresidefloat
+  {\global\floatflagtrue
+   \global\sidefloatpagetotal \pagetotal % global
+   \ifnum\sidefloattype<4
+     \global        \sidefloatwidth \zeropoint
+   \else\ifnum\sidefloattype>5
+     \global        \sidefloatwidth \zeropoint
+   \else
+     \global        \sidefloatwidth \wd\floatbox
+     \global\advance\sidefloatwidth \floatsideskip
+   \fi\fi
+   \ifdim\sidefloatwidth<\zeropoint
+     \global\sidefloatwidth\zeropoint
+   \fi
+   \global        \sidefloathsize  \hsize
+   \global\advance\sidefloathsize -\sidefloatwidth
+   \global        \sidefloatheight \ht\floatbox
+   \global\advance\sidefloatheight \dp\floatbox
+   \global\advance\sidefloatheight \sidefloattopskip
+   \global        \sidefloatvsize  \sidefloatheight
+   \global\advance\sidefloatvsize  \sidefloatpagetotal
+   \dimen0\sidefloatvsize
+   \dimen2\pagegoal
+   \relax
+   \ifcase\sidefloatmethod
+     % method 0 : raw
+   \or
+     % method 1 : safe
+     \dimen2 .99\pagegoal
+   \or
+     % method 2 : tight
+     \advance\dimen0 -\onepoint
+   \fi
+   \relax % really needed ! ! ! !
+   \ifdim\dimen0>\dimen2
+     \global\roomforfloatfalse
+   \else
+     \dimen0=\pagegoal
+     \advance\dimen0 -\sidefloatvsize
+     \ifdim\dimen0<\sidefloatbottomskip
+       \global\advance\sidefloatvsize \dimen0
+       \global\floatshorttrue
+       \pushpenalties
+       % why was this \global\holdinginserts\plusone
+     \else
+       \global\advance\sidefloatvsize \sidefloatbottomskip
+       \global\floatshortfalse
+     \fi
+     \global\roomforfloattrue
+   \fi}
+
+\def\setsidefloat% nilling everypar saves time and redudant pos's
+  {% removed here dec 2001
+   % {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}%
+   \ifnum\sidefloattype=4 \kern\sidefloattopskip \fi
+   \ifnum\sidefloattype=5 \kern\sidefloattopskip \fi
+   \edef\presidefloatdepth{\the\prevdepth}%
+   \nointerlineskip
+   \bgroup
+   \everypar\emptytoks
+   \parskip\zeropoint
+  %\checksidefloatshift
+   \setsidefloatskips
+   \logsidefloat
+   \relax
+   \ifcase\sidefloattype
+     % invalid
+   \or % backspace
+     \noindent\llap{\rlap{\box\floatbox}\hskip\sidefloatleftskip}\hfill
+   \or % leftedge
+     \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
+   \or % leftmargin
+     \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
+   \or % leftside
+     \noindent\box\floatbox\hfill
+   \or % rightside
+     \hfill\box\floatbox
+   \or % rightmargin
+     \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
+   \or % rightedge
+     \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
+   \or % cutspace
+     \hfill\rlap{\hskip\sidefloatrightskip\llap{\box\floatbox}}%
+   \fi
+   \egroup
+   \par
+   \kern-\sidefloatheight
+   \penalty10001 % oeps, this will change
+   \normalbaselines
+   \prevdepth\presidefloatdepth
+   % \noindent
+   \resetsidefloatparagraph
+   \ignorespaces} % not really needed
+
+\newcount\sidefloatparagraph
+
+\def\iffirstsidefloatparagraph
+  {\ifcase\sidefloatparagraph\or}
+
+% without sidefloat lines
+%
+% \def\setsidefloatparagraph
+%   {%\advance\sidefloatprogress \sidefloatbottomskip
+%    %\!!counta\sidefloatprogress
+%    \scratchdimen\sidefloatprogress
+%    \advance\scratchdimen \strutht
+%    \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
+%    \!!counta\scratchdimen
+%    \divide\!!counta \baselineskip
+%    \ifnum\!!counta>0
+%      \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth
+%      \hangafter-\!!counta
+%    \fi
+%    \global\advance\sidefloatparagraph \plusone
+%    \iftracesidefloats
+%      \hskip-\sidefloatwidth
+%      \color[darkgray]%
+%        {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
+%        %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
+%         \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
+%    \fi}
+
+\def\setsidefloatparagraph
+  {%\advance\sidefloatprogress \sidefloatbottomskip
+   %\!!counta\sidefloatprogress
+   \scratchdimen\sidefloatprogress
+   \advance\scratchdimen \strutht
+   \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
+   \!!counta\scratchdimen
+   \divide\!!counta \baselineskip\relax
+   \ifnum\!!counta>0
+     % new from here
+     \ifcase\sidefloatsidelines\else
+       \ifcase\sidefloatlinesdone
+         \global\sidefloatlinesdone\!!counta
+       \else
+         \scratchcounter\sidefloatlinesdone
+         \advance\scratchcounter-\!!counta
+         \global\advance\sidefloatsidelines-\scratchcounter
+       \fi
+     \fi
+     \ifnum\sidefloatsidelines>\zerocount
+       \scratchtoks\emptytoks
+       \scratchcounter\sidefloatsidelines
+       \scratchdimen\hsize
+       \advance\scratchdimen-\sidefloatwidth
+       \dorecurse\sidefloatsidelines
+         {\appendtoks \zeropoint \hsize \to \scratchtoks}%
+       \ifnum\!!counta>\sidefloatsidelines
+         \advance\!!counta -\sidefloatsidelines\relax
+         \advance\scratchcounter\!!counta
+         \dorecurse\!!counta
+           {\ifnum\sidefloattype>4
+              \appendtoks \zeropoint \scratchdimen \to \scratchtoks
+            \else
+              \appendtoks \sidefloatwidth \scratchdimen \to \scratchtoks
+            \fi}%
+       \fi
+       \advance\scratchcounter \plusone
+       \parshape \scratchcounter \the\scratchtoks \zeropoint \hsize\relax
+     \else
+       % new till here
+       \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth
+       \hangafter-\!!counta
+     \fi
+   \fi
+   \global\advance\sidefloatparagraph \plusone
+   \iftracesidefloats
+     \hskip-\sidefloatwidth
+     \color[darkgray]%
+       {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
+       %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
+        \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
+   \fi}
+
+\def\resetsidefloatparagraph
+  {\global\sidefloatparagraph\zerocount }
+
+\def\dochecksidefloat
+  {\progresssidefloat
+   \ifdim\sidefloatprogress>\zeropoint
+     \setsidefloatparagraph
+   \else
+     \resetsidefloatparagraph
+   \fi
+   \parskip\ctxparskip}
+
+\def\checksidefloat
+  {\dochecksidefloat}
+
+\def\synchronizesidefloats
+  {\ifinner \else \checksidefloat \fi}
+
+\def\doadjustsidefloatdisplaylines
+  {\par
+   \vskip-\parskip
+   \noindent
+   \ignorespaces}
+
+\def\adjustsidefloatdisplaylines
+  {\aftergroup\doadjustsidefloatdisplaylines}
+
+\def\previoussidefloat
+  {\progresssidefloat
+   \ifdim\sidefloatprogress>\zeropoint \relax
+     \iffloatshort
+       \global\floatshortfalse
+       \tosssidefloat
+     \else
+       \kern\sidefloatprogress
+     \fi
+   \fi}
+
+\def\stallsidefloat
+  {\!!counta\pageshrink
+   \divide\!!counta \baselineskip
+   \advance\!!counta \plusone
+   \parskip\zeropoint
+   \dorecurse\!!counta{\line{}}
+   \kern-\!!counta\baselineskip
+   \penalty\zerocount }
+
+% We need to hook it into the other otr's. This code will move.
+
+\let\OTRONEflushsidefloats      \flushsidefloats
+\let\OTRONEsynchronizesidefloats\synchronizesidefloats
+
+% page-set
+%
+% \let\OTRSETflushsidefloats      \forgetsidefloats
+% \let\OTRSETsynchronizesidefloats\forgetsidefloats
+
+% page-mul
+%
+% \let\OTRMULflushsidefloats      \forgetsidefloats
+% \let\OTRMULsynchronizesidefloats\forgetsidefloats
+
+\def\synchronizesidefloats{\OTRcommand\synchronizesidefloats}
+\def\flushsidefloats      {\OTRcommand\flushsidefloats}
+
+\protect \endinput
diff --git a/tex/context/base/page-sid.mkiv b/tex/context/base/page-sid.mkiv
new file mode 100644
index 000000000..0848c9d8c
--- /dev/null
+++ b/tex/context/base/page-sid.mkiv
@@ -0,0 +1,931 @@
+%D \module
+%D   [       file=page-sid,
+%D        version=2000.10.20,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Side Floats,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Side Floats}
+
+\unprotect
+
+% problem: when too small, side effects; we need to determine the
+% shift earlier so that we can act when shift < size
+%
+% \definefloat[edgefigure]
+% \setupfloat
+%     [edgefigure]
+%     [rightmargindistance=-\rightmargintotal,
+%      leftmargindistance=-\rightmargintotal,
+%      default=outer]
+% \starttext
+% \placeedgefigure{}{\framed[width=12cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=5cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=4cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=2cm]{}} \input tufte
+% \stoptext
+
+% todo: dimexpr an dnumexpr
+
+% These macro deal with side floats. We started with Daniel
+% Comenetz macros as published in TUGBoat Volume 14 (1993),
+% No.\ 1: Anchored Figures at Either Margin. I extended and
+% patched the macros to suite our needs which results in a
+% messy module. Therefore, this module badly needs an update
+% because it's now a mixture of old and new macros.
+
+% afhankelijke variabelen
+%
+% \overgap    vervangen door   \floatsidetopskip
+% \sidegap    vervangen door   \floatsideskip
+% \undergap   vervangen door   \floatsidebottomskip
+%
+% \prskp      vervangen door   \ctxparskip
+
+% toegevoegde macro's/aanroepen
+%
+% \logsidefloat       : loginformatie
+% \flushsidefloats    : nodig voor koppen
+
+% recente wijzigingen:
+%
+% namen aangepast: \float... enz. i.p.v. \pic
+
+% Pas op: \EveryPar{\EveryPar{}\margetitel{whatever}}
+% \plaatsfiguur[links]{}{} moet goed gaan. In dat geval
+% begint de tekst terecht wat lager.
+
+\newdimen\sidefloatheight      % includes the topskip
+\newdimen\sidefloatwidth
+\newdimen\sidefloathsize
+\newdimen\sidefloatshift
+\newdimen\sidefloatextrashift
+\newdimen\sidefloatvsize       \def\nofloatvsize{-1pt }
+\newdimen\sidefloatprogress
+\newdimen\sidefloatpagetotal
+
+\newbox\floatbottom
+
+\newcount\sidefloatsidelines
+\newcount\sidefloatlinesdone
+
+% 1 = backspace
+% 2 = leftedge
+% 3 = leftmargin
+% 4 = leftside
+% 5 = rightside
+% 6 = rightmargin
+% 7 = rightedge
+% 8 = cutspace
+
+\chardef\sidefloattype\zerocount
+
+\def\backspacefloat    {\global\chardef\sidefloattype1 \putsidefloat}
+\def\leftedgefloat     {\global\chardef\sidefloattype2 \putsidefloat}
+\def\leftmarginfloat   {\global\chardef\sidefloattype3 \putsidefloat}
+\def\leftfloat         {\global\chardef\sidefloattype4 \putsidefloat}
+\def\rightfloat        {\global\chardef\sidefloattype5 \putsidefloat}
+\def\rightmarginfloat  {\global\chardef\sidefloattype6 \putsidefloat}
+\def\rightedgefloat    {\global\chardef\sidefloattype7 \putsidefloat}
+\def\cutspacefloat     {\global\chardef\sidefloattype8 \putsidefloat}
+
+\let\marginfloat       \cutspacefloat
+
+\newif\ifroomforfloat
+\newif\iffloatshort
+\newif\iffloatflag
+\newif\iffloatrighteqo
+\newif\iffloatlefteqo
+
+\newdimen\sidefloatleftskip
+\newdimen\sidefloatrightskip
+\newdimen\sidefloatmaximum
+
+% \def\checksidefloatshift
+%   {\ifdim\sidefloatmaximum>\zeropoint
+%      \ifcase\sidefloattype
+%        % invalid
+%      \or
+%        % backspace
+%      \or
+%        \global\sidefloatshift-\sidefloatmaximum
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance   \rightedgedistance
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+%      \or
+%        \global\sidefloatshift-\sidefloatmaximum
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+%      \or
+%        % left
+%      \or
+%        % right
+%      \or
+%        \global\sidefloatshift-\sidefloatmaximum
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+%      \or
+%        \global\sidefloatshift-\sidefloatmaximum
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance   \rightedgedistance
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
+%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+%      \or
+%        % cutspace
+%      \fi
+%    \fi}
+
+\def\checksidefloatshift
+  {\ifdim\sidefloatmaximum>\zeropoint
+     \ifcase\sidefloattype
+       % invalid
+     \or
+       % backspace
+     \or
+       \global\sidefloatshift\dimexpr
+         -\sidefloatmaximum
+         -\rightorleftpageaction \leftedgedistance   \rightedgedistance
+         -\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
+         -\rightorleftpageaction \leftmargindistance \rightmargindistance
+         -\compensatedinnermakeupmargin
+       \relax
+     \or
+       \global\sidefloatshift\dimexpr
+         -\sidefloatmaximum
+         -\rightorleftpageaction \leftmargindistance \rightmargindistance
+         -\compensatedinnermakeupmargin
+       \relax
+     \or
+       % left
+     \or
+       % right
+     \or
+       \global\sidefloatshift\dimexpr
+         -\sidefloatmaximum
+         -\rightorleftpageaction \leftmargindistance \rightmargindistance
+         -\compensatedinnermakeupmargin
+       \relax
+     \or
+       \global\sidefloatshift\dimexpr
+         -\sidefloatmaximum
+         -\rightorleftpageaction \leftedgedistance   \rightedgedistance
+         -\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
+         -\rightorleftpageaction \leftmargindistance \rightmargindistance
+         -\compensatedinnermakeupmargin
+       \relax
+     \or
+       % cutspace
+     \fi
+   \fi}
+
+% \def\setsidefloatskips
+%   {\global\sidefloatrightskip\zeropoint
+%    \global\sidefloatleftskip \zeropoint
+%    \ifcase\sidefloattype
+%    \or % backspace
+%      \global        \sidefloatleftskip \rightorleftpageaction \backspace \cutspace
+%    \or % leftedge
+%      \global        \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance
+%      \global\advance\sidefloatleftskip \rightorleftpageaction \leftmarginwidth\rightmarginwidth
+%      \global\advance\sidefloatleftskip \rightorleftpageaction \leftedgedistance\rightedgedistance
+%    \or % leftmargin
+%      \global        \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance
+%    \or % leftside
+%    \or % rightside
+%    \or % rightmargin
+%      \global        \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance
+%    \or % rightedge
+%      \global        \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance
+%      \global\advance\sidefloatrightskip\rightorleftpageaction \rightmarginwidth\leftmarginwidth
+%      \global\advance\sidefloatrightskip\rightorleftpageaction \rightedgedistance\leftedgedistance
+%    \or % cutspace
+%      \global        \sidefloatrightskip\rightorleftpageaction \cutspace\backspace
+%    \fi
+%    \ifdim\sidefloatrightskip>\zeropoint
+%      \doglobal\advance\sidefloatrightskip\rightskip
+%    \fi
+%    \ifdim\sidefloatleftskip>\zeropoint
+%      \doglobal\advance\sidefloatleftskip\leftskip
+%    \fi}
+
+
+% use \outermarginwidth etc here
+
+\def\setsidefloatskips
+  {\global\sidefloatrightskip\zeropoint
+   \global\sidefloatleftskip \zeropoint
+   \ifcase\sidefloattype
+   \or % backspace
+     \global\sidefloatleftskip\dimexpr
+       +\rightorleftpageaction \backspace           \cutspace
+       +\compensatedinnermakeupmargin
+     \relax
+   \or % leftedge
+     \global\sidefloatleftskip\dimexpr
+       +\rightorleftpageaction \leftmargindistance  \rightmargindistance
+       +\rightorleftpageaction \leftmarginwidth     \rightmarginwidth
+       +\rightorleftpageaction \leftedgedistance    \rightedgedistance
+       +\compensatedinnermakeupmargin
+     \relax
+   \or % leftmargin
+     \global\sidefloatleftskip\dimexpr
+       +\rightorleftpageaction \leftmargindistance  \rightmargindistance
+       +\compensatedinnermakeupmargin
+     \relax
+   \or % leftside
+   \or % rightside
+   \or % rightmargin
+     \global\sidefloatrightskip\dimexpr
+       +\rightorleftpageaction \rightmargindistance \leftmargindistance
+       +\compensatedinnermakeupmargin
+     \relax
+   \or % rightedge
+     \global\sidefloatrightskip\dimexpr
+       +\rightorleftpageaction \rightmargindistance \leftmargindistance
+       +\rightorleftpageaction \rightmarginwidth    \leftmarginwidth
+       +\rightorleftpageaction \rightedgedistance   \leftedgedistance
+       +\compensatedinnermakeupmargin
+     \relax
+   \or % cutspace
+     \global\sidefloatrightskip\dimexpr
+       +\rightorleftpageaction \cutspace            \backspace
+       +\compensatedinnermakeupmargin
+     \relax
+   \fi
+   \ifdim\sidefloatrightskip>\zeropoint \doglobal\advance\sidefloatrightskip\rightskip \fi
+   \ifdim\sidefloatleftskip >\zeropoint \doglobal\advance\sidefloatleftskip \leftskip  \fi}
+
+% eq is still crap
+
+\ifx\normalleqno\undefined
+
+  \let\floatrighteqo=\eqno
+  \let\floatleftleqo=\leqno
+
+\else
+
+  \let\floatrighteqo=\normaleqno
+  \let\floatleftleqo=\normalleqno
+
+\fi
+
+% Watch it even more! In inner, gaat't mis omdat daar
+% pagetotal enz niet zijn aangepast. Inner kan overigens niet
+% betrouwbaar worden getest!
+
+% \def\flushsidefloats%
+%   {\par
+%    \sidefloatprogress=\sidefloatvsize
+%    \advance\sidefloatprogress by -\pagetotal
+%    \ifdim\sidefloatprogress>\zeropoint
+%      \witruimte % nog checken op interferentie
+%      \kern\sidefloatprogress
+%    \fi
+%    \global\sidefloatvsize=\nofloatvsize
+%    \global\floatflagfalse}
+%
+% no, too buggy, leads to top of page crap
+%
+%\def\flushsidefloats
+%  {\par
+%   \dochecksidefloat
+%   \scratchcounter=-\hangafter
+%   \dorecurse{\scratchcounter}{\strut\hfill\strut\par}}
+%
+%\def\flushsidefloats
+%  {\par
+%   \!!heighta\sidefloatvsize
+%   \advance\!!heighta -\pagetotal
+%   \ifdim\!!heighta>\zeropoint
+%     % to be checked for interference
+%     \witruimte
+%     % will be option
+%     \getnoflines\!!heighta
+%     \!!heighta\noflines\lineheight
+%     % so far for option
+%     \kern\!!heighta
+%   \fi
+%   % == \forgetsidefloats
+%   \global\sidefloatvsize\nofloatvsize
+%   \global\floatshortfalse
+%   \global\floatflagfalse}
+
+% \def\flushsidefloats
+%   {\par
+%    \!!heighta\sidefloatvsize
+%    \advance\!!heighta -\pagetotal
+%    \ifdim\!!heighta>\zeropoint
+%      % to be checked for interference
+%      \witruimte
+%      % will be option
+%      \getnoflines\!!heighta
+%      \!!heighta\noflines\lineheight
+%      % so far for option
+%      \ifdim\sidefloatbottomskip>\zeropoint\relax
+%        \ifdim\!!heighta>\sidefloatbottomskip
+%          \advance\!!heighta-\sidefloatbottomskip
+%          \kern\!!heighta
+%          \vskip\sidefloatbottomskip
+%        \else
+%          \kern\!!heighta
+%        \fi
+%      \else
+%        \kern\!!heighta
+%      \fi
+%    \fi
+%    % == \forgetsidefloats
+%    \global\sidefloatvsize\nofloatvsize
+%    \global\floatshortfalse
+%    \global\floatflagfalse}
+
+\newif\iftracesidefloats
+
+\def\flushsidefloats
+  {\par
+   \!!heighta\sidefloatvsize
+   \advance\!!heighta -\pagetotal
+   \ifnum\!!heighta>\zeropoint
+     \global\advance\sidefloatvsize -\sidefloatbottomskip
+     \ifdim\!!heighta>\zeropoint
+       \bgroup
+       \let\flushsidefloats\relax
+       \forgetall
+       \doloop
+         {\strut
+          \iftracesidefloats
+            \color[darkgray]%
+              {\baselinerulefalse
+               \boxrulewidth.5\points
+               \ruledhbox{\strut\kern\sidefloatwidth}}%
+          \fi
+          \par
+          \!!heighta\sidefloatvsize
+          \advance\!!heighta -\pagetotal
+          \ifdim\!!heighta>\zeropoint
+            \ifnum\recurselevel>\plushundred
+              \exitloop
+            \fi
+          \else
+            \exitloop
+          \fi}%
+       \egroup
+       \ifdim\parskip>\zeropoint
+         \ifdim\sidefloatbottomskip>\parskip
+           \nowhitespace
+           \vskip\sidefloatbottomskip
+         \fi
+       \fi
+     \else\ifdim\sidefloatbottomskip>\parskip
+       \vskip\sidefloatbottomskip
+     \fi\fi
+   \fi
+   % not entirely the same as \forgetsidefloats
+   \global\sidefloatvsize\nofloatvsize
+   % \global\sidefloatsidelines\zerocount % no, we flush before a side float
+   \global\floatshortfalse                % so this will get lost
+   % also here if used at all \global\holdinginserts\zerocount
+   \global\floatflagfalse}
+
+\def\flushsidefloatsafterpar
+  {\xdef\oldpagetotal{\the\pagetotal}%
+   \gdef\checksidefloat
+     {\dochecksidefloat
+      \ifdim\oldpagetotal=\pagetotal \else
+        \global\let\checksidefloat\dochecksidefloat
+        \flushsidefloats
+        \global\sidefloatsidelines\zerocount % here !
+      \fi}}
+
+\def\forgetsidefloats
+  {\global\sidefloatvsize\nofloatvsize
+   \global\sidefloatsidelines\zerocount
+   % also here if used at all \global\holdinginserts\zerocount
+   \global\floatshortfalse
+   \global\floatflagfalse}
+
+\let\logsidefloat=\relax
+
+\def\pushpenalties % needed ? and right
+  {\widowpenalty\plusone
+   \clubpenalty\plustwo
+   \brokenpenalty\plusone
+   \let\pushpenalties\relax
+   \edef\poppenalties
+     {\widowpenalty \the\widowpenalty
+      \clubpenalty  \the\clubpenalty
+      \brokenpenalty\the\brokenpenalty
+      \let\poppenalties\relax}}
+
+% shouldn;t that be:
+%
+% \def\pushpenalties % needed?
+%   {\let\pushpenalties\relax
+%    \edef\poppenalties
+%      {\widowpenalty \the\widowpenalty
+%       \clubpenalty  \the\clubpenalty
+%       \brokenpenalty\the\brokenpenalty
+%       \let\poppenalties\relax}%
+%    \widowpenalty\plusone
+%    \clubpenalty\plustwo
+%    \brokenpenalty\plusone}
+
+\let\poppenalties=\relax
+
+\def\restorepenalties
+  {\ifnum\outputpenalty=\!!tenthousand\else
+     \penalty\outputpenalty
+   \fi}
+
+\def\sidefloatoutput
+  {\iffloatshort
+     \unvbox\normalpagebox
+     \setbox\floatbottom\lastbox
+     \ifdim\wd\floatbottom>\sidefloathsize
+       \penalty-201
+       \box\floatbottom
+     \else
+       \ifvoid\floatbottom
+       \else
+         \restoreleftindent
+         \ifdim\wd\floatbottom<\sidefloathsize
+           \parskip\zeropoint
+           %\noindent
+           \ifinner\else\vadjust{\penalty\minusone}\fi
+           \iffloatlefteqo
+             \global\floatlefteqofalse
+           \else
+             \global\advance\sidefloathsize -\wd\floatbottom
+             \iffloatrighteqo
+               \global\floatrighteqofalse
+             \else
+               \global\divide\sidefloathsize \plustwo
+             \fi
+             \hskip\sidefloathsize
+           \fi
+         \fi
+         \box\floatbottom
+         \restorepenalties
+       \fi
+     \fi
+     % why was this \global\holdinginserts\zerocount
+     \global\floatshortfalse
+   \else
+     \finalsidefloatoutput % new
+     \global\sidefloatvsize\nofloatvsize
+     \global\sidefloatsidelines\zerocount
+     % we can end up in fig lock, so \global\holdinginserts\zerocount here too ?
+     \poppenalties
+   \fi}
+
+\def\finalsidefloatoutput% new
+  {\finaloutput\unvbox\normalpagebox}
+
+\def\restoreleftindent
+  {\relax \ifnum\sidefloattype>4 \else
+     \parskip\zeropoint % here ?
+     \ifdim\sidefloatwidth>\zeropoint % new, see prikkels
+       \noindent
+       \ifinner\else\vadjust{\penalty\minusone}\fi
+       \hskip\sidefloatwidth
+    %\else
+    %  we have a margin or edge float
+     \fi
+   \fi}
+
+\ifx\normaleqno\undefined
+
+  \def\normaleqno
+    {\iffloatshort
+       \global\floatrighteqotrue
+     \fi
+     \floatrighteqo}
+
+\else
+
+  \def\eqno
+    {\iffloatshort
+       \global\floatrighteqotrue
+     \fi
+     \floatrighteqo}
+
+\fi
+
+% externfiguur     -> grid        =ja|hoogte|diepte|halveregel|passend -> helemaal in details
+% stelplaatsblokin -> zijuitlijnen=hoogte|diepte|regel|halveregel|grid -> halveregel in 'details'
+
+% replacement for below
+%
+%    \global\setbox\floatbox\hbox % no \hskip, but \kern here
+%      {\ifcase\sidefloattype
+%         \vbox{#1}%
+%       \or % 1
+%         \hskip\sidefloatleftshift
+%         \hskip\sidefloatshift
+%         \vbox{#1}%
+%         \kern-\sidefloatextrashift
+%       \or % 2
+%         \hskip\sidefloatshift
+%         \vbox{#1}%
+%         \kern-\sidefloatextrashift
+%       \or % 3
+%         \hskip\sidefloatshift
+%         \vbox{#1}%
+%         \kern-\sidefloatextrashift
+%       \or % 4
+%         \hskip\sidefloatleftshift
+%         \hskip\sidefloatshift
+%         \vbox{#1\removedepth}%
+%         \kern-\sidefloatextrashift
+%       \or % 5
+%         \hskip-\sidefloatextrashift
+%         \vbox{#1}%
+%         \kern\sidefloatshift
+%         \kern\sidefloatrightshift
+%       \or % 6
+%         \hskip-\sidefloatextrashift
+%         \vbox{#1}%
+%         \kern\sidefloatshift
+%       \or % 7
+%         \hskip-\sidefloatextrashift
+%         \vbox{#1}%
+%         \kern\sidefloatshift
+%       \or % 8
+%         \hskip-\sidefloatextrashift
+%         \vbox{#1}%
+%         \kern\sidefloatshift
+%         \kern\sidefloatrightshift
+%       \fi}%
+%
+% keep this ^
+
+\def\putsidefloat#1% grid (4) is rather experimental
+  {\par
+   \whitespace
+   % moved here dec 2001
+   {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}% moved
+   \checksidefloatshift
+   \ifdim\sidefloatshift=\zeropoint \relax
+     \ifnum\sidefloattype=4
+       \global\advance\sidefloatshift\sidefloatextrashift
+       \global\sidefloatextrashift\zeropoint
+     \else\ifnum\sidefloattype=5
+       \global\advance\sidefloatshift\sidefloatextrashift
+       \global\sidefloatextrashift\zeropoint
+     \fi\fi
+   \else
+     \ifnum\sidefloattype<4
+       \global\chardef\sidefloattype4
+     \else\ifnum\sidefloattype>5
+       \global\chardef\sidefloattype5
+     \fi\fi
+   \fi
+   \previoussidefloat
+   \stallsidefloat
+  %\global\setbox\floatbox\hbox
+  %  {\ifmarginfloat\else\ifrightfloat\else\kern\sidefloatleftshift\fi\fi
+  %   \hskip\ifrightfloat-\sidefloatextrashift\else\sidefloatshift\fi
+  %   \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}%
+  %   \kern\ifrightfloat\sidefloatshift\else-\sidefloatextrashift\fi
+  %   \ifmarginfloat\else\ifrightfloat\kern\sidefloatrightshift\fi\fi}%
+   \global\setbox\floatbox\hbox % no \hskip, but \kern here
+     {\ifnum\sidefloattype=4
+        \hskip\sidefloatleftshift
+      \else\ifnum\sidefloattype=1
+        \hskip\sidefloatleftshift
+      \fi\fi
+      \ifnum\sidefloattype>4
+        \hskip-\sidefloatextrashift
+      \else
+        \hskip\sidefloatshift
+      \fi
+      \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}%
+      \ifnum\sidefloattype>4
+        \kern\sidefloatshift
+      \else
+        \kern-\sidefloatextrashift
+      \fi
+      \ifnum\sidefloattype=8
+        \kern\sidefloatrightshift
+      \else\ifnum\sidefloattype=5
+        \kern\sidefloatrightshift
+      \fi\fi}%
+   \ifnum\sidefloatalign=4
+     \getnoflines{\ht\floatbox}%
+     \scratchdimen\noflines\lineheight
+     \advance\scratchdimen-\strutdepth
+     \getrawnoflines\sidefloattopskip
+     \advance\scratchdimen\noflines\lineheight
+     % todo: maybe rounding problem here
+     % \global\setbox\floatbox\hbox{\lower\lineheight\box\floatbox}%
+     \global\setbox\floatbox\hbox{\lower\strutdepth\box\floatbox}%
+     \global\ht\floatbox\scratchdimen
+     \global\dp\floatbox\zeropoint
+   \fi
+   \ifcase\sidefloatalign \else
+     \global\sidefloattopskip\zeropoint
+   \fi
+   \scratchdimen
+     \ifnum\sidefloattype<4
+       \sidefloattopskip
+     \else\ifnum\sidefloattype>5
+       \sidefloattopskip
+     \else
+       \zeropoint
+     \fi\fi
+   % the top of the box is at the previous baseline
+   \ifcase\sidefloatalign
+       % 0 normal
+     \advance\scratchdimen\strutdepth % == \sidefloattopoffset
+   \or % 1 height
+     \advance\scratchdimen\strutdepth % == \sidefloattopoffset
+   \or % 2 line
+   \or % 3 depth
+     \advance\scratchdimen\lineheight
+     \advance\scratchdimen\strutdepth
+   \or % 4 grid
+     \scratchdimen\zeropoint
+   \or
+     \advance\scratchdimen\strutheight
+   \fi
+   % new
+   \global\sidefloatlinesdone\zerocount
+   \ifnum\sidefloatsidelines>\zerocount
+     \advance\scratchdimen\sidefloatsidelines\lineheight
+   \fi
+   % new
+   \global\setbox\floatbox\hbox
+     {\vbox
+        {\vskip\scratchdimen
+         \nointerlineskip
+         \box\floatbox
+         \ifnum\sidefloatalign=5 \vskip-\lineheight \fi}}%
+   \ifnum\sidefloattype<4
+     \global\sidefloattopskip\zeropoint
+   \else\ifnum\sidefloattype>5
+     \global\sidefloattopskip\zeropoint
+   \fi\fi
+   \global\sidefloatdownshift\zeropoint
+   \measuresidefloat
+   \ifroomforfloat \else
+     \tosssidefloat
+     \measuresidefloat
+     \stallsidefloat
+   \fi
+   \setsidefloat}
+
+\def\progresssidefloat
+  {\sidefloatprogress\sidefloatvsize
+   \iffloatflag
+     \advance\sidefloatprogress -\sidefloatpagetotal
+     \global\floatflagfalse
+   \else
+     \advance\sidefloatprogress -\pagetotal
+   \fi}
+
+\def\tosssidefloat
+  {\vfill\eject}
+
+\def\measuresidefloat
+  {\global\floatflagtrue
+   \global\sidefloatpagetotal \pagetotal % global
+   \ifnum\sidefloattype<4
+     \global        \sidefloatwidth \zeropoint
+   \else\ifnum\sidefloattype>5
+     \global        \sidefloatwidth \zeropoint
+   \else
+     \global        \sidefloatwidth \wd\floatbox
+     \global\advance\sidefloatwidth \floatsideskip
+   \fi\fi
+   \ifdim\sidefloatwidth<\zeropoint
+     \global\sidefloatwidth\zeropoint
+   \fi
+   \global        \sidefloathsize  \hsize
+   \global\advance\sidefloathsize -\sidefloatwidth
+   \global        \sidefloatheight \ht\floatbox
+   \global\advance\sidefloatheight \dp\floatbox
+   \global\advance\sidefloatheight \sidefloattopskip
+   \global        \sidefloatvsize  \sidefloatheight
+   \global\advance\sidefloatvsize  \sidefloatpagetotal
+   \dimen0\sidefloatvsize
+   \dimen2\pagegoal
+   \relax
+   \ifcase\sidefloatmethod
+     % method 0 : raw
+   \or
+     % method 1 : safe
+     \dimen2 .99\pagegoal
+   \or
+     % method 2 : tight
+     \advance\dimen0 -\onepoint
+   \fi
+   \relax % really needed ! ! ! !
+   \ifdim\dimen0>\dimen2
+     \global\roomforfloatfalse
+   \else
+     \dimen0=\pagegoal
+     \advance\dimen0 -\sidefloatvsize
+     \ifdim\dimen0<\sidefloatbottomskip
+       \global\advance\sidefloatvsize \dimen0
+       \global\floatshorttrue
+       \pushpenalties
+       % why was this \global\holdinginserts\plusone
+     \else
+       \global\advance\sidefloatvsize \sidefloatbottomskip
+       \global\floatshortfalse
+     \fi
+     \global\roomforfloattrue
+   \fi}
+
+\def\setsidefloat% nilling everypar saves time and redudant pos's
+  {% removed here dec 2001
+   % {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}%
+   \ifnum\sidefloattype=4 \kern\sidefloattopskip \fi
+   \ifnum\sidefloattype=5 \kern\sidefloattopskip \fi
+   \edef\presidefloatdepth{\the\prevdepth}%
+   \nointerlineskip
+   \bgroup
+   \everypar\emptytoks
+   \parskip\zeropoint
+  %\checksidefloatshift
+   \setsidefloatskips
+   \logsidefloat
+   \relax
+   \ifcase\sidefloattype
+     % invalid
+   \or % backspace
+     \noindent\llap{\rlap{\box\floatbox}\hskip\sidefloatleftskip}\hfill
+   \or % leftedge
+     \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
+   \or % leftmargin
+     \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
+   \or % leftside
+     \noindent\box\floatbox\hfill
+   \or % rightside
+     \hfill\box\floatbox
+   \or % rightmargin
+     \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
+   \or % rightedge
+     \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
+   \or % cutspace
+     \hfill\rlap{\hskip\sidefloatrightskip\llap{\box\floatbox}}%
+   \fi
+   \egroup
+   \par
+   \kern-\sidefloatheight
+   \penalty10001 % oeps, this will change
+   \normalbaselines
+   \prevdepth\presidefloatdepth
+   % \noindent
+   \resetsidefloatparagraph
+   \ignorespaces} % not really needed
+
+\newcount\sidefloatparagraph
+
+\def\iffirstsidefloatparagraph
+  {\ifcase\sidefloatparagraph\or}
+
+% without sidefloat lines
+%
+% \def\setsidefloatparagraph
+%   {%\advance\sidefloatprogress \sidefloatbottomskip
+%    %\!!counta\sidefloatprogress
+%    \scratchdimen\sidefloatprogress
+%    \advance\scratchdimen \strutht
+%    \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
+%    \!!counta\scratchdimen
+%    \divide\!!counta \baselineskip
+%    \ifnum\!!counta>0
+%      \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth
+%      \hangafter-\!!counta
+%    \fi
+%    \global\advance\sidefloatparagraph \plusone
+%    \iftracesidefloats
+%      \hskip-\sidefloatwidth
+%      \color[darkgray]%
+%        {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
+%        %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
+%         \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
+%    \fi}
+
+\def\setsidefloatparagraph
+  {%\advance\sidefloatprogress \sidefloatbottomskip
+   %\!!counta\sidefloatprogress
+   \scratchdimen\sidefloatprogress
+   \advance\scratchdimen \strutht
+   \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
+   \!!counta\scratchdimen
+   \divide\!!counta \baselineskip\relax
+   \ifnum\!!counta>0
+     % new from here
+     \ifcase\sidefloatsidelines\else
+       \ifcase\sidefloatlinesdone
+         \global\sidefloatlinesdone\!!counta
+       \else
+         \scratchcounter\sidefloatlinesdone
+         \advance\scratchcounter-\!!counta
+         \global\advance\sidefloatsidelines-\scratchcounter
+       \fi
+     \fi
+     \ifnum\sidefloatsidelines>\zerocount
+       \scratchtoks\emptytoks
+       \scratchcounter\sidefloatsidelines
+       \scratchdimen\hsize
+       \advance\scratchdimen-\sidefloatwidth
+       \dorecurse\sidefloatsidelines
+         {\appendtoks \zeropoint \hsize \to \scratchtoks}%
+       \ifnum\!!counta>\sidefloatsidelines
+         \advance\!!counta -\sidefloatsidelines\relax
+         \advance\scratchcounter\!!counta
+         \dorecurse\!!counta
+           {\ifnum\sidefloattype>4
+              \appendtoks \zeropoint \scratchdimen \to \scratchtoks
+            \else
+              \appendtoks \sidefloatwidth \scratchdimen \to \scratchtoks
+            \fi}%
+       \fi
+       \advance\scratchcounter \plusone
+       \parshape \scratchcounter \the\scratchtoks \zeropoint \hsize\relax
+     \else
+       % new till here
+       \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth
+       \hangafter-\!!counta
+     \fi
+   \fi
+   \global\advance\sidefloatparagraph \plusone
+   \iftracesidefloats
+     \hskip-\sidefloatwidth
+     \color[darkgray]%
+       {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
+       %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
+        \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
+   \fi}
+
+\def\resetsidefloatparagraph
+  {\global\sidefloatparagraph\zerocount }
+
+\def\dochecksidefloat
+  {\progresssidefloat
+   \ifdim\sidefloatprogress>\zeropoint
+     \setsidefloatparagraph
+   \else
+     \resetsidefloatparagraph
+   \fi
+   \parskip\ctxparskip}
+
+\def\checksidefloat
+  {\dochecksidefloat}
+
+\def\synchronizesidefloats
+  {\ifinner \else \checksidefloat \fi}
+
+\def\doadjustsidefloatdisplaylines
+  {\par
+   \vskip-\parskip
+   \noindent
+   \ignorespaces}
+
+\def\adjustsidefloatdisplaylines
+  {\aftergroup\doadjustsidefloatdisplaylines}
+
+\def\previoussidefloat
+  {\progresssidefloat
+   \ifdim\sidefloatprogress>\zeropoint \relax
+     \iffloatshort
+       \global\floatshortfalse
+       \tosssidefloat
+     \else
+       \kern\sidefloatprogress
+     \fi
+   \fi}
+
+\def\stallsidefloat
+  {\!!counta\pageshrink
+   \divide\!!counta \baselineskip
+   \advance\!!counta \plusone
+   \parskip\zeropoint
+   \dorecurse\!!counta{\line{}}
+   \kern-\!!counta\baselineskip
+   \penalty\zerocount }
+
+% We need to hook it into the other otr's. This code will move.
+
+\let\OTRONEflushsidefloats      \flushsidefloats
+\let\OTRONEsynchronizesidefloats\synchronizesidefloats
+
+% page-set
+%
+% \let\OTRSETflushsidefloats      \forgetsidefloats
+% \let\OTRSETsynchronizesidefloats\forgetsidefloats
+
+% page-mul
+%
+% \let\OTRMULflushsidefloats      \forgetsidefloats
+% \let\OTRMULsynchronizesidefloats\forgetsidefloats
+
+\def\synchronizesidefloats{\OTRcommand\synchronizesidefloats}
+\def\flushsidefloats      {\OTRcommand\flushsidefloats}
+
+\protect \endinput
diff --git a/tex/context/base/page-sid.tex b/tex/context/base/page-sid.tex
deleted file mode 100644
index 0848c9d8c..000000000
--- a/tex/context/base/page-sid.tex
+++ /dev/null
@@ -1,931 +0,0 @@
-%D \module
-%D   [       file=page-sid,
-%D        version=2000.10.20,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Side Floats,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Side Floats}
-
-\unprotect
-
-% problem: when too small, side effects; we need to determine the
-% shift earlier so that we can act when shift < size
-%
-% \definefloat[edgefigure]
-% \setupfloat
-%     [edgefigure]
-%     [rightmargindistance=-\rightmargintotal,
-%      leftmargindistance=-\rightmargintotal,
-%      default=outer]
-% \starttext
-% \placeedgefigure{}{\framed[width=12cm]{}} \input tufte
-% \placeedgefigure{}{\framed[width=5cm]{}} \input tufte
-% \placeedgefigure{}{\framed[width=4cm]{}} \input tufte
-% \placeedgefigure{}{\framed[width=2cm]{}} \input tufte
-% \stoptext
-
-% todo: dimexpr an dnumexpr
-
-% These macro deal with side floats. We started with Daniel
-% Comenetz macros as published in TUGBoat Volume 14 (1993),
-% No.\ 1: Anchored Figures at Either Margin. I extended and
-% patched the macros to suite our needs which results in a
-% messy module. Therefore, this module badly needs an update
-% because it's now a mixture of old and new macros.
-
-% afhankelijke variabelen
-%
-% \overgap    vervangen door   \floatsidetopskip
-% \sidegap    vervangen door   \floatsideskip
-% \undergap   vervangen door   \floatsidebottomskip
-%
-% \prskp      vervangen door   \ctxparskip
-
-% toegevoegde macro's/aanroepen
-%
-% \logsidefloat       : loginformatie
-% \flushsidefloats    : nodig voor koppen
-
-% recente wijzigingen:
-%
-% namen aangepast: \float... enz. i.p.v. \pic
-
-% Pas op: \EveryPar{\EveryPar{}\margetitel{whatever}}
-% \plaatsfiguur[links]{}{} moet goed gaan. In dat geval
-% begint de tekst terecht wat lager.
-
-\newdimen\sidefloatheight      % includes the topskip
-\newdimen\sidefloatwidth
-\newdimen\sidefloathsize
-\newdimen\sidefloatshift
-\newdimen\sidefloatextrashift
-\newdimen\sidefloatvsize       \def\nofloatvsize{-1pt }
-\newdimen\sidefloatprogress
-\newdimen\sidefloatpagetotal
-
-\newbox\floatbottom
-
-\newcount\sidefloatsidelines
-\newcount\sidefloatlinesdone
-
-% 1 = backspace
-% 2 = leftedge
-% 3 = leftmargin
-% 4 = leftside
-% 5 = rightside
-% 6 = rightmargin
-% 7 = rightedge
-% 8 = cutspace
-
-\chardef\sidefloattype\zerocount
-
-\def\backspacefloat    {\global\chardef\sidefloattype1 \putsidefloat}
-\def\leftedgefloat     {\global\chardef\sidefloattype2 \putsidefloat}
-\def\leftmarginfloat   {\global\chardef\sidefloattype3 \putsidefloat}
-\def\leftfloat         {\global\chardef\sidefloattype4 \putsidefloat}
-\def\rightfloat        {\global\chardef\sidefloattype5 \putsidefloat}
-\def\rightmarginfloat  {\global\chardef\sidefloattype6 \putsidefloat}
-\def\rightedgefloat    {\global\chardef\sidefloattype7 \putsidefloat}
-\def\cutspacefloat     {\global\chardef\sidefloattype8 \putsidefloat}
-
-\let\marginfloat       \cutspacefloat
-
-\newif\ifroomforfloat
-\newif\iffloatshort
-\newif\iffloatflag
-\newif\iffloatrighteqo
-\newif\iffloatlefteqo
-
-\newdimen\sidefloatleftskip
-\newdimen\sidefloatrightskip
-\newdimen\sidefloatmaximum
-
-% \def\checksidefloatshift
-%   {\ifdim\sidefloatmaximum>\zeropoint
-%      \ifcase\sidefloattype
-%        % invalid
-%      \or
-%        % backspace
-%      \or
-%        \global\sidefloatshift-\sidefloatmaximum
-%        \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance   \rightedgedistance
-%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
-%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
-%      \or
-%        \global\sidefloatshift-\sidefloatmaximum
-%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
-%      \or
-%        % left
-%      \or
-%        % right
-%      \or
-%        \global\sidefloatshift-\sidefloatmaximum
-%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
-%      \or
-%        \global\sidefloatshift-\sidefloatmaximum
-%        \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance   \rightedgedistance
-%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
-%        \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
-%      \or
-%        % cutspace
-%      \fi
-%    \fi}
-
-\def\checksidefloatshift
-  {\ifdim\sidefloatmaximum>\zeropoint
-     \ifcase\sidefloattype
-       % invalid
-     \or
-       % backspace
-     \or
-       \global\sidefloatshift\dimexpr
-         -\sidefloatmaximum
-         -\rightorleftpageaction \leftedgedistance   \rightedgedistance
-         -\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
-         -\rightorleftpageaction \leftmargindistance \rightmargindistance
-         -\compensatedinnermakeupmargin
-       \relax
-     \or
-       \global\sidefloatshift\dimexpr
-         -\sidefloatmaximum
-         -\rightorleftpageaction \leftmargindistance \rightmargindistance
-         -\compensatedinnermakeupmargin
-       \relax
-     \or
-       % left
-     \or
-       % right
-     \or
-       \global\sidefloatshift\dimexpr
-         -\sidefloatmaximum
-         -\rightorleftpageaction \leftmargindistance \rightmargindistance
-         -\compensatedinnermakeupmargin
-       \relax
-     \or
-       \global\sidefloatshift\dimexpr
-         -\sidefloatmaximum
-         -\rightorleftpageaction \leftedgedistance   \rightedgedistance
-         -\rightorleftpageaction \leftmarginwidth    \rightmarginwidth
-         -\rightorleftpageaction \leftmargindistance \rightmargindistance
-         -\compensatedinnermakeupmargin
-       \relax
-     \or
-       % cutspace
-     \fi
-   \fi}
-
-% \def\setsidefloatskips
-%   {\global\sidefloatrightskip\zeropoint
-%    \global\sidefloatleftskip \zeropoint
-%    \ifcase\sidefloattype
-%    \or % backspace
-%      \global        \sidefloatleftskip \rightorleftpageaction \backspace \cutspace
-%    \or % leftedge
-%      \global        \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance
-%      \global\advance\sidefloatleftskip \rightorleftpageaction \leftmarginwidth\rightmarginwidth
-%      \global\advance\sidefloatleftskip \rightorleftpageaction \leftedgedistance\rightedgedistance
-%    \or % leftmargin
-%      \global        \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance
-%    \or % leftside
-%    \or % rightside
-%    \or % rightmargin
-%      \global        \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance
-%    \or % rightedge
-%      \global        \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance
-%      \global\advance\sidefloatrightskip\rightorleftpageaction \rightmarginwidth\leftmarginwidth
-%      \global\advance\sidefloatrightskip\rightorleftpageaction \rightedgedistance\leftedgedistance
-%    \or % cutspace
-%      \global        \sidefloatrightskip\rightorleftpageaction \cutspace\backspace
-%    \fi
-%    \ifdim\sidefloatrightskip>\zeropoint
-%      \doglobal\advance\sidefloatrightskip\rightskip
-%    \fi
-%    \ifdim\sidefloatleftskip>\zeropoint
-%      \doglobal\advance\sidefloatleftskip\leftskip
-%    \fi}
-
-
-% use \outermarginwidth etc here
-
-\def\setsidefloatskips
-  {\global\sidefloatrightskip\zeropoint
-   \global\sidefloatleftskip \zeropoint
-   \ifcase\sidefloattype
-   \or % backspace
-     \global\sidefloatleftskip\dimexpr
-       +\rightorleftpageaction \backspace           \cutspace
-       +\compensatedinnermakeupmargin
-     \relax
-   \or % leftedge
-     \global\sidefloatleftskip\dimexpr
-       +\rightorleftpageaction \leftmargindistance  \rightmargindistance
-       +\rightorleftpageaction \leftmarginwidth     \rightmarginwidth
-       +\rightorleftpageaction \leftedgedistance    \rightedgedistance
-       +\compensatedinnermakeupmargin
-     \relax
-   \or % leftmargin
-     \global\sidefloatleftskip\dimexpr
-       +\rightorleftpageaction \leftmargindistance  \rightmargindistance
-       +\compensatedinnermakeupmargin
-     \relax
-   \or % leftside
-   \or % rightside
-   \or % rightmargin
-     \global\sidefloatrightskip\dimexpr
-       +\rightorleftpageaction \rightmargindistance \leftmargindistance
-       +\compensatedinnermakeupmargin
-     \relax
-   \or % rightedge
-     \global\sidefloatrightskip\dimexpr
-       +\rightorleftpageaction \rightmargindistance \leftmargindistance
-       +\rightorleftpageaction \rightmarginwidth    \leftmarginwidth
-       +\rightorleftpageaction \rightedgedistance   \leftedgedistance
-       +\compensatedinnermakeupmargin
-     \relax
-   \or % cutspace
-     \global\sidefloatrightskip\dimexpr
-       +\rightorleftpageaction \cutspace            \backspace
-       +\compensatedinnermakeupmargin
-     \relax
-   \fi
-   \ifdim\sidefloatrightskip>\zeropoint \doglobal\advance\sidefloatrightskip\rightskip \fi
-   \ifdim\sidefloatleftskip >\zeropoint \doglobal\advance\sidefloatleftskip \leftskip  \fi}
-
-% eq is still crap
-
-\ifx\normalleqno\undefined
-
-  \let\floatrighteqo=\eqno
-  \let\floatleftleqo=\leqno
-
-\else
-
-  \let\floatrighteqo=\normaleqno
-  \let\floatleftleqo=\normalleqno
-
-\fi
-
-% Watch it even more! In inner, gaat't mis omdat daar
-% pagetotal enz niet zijn aangepast. Inner kan overigens niet
-% betrouwbaar worden getest!
-
-% \def\flushsidefloats%
-%   {\par
-%    \sidefloatprogress=\sidefloatvsize
-%    \advance\sidefloatprogress by -\pagetotal
-%    \ifdim\sidefloatprogress>\zeropoint
-%      \witruimte % nog checken op interferentie
-%      \kern\sidefloatprogress
-%    \fi
-%    \global\sidefloatvsize=\nofloatvsize
-%    \global\floatflagfalse}
-%
-% no, too buggy, leads to top of page crap
-%
-%\def\flushsidefloats
-%  {\par
-%   \dochecksidefloat
-%   \scratchcounter=-\hangafter
-%   \dorecurse{\scratchcounter}{\strut\hfill\strut\par}}
-%
-%\def\flushsidefloats
-%  {\par
-%   \!!heighta\sidefloatvsize
-%   \advance\!!heighta -\pagetotal
-%   \ifdim\!!heighta>\zeropoint
-%     % to be checked for interference
-%     \witruimte
-%     % will be option
-%     \getnoflines\!!heighta
-%     \!!heighta\noflines\lineheight
-%     % so far for option
-%     \kern\!!heighta
-%   \fi
-%   % == \forgetsidefloats
-%   \global\sidefloatvsize\nofloatvsize
-%   \global\floatshortfalse
-%   \global\floatflagfalse}
-
-% \def\flushsidefloats
-%   {\par
-%    \!!heighta\sidefloatvsize
-%    \advance\!!heighta -\pagetotal
-%    \ifdim\!!heighta>\zeropoint
-%      % to be checked for interference
-%      \witruimte
-%      % will be option
-%      \getnoflines\!!heighta
-%      \!!heighta\noflines\lineheight
-%      % so far for option
-%      \ifdim\sidefloatbottomskip>\zeropoint\relax
-%        \ifdim\!!heighta>\sidefloatbottomskip
-%          \advance\!!heighta-\sidefloatbottomskip
-%          \kern\!!heighta
-%          \vskip\sidefloatbottomskip
-%        \else
-%          \kern\!!heighta
-%        \fi
-%      \else
-%        \kern\!!heighta
-%      \fi
-%    \fi
-%    % == \forgetsidefloats
-%    \global\sidefloatvsize\nofloatvsize
-%    \global\floatshortfalse
-%    \global\floatflagfalse}
-
-\newif\iftracesidefloats
-
-\def\flushsidefloats
-  {\par
-   \!!heighta\sidefloatvsize
-   \advance\!!heighta -\pagetotal
-   \ifnum\!!heighta>\zeropoint
-     \global\advance\sidefloatvsize -\sidefloatbottomskip
-     \ifdim\!!heighta>\zeropoint
-       \bgroup
-       \let\flushsidefloats\relax
-       \forgetall
-       \doloop
-         {\strut
-          \iftracesidefloats
-            \color[darkgray]%
-              {\baselinerulefalse
-               \boxrulewidth.5\points
-               \ruledhbox{\strut\kern\sidefloatwidth}}%
-          \fi
-          \par
-          \!!heighta\sidefloatvsize
-          \advance\!!heighta -\pagetotal
-          \ifdim\!!heighta>\zeropoint
-            \ifnum\recurselevel>\plushundred
-              \exitloop
-            \fi
-          \else
-            \exitloop
-          \fi}%
-       \egroup
-       \ifdim\parskip>\zeropoint
-         \ifdim\sidefloatbottomskip>\parskip
-           \nowhitespace
-           \vskip\sidefloatbottomskip
-         \fi
-       \fi
-     \else\ifdim\sidefloatbottomskip>\parskip
-       \vskip\sidefloatbottomskip
-     \fi\fi
-   \fi
-   % not entirely the same as \forgetsidefloats
-   \global\sidefloatvsize\nofloatvsize
-   % \global\sidefloatsidelines\zerocount % no, we flush before a side float
-   \global\floatshortfalse                % so this will get lost
-   % also here if used at all \global\holdinginserts\zerocount
-   \global\floatflagfalse}
-
-\def\flushsidefloatsafterpar
-  {\xdef\oldpagetotal{\the\pagetotal}%
-   \gdef\checksidefloat
-     {\dochecksidefloat
-      \ifdim\oldpagetotal=\pagetotal \else
-        \global\let\checksidefloat\dochecksidefloat
-        \flushsidefloats
-        \global\sidefloatsidelines\zerocount % here !
-      \fi}}
-
-\def\forgetsidefloats
-  {\global\sidefloatvsize\nofloatvsize
-   \global\sidefloatsidelines\zerocount
-   % also here if used at all \global\holdinginserts\zerocount
-   \global\floatshortfalse
-   \global\floatflagfalse}
-
-\let\logsidefloat=\relax
-
-\def\pushpenalties % needed ? and right
-  {\widowpenalty\plusone
-   \clubpenalty\plustwo
-   \brokenpenalty\plusone
-   \let\pushpenalties\relax
-   \edef\poppenalties
-     {\widowpenalty \the\widowpenalty
-      \clubpenalty  \the\clubpenalty
-      \brokenpenalty\the\brokenpenalty
-      \let\poppenalties\relax}}
-
-% shouldn;t that be:
-%
-% \def\pushpenalties % needed?
-%   {\let\pushpenalties\relax
-%    \edef\poppenalties
-%      {\widowpenalty \the\widowpenalty
-%       \clubpenalty  \the\clubpenalty
-%       \brokenpenalty\the\brokenpenalty
-%       \let\poppenalties\relax}%
-%    \widowpenalty\plusone
-%    \clubpenalty\plustwo
-%    \brokenpenalty\plusone}
-
-\let\poppenalties=\relax
-
-\def\restorepenalties
-  {\ifnum\outputpenalty=\!!tenthousand\else
-     \penalty\outputpenalty
-   \fi}
-
-\def\sidefloatoutput
-  {\iffloatshort
-     \unvbox\normalpagebox
-     \setbox\floatbottom\lastbox
-     \ifdim\wd\floatbottom>\sidefloathsize
-       \penalty-201
-       \box\floatbottom
-     \else
-       \ifvoid\floatbottom
-       \else
-         \restoreleftindent
-         \ifdim\wd\floatbottom<\sidefloathsize
-           \parskip\zeropoint
-           %\noindent
-           \ifinner\else\vadjust{\penalty\minusone}\fi
-           \iffloatlefteqo
-             \global\floatlefteqofalse
-           \else
-             \global\advance\sidefloathsize -\wd\floatbottom
-             \iffloatrighteqo
-               \global\floatrighteqofalse
-             \else
-               \global\divide\sidefloathsize \plustwo
-             \fi
-             \hskip\sidefloathsize
-           \fi
-         \fi
-         \box\floatbottom
-         \restorepenalties
-       \fi
-     \fi
-     % why was this \global\holdinginserts\zerocount
-     \global\floatshortfalse
-   \else
-     \finalsidefloatoutput % new
-     \global\sidefloatvsize\nofloatvsize
-     \global\sidefloatsidelines\zerocount
-     % we can end up in fig lock, so \global\holdinginserts\zerocount here too ?
-     \poppenalties
-   \fi}
-
-\def\finalsidefloatoutput% new
-  {\finaloutput\unvbox\normalpagebox}
-
-\def\restoreleftindent
-  {\relax \ifnum\sidefloattype>4 \else
-     \parskip\zeropoint % here ?
-     \ifdim\sidefloatwidth>\zeropoint % new, see prikkels
-       \noindent
-       \ifinner\else\vadjust{\penalty\minusone}\fi
-       \hskip\sidefloatwidth
-    %\else
-    %  we have a margin or edge float
-     \fi
-   \fi}
-
-\ifx\normaleqno\undefined
-
-  \def\normaleqno
-    {\iffloatshort
-       \global\floatrighteqotrue
-     \fi
-     \floatrighteqo}
-
-\else
-
-  \def\eqno
-    {\iffloatshort
-       \global\floatrighteqotrue
-     \fi
-     \floatrighteqo}
-
-\fi
-
-% externfiguur     -> grid        =ja|hoogte|diepte|halveregel|passend -> helemaal in details
-% stelplaatsblokin -> zijuitlijnen=hoogte|diepte|regel|halveregel|grid -> halveregel in 'details'
-
-% replacement for below
-%
-%    \global\setbox\floatbox\hbox % no \hskip, but \kern here
-%      {\ifcase\sidefloattype
-%         \vbox{#1}%
-%       \or % 1
-%         \hskip\sidefloatleftshift
-%         \hskip\sidefloatshift
-%         \vbox{#1}%
-%         \kern-\sidefloatextrashift
-%       \or % 2
-%         \hskip\sidefloatshift
-%         \vbox{#1}%
-%         \kern-\sidefloatextrashift
-%       \or % 3
-%         \hskip\sidefloatshift
-%         \vbox{#1}%
-%         \kern-\sidefloatextrashift
-%       \or % 4
-%         \hskip\sidefloatleftshift
-%         \hskip\sidefloatshift
-%         \vbox{#1\removedepth}%
-%         \kern-\sidefloatextrashift
-%       \or % 5
-%         \hskip-\sidefloatextrashift
-%         \vbox{#1}%
-%         \kern\sidefloatshift
-%         \kern\sidefloatrightshift
-%       \or % 6
-%         \hskip-\sidefloatextrashift
-%         \vbox{#1}%
-%         \kern\sidefloatshift
-%       \or % 7
-%         \hskip-\sidefloatextrashift
-%         \vbox{#1}%
-%         \kern\sidefloatshift
-%       \or % 8
-%         \hskip-\sidefloatextrashift
-%         \vbox{#1}%
-%         \kern\sidefloatshift
-%         \kern\sidefloatrightshift
-%       \fi}%
-%
-% keep this ^
-
-\def\putsidefloat#1% grid (4) is rather experimental
-  {\par
-   \whitespace
-   % moved here dec 2001
-   {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}% moved
-   \checksidefloatshift
-   \ifdim\sidefloatshift=\zeropoint \relax
-     \ifnum\sidefloattype=4
-       \global\advance\sidefloatshift\sidefloatextrashift
-       \global\sidefloatextrashift\zeropoint
-     \else\ifnum\sidefloattype=5
-       \global\advance\sidefloatshift\sidefloatextrashift
-       \global\sidefloatextrashift\zeropoint
-     \fi\fi
-   \else
-     \ifnum\sidefloattype<4
-       \global\chardef\sidefloattype4
-     \else\ifnum\sidefloattype>5
-       \global\chardef\sidefloattype5
-     \fi\fi
-   \fi
-   \previoussidefloat
-   \stallsidefloat
-  %\global\setbox\floatbox\hbox
-  %  {\ifmarginfloat\else\ifrightfloat\else\kern\sidefloatleftshift\fi\fi
-  %   \hskip\ifrightfloat-\sidefloatextrashift\else\sidefloatshift\fi
-  %   \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}%
-  %   \kern\ifrightfloat\sidefloatshift\else-\sidefloatextrashift\fi
-  %   \ifmarginfloat\else\ifrightfloat\kern\sidefloatrightshift\fi\fi}%
-   \global\setbox\floatbox\hbox % no \hskip, but \kern here
-     {\ifnum\sidefloattype=4
-        \hskip\sidefloatleftshift
-      \else\ifnum\sidefloattype=1
-        \hskip\sidefloatleftshift
-      \fi\fi
-      \ifnum\sidefloattype>4
-        \hskip-\sidefloatextrashift
-      \else
-        \hskip\sidefloatshift
-      \fi
-      \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}%
-      \ifnum\sidefloattype>4
-        \kern\sidefloatshift
-      \else
-        \kern-\sidefloatextrashift
-      \fi
-      \ifnum\sidefloattype=8
-        \kern\sidefloatrightshift
-      \else\ifnum\sidefloattype=5
-        \kern\sidefloatrightshift
-      \fi\fi}%
-   \ifnum\sidefloatalign=4
-     \getnoflines{\ht\floatbox}%
-     \scratchdimen\noflines\lineheight
-     \advance\scratchdimen-\strutdepth
-     \getrawnoflines\sidefloattopskip
-     \advance\scratchdimen\noflines\lineheight
-     % todo: maybe rounding problem here
-     % \global\setbox\floatbox\hbox{\lower\lineheight\box\floatbox}%
-     \global\setbox\floatbox\hbox{\lower\strutdepth\box\floatbox}%
-     \global\ht\floatbox\scratchdimen
-     \global\dp\floatbox\zeropoint
-   \fi
-   \ifcase\sidefloatalign \else
-     \global\sidefloattopskip\zeropoint
-   \fi
-   \scratchdimen
-     \ifnum\sidefloattype<4
-       \sidefloattopskip
-     \else\ifnum\sidefloattype>5
-       \sidefloattopskip
-     \else
-       \zeropoint
-     \fi\fi
-   % the top of the box is at the previous baseline
-   \ifcase\sidefloatalign
-       % 0 normal
-     \advance\scratchdimen\strutdepth % == \sidefloattopoffset
-   \or % 1 height
-     \advance\scratchdimen\strutdepth % == \sidefloattopoffset
-   \or % 2 line
-   \or % 3 depth
-     \advance\scratchdimen\lineheight
-     \advance\scratchdimen\strutdepth
-   \or % 4 grid
-     \scratchdimen\zeropoint
-   \or
-     \advance\scratchdimen\strutheight
-   \fi
-   % new
-   \global\sidefloatlinesdone\zerocount
-   \ifnum\sidefloatsidelines>\zerocount
-     \advance\scratchdimen\sidefloatsidelines\lineheight
-   \fi
-   % new
-   \global\setbox\floatbox\hbox
-     {\vbox
-        {\vskip\scratchdimen
-         \nointerlineskip
-         \box\floatbox
-         \ifnum\sidefloatalign=5 \vskip-\lineheight \fi}}%
-   \ifnum\sidefloattype<4
-     \global\sidefloattopskip\zeropoint
-   \else\ifnum\sidefloattype>5
-     \global\sidefloattopskip\zeropoint
-   \fi\fi
-   \global\sidefloatdownshift\zeropoint
-   \measuresidefloat
-   \ifroomforfloat \else
-     \tosssidefloat
-     \measuresidefloat
-     \stallsidefloat
-   \fi
-   \setsidefloat}
-
-\def\progresssidefloat
-  {\sidefloatprogress\sidefloatvsize
-   \iffloatflag
-     \advance\sidefloatprogress -\sidefloatpagetotal
-     \global\floatflagfalse
-   \else
-     \advance\sidefloatprogress -\pagetotal
-   \fi}
-
-\def\tosssidefloat
-  {\vfill\eject}
-
-\def\measuresidefloat
-  {\global\floatflagtrue
-   \global\sidefloatpagetotal \pagetotal % global
-   \ifnum\sidefloattype<4
-     \global        \sidefloatwidth \zeropoint
-   \else\ifnum\sidefloattype>5
-     \global        \sidefloatwidth \zeropoint
-   \else
-     \global        \sidefloatwidth \wd\floatbox
-     \global\advance\sidefloatwidth \floatsideskip
-   \fi\fi
-   \ifdim\sidefloatwidth<\zeropoint
-     \global\sidefloatwidth\zeropoint
-   \fi
-   \global        \sidefloathsize  \hsize
-   \global\advance\sidefloathsize -\sidefloatwidth
-   \global        \sidefloatheight \ht\floatbox
-   \global\advance\sidefloatheight \dp\floatbox
-   \global\advance\sidefloatheight \sidefloattopskip
-   \global        \sidefloatvsize  \sidefloatheight
-   \global\advance\sidefloatvsize  \sidefloatpagetotal
-   \dimen0\sidefloatvsize
-   \dimen2\pagegoal
-   \relax
-   \ifcase\sidefloatmethod
-     % method 0 : raw
-   \or
-     % method 1 : safe
-     \dimen2 .99\pagegoal
-   \or
-     % method 2 : tight
-     \advance\dimen0 -\onepoint
-   \fi
-   \relax % really needed ! ! ! !
-   \ifdim\dimen0>\dimen2
-     \global\roomforfloatfalse
-   \else
-     \dimen0=\pagegoal
-     \advance\dimen0 -\sidefloatvsize
-     \ifdim\dimen0<\sidefloatbottomskip
-       \global\advance\sidefloatvsize \dimen0
-       \global\floatshorttrue
-       \pushpenalties
-       % why was this \global\holdinginserts\plusone
-     \else
-       \global\advance\sidefloatvsize \sidefloatbottomskip
-       \global\floatshortfalse
-     \fi
-     \global\roomforfloattrue
-   \fi}
-
-\def\setsidefloat% nilling everypar saves time and redudant pos's
-  {% removed here dec 2001
-   % {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}%
-   \ifnum\sidefloattype=4 \kern\sidefloattopskip \fi
-   \ifnum\sidefloattype=5 \kern\sidefloattopskip \fi
-   \edef\presidefloatdepth{\the\prevdepth}%
-   \nointerlineskip
-   \bgroup
-   \everypar\emptytoks
-   \parskip\zeropoint
-  %\checksidefloatshift
-   \setsidefloatskips
-   \logsidefloat
-   \relax
-   \ifcase\sidefloattype
-     % invalid
-   \or % backspace
-     \noindent\llap{\rlap{\box\floatbox}\hskip\sidefloatleftskip}\hfill
-   \or % leftedge
-     \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
-   \or % leftmargin
-     \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
-   \or % leftside
-     \noindent\box\floatbox\hfill
-   \or % rightside
-     \hfill\box\floatbox
-   \or % rightmargin
-     \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
-   \or % rightedge
-     \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
-   \or % cutspace
-     \hfill\rlap{\hskip\sidefloatrightskip\llap{\box\floatbox}}%
-   \fi
-   \egroup
-   \par
-   \kern-\sidefloatheight
-   \penalty10001 % oeps, this will change
-   \normalbaselines
-   \prevdepth\presidefloatdepth
-   % \noindent
-   \resetsidefloatparagraph
-   \ignorespaces} % not really needed
-
-\newcount\sidefloatparagraph
-
-\def\iffirstsidefloatparagraph
-  {\ifcase\sidefloatparagraph\or}
-
-% without sidefloat lines
-%
-% \def\setsidefloatparagraph
-%   {%\advance\sidefloatprogress \sidefloatbottomskip
-%    %\!!counta\sidefloatprogress
-%    \scratchdimen\sidefloatprogress
-%    \advance\scratchdimen \strutht
-%    \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
-%    \!!counta\scratchdimen
-%    \divide\!!counta \baselineskip
-%    \ifnum\!!counta>0
-%      \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth
-%      \hangafter-\!!counta
-%    \fi
-%    \global\advance\sidefloatparagraph \plusone
-%    \iftracesidefloats
-%      \hskip-\sidefloatwidth
-%      \color[darkgray]%
-%        {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
-%        %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
-%         \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
-%    \fi}
-
-\def\setsidefloatparagraph
-  {%\advance\sidefloatprogress \sidefloatbottomskip
-   %\!!counta\sidefloatprogress
-   \scratchdimen\sidefloatprogress
-   \advance\scratchdimen \strutht
-   \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
-   \!!counta\scratchdimen
-   \divide\!!counta \baselineskip\relax
-   \ifnum\!!counta>0
-     % new from here
-     \ifcase\sidefloatsidelines\else
-       \ifcase\sidefloatlinesdone
-         \global\sidefloatlinesdone\!!counta
-       \else
-         \scratchcounter\sidefloatlinesdone
-         \advance\scratchcounter-\!!counta
-         \global\advance\sidefloatsidelines-\scratchcounter
-       \fi
-     \fi
-     \ifnum\sidefloatsidelines>\zerocount
-       \scratchtoks\emptytoks
-       \scratchcounter\sidefloatsidelines
-       \scratchdimen\hsize
-       \advance\scratchdimen-\sidefloatwidth
-       \dorecurse\sidefloatsidelines
-         {\appendtoks \zeropoint \hsize \to \scratchtoks}%
-       \ifnum\!!counta>\sidefloatsidelines
-         \advance\!!counta -\sidefloatsidelines\relax
-         \advance\scratchcounter\!!counta
-         \dorecurse\!!counta
-           {\ifnum\sidefloattype>4
-              \appendtoks \zeropoint \scratchdimen \to \scratchtoks
-            \else
-              \appendtoks \sidefloatwidth \scratchdimen \to \scratchtoks
-            \fi}%
-       \fi
-       \advance\scratchcounter \plusone
-       \parshape \scratchcounter \the\scratchtoks \zeropoint \hsize\relax
-     \else
-       % new till here
-       \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth
-       \hangafter-\!!counta
-     \fi
-   \fi
-   \global\advance\sidefloatparagraph \plusone
-   \iftracesidefloats
-     \hskip-\sidefloatwidth
-     \color[darkgray]%
-       {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
-       %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
-        \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
-   \fi}
-
-\def\resetsidefloatparagraph
-  {\global\sidefloatparagraph\zerocount }
-
-\def\dochecksidefloat
-  {\progresssidefloat
-   \ifdim\sidefloatprogress>\zeropoint
-     \setsidefloatparagraph
-   \else
-     \resetsidefloatparagraph
-   \fi
-   \parskip\ctxparskip}
-
-\def\checksidefloat
-  {\dochecksidefloat}
-
-\def\synchronizesidefloats
-  {\ifinner \else \checksidefloat \fi}
-
-\def\doadjustsidefloatdisplaylines
-  {\par
-   \vskip-\parskip
-   \noindent
-   \ignorespaces}
-
-\def\adjustsidefloatdisplaylines
-  {\aftergroup\doadjustsidefloatdisplaylines}
-
-\def\previoussidefloat
-  {\progresssidefloat
-   \ifdim\sidefloatprogress>\zeropoint \relax
-     \iffloatshort
-       \global\floatshortfalse
-       \tosssidefloat
-     \else
-       \kern\sidefloatprogress
-     \fi
-   \fi}
-
-\def\stallsidefloat
-  {\!!counta\pageshrink
-   \divide\!!counta \baselineskip
-   \advance\!!counta \plusone
-   \parskip\zeropoint
-   \dorecurse\!!counta{\line{}}
-   \kern-\!!counta\baselineskip
-   \penalty\zerocount }
-
-% We need to hook it into the other otr's. This code will move.
-
-\let\OTRONEflushsidefloats      \flushsidefloats
-\let\OTRONEsynchronizesidefloats\synchronizesidefloats
-
-% page-set
-%
-% \let\OTRSETflushsidefloats      \forgetsidefloats
-% \let\OTRSETsynchronizesidefloats\forgetsidefloats
-
-% page-mul
-%
-% \let\OTRMULflushsidefloats      \forgetsidefloats
-% \let\OTRMULsynchronizesidefloats\forgetsidefloats
-
-\def\synchronizesidefloats{\OTRcommand\synchronizesidefloats}
-\def\flushsidefloats      {\OTRcommand\flushsidefloats}
-
-\protect \endinput
diff --git a/tex/context/base/page-spr.mkii b/tex/context/base/page-spr.mkii
new file mode 100644
index 000000000..06947a36a
--- /dev/null
+++ b/tex/context/base/page-spr.mkii
@@ -0,0 +1,104 @@
+%D \module
+%D   [       file=page-spr,
+%D        version=2002.11.11,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Spreading,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Spreading}
+
+% This module is experimental and not yet official!
+
+\unprotect
+
+\newbox\spreadbox
+\newif \ifinspread
+
+\chardef\showspreadmode=1
+
+% beware, ugly overload, to be redone
+
+\def\normalsettextpagecontent#1#2#3% #2 and #3 will disappear
+  {\setbox#1\hbox
+     {\vbox to \textheight
+        {\offinterlineskip
+         \freezetextwidth
+         \hsize\textwidth   % local variant of \sethsize
+         \boxmaxdepth\maxdepth
+         \noindent             % content can be < \hsize
+         \dopagecontents#2#3}}%
+   \dp#1\zeropoint
+   \setbox#1\hbox to \makeupwidth
+     {\ifinspread
+        \ifvoid\spreadbox
+          \global\setbox\spreadbox\box#1%
+          \copy\spreadbox\hss % left page
+        \else
+          % prevent duplicate writes in normal run
+          \ifarrangingpages \else \ifcase\showspreadmode
+            \global\setbox\spreadbox\null
+            \wd\spreadbox\makeupwidth
+            \ht\spreadbox\textheight
+          \fi \fi
+          \hss\box\spreadbox % right page
+        \fi
+      \else
+        \hss\box#1\hss % never change the \hss's
+      \fi}}
+
+\def\doflushspread
+  {\ifinspread \ifvoid\spreadbox\else
+     % this page will be discarded later
+     \null \page
+   \fi \fi }
+
+\def\startspread
+  {\bgroup
+   \ifdoublesided
+     \page[\v!left]%
+    %\setsystemmode{spread}%
+     \inspreadtrue
+     \scratchdimen2\textwidth
+     \advance\scratchdimen2\backspace
+     \expanded{\setuplayout[\c!textwidth=\the\scratchdimen]}%
+     \def\startspread{\bgroup\let\stopspread\egroup}%
+     \let\stopspread\dostopspread
+   \else
+     \let\stopspread\egroup
+   \fi}
+
+\let\stopspread\relax
+
+\def\dostopspread
+  {\kern\zeropoint\page
+   \inspreadfalse
+   \setuplayout[\c!textwidth=\textwidth]
+   \page[\v!left]
+   \egroup}
+
+\protect \endinput
+
+% texexec --arr --pdf test
+%
+% \setuplayout[width=middle]
+% \setuppapersize[A4][A3,landscape]
+% \setuppagenumbering[alternative=doublesided]
+% \setuparranging[2UP]
+%
+% \starttext
+%
+% \dorecurse{3}{\input tufte }
+%
+% \startspread
+%   \dorecurse{10}{\input tufte }
+% \stopspread
+%
+% \dorecurse{3}{\input tufte }
+%
+% \stoptext
diff --git a/tex/context/base/page-spr.mkiv b/tex/context/base/page-spr.mkiv
new file mode 100644
index 000000000..4436ddcc2
--- /dev/null
+++ b/tex/context/base/page-spr.mkiv
@@ -0,0 +1,103 @@
+%D \module
+%D   [       file=page-spr,
+%D        version=2002.11.11,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Spreading,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 / Spreading}
+
+% This module is experimental and not yet official!
+
+\unprotect
+
+\newbox\spreadbox
+\newif \ifinspread
+
+\chardef\showspreadmode\plusone
+
+% beware, ugly overload, to be redone
+
+\def\normalsettextpagecontent#1#2#3% #2 and #3 will disappear
+  {\setbox#1\hbox
+     {\setlayoutcomponentattribute\v!page\v!text
+      \vbox \layoutcomponentboxattribute to \textheight
+        {\offinterlineskip
+         \freezetextwidth
+         \hsize\textwidth   % local variant of \sethsize
+         \boxmaxdepth\maxdepth
+         \noindent             % content can be < \hsize
+         \dopagecontents#2#3}}%
+   \dp#1\zeropoint
+   \setbox#1\hbox to \makeupwidth
+     {\ifinspread
+        \ifvoid\spreadbox
+          \global\setbox\spreadbox\box#1%
+          \copy\spreadbox\hss % left page
+        \else
+          % prevent duplicate writes in normal run
+          \ifarrangingpages \else \ifcase\showspreadmode
+            \global\setbox\spreadbox\null
+            \wd\spreadbox\makeupwidth
+            \ht\spreadbox\textheight
+          \fi \fi
+          \hss\box\spreadbox % right page
+        \fi
+      \else
+        \hss\box#1\hss % never change the \hss's
+      \fi}}
+
+\def\doflushspread
+  {\ifinspread \ifvoid\spreadbox\else
+     % this page will be discarded later
+     \null \page
+   \fi \fi }
+
+\def\startspread
+  {\bgroup
+   \ifdoublesided
+     \page[\v!left]%
+    %\setsystemmode{spread}%
+     \inspreadtrue
+     \expanded{\setuplayout[\c!textwidth=\the\dimexpr2\textwidth+2\backspace\relax]}%
+     \def\startspread{\bgroup\let\stopspread\egroup}%
+     \let\stopspread\dostopspread
+   \else
+     \let\stopspread\egroup
+   \fi}
+
+\let\stopspread\relax
+
+\def\dostopspread
+  {\kern\zeropoint\page
+   \inspreadfalse
+   \setuplayout[\c!textwidth=\textwidth]
+   \page[\v!left]
+   \egroup}
+
+\protect \endinput
+
+% texexec --arr --pdf test
+%
+% \setuplayout[width=middle]
+% \setuppapersize[A4][A3,landscape]
+% \setuppagenumbering[alternative=doublesided]
+% \setuparranging[2UP]
+%
+% \starttext
+%
+% \dorecurse{3}{\input tufte }
+%
+% \startspread
+%   \dorecurse{10}{\input tufte }
+% \stopspread
+%
+% \dorecurse{3}{\input tufte }
+%
+% \stoptext
diff --git a/tex/context/base/page-spr.tex b/tex/context/base/page-spr.tex
deleted file mode 100644
index 06947a36a..000000000
--- a/tex/context/base/page-spr.tex
+++ /dev/null
@@ -1,104 +0,0 @@
-%D \module
-%D   [       file=page-spr,
-%D        version=2002.11.11,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Spreading,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 / Spreading}
-
-% This module is experimental and not yet official!
-
-\unprotect
-
-\newbox\spreadbox
-\newif \ifinspread
-
-\chardef\showspreadmode=1
-
-% beware, ugly overload, to be redone
-
-\def\normalsettextpagecontent#1#2#3% #2 and #3 will disappear
-  {\setbox#1\hbox
-     {\vbox to \textheight
-        {\offinterlineskip
-         \freezetextwidth
-         \hsize\textwidth   % local variant of \sethsize
-         \boxmaxdepth\maxdepth
-         \noindent             % content can be < \hsize
-         \dopagecontents#2#3}}%
-   \dp#1\zeropoint
-   \setbox#1\hbox to \makeupwidth
-     {\ifinspread
-        \ifvoid\spreadbox
-          \global\setbox\spreadbox\box#1%
-          \copy\spreadbox\hss % left page
-        \else
-          % prevent duplicate writes in normal run
-          \ifarrangingpages \else \ifcase\showspreadmode
-            \global\setbox\spreadbox\null
-            \wd\spreadbox\makeupwidth
-            \ht\spreadbox\textheight
-          \fi \fi
-          \hss\box\spreadbox % right page
-        \fi
-      \else
-        \hss\box#1\hss % never change the \hss's
-      \fi}}
-
-\def\doflushspread
-  {\ifinspread \ifvoid\spreadbox\else
-     % this page will be discarded later
-     \null \page
-   \fi \fi }
-
-\def\startspread
-  {\bgroup
-   \ifdoublesided
-     \page[\v!left]%
-    %\setsystemmode{spread}%
-     \inspreadtrue
-     \scratchdimen2\textwidth
-     \advance\scratchdimen2\backspace
-     \expanded{\setuplayout[\c!textwidth=\the\scratchdimen]}%
-     \def\startspread{\bgroup\let\stopspread\egroup}%
-     \let\stopspread\dostopspread
-   \else
-     \let\stopspread\egroup
-   \fi}
-
-\let\stopspread\relax
-
-\def\dostopspread
-  {\kern\zeropoint\page
-   \inspreadfalse
-   \setuplayout[\c!textwidth=\textwidth]
-   \page[\v!left]
-   \egroup}
-
-\protect \endinput
-
-% texexec --arr --pdf test
-%
-% \setuplayout[width=middle]
-% \setuppapersize[A4][A3,landscape]
-% \setuppagenumbering[alternative=doublesided]
-% \setuparranging[2UP]
-%
-% \starttext
-%
-% \dorecurse{3}{\input tufte }
-%
-% \startspread
-%   \dorecurse{10}{\input tufte }
-% \stopspread
-%
-% \dorecurse{3}{\input tufte }
-%
-% \stoptext
diff --git a/tex/context/base/page-str.mkii b/tex/context/base/page-str.mkii
new file mode 100644
index 000000000..cfaebe398
--- /dev/null
+++ b/tex/context/base/page-str.mkii
@@ -0,0 +1,376 @@
+%D \module
+%D   [       file=page-str,
+%D        version=2006.03.21,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Page Streams,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright=PRAGMA-ADE]
+%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 / Page Streams}
+
+%D The first version of this component of \CONTEXT\ was written
+%D for Thomas Schmitz who asked for parallel page streams. While
+%D playing with the code, I decided to make it into a component
+%D that can be used to construct all kind of stream related
+%D mechanisms. Because I could apply this feature in a project,
+%D there is some additional code here (related to graphics).
+%D
+%D These macros were written while listening to and watching the DVD
+%D \quotation {Rush In Rio}.
+
+% not yet ok in mkiv ... marknotes
+
+\unprotect
+
+% taco, what is the best way to append a otr chunk (insert pagediscards?)
+
+\let\currentoutputstream\s!default
+
+\newtoks\defaultstreamoutput \defaultstreamoutput=\OTRONEoutput
+
+\newtoks\normalstreamoutput  \normalstreamoutput={\saveoutputstream[\currentoutputstream]}
+
+\newcount\streampenalty \streampenalty=-101010101
+
+\ifx\multicolumnseject\undefined \else
+  \let\normalmulticolumnseject\multicolumnseject
+  \def\multicolumnseject{\ifinoutputstream\else\normalmulticolumnseject\fi}
+\fi
+
+\newif\ifinoutputstream
+
+\newtoks \everyenableoutputstream
+
+\appendtoks
+  \flushsidefloats
+\to \everyenableoutputstream
+
+\def\enableoutputstream[#1]%
+  {\the\everyenableoutputstream
+   \finishoutputstream
+   \writestatus{otr}{switching to output stream #1}%
+   \inoutputstreamtrue
+   \xdef\currentoutputstream{#1}}
+
+\def\disableoutputstream
+  {\finishoutputstream
+   \writestatus{otr}{switching to default output stream}%
+   \inoutputstreamfalse
+   \global\let\currentoutputstream\s!default}
+
+\def\useoutputstream[#1]%
+  {\writestatus{otr}{using output stream #1}%
+   \xdef\currentoutputstream{#1}}
+
+\def\handlestreamoutput
+  {\doifelse\currentoutputstream\s!default
+     {\ifnum\outputpenalty=\streampenalty
+        \ifvoid\normalpagebox \else
+          \unvbox\normalpagebox
+        \fi
+      \else
+        \the\defaultstreamoutput
+      \fi}
+     {\the\normalstreamoutput}}
+
+\OTRONEoutput{\handlestreamoutput}
+
+\def\defineoutputstream[#1]%
+  {\doifundefined{otrs:#1}{\expandafter\newbox\csname otrs:#1\endcsname}}
+
+\def\outputstreamtag#1%
+  {\csname otrs:#1\endcsname}
+
+\def\finishoutputstream % todo: installoutput
+  {\endgraf
+   \penalty\streampenalty
+   \endgraf}
+
+\def\saveoutputstream[#1]%
+  {\writestatus{otr}{saving otr stream #1}%
+   \ifvoid\normalpagebox
+     \global\setbox\outputstreamtag{#1}\emptybox
+   \else
+     \global\setbox\outputstreamtag{#1}\vbox
+       {\presetoutputstream
+        \ifvoid\outputstreamtag{#1}\else\unvbox\outputstreamtag{#1}\fi
+        \scratchdimen\dp\normalpagebox
+        \unvbox\normalpagebox
+        \vskip-\scratchdimen
+        \kern\strutdepth}%
+   \fi}
+
+% \def\presetoutputstream
+%   {\pdffirstlineheight\strutheight
+%    \pdflastlinedepth  \strutdepth
+%    \pdfeachlineheight \strutheight
+%    \pdfeachlinedepth  \strutdepth}
+
+\let\presetoutputstream\relax
+
+\def\outputstreamht  [#1]{\ht\outputstreamtag{#1}}
+\def\outputstreamdp  [#1]{\dp\outputstreamtag{#1}}
+\def\outputstreamwd  [#1]{\wd\outputstreamtag{#1}}
+
+%def\outputstreambox [#1]{\ifvoid\outputstreamtag{#1}\else\box \outputstreamtag{#1}\fi}
+%def\outputstreamcopy[#1]{\ifvoid\outputstreamtag{#1}\else\copy\outputstreamtag{#1}\fi}
+
+\def\dowithoutputstreambox#1[#2]{\ifvoid\outputstreamtag{#2}\else#1\outputstreamtag{#2}\fi}
+
+\def\outputstreamcopy   {\dowithoutputstreambox\copy   }
+\def\outputstreambox    {\dowithoutputstreambox\box    }
+\def\outputstreamunvcopy{\dowithoutputstreambox\unvcopy}
+\def\outputstreamunvbox {\dowithoutputstreambox\unvbox }
+
+%D Footnotes don't go along with streams, simply because there is no
+%D way to re-split inserts. A dirty way out is to use marks and store
+%D notes that way.
+
+\def\definemarknote
+  {\dodoubleempty\dodefinemarknote}
+
+\def\dodefinemarknote[#1][#2]%
+  {\definemarking[mn:#1]%
+   \setvalue{mn:#1:n}{0}%
+   \getparameters
+     [mn:#1]
+     [\c!before=,
+      \c!after=,
+      \c!inbetween=\endgraf,
+      \c!command=\firstofoneargument,
+      #2]}
+
+\def\setmarknote[#1]#2%
+  {\doglobal\incrementvalue{mn:#1:n}%
+   \setgvalue{mn:#1:t:\getvalue{mn:#1:n}}{#2}%
+   \expanded{\marking[mn:#1]{\getvalue{mn:#1:n}}}}
+
+\def\flushmarknotes[#1]% assumes split
+  {\begingroup
+%    \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}%
+%    \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}%
+%    \ifnum\firstmarknote<\lastmarknote\relax
+%      \getvalue{mn:#1\c!before}%
+%      \dostepwiserecurse\firstmarknote\lastmarknote\plusone
+%        {\ifnum\recurselevel>\firstmarknote\relax
+%           \ifnum\recurselevel<\lastmarknote\relax
+%             \getvalue{mn:#1\c!inbetween}%
+%           \fi
+%         \fi
+%         \getvalue{mn:#1\c!command}{\getvalue{mn:#1:t:\recurselevel}}}%
+%      \getvalue{mn:#1\c!after}%
+%    \fi
+   \endgroup}
+
+\def\erasemarknotes[#1]%
+  {\begingroup
+   \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}%
+   \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}%
+   \dostepwiserecurse\firstmarknote\lastmarknote\plusone
+     {\global\letvalue{mn:#1:t:\recurselevel}\empty}%
+   \endgroup}
+
+%D The next section implements synchronization of (currently
+%D two) output streams. In due time we will implement both a
+%D vertical and horizontal system, as well as alternative
+%D splitters (firstpagevsize, succesivevsize etc).
+
+\def\synchronizeoutputstreams[#1]% [one,two] [left,right]
+  {\bgroup
+   \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
+   \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
+   \forgeteverypar
+   \def\roundingeps{50sp}%
+   \getboxheight\dimen0\of\box\outputstreamtag\firstoutputstream
+   \getboxheight\dimen2\of\box\outputstreamtag\secondoutputstream
+   \scratchdimen\dimexpr\dimen0-\dimen2\relax
+   \ifdim\scratchdimen<-\roundingeps\relax
+     \scratchdimen-\scratchdimen
+     \writestatus{sync}{compensating first stream: \the\scratchdimen/\number\scratchdimen}%
+     \getroundednoflines\scratchdimen
+     \global\setbox\outputstreamtag\firstoutputstream\vbox
+       {\presetoutputstream
+        \unvbox\outputstreamtag\firstoutputstream\dorecurse\noflines\crlf}%
+   \else\ifdim\scratchdimen>\roundingeps\relax
+     \writestatus{sync}{compensating second stream: \the\scratchdimen/\number\scratchdimen}%
+     \getroundednoflines\scratchdimen
+     \global\setbox\outputstreamtag\secondoutputstream\vbox
+       {\presetoutputstream
+        \unvbox\outputstreamtag\secondoutputstream\dorecurse\noflines\crlf}%
+   \else
+      \writestatus{sync}{no need to compensate streams: \the\scratchdimen/\number\scratchdimen}%
+   \fi\fi
+   \egroup}
+
+\def\nofoutputstreamsplitlines  {\v!auto} % {40}
+\def\outputstreamsplittolerance {-5}
+
+\def\flushoutputstreampages[#1]%
+  {\bgroup
+   \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
+   \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
+   \doloop
+     {\flushoutputstreams[#1]%
+      \ifvoid\outputstreamtag\firstoutputstream
+        \ifvoid\outputstreamtag\secondoutputstream
+          \exitloop
+        \else
+          \global\setbox\outputstreamtag\firstoutputstream\vbox{\strut}%
+        \fi
+      \else
+        \ifvoid\outputstreamtag\secondoutputstream
+          \global\setbox\outputstreamtag\secondoutputstream\vbox{\strut}%
+        \else
+          % okay
+        \fi
+      \fi}%
+   \egroup}
+
+\def\flushoutputstreams[#1]%
+  {\bgroup
+   \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
+   \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
+   \doif\nofoutputstreamsplitlines\v!auto
+     {\getrawnoflines\textheight
+      \edef\nofoutputstreamsplitlines{\the\noflines}}%
+   \splittopskip\strutheight
+   \scratchdimen\nofoutputstreamsplitlines\lineheight\relax
+   \unless\iffalse
+     \dimen0\scratchdimen
+     \doloop
+       {\setbox4\copy\outputstreamtag\firstoutputstream
+        \setbox0\vsplit4 to \dimen0
+        \setbox0\vbox
+          {\directsetup{stream:\firstoutputstream:top}%
+           \unvbox0
+           \directsetup{stream:\firstoutputstream:bottom}}%
+        \ifdim\ht0>\scratchdimen
+          \advance\dimen0-\lineheight
+        \else
+          \exitloop
+        \fi}%
+     \scratchdimen\dimen0
+     \dimen2\scratchdimen
+     \doloop
+       {\setbox6\copy\outputstreamtag\secondoutputstream
+        \setbox2\vsplit6 to \dimen2
+        \setbox2\vbox
+          {\directsetup{stream:\secondoutputstream:top}%
+           \unvbox0
+           \directsetup{stream:\secondoutputstream:bottom}}%
+        \ifdim\ht2>\scratchdimen
+          \advance\dimen2-\lineheight
+        \else
+          \exitloop
+        \fi}%
+     \scratchdimen\dimen2
+   \fi
+   \setbox4\copy\outputstreamtag\firstoutputstream
+   \setbox6\copy\outputstreamtag\secondoutputstream
+   \scratchcounter\zerocount
+   \doloop
+     {\setbox0\vsplit4 to \scratchdimen
+      \setbox0\vbox{\unvbox0}%
+      \setbox2\vsplit6 to \scratchdimen
+      \setbox2\vbox{\unvbox2}%
+      \ifvoid4
+        \exitloop
+      \else\ifvoid6
+        \exitloop
+      \else
+          \dimen8=\dimexpr\ht4-\ht6\relax
+          \ifdim\dimen8<\zeropoint\dimen8=-\dimen8\relax\fi
+          \advance\scratchcounter\plusone
+          \ifdim\dimen8<.5\lineheight
+            \exitloop
+          \else\ifnum\outputstreamsplittolerance>\zeropoint
+            \ifnum\scratchcounter>\outputstreamsplittolerance\relax
+              \exitloop
+            \else
+              \advance\scratchdimen\lineheight
+            \fi
+          \else\ifnum\outputstreamsplittolerance<\zeropoint
+            \ifnum-\scratchcounter<\outputstreamsplittolerance\relax
+              \exitloop
+            \else
+              \advance\scratchdimen-\lineheight
+            \fi
+          \else\ifnum\outputstreamsplittolerance=\zeropoint
+            \exitloop
+          \fi\fi\fi\fi
+       \fi\fi}%
+   \setbox0\vsplit\outputstreamtag\firstoutputstream to \scratchdimen
+   \setbox0\vbox to \textheight
+     {\presetoutputstream
+      \directsetup{stream:\firstoutputstream:top}%
+      \unvbox0
+      \vfill
+      \directsetup{stream:\firstoutputstream:bottom}}%
+   \setbox2\vsplit\outputstreamtag\secondoutputstream to \scratchdimen
+   \setbox2\vbox to \textheight
+     {\presetoutputstream
+      \directsetup{stream:\secondoutputstream:top}%
+      \unvbox2
+      \vfill
+      \directsetup{stream:\secondoutputstream:bottom}}%
+   \directsetup{stream:\firstoutputstream:reset}%
+   \directsetup{stream:\secondoutputstream:reset}%
+   \page[even]
+   \box0\vfill\page
+   \box2\vfill\page
+   \egroup}
+
+    %D Although one can put floats in a stream, it sometimes makes sense
+    %D to keep them apart and this is what local floats do.
+
+    \def\setuplocalfloats
+      {\getparameters[\??lf]}
+
+    \setuplocalfloats
+      [%before=\blank,
+       %after=\blank,
+       inbetween=\blank]
+
+    \installfloathandler \v!local \somelocalfloat
+
+    \initializeboxstack{localfloats}
+
+    \newcounter\noflocalfloats
+
+    \def\resetlocalfloats
+      {\doglobal\newcounter\noflocalfloats
+       \initializeboxstack{localfloats}}
+
+    \def\somelocalfloat[#1]%
+      {\doglobal\increment\noflocalfloats
+       \savebox{localfloats}{\noflocalfloats}{\box\floatbox}}
+
+    \def\getlocalfloats
+      {\dorecurse\noflocalfloats
+         {\ifnum\recurselevel=\plusone % 1\relax
+            \getvalue{\??lf\c!before}%
+          \else
+            \getvalue{\??lf\c!inbetween}%
+          \fi
+          \dontleavehmode\hbox{\foundbox{localfloats}\recurselevel}%
+          \ifnum\recurselevel=\noflocalfloats\relax
+            \getvalue{\??lf\c!after}%
+          \fi}}
+
+    \def\flushlocalfloats
+      {\getlocalfloats
+       \resetlocalfloats}
+
+    \def\getlocalfloat#1{\expanded{\foundbox{localfloats}{\number#1}}}
+
+    \def\forcelocalfloats{\let\forcedfloatmethod\v!local}
+
+%D Because many arrangements are possible, we will implement
+%D some examples in a runtime loadable module \type {m-streams}.
+
+\protect \endinput
diff --git a/tex/context/base/page-str.mkiv b/tex/context/base/page-str.mkiv
new file mode 100644
index 000000000..e4fd39794
--- /dev/null
+++ b/tex/context/base/page-str.mkiv
@@ -0,0 +1,380 @@
+%D \module
+%D   [       file=page-str,
+%D        version=2006.03.21,
+%D          title=\CONTEXT\ Page Macros,
+%D       subtitle=Page Streams,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright=PRAGMA-ADE]
+%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 / Page Streams}
+
+%D The first version of this component of \CONTEXT\ was written
+%D for Thomas Schmitz who asked for parallel page streams. While
+%D playing with the code, I decided to make it into a component
+%D that can be used to construct all kind of stream related
+%D mechanisms. Because I could apply this feature in a project,
+%D there is some additional code here (related to graphics).
+%D
+%D These macros were written while listening to and watching the DVD
+%D \quotation {Rush In Rio}.
+
+% not yet ok in mkiv ... marknotes .. will be completely redone
+
+\unprotect
+
+% taco, what is the best way to append a otr chunk (insert pagediscards?)
+
+\let\currentoutputstream\s!default
+
+\newtoks\defaultstreamoutput \defaultstreamoutput=\OTRONEoutput
+
+\newtoks\normalstreamoutput  \normalstreamoutput={\saveoutputstream[\currentoutputstream]}
+
+\newcount\streampenalty \streampenalty=-101010101
+
+\ifx\multicolumnseject\undefined \else
+  \let\normalmulticolumnseject\multicolumnseject
+  \def\multicolumnseject{\ifinoutputstream\else\normalmulticolumnseject\fi}
+\fi
+
+\newif\ifinoutputstream
+
+\newtoks \everyenableoutputstream
+
+\appendtoks
+  \flushsidefloats
+\to \everyenableoutputstream
+
+\def\enableoutputstream[#1]%
+  {\the\everyenableoutputstream
+   \finishoutputstream
+   \writestatus{otr}{switching to output stream #1}%
+   \inoutputstreamtrue
+   \xdef\currentoutputstream{#1}}
+
+\def\disableoutputstream
+  {\finishoutputstream
+   \writestatus{otr}{switching to default output stream}%
+   \inoutputstreamfalse
+   \global\let\currentoutputstream\s!default}
+
+\def\useoutputstream[#1]%
+  {\writestatus{otr}{using output stream #1}%
+   \xdef\currentoutputstream{#1}}
+
+\def\handlestreamoutput
+  {\ifx\currentoutputstream\s!default % already expanded
+     \ifnum\outputpenalty=\streampenalty
+       \ifvoid\normalpagebox \else
+         \unvbox\normalpagebox
+       \fi
+     \else
+       \the\defaultstreamoutput
+     \fi
+   \else
+     \the\normalstreamoutput
+   \fi}
+
+\OTRONEoutput{\handlestreamoutput}
+
+\def\defineoutputstream[#1]%
+  {\doifundefined{otrs:#1}{\expandafter\newbox\csname otrs:#1\endcsname}}
+
+\def\outputstreamtag#1%
+  {\csname otrs:#1\endcsname}
+
+\def\finishoutputstream % todo: installoutput
+  {\endgraf
+   \penalty\streampenalty
+   \endgraf}
+
+\def\saveoutputstream[#1]%
+  {\writestatus{otr}{saving otr stream #1}%
+   \ifvoid\normalpagebox
+     \global\setbox\outputstreamtag{#1}\emptybox
+   \else
+     \global\setbox\outputstreamtag{#1}\vbox
+       {\presetoutputstream
+        \ifvoid\outputstreamtag{#1}\else\unvbox\outputstreamtag{#1}\fi
+        \scratchdimen\dp\normalpagebox
+        \unvbox\normalpagebox
+        \vskip-\scratchdimen
+        \kern\strutdepth}%
+   \fi}
+
+% \def\presetoutputstream
+%   {\pdffirstlineheight\strutheight
+%    \pdflastlinedepth  \strutdepth
+%    \pdfeachlineheight \strutheight
+%    \pdfeachlinedepth  \strutdepth}
+
+\let\presetoutputstream\relax
+
+\def\outputstreamht  [#1]{\ht\outputstreamtag{#1}}
+\def\outputstreamdp  [#1]{\dp\outputstreamtag{#1}}
+\def\outputstreamwd  [#1]{\wd\outputstreamtag{#1}}
+
+%def\outputstreambox [#1]{\ifvoid\outputstreamtag{#1}\else\box \outputstreamtag{#1}\fi}
+%def\outputstreamcopy[#1]{\ifvoid\outputstreamtag{#1}\else\copy\outputstreamtag{#1}\fi}
+
+\def\dowithoutputstreambox#1[#2]{\ifvoid\outputstreamtag{#2}\else#1\outputstreamtag{#2}\fi}
+
+\def\outputstreamcopy   {\dowithoutputstreambox\copy   }
+\def\outputstreambox    {\dowithoutputstreambox\box    }
+\def\outputstreamunvcopy{\dowithoutputstreambox\unvcopy}
+\def\outputstreamunvbox {\dowithoutputstreambox\unvbox }
+
+%D Footnotes don't go along with streams, simply because there is no
+%D way to re-split inserts. A dirty way out is to use marks and store
+%D notes that way.
+
+% not mkiv ready yet
+
+\def\definemarknote
+  {\dodoubleempty\dodefinemarknote}
+
+\def\dodefinemarknote[#1][#2]%
+  {\definemarking[mn:#1]%
+   \setvalue{mn:#1:n}{0}%
+   \getparameters
+     [mn:#1]
+     [\c!before=,
+      \c!after=,
+      \c!inbetween=\endgraf,
+      \c!command=\firstofoneargument,
+      #2]}
+
+\def\setmarknote[#1]#2%
+  {\doglobal\incrementvalue{mn:#1:n}%
+   \setgvalue{mn:#1:t:\getvalue{mn:#1:n}}{#2}%
+   \expanded{\marking[mn:#1]{\getvalue{mn:#1:n}}}}
+
+\def\flushmarknotes[#1]% assumes split
+  {\begingroup
+%    \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}%
+%    \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}%
+%    \ifnum\firstmarknote<\lastmarknote\relax
+%      \getvalue{mn:#1\c!before}%
+%      \dostepwiserecurse\firstmarknote\lastmarknote\plusone
+%        {\ifnum\recurselevel>\firstmarknote\relax
+%           \ifnum\recurselevel<\lastmarknote\relax
+%             \getvalue{mn:#1\c!inbetween}%
+%           \fi
+%         \fi
+%         \getvalue{mn:#1\c!command}{\getvalue{mn:#1:t:\recurselevel}}}%
+%      \getvalue{mn:#1\c!after}%
+%    \fi
+   \endgroup}
+
+\def\erasemarknotes[#1]%
+  {\begingroup
+   \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}%
+   \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}%
+   \dostepwiserecurse\firstmarknote\lastmarknote\plusone
+     {\global\letvalue{mn:#1:t:\recurselevel}\empty}%
+   \endgroup}
+
+%D The next section implements synchronization of (currently
+%D two) output streams. In due time we will implement both a
+%D vertical and horizontal system, as well as alternative
+%D splitters (firstpagevsize, succesivevsize etc).
+
+\def\synchronizeoutputstreams[#1]% [one,two] [left,right]
+  {\bgroup
+   \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
+   \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
+   \forgeteverypar
+   \def\roundingeps{50sp}%
+   \getboxheight\dimen0\of\box\outputstreamtag\firstoutputstream
+   \getboxheight\dimen2\of\box\outputstreamtag\secondoutputstream
+   \scratchdimen\dimexpr\dimen0-\dimen2\relax
+   \ifdim\scratchdimen<-\roundingeps\relax
+     \scratchdimen-\scratchdimen
+     \writestatus{sync}{compensating first stream: \the\scratchdimen/\number\scratchdimen}%
+     \getroundednoflines\scratchdimen
+     \global\setbox\outputstreamtag\firstoutputstream\vbox
+       {\presetoutputstream
+        \unvbox\outputstreamtag\firstoutputstream\dorecurse\noflines\crlf}%
+   \else\ifdim\scratchdimen>\roundingeps\relax
+     \writestatus{sync}{compensating second stream: \the\scratchdimen/\number\scratchdimen}%
+     \getroundednoflines\scratchdimen
+     \global\setbox\outputstreamtag\secondoutputstream\vbox
+       {\presetoutputstream
+        \unvbox\outputstreamtag\secondoutputstream\dorecurse\noflines\crlf}%
+   \else
+      \writestatus{sync}{no need to compensate streams: \the\scratchdimen/\number\scratchdimen}%
+   \fi\fi
+   \egroup}
+
+\def\nofoutputstreamsplitlines  {\v!auto} % {40}
+\def\outputstreamsplittolerance {-5}
+
+\def\flushoutputstreampages[#1]%
+  {\bgroup
+   \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
+   \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
+   \doloop
+     {\flushoutputstreams[#1]%
+      \ifvoid\outputstreamtag\firstoutputstream
+        \ifvoid\outputstreamtag\secondoutputstream
+          \exitloop
+        \else
+          \global\setbox\outputstreamtag\firstoutputstream\vbox{\strut}%
+        \fi
+      \else
+        \ifvoid\outputstreamtag\secondoutputstream
+          \global\setbox\outputstreamtag\secondoutputstream\vbox{\strut}%
+        \else
+          % okay
+        \fi
+      \fi}%
+   \egroup}
+
+\def\flushoutputstreams[#1]%
+  {\bgroup
+   \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
+   \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
+   \doif\nofoutputstreamsplitlines\v!auto
+     {\getrawnoflines\textheight
+      \edef\nofoutputstreamsplitlines{\the\noflines}}%
+   \splittopskip\strutheight
+   \scratchdimen\nofoutputstreamsplitlines\lineheight\relax
+   \unless\iffalse
+     \dimen0\scratchdimen
+     \doloop
+       {\setbox4\copy\outputstreamtag\firstoutputstream
+        \setbox0\vsplit4 to \dimen0
+        \setbox0\vbox
+          {\directsetup{stream:\firstoutputstream:top}%
+           \unvbox0
+           \directsetup{stream:\firstoutputstream:bottom}}%
+        \ifdim\ht0>\scratchdimen
+          \advance\dimen0-\lineheight
+        \else
+          \exitloop
+        \fi}%
+     \scratchdimen\dimen0
+     \dimen2\scratchdimen
+     \doloop
+       {\setbox6\copy\outputstreamtag\secondoutputstream
+        \setbox2\vsplit6 to \dimen2
+        \setbox2\vbox
+          {\directsetup{stream:\secondoutputstream:top}%
+           \unvbox0
+           \directsetup{stream:\secondoutputstream:bottom}}%
+        \ifdim\ht2>\scratchdimen
+          \advance\dimen2-\lineheight
+        \else
+          \exitloop
+        \fi}%
+     \scratchdimen\dimen2
+   \fi
+   \setbox4\copy\outputstreamtag\firstoutputstream
+   \setbox6\copy\outputstreamtag\secondoutputstream
+   \scratchcounter\zerocount
+   \doloop
+     {\setbox0\vsplit4 to \scratchdimen
+      \setbox0\vbox{\unvbox0}%
+      \setbox2\vsplit6 to \scratchdimen
+      \setbox2\vbox{\unvbox2}%
+      \ifvoid4
+        \exitloop
+      \else\ifvoid6
+        \exitloop
+      \else
+          \dimen8=\dimexpr\ht4-\ht6\relax
+          \ifdim\dimen8<\zeropoint\dimen8=-\dimen8\relax\fi
+          \advance\scratchcounter\plusone
+          \ifdim\dimen8<.5\lineheight
+            \exitloop
+          \else\ifnum\outputstreamsplittolerance>\zeropoint
+            \ifnum\scratchcounter>\outputstreamsplittolerance\relax
+              \exitloop
+            \else
+              \advance\scratchdimen\lineheight
+            \fi
+          \else\ifnum\outputstreamsplittolerance<\zeropoint
+            \ifnum-\scratchcounter<\outputstreamsplittolerance\relax
+              \exitloop
+            \else
+              \advance\scratchdimen-\lineheight
+            \fi
+          \else\ifnum\outputstreamsplittolerance=\zeropoint
+            \exitloop
+          \fi\fi\fi\fi
+       \fi\fi}%
+   \setbox0\vsplit\outputstreamtag\firstoutputstream to \scratchdimen
+   \setbox0\vbox to \textheight
+     {\presetoutputstream
+      \directsetup{stream:\firstoutputstream:top}%
+      \unvbox0
+      \vfill
+      \directsetup{stream:\firstoutputstream:bottom}}%
+   \setbox2\vsplit\outputstreamtag\secondoutputstream to \scratchdimen
+   \setbox2\vbox to \textheight
+     {\presetoutputstream
+      \directsetup{stream:\secondoutputstream:top}%
+      \unvbox2
+      \vfill
+      \directsetup{stream:\secondoutputstream:bottom}}%
+   \directsetup{stream:\firstoutputstream:reset}%
+   \directsetup{stream:\secondoutputstream:reset}%
+   \page[even]
+   \box0\vfill\page
+   \box2\vfill\page
+   \egroup}
+
+    %D Although one can put floats in a stream, it sometimes makes sense
+    %D to keep them apart and this is what local floats do.
+
+    \def\setuplocalfloats
+      {\getparameters[\??lf]}
+
+    \setuplocalfloats
+      [%before=\blank,
+       %after=\blank,
+       inbetween=\blank]
+
+    \installfloathandler \v!local \somelocalfloat
+
+    \initializeboxstack{localfloats}
+
+    \newcounter\noflocalfloats
+
+    \def\resetlocalfloats
+      {\doglobal\newcounter\noflocalfloats
+       \initializeboxstack{localfloats}}
+
+    \def\somelocalfloat[#1]%
+      {\doglobal\increment\noflocalfloats
+       \savebox{localfloats}{\noflocalfloats}{\box\floatbox}}
+
+    \def\getlocalfloats
+      {\dorecurse\noflocalfloats
+         {\ifnum\recurselevel=\plusone % 1\relax
+            \getvalue{\??lf\c!before}%
+          \else
+            \getvalue{\??lf\c!inbetween}%
+          \fi
+          \dontleavehmode\hbox{\foundbox{localfloats}\recurselevel}%
+          \ifnum\recurselevel=\noflocalfloats\relax
+            \getvalue{\??lf\c!after}%
+          \fi}}
+
+    \def\flushlocalfloats
+      {\getlocalfloats
+       \resetlocalfloats}
+
+    \def\getlocalfloat#1{\expanded{\foundbox{localfloats}{\number#1}}}
+
+    \def\forcelocalfloats{\let\forcedfloatmethod\v!local}
+
+%D Because many arrangements are possible, we will implement
+%D some examples in a runtime loadable module \type {m-streams}.
+
+\protect \endinput
diff --git a/tex/context/base/page-str.tex b/tex/context/base/page-str.tex
deleted file mode 100644
index 2fb53bc6a..000000000
--- a/tex/context/base/page-str.tex
+++ /dev/null
@@ -1,374 +0,0 @@
-%D \module
-%D   [       file=page-str,
-%D        version=2006.03.21,
-%D          title=\CONTEXT\ Page Macros,
-%D       subtitle=Page Streams,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright=PRAGMA-ADE]
-%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 / Page Streams}
-
-%D The first version of this component of \CONTEXT\ was written
-%D for Thomas Schmitz who asked for parallel page streams. While
-%D playing with the code, I decided to make it into a component
-%D that can be used to construct all kind of stream related
-%D mechanisms. Because I could apply this feature in a project,
-%D there is some additional code here (related to graphics).
-%D
-%D These macros were written while listening to and watching the DVD
-%D \quotation {Rush In Rio}.
-
-\unprotect
-
-% taco, what is the best way to append a otr chunk (insert pagediscards?)
-
-\let\currentoutputstream\s!default
-
-\newtoks\defaultstreamoutput \defaultstreamoutput=\OTRONEoutput
-
-\newtoks\normalstreamoutput  \normalstreamoutput={\saveoutputstream[\currentoutputstream]}
-
-\newcount\streampenalty \streampenalty=-101010101
-
-\ifx\multicolumnseject\undefined \else
-  \let\normalmulticolumnseject\multicolumnseject
-  \def\multicolumnseject{\ifinoutputstream\else\normalmulticolumnseject\fi}
-\fi
-
-\newif\ifinoutputstream
-
-\newtoks \everyenableoutputstream
-
-\appendtoks
-  \flushsidefloats
-\to \everyenableoutputstream
-
-\def\enableoutputstream[#1]%
-  {\the\everyenableoutputstream
-   \finishoutputstream
-   \writestatus{otr}{switching to output stream #1}%
-   \inoutputstreamtrue
-   \xdef\currentoutputstream{#1}}
-
-\def\disableoutputstream
-  {\finishoutputstream
-   \writestatus{otr}{switching to default output stream}%
-   \inoutputstreamfalse
-   \global\let\currentoutputstream\s!default}
-
-\def\useoutputstream[#1]%
-  {\writestatus{otr}{using output stream #1}%
-   \xdef\currentoutputstream{#1}}
-
-\def\handlestreamoutput
-  {\doifelse\currentoutputstream\s!default
-     {\ifnum\outputpenalty=\streampenalty
-        \ifvoid\normalpagebox \else
-          \unvbox\normalpagebox
-        \fi
-      \else
-        \the\defaultstreamoutput
-      \fi}
-     {\the\normalstreamoutput}}
-
-\OTRONEoutput{\handlestreamoutput}
-
-\def\defineoutputstream[#1]%
-  {\doifundefined{otrs:#1}{\expandafter\newbox\csname otrs:#1\endcsname}}
-
-\def\outputstreamtag#1%
-  {\csname otrs:#1\endcsname}
-
-\def\finishoutputstream % todo: installoutput
-  {\endgraf
-   \penalty\streampenalty
-   \endgraf}
-
-\def\saveoutputstream[#1]%
-  {\writestatus{otr}{saving otr stream #1}%
-   \ifvoid\normalpagebox
-     \global\setbox\outputstreamtag{#1}\emptybox
-   \else
-     \global\setbox\outputstreamtag{#1}\vbox
-       {\presetoutputstream
-        \ifvoid\outputstreamtag{#1}\else\unvbox\outputstreamtag{#1}\fi
-        \scratchdimen\dp\normalpagebox
-        \unvbox\normalpagebox
-        \vskip-\scratchdimen
-        \kern\strutdepth}%
-   \fi}
-
-% \def\presetoutputstream
-%   {\pdffirstlineheight\strutheight
-%    \pdflastlinedepth  \strutdepth
-%    \pdfeachlineheight \strutheight
-%    \pdfeachlinedepth  \strutdepth}
-
-\let\presetoutputstream\relax
-
-\def\outputstreamht  [#1]{\ht\outputstreamtag{#1}}
-\def\outputstreamdp  [#1]{\dp\outputstreamtag{#1}}
-\def\outputstreamwd  [#1]{\wd\outputstreamtag{#1}}
-
-%def\outputstreambox [#1]{\ifvoid\outputstreamtag{#1}\else\box \outputstreamtag{#1}\fi}
-%def\outputstreamcopy[#1]{\ifvoid\outputstreamtag{#1}\else\copy\outputstreamtag{#1}\fi}
-
-\def\dowithoutputstreambox#1[#2]{\ifvoid\outputstreamtag{#2}\else#1\outputstreamtag{#2}\fi}
-
-\def\outputstreamcopy   {\dowithoutputstreambox\copy   }
-\def\outputstreambox    {\dowithoutputstreambox\box    }
-\def\outputstreamunvcopy{\dowithoutputstreambox\unvcopy}
-\def\outputstreamunvbox {\dowithoutputstreambox\unvbox }
-
-%D Footnotes don't go along with streams, simply because there is no
-%D way to re-split inserts. A dirty way out is to use marks and store
-%D notes that way.
-
-\def\definemarknote
-  {\dodoubleempty\dodefinemarknote}
-
-\def\dodefinemarknote[#1][#2]%
-  {\definemarking[mn:#1]%
-   \setvalue{mn:#1:n}{0}%
-   \getparameters
-     [mn:#1]
-     [\c!before=,
-      \c!after=,
-      \c!inbetween=\endgraf,
-      \c!command=\firstofoneargument,
-      #2]}
-
-\def\setmarknote[#1]#2%
-  {\doglobal\incrementvalue{mn:#1:n}%
-   \setgvalue{mn:#1:t:\getvalue{mn:#1:n}}{#2}%
-   \expanded{\marking[mn:#1]{\getvalue{mn:#1:n}}}}
-
-\def\flushmarknotes[#1]% assumes split
-  {\begingroup
-   \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}%
-   \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}%
-   \ifnum\firstmarknote<\lastmarknote\relax
-     \getvalue{mn:#1\c!before}%
-     \dostepwiserecurse\firstmarknote\lastmarknote\plusone
-       {\ifnum\recurselevel>\firstmarknote\relax
-          \ifnum\recurselevel<\lastmarknote\relax
-            \getvalue{mn:#1\c!inbetween}%
-          \fi
-        \fi
-        \getvalue{mn:#1\c!command}{\getvalue{mn:#1:t:\recurselevel}}}%
-     \getvalue{mn:#1\c!after}%
-   \fi
-   \endgroup}
-
-\def\erasemarknotes[#1]%
-  {\begingroup
-   \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}%
-   \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}%
-   \dostepwiserecurse\firstmarknote\lastmarknote\plusone
-     {\global\letvalue{mn:#1:t:\recurselevel}\empty}%
-   \endgroup}
-
-%D The next section implements synchronization of (currently
-%D two) output streams. In due time we will implement both a
-%D vertical and horizontal system, as well as alternative
-%D splitters (firstpagevsize, succesivevsize etc).
-
-\def\synchronizeoutputstreams[#1]% [one,two] [left,right]
-  {\bgroup
-   \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
-   \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
-   \forgeteverypar
-   \def\roundingeps{50sp}%
-   \getboxheight\dimen0\of\box\outputstreamtag\firstoutputstream
-   \getboxheight\dimen2\of\box\outputstreamtag\secondoutputstream
-   \scratchdimen\dimexpr\dimen0-\dimen2\relax
-   \ifdim\scratchdimen<-\roundingeps\relax
-     \scratchdimen-\scratchdimen
-     \writestatus{sync}{compensating first stream: \the\scratchdimen/\number\scratchdimen}%
-     \getroundednoflines\scratchdimen
-     \global\setbox\outputstreamtag\firstoutputstream\vbox
-       {\presetoutputstream
-        \unvbox\outputstreamtag\firstoutputstream\dorecurse\noflines\crlf}%
-   \else\ifdim\scratchdimen>\roundingeps\relax
-     \writestatus{sync}{compensating second stream: \the\scratchdimen/\number\scratchdimen}%
-     \getroundednoflines\scratchdimen
-     \global\setbox\outputstreamtag\secondoutputstream\vbox
-       {\presetoutputstream
-        \unvbox\outputstreamtag\secondoutputstream\dorecurse\noflines\crlf}%
-   \else
-      \writestatus{sync}{no need to compensate streams: \the\scratchdimen/\number\scratchdimen}%
-   \fi\fi
-   \egroup}
-
-\def\nofoutputstreamsplitlines  {\v!auto} % {40}
-\def\outputstreamsplittolerance {-5}
-
-\def\flushoutputstreampages[#1]%
-  {\bgroup
-   \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
-   \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
-   \doloop
-     {\flushoutputstreams[#1]%
-      \ifvoid\outputstreamtag\firstoutputstream
-        \ifvoid\outputstreamtag\secondoutputstream
-          \exitloop
-        \else
-          \global\setbox\outputstreamtag\firstoutputstream\vbox{\strut}%
-        \fi
-      \else
-        \ifvoid\outputstreamtag\secondoutputstream
-          \global\setbox\outputstreamtag\secondoutputstream\vbox{\strut}%
-        \else
-          % okay
-        \fi
-      \fi}%
-   \egroup}
-
-\def\flushoutputstreams[#1]%
-  {\bgroup
-   \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
-   \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
-   \doif\nofoutputstreamsplitlines\v!auto
-     {\getrawnoflines\textheight
-      \edef\nofoutputstreamsplitlines{\the\noflines}}%
-   \splittopskip\strutheight
-   \scratchdimen\nofoutputstreamsplitlines\lineheight\relax
-   \unless\iffalse
-     \dimen0\scratchdimen
-     \doloop
-       {\setbox4\copy\outputstreamtag\firstoutputstream
-        \setbox0\vsplit4 to \dimen0
-        \setbox0\vbox
-          {\directsetup{stream:\firstoutputstream:top}%
-           \unvbox0
-           \directsetup{stream:\firstoutputstream:bottom}}%
-        \ifdim\ht0>\scratchdimen
-          \advance\dimen0-\lineheight
-        \else
-          \exitloop
-        \fi}%
-     \scratchdimen\dimen0
-     \dimen2\scratchdimen
-     \doloop
-       {\setbox6\copy\outputstreamtag\secondoutputstream
-        \setbox2\vsplit6 to \dimen2
-        \setbox2\vbox
-          {\directsetup{stream:\secondoutputstream:top}%
-           \unvbox0
-           \directsetup{stream:\secondoutputstream:bottom}}%
-        \ifdim\ht2>\scratchdimen
-          \advance\dimen2-\lineheight
-        \else
-          \exitloop
-        \fi}%
-     \scratchdimen\dimen2
-   \fi
-   \setbox4\copy\outputstreamtag\firstoutputstream
-   \setbox6\copy\outputstreamtag\secondoutputstream
-   \scratchcounter\zerocount
-   \doloop
-     {\setbox0\vsplit4 to \scratchdimen
-      \setbox0\vbox{\unvbox0}%
-      \setbox2\vsplit6 to \scratchdimen
-      \setbox2\vbox{\unvbox2}%
-      \ifvoid4
-        \exitloop
-      \else\ifvoid6
-        \exitloop
-      \else
-          \dimen8=\dimexpr\ht4-\ht6\relax
-          \ifdim\dimen8<\zeropoint\dimen8=-\dimen8\relax\fi
-          \advance\scratchcounter\plusone
-          \ifdim\dimen8<.5\lineheight
-            \exitloop
-          \else\ifnum\outputstreamsplittolerance>\zeropoint
-            \ifnum\scratchcounter>\outputstreamsplittolerance\relax
-              \exitloop
-            \else
-              \advance\scratchdimen\lineheight
-            \fi
-          \else\ifnum\outputstreamsplittolerance<\zeropoint
-            \ifnum-\scratchcounter<\outputstreamsplittolerance\relax
-              \exitloop
-            \else
-              \advance\scratchdimen-\lineheight
-            \fi
-          \else\ifnum\outputstreamsplittolerance=\zeropoint
-            \exitloop
-          \fi\fi\fi\fi
-       \fi\fi}%
-   \setbox0\vsplit\outputstreamtag\firstoutputstream to \scratchdimen
-   \setbox0\vbox to \textheight
-     {\presetoutputstream
-      \directsetup{stream:\firstoutputstream:top}%
-      \unvbox0
-      \vfill
-      \directsetup{stream:\firstoutputstream:bottom}}%
-   \setbox2\vsplit\outputstreamtag\secondoutputstream to \scratchdimen
-   \setbox2\vbox to \textheight
-     {\presetoutputstream
-      \directsetup{stream:\secondoutputstream:top}%
-      \unvbox2
-      \vfill
-      \directsetup{stream:\secondoutputstream:bottom}}%
-   \directsetup{stream:\firstoutputstream:reset}%
-   \directsetup{stream:\secondoutputstream:reset}%
-   \page[even]
-   \box0\vfill\page
-   \box2\vfill\page
-   \egroup}
-
-    %D Although one can put floats in a stream, it sometimes makes sense
-    %D to keep them apart and this is what local floats do.
-
-    \def\setuplocalfloats
-      {\getparameters[\??lf]}
-
-    \setuplocalfloats
-      [%before=\blank,
-       %after=\blank,
-       inbetween=\blank]
-
-    \installfloathandler \v!local \somelocalfloat
-
-    \initializeboxstack{localfloats}
-
-    \newcounter\noflocalfloats
-
-    \def\resetlocalfloats
-      {\doglobal\newcounter\noflocalfloats
-       \initializeboxstack{localfloats}}
-
-    \def\somelocalfloat[#1]%
-      {\doglobal\increment\noflocalfloats
-       \savebox{localfloats}{\noflocalfloats}{\box\floatbox}}
-
-    \def\getlocalfloats
-      {\dorecurse\noflocalfloats
-         {\ifnum\recurselevel=\plusone % 1\relax
-            \getvalue{\??lf\c!before}%
-          \else
-            \getvalue{\??lf\c!inbetween}%
-          \fi
-          \dontleavehmode\hbox{\foundbox{localfloats}\recurselevel}%
-          \ifnum\recurselevel=\noflocalfloats\relax
-            \getvalue{\??lf\c!after}%
-          \fi}}
-
-    \def\flushlocalfloats
-      {\getlocalfloats
-       \resetlocalfloats}
-
-    \def\getlocalfloat#1{\expanded{\foundbox{localfloats}{\number#1}}}
-
-    \def\forcelocalfloats{\let\forcedfloatmethod\v!local}
-
-%D Because many arrangements are possible, we will implement
-%D some examples in a runtime loadable module \type {m-streams}.
-
-\protect \endinput
diff --git a/tex/context/base/page-txt.mkiv b/tex/context/base/page-txt.mkiv
index ab0370316..f4e2d76f9 100644
--- a/tex/context/base/page-txt.mkiv
+++ b/tex/context/base/page-txt.mkiv
@@ -19,8 +19,6 @@
 
 \unprotect
 
-\let\dodummypageskip\gobbleoneargument % obsolete
-
 %D Interfacing between this and other modules is handled by
 %D the following macros. The current state of a text line
 %D (header, footer, etc.) is checked by:
@@ -74,16 +72,18 @@
      \getparameters[\??tk#1#2][#3]%
    \else
     %\getparameters[\??tk#1\v!text][#2]%
-     \edef\previoustextstate{\getvalue{\??tk#1\c!state}}%
+     \edef\previoustextstate{\csname\??tk#1\c!state\endcsname}%
      \getparameters[\??tk#1][#2]%
-     \doifnotvalue{\??tk#1\c!state}\previoustextstate
-       {%\checkcurrentlayout % no
-        \edef\currenttextstate{\getvalue{\??tk#1\c!state}}%
-        % speed optimization (calculating backgrounds takes time)
-        \doifcommon{\previoustextstate,\currenttextstate}{\v!high,\v!none}
-          {\calculatevsizes
-           \recalculatebackgrounds
-           \recalculatelogos}}%
+     \edef\currenttextstate{\csname\??tk#1\c!state\endcsname}%
+     \ifx\currenttextstate\previoustextstate
+       % no change in state
+     \else
+       %\checkcurrentlayout % no
+       % speed optimization (calculating backgrounds takes time)
+       \doifcommon{\previoustextstate,\currenttextstate}{\v!high,\v!none}
+         {\calculatevsizes
+          \recalculatebackgrounds}%
+     \fi
    \fi}
 
 \def\setuptop    {\dotripleempty\dosetuplayouttext[\v!top]}
@@ -125,11 +125,11 @@
 %D \showsetup{setupfootertexts}
 %D \showsetup{setupbottomtexts}
 
-\def\setuptoptexts    {\dosixtupleempty\dosetuptexts[\v!top]}
-\def\setupheadertexts {\dosixtupleempty\dosetuptexts[\v!header]}
-\def\setuptexttexts   {\dosixtupleempty\dosetuptexts[\v!text]}
+\def\setuptoptexts    {\dosixtupleempty\dosetuptexts[\v!top    ]}
+\def\setupheadertexts {\dosixtupleempty\dosetuptexts[\v!header ]}
+\def\setuptexttexts   {\dosixtupleempty\dosetuptexts[\v!text   ]}
 \def\setupfootertexts {\dosixtupleempty\dosetuptexts[\v!footer ]}
-\def\setupbottomtexts {\dosixtupleempty\dosetuptexts[\v!bottom]}
+\def\setupbottomtexts {\dosixtupleempty\dosetuptexts[\v!bottom ]}
 
 %D The left, right and center variables can also be set
 %D directly using the previously discussed macros.
@@ -137,97 +137,78 @@
 \def\dosetuptexts[#1][#2][#3][#4][#5][#6]%
   {\ifsixthargument
      \setvalue{\??tk#1#2\c!lefttext}%
-       {\dodoubletexts{\??tk#1}{#2}%
+       {\dodoubletexts{#1}{#2}%
           {\c!leftstyle \c!leftcolor \c!leftwidth }{#3}%
           {\c!rightstyle\c!rightcolor\c!rightwidth}{#6}}%
      \setvalue{\??tk#1#2\c!righttext}%
-       {\dodoubletexts{\??tk#1}{#2}%
+       {\dodoubletexts{#1}{#2}%
           {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}%
           {\c!leftstyle \c!leftcolor \c!leftwidth }{#5}}%
    \else\iffifthargument
      \setvalue{\??tk#1\v!text\c!lefttext}%
-       {\dodoubletexts{\??tk#1}\v!text
+       {\dodoubletexts{#1}\v!text
           {\c!leftstyle \c!leftcolor \c!leftwidth }{#2}%
           {\c!rightstyle\c!rightcolor\c!rightwidth}{#5}}%
      \setvalue{\??tk#1\v!text\c!righttext}%
-       {\dodoubletexts{\??tk#1}\v!text
+       {\dodoubletexts{#1}\v!text
           {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}%
           {\c!leftstyle \c!leftcolor \c!leftwidth }{#4}}%
    \else\iffourthargument
      \setvalue{\??tk#1#2\c!lefttext}%
-       {\dodoubletexts{\??tk#1}{#2}
+       {\dodoubletexts{#1}{#2}
           {\c!leftstyle\c!leftcolor\c!leftwidth}{#3}%
           {\c!leftstyle\c!leftcolor\c!leftwidth}{#3}}%
      \setvalue{\??tk#1#2\c!righttext}%
-       {\dodoubletexts{\??tk#1}{#2}
+       {\dodoubletexts{#1}{#2}
           {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}%
           {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}}%
    \else\ifthirdargument
      \setvalue{\??tk#1\v!text\c!lefttext}%
-       {\dodoubletexts{\??tk#1}\v!text
+       {\dodoubletexts{#1}\v!text
           {\c!leftstyle\c!leftcolor\c!leftwidth}{#2}%
           {\c!leftstyle\c!leftcolor\c!leftwidth}{#2}}%
      \setvalue{\??tk#1\v!text\c!righttext}%
-       {\dodoubletexts{\??tk#1}\v!text
+       {\dodoubletexts{#1}\v!text
           {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}%
           {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}}%
    \else\ifsecondargument % new
-     \letvalue{\??tk#1\v!text\c!lefttext }\empty
-     \letvalue{\??tk#1\v!text\c!righttext}\empty
-     \setvalue{\??tk#1\v!text\c!middletext }%
-       {\dosingletexts{\??tk#1}\v!text\c!style\c!color\c!width{#2}}%
+     \letvalue{\??tk#1\v!text\c!lefttext  }\empty
+     \letvalue{\??tk#1\v!text\c!righttext }\empty
+     \setvalue{\??tk#1\v!text\c!middletext}{\dosingletexts{#1}\v!text\c!style\c!color\c!width{#2}}%
    \else
-     \dosixtupleempty\dosetuptexts[#1][\v!text][][][][]%
+     \dosixtupleempty\dosetuptexts[#1][\v!text  ][][][][]%
      \dosixtupleempty\dosetuptexts[#1][\v!margin][][][][]%
-     \dosixtupleempty\dosetuptexts[#1][\v!edge ][][][][]%
+     \dosixtupleempty\dosetuptexts[#1][\v!edge  ][][][][]%
    \fi\fi\fi\fi\fi}
 
 %D Left and right texts are swapped on odd and even pages, but
 %D only when double sided typesetting is enabled.
 
-\def\dodoubletexts#1#2#3#4#5#6%
-  {\doifoddpageelse
-     {\dosingletexts{#1}{#2}#3{#4}}  % #3 => provides three arguments
-     {\dosingletexts{#1}{#2}#5{#6}}} % #5 => provides three arguments
+\def\dodoubletexts{\doifoddpageelse\dodoubletextsodd\dodoubletextseven}
 
-%D The next macro will be cleaned up amd made less messy and
+\def\dodoubletextsodd #1#2#3#4#5#6{\dosingletexts{#1}{#2}#3{#4}} % #3 => provides three arguments
+\def\dodoubletextseven#1#2#3#4#5#6{\dosingletexts{#1}{#2}#5{#6}} % #5 => provides three arguments
+
+%D The next macro will be cleaned up and made less messy and
 %D dependent.
 
 \def\placetextlinestrut#1%
   {\doifvalue{#1\c!strut}\v!yes{\setstrut\strut}}
 
-% \def\dosingletexts#1#2#3#4#5#6%
-%   {\bgroup
-%    \defconvertedargument\ascii{#6}%
-%    \doifsomething\ascii
-%      {\doattributes{#1#2}#3#4%
-%         {\placetextlinestrut{#1}% here !
-%         %\doifdefinedelse{\??mk\ascii\c!coupling} % brrr
-%          \doifelsemarking\ascii
-%            {\dolimitatetexts{#1#2#5}{\getmarking[\ascii][\v!first]}}
-%            {\ConvertConstantAfter\doifelse\v!pagenumber{#6}
-%                \placelocationpagenumber % pretty low level
-%               {\ConvertConstantAfter\doifelse\v!date{#6}
-%                  {\currentdate}
-%                  {% #6{}{}{} -> {} needed for macros that look
-%                   % ahead, like \uniqueMPgraphic
-%                   \ignorecrlf\dolimitatetexts{#1#2#5}{#6{}{}{}}}}}}}%
-%   \egroup}
-
 \def\dosingletexts#1#2#3#4#5#6%
   {\bgroup
    \defconvertedargument\ascii{#6}% no longer \defconvertedargument
    \ifx\ascii\empty\else
-     \dostartattributes{#1#2}#3#4\empty
-       \placetextlinestrut{#1}% here !
+     \dostartattributes{\??tk#1#2}#3#4\empty
+       \placetextlinestrut{\??tk#1}% here !
        \doifelsemarking\ascii
-         {\dolimitatetexts{#1#2#5}{\getmarking[\ascii][\v!first]}}%
+         {\dolimitatetexts{\??tk#1#2#5}{\getmarking[\ascii][\v!first]}}%
          {\ifcsname\??tk->\ascii\endcsname
             \csname\??tk->\ascii\endcsname
           \else
             % #6{}{}{} -> {} needed for macros that look
             % ahead, like \uniqueMPgraphic
-            \ignorecrlf\dolimitatetexts{#1#2#5}{#6{}{}{}}%
+            \ignorecrlf\dolimitatetexts{\??tk#1#2#5}{#6{}{}{}}%
           \fi}%
      \dostopattributes
   \fi
@@ -240,7 +221,7 @@
 %D length.
 
 \def\dolimitatetexts#1#2%
-  {\doifelsevaluenothing{#1}{#2}{\limitatetext{#2}{\getvalue{#1}}{\unknown}}}
+  {\doifelsevaluenothing{#1}{#2}{\limitatetext{#2}{\csname#1\endcsname}{\unknown}}}
 
 %D The placement of text is hooked into the token lists
 %D associated to the area at hand.
@@ -255,24 +236,15 @@
 %D the \type {status} variable. This is handled by the next
 %D couple of macros.
 
-\def\settextlinestatus  #1{\edef\textlinestatus{\csname\??tk#1\c!state\endcsname}}
-%def\resettextlinestatus#1{\letgvalue{\??tk#1\c!state}\v!normal}
+\def\settextlinestatus#1%
+  {\edef\textlinestatus{\csname\??tk#1\c!state\endcsname}}
 
 \def\resettextlinestatus#1% postpone
-  {\setgvalue{\??tk#1\s!reset}{\letgvalue{\??tk#1\c!state}\v!normal}}
+  {\expandafter\gdef\csname\??tk#1\s!reset\endcsname{\global\expandafter\let\csname\??tk#1\c!state\endcsname\v!normal}}
 
 \def\placelayouttextline#1% #2
-  {\settextlinestatus{#1}%
-   \csname\string\placelayouttextline
-     \ifcsname\string\placelayouttextline\textlinestatus\endcsname
-       \textlinestatus
-     \else
-       \s!unknown
-     \fi
-   \endcsname{#1}} % {#2}
-
-% \def\doifelselayouttextline#1% shown or not
-%   {\doifinsetelse{\getvalue{\??tk#1\c!state}}{\v!normal,\v!start}}
+  {\settextlinestatus#1%
+   \csname\??tk::\ifcsname\??tk::\textlinestatus\endcsname\textlinestatus\else\s!unknown\fi\endcsname#1} % {#2}
 
 \def\doifelselayouttextline#1% shown or not
   {\edef\!!stringa{\csname\??tk#1\c!state\endcsname}%
@@ -298,50 +270,49 @@
 
 \newconditional\resyncaftertextline
 
-\setvalue{\string\placelayouttextline\v!normal }{\doplacelayouttextline}
-\setvalue{\string\placelayouttextline          }{\doplacelayouttextline}
+% there is no need for {#1} etc since we use symbolic names
 
-\setvalue{\string\placelayouttextline\v!none}#1#2%
-  {}
+\setvalue{\??tk::\v!normal}{\doplacelayouttextline}
+\setvalue{\??tk::\empty   }{\doplacelayouttextline}
 
-\setvalue{\string\placelayouttextline\v!high}#1#2%
-  {\global\settrue\resyncaftertextline
-   \resettextlinestatus{#1}}
+\setvalue{\??tk::\v!none  }#1#2{}
+\setvalue{\??tk::\v!stop  }#1#2{}
 
-\setvalue{\string\placelayouttextline\v!empty}#1#2%
-  {\resettextlinestatus{#1}}
+\setvalue{\??tk::\v!high}#1#2%
+  {\global\settrue\resyncaftertextline
+   \resettextlinestatus#1}
 
-\setvalue{\string\placelayouttextline\v!start}#1#2%
-  {\resettextlinestatus{#1}%
-   \doplacelayouttextline{#1}{#2}}
+\setvalue{\??tk::\v!empty}#1#2%
+  {\resettextlinestatus#1}
 
-\setvalue{\string\placelayouttextline\v!stop}#1#2%
-  {}
+\setvalue{\??tk::\v!start}#1#2%
+  {\resettextlinestatus#1%
+   \doplacelayouttextline#1#2}
 
-\setvalue{\string\placelayouttextline\v!nomarking}#1#2%
+\setvalue{\??tk::\v!nomarking}#1#2%
   {\bgroup
-   \resettextlinestatus{#1}%
+   \resettextlinestatus#1%
    \let\dogetmarking\nogetmarking
-   \doplacelayouttextline{#1}{#2}%
+   \doplacelayouttextline#1#2%
    \egroup}
 
-\setvalue{\string\placelayouttextline\s!unknown}#1#2%
+\setvalue{\??tk::\s!unknown}#1#2%
   {\global\settrue\resyncaftertextline
    \bgroup % new
-   \resettextlinestatus{#1}%
-   \getvalue{\??tk#1\textlinestatus}%
-   \getvalue{\??tk#1\v!text  \textlinestatus}%
-   \getvalue{\??tk#1\v!margin\textlinestatus}%
-   \getvalue{\??tk#1\v!edge  \textlinestatus}%
-   \doplacelayouttextline{#1}{#2}%
+   \resettextlinestatus#1%
+   \csname\??tk#1\textlinestatus\endcsname
+   \csname\??tk#1\v!text  \textlinestatus\endcsname
+   \csname\??tk#1\v!margin\textlinestatus\endcsname
+   \csname\??tk#1\v!edge  \textlinestatus\endcsname
+   \doplacelayouttextline#1#2%
    \egroup}
 
 %D The following macro has to be called after a page
 %D is flushed.
 
 \def\resetlayouttextline#1%
-  {\getvalue {\??tk#1\s!reset}%
-   \letgvalue{\??tk#1\s!reset}\relax}
+  {\csname\??tk#1\s!reset\endcsname
+   \global\expandafter\let\csname\??tk#1\s!reset\endcsname\relax}
 
 \def\resetlayouttextlines
   {\resetlayouttextline\v!top
@@ -350,9 +321,8 @@
    \resetlayouttextline\v!footer
    \resetlayouttextline\v!bottom
    \ifconditional\resyncaftertextline
-     \doglobal\calculatevsizes
+     \calculateglobalvsizes
      \recalculatebackgrounds
-     \recalculatelogos
      \global\setfalse\resyncaftertextline
    \fi}
 
@@ -458,15 +428,9 @@
          \egroup
          \mkprocesspagecontents{#2}%
          \settextpagecontent\scratchpagebox{#1}{#2}%
-         \setbox\scratchpagebox\vbox % can we avoid this extra box
-           {\startlayoutcomponent{textbody}{text body}%
-            \box\scratchpagebox
-            \stoplayoutcomponent}%
          \addtextbackground\scratchpagebox
          \addtextgridlayer\scratchpagebox
-         \localstarttextcolor % does not work in mkiv
          \box\scratchpagebox
-         \localstoptextcolor  % so we have to change this
          \bgroup
            \hskip\rightmargindistance
            \ifdim\rightmarginwidth>\zeropoint
@@ -486,17 +450,20 @@
 %D The main text area has to be combined with some additional
 %D (tracing) information.
 
-% will be overloaded in page-lyr
+% will be stored as normal and overloaded in page-lyr and later in
+% page-spr we overload the the stored version .. evenatually i will
+% clear up the experimental mess
 
 \def\settextpagecontent#1#2#3% #2 and #3 will disappear
   {\setbox#1\hbox to \makeupwidth
-     {\hss                        % so don't change this
-      \vbox to \textheight
+     {\hss                     % so don't change this
+      \setlayoutcomponentattribute\v!page\v!text
+      \vbox \layoutcomponentboxattribute to \textheight
         {\offinterlineskip
          \freezetextwidth
          \hsize\textwidth      % local variant of \sethsize
          \boxmaxdepth\maxdepth
-         \noindent                % content can be < \hsize
+         \noindent             % content can be < \hsize
          \dopagecontents#2#3}%
       \hss}%
    \dp#1\zeropoint}
@@ -506,17 +473,17 @@
   [grid=red,
    page=green]
 
-\def\addtextgridlayer#1% tzt run time
+\def\addtextgridlayer#1% to be checked for color and layer
   {\ifcase\showgridstate\else % 1=bottom 2=top
-     \setgridbox\scratchbox\makeupwidth\textheight
+     \startcolor[layout:grid]%
+     \setgridbox\scratchbox\makeupwidth\textheight % todo: check color
      \setbox#1\hbox
        {\ifcase\showgridstate\or\or\box#1\hskip-\makeupwidth\fi
         \bgroup % color
-        \startlayoutcomponent{gridcolumns}{grid columns}%
-        \incolortrue
         \ifcase\layoutcolumns\else
           \gray
-          \hbox to \makeupwidth
+          \setlayoutcomponentattribute\v!grid\v!columns
+          \hbox \layoutcomponentboxattribute to \makeupwidth
             {\dorecurse\layoutcolumns
                {\hskip\layoutcolumnwidth
                 \ifnum\recurselevel<\layoutcolumns
@@ -527,12 +494,11 @@
                 \fi}}%
           \hskip-\makeupwidth
         \fi
-        \stoplayoutcomponent
-        \startlayoutcomponent{gridlines}{grid lines}%
-        \startcolor[layout:grid]\box\scratchbox\stopcolor
-        \stoplayoutcomponent
+        \setlayoutcomponentattribute\v!grid\v!lines
+        \hbox \layoutcomponentboxattribute{\box\scratchbox}%
         \egroup
         \ifcase\showgridstate\or\hskip-\makeupwidth\box#1\fi}%
+      \stopcolor
    \fi}
 
 %D The placement of a whole line is handled by the next two
@@ -541,89 +507,158 @@
 
 \def\ignoredlinebreak{\unskip\space\ignorespaces}
 
+% \def\doplacelayouttextline#1#2%
+%   {\ifdim#2>\zeropoint\relax  % prevents pagenumbers when zero height
+%      \goleftonpage
+%      \hbox
+%        {\setbox\scratchpagebox\vbox to #2
+%           {\vsize#2\relax
+%            \normalbaselines
+%            \let\\\ignoredlinebreak
+%            \let\crlf\ignoredlinebreak
+%            \csname\??tk#1\c!before\endcsname
+%            \doifbothsidesoverruled
+%              {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\zerocount\plusone}
+%              {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\zerocount\plusone}
+%              {\dodoplacelayouttextline#1\c!righttext\c!middletext\c!lefttext \plusone\zerocount}%
+%            \csname\??tk#1\c!after\endcsname
+%            \kern\zeropoint}% keep the \dp, beware of \vtops, never change this!
+%         \dp\scratchpagebox\zeropoint
+%         \box\scratchpagebox}%
+%      \vskip-#2\relax
+%    \fi}
+%
+% \def\dodoplacelayouttextline#1#2#3#4#5#6% \hsize toegevoegd, \hss's niet meer wijzigen
+%   {\hbox
+%      {\ifdim\leftedgewidth>\zeropoint
+%         \dododoplacelayouttextline\leftedgewidth#1\v!edge
+%           {\hss\csname\??tk#1\v!edge#2\endcsname}%
+%         \hskip\leftedgedistance
+%       \fi
+%       \ifdim\leftmarginwidth>\zeropoint
+%         \dododoplacelayouttextline\leftmarginwidth#1\v!margin
+%           {\hbox to \leftmarginwidth
+%              {\hss\csname\??tk#1\v!margin#2\endcsname}%
+%            \hskip-\leftmarginwidth
+%            \hbox to \leftmarginwidth
+%              {\hss\ifcase#5\or\csname\??tk#1\v!margin\c!margintext\endcsname\fi}}%
+%         \hskip\leftmargindistance
+%       \fi
+%       \ifdim\makeupwidth>\zeropoint
+%         \dododoplacelayouttextline\makeupwidth{#1}\v!text
+%           {\hbox to \makeupwidth
+%              {\ifcase#5\or\@@nmpre{\csname\??tk#1\v!text\c!marginedgetext\endcsname}\fi
+%               \csname\??tk#1\v!text#2\endcsname\hss}%
+%            \hskip-\makeupwidth
+%            \hbox to \makeupwidth
+%              {\hss\csname\??tk#1\v!text#3\endcsname\hss}%
+%            \hskip-\makeupwidth
+%            \hbox to \makeupwidth
+%              {\hss\csname\??tk#1\v!text#4\endcsname
+%               \ifcase#6\or\@@nmpos{\csname\??tk#1\v!text\c!marginedgetext\endcsname}\fi}}%
+%       \fi
+%       \ifdim\rightmarginwidth>\zeropoint
+%         \hskip\rightmargindistance
+%         \dododoplacelayouttextline\rightmarginwidth{#1}\v!margin
+%           {\hbox to \rightmarginwidth
+%              {\csname\??tk#1\v!margin#4\endcsname\hss}%
+%            \hskip-\rightmarginwidth
+%            \hbox to \rightmarginwidth
+%              {\ifcase#6\or\csname\??tk#1\v!margin\c!margintext\endcsname\fi\hss}}%
+%       \fi
+%       \ifdim\rightedgewidth>\zeropoint
+%         \hskip\rightedgedistance
+%         \dododoplacelayouttextline\rightedgewidth{#1}\v!edge
+%           {\csname\??tk#1\v!edge#4\endcsname\hss}%
+%       \fi}}
+%
+% \def\dododoplacelayouttextline#1#2#3#4%
+%   {\vbox % to \vsize
+%      {\hsize#1\relax
+%       \csname\??tk#2#3\c!before\endcsname
+%       \setlayoutcomponentattribute#2#3%
+%       \hbox \layoutcomponentboxattribute to #1{#4}%
+%       \csname\??tk#2#3\c!after\endcsname}}
+
 \def\doplacelayouttextline#1#2%
-  {\ifdim#2>\zeropoint\relax  % prevents pagenumbers when zero height
-     \goleftonpage
-     \hbox
-       {\setbox\scratchpagebox\vbox to #2
-          {%\forgetall
-           \vsize#2\relax
-           \normalbaselines
-           \let\\\ignoredlinebreak
-           \let\crlf\ignoredlinebreak
-          %\getvalue{\??tk#1\v!text\c!before}%
-           \getvalue{\??tk#1\c!before}%
-           \doifbothsidesoverruled
-             {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\gobbleoneargument\getvalue}
-             {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\gobbleoneargument\getvalue}
-             {\dodoplacelayouttextline#1\c!righttext\c!middletext\c!lefttext \getvalue\gobbleoneargument}%
-          %\getvalue{\??tk#1\v!text\c!after}%
-           \getvalue{\??tk#1\c!after}%
-           \kern\zeropoint}% keep the \dp, beware of \vtops, never change this!
-        \dp\scratchpagebox\zeropoint
-        \box\scratchpagebox}%
-     \vskip-#2\relax
+  {\let\currentlayouttextline#1%
+   \ifdim#2>\zeropoint\relax  % prevents pagenumbers when zero height
+     \doplacelayouttextlineindeed{#2}%
    \fi}
 
-\def\dodoplacelayouttextline#1#2#3#4#5#6% \hsize toegevoegd, \hss's niet meer wijzigen
+\def\doplacelayouttextlineindeed#1%
+  {\goleftonpage
+   \hbox
+     {\setbox\scratchpagebox\vbox to #1
+        {\vsize#1\relax
+         \normalbaselines
+         \let\\\ignoredlinebreak
+         \let\crlf\ignoredlinebreak
+         \csname\??tk\currentlayouttextline\c!before\endcsname
+         \doifbothsidesoverruled\dodoplacelayouttextlineright\dodoplacelayouttextlineright\dodoplacelayouttextlineleft
+         \csname\??tk\currentlayouttextline\c!after\endcsname
+         \kern\zeropoint}% keep the \dp, beware of \vtops, never change this!
+      \dp\scratchpagebox\zeropoint
+      \box\scratchpagebox}%
+   \vskip-#1\relax}
+
+\def\dodoplacelayouttextlineright{\dodoplacelayouttextline\c!lefttext \c!middletext\c!righttext\zerocount\plusone}
+\def\dodoplacelayouttextlineleft {\dodoplacelayouttextline\c!righttext\c!middletext\c!lefttext \plusone\zerocount}
+
+\def\dodoplacelayouttextline#1#2#3#4#5% \hsize toegevoegd, \hss's niet meer wijzigen
   {\hbox
      {\ifdim\leftedgewidth>\zeropoint
-        \dododoplacelayouttextline\leftedgewidth{#1}\v!edge
-          {\hss\getvalue{\??tk#1\v!edge#2}}%
+        \dododoplacelayouttextline\leftedgewidth\currentlayouttextline\v!edge{\thelayoutleftedgeline#1}%
         \hskip\leftedgedistance
       \fi
       \ifdim\leftmarginwidth>\zeropoint
-        \dododoplacelayouttextline\leftmarginwidth{#1}\v!margin
-          {\hbox to \leftmarginwidth
-             {\hss\getvalue{\??tk#1\v!margin#2}}%
-           \hskip-\leftmarginwidth
-           \hbox to \leftmarginwidth
-             {\hss#5{\??tk#1\v!margin\c!margintext}}}%
+        \dododoplacelayouttextline\leftmarginwidth\currentlayouttextline\v!margin{\thelayoutleftmarginline#1#4}%
         \hskip\leftmargindistance
       \fi
       \ifdim\makeupwidth>\zeropoint
-        \dododoplacelayouttextline\makeupwidth{#1}\v!text
-          {\hbox to \makeupwidth
-             {\@@nmpre{#5{\??tk#1\v!text\c!marginedgetext}}%
-              \getvalue{\??tk#1\v!text#2}\hss}%
-           \hskip-\makeupwidth
-           \hbox to \makeupwidth
-             {\hss\getvalue{\??tk#1\v!text#3}\hss}%
-           \hskip-\makeupwidth
-           \hbox to \makeupwidth
-             {\hss\getvalue{\??tk#1\v!text#4}%
-              \@@nmpos{#6{\??tk#1\v!text\c!marginedgetext}}}}%
+        \dododoplacelayouttextline\makeupwidth\currentlayouttextline\v!text{\thelayouttextline#1#2#3#4#5}%
       \fi
       \ifdim\rightmarginwidth>\zeropoint
         \hskip\rightmargindistance
-        \dododoplacelayouttextline\rightmarginwidth{#1}\v!margin
-          {\hbox to \rightmarginwidth
-             {\getvalue{\??tk#1\v!margin#4}\hss}%
-           \hskip-\rightmarginwidth
-           \hbox to \rightmarginwidth
-             {#6{\??tk#1\v!margin\c!margintext}\hss}}%
+        \dododoplacelayouttextline\rightmarginwidth\currentlayouttextline\v!margin{\thelayoutrightmarginline#3#5}%
       \fi
       \ifdim\rightedgewidth>\zeropoint
         \hskip\rightedgedistance
-        \dododoplacelayouttextline\rightedgewidth{#1}\v!edge
-          {\getvalue{\??tk#1\v!edge#4}\hss}%
+        \dododoplacelayouttextline\rightedgewidth\currentlayouttextline\v!edge{\thelayoutrightedgeline#1}%
       \fi}}
 
-% \def\dododoplacelayouttextline#1#2#3#4%
-%   {\vbox % to \vsize
-%      {\hsize#1\relax
-%       \getvalue{\??tk#2#3\c!voor}
-%       \hbox to #1{#4}%
-%       \getvalue{\??tk#2#3\c!na}}}
+\def\thelayoutleftedgeline#1%
+  {\hss\csname\??tk\currentlayouttextline\v!edge#1\endcsname}%
+
+\def\thelayoutrightedgeline#1%
+  {\csname\??tk\currentlayouttextline\v!edge#1\endcsname\hss}
+
+\def\thelayoutleftmarginline#1#2%
+  {\hbox to \leftmarginwidth{\hss\csname\??tk\currentlayouttextline\v!margin#1\endcsname}%
+   \hskip-\leftmarginwidth
+   \hbox to \leftmarginwidth{\hss\ifcase#2\or\csname\??tk\currentlayouttextline\v!margin\c!margintext\endcsname\fi}}
+
+\def\thelayoutrightmarginline#1#2%
+  {\hbox to \rightmarginwidth{\csname\??tk\currentlayouttextline\v!margin#1\endcsname\hss}%
+   \hskip-\rightmarginwidth
+   \hbox to \rightmarginwidth{\ifcase#2\or\csname\??tk\currentlayouttextline\v!margin\c!margintext\endcsname\fi\hss}}
+
+\def\thelayoutedgetextline{\csname\??tk\currentlayouttextline\v!text\c!marginedgetext\endcsname}
+
+\def\thelayouttextline#1#2#3#4#5%
+  {\hbox to \makeupwidth{\ifcase#4\or\@@nmpre\thelayoutedgetextline\fi\csname\??tk\currentlayouttextline\v!text#1\endcsname\hss}%
+   \hskip-\makeupwidth
+   \hbox to \makeupwidth{\hss\csname\??tk\currentlayouttextline\v!text#2\endcsname\hss}%
+   \hskip-\makeupwidth
+   \hbox to \makeupwidth{\hss\csname\??tk\currentlayouttextline\v!text#3\endcsname\ifcase#5\or\@@nmpos\thelayoutedgetextline\fi}}
 
 \def\dododoplacelayouttextline#1#2#3#4%
   {\vbox % to \vsize
      {\hsize#1\relax
-      \getvalue{\??tk#2#3\c!before}%
-      \startlayoutcomponent{t:#2:#3}{area #2 #3}%
-        \hbox to #1{#4}%
-      \stoplayoutcomponent
-      \getvalue{\??tk#2#3\c!after}}}
+      \csname\??tk#2#3\c!before\endcsname
+      \setlayoutcomponentattribute#2#3%
+      \hbox \layoutcomponentboxattribute to #1{#4}%
+      \csname\??tk#2#3\c!after\endcsname}}
 
 %D Although it is far better to use backgrounds for this
 %D purpose, one can add a rule in the following way. This
@@ -649,19 +684,41 @@
 % \def\@@nmpos#1{\setbox0\hbox{#1}\ifdim\wd0=\zeropoint\else\tfskip\unhbox0\fi}
 
 % cleaner
-
-\def\@@nmpre#1{\doiftext{#1}{{#1}\tfskip}}
-\def\@@nmpos#1{\doiftext{#1}{\tfskip{#1}}}
-
+%
+% \def\@@nmpre#1{\doiftext{#1}{{#1}\tfskip}}
+% \def\@@nmpos#1{\doiftext{#1}{\tfskip{#1}}}
+%
 % newer
-
-\def\@@nmprepos#1#2#3#4#5%
-  {\doifelsenothing\@@nmwidth
-     {\doiftext{#5}{#1{#5}#2}}
-     {\doiftext{#5}{\hbox to \@@nmwidth{#3{#5}#4}}}}
-
-\def\@@nmpre{\@@nmprepos\empty\tfskip\relax\hss}
-\def\@@nmpos{\@@nmprepos\tfskip\empty\hss\relax}
+%
+% \def\@@nmprepos#1#2#3#4#5%
+%   {\doifelsenothing\@@nmwidth
+%      {\doiftext{#5}{#1{#5}#2}}
+%      {\doiftext{#5}{\hbox to \@@nmwidth{#3{#5}#4}}}}
+%
+% \def\@@nmpre{\@@nmprepos\empty\tfskip\relax\hss}
+% \def\@@nmpos{\@@nmprepos\tfskip\empty\hss\relax}
+%
+% faster
+
+\def\@@nmpre#1%
+  {\begingroup
+   \setbox\scratchbox\normalhbox{\trialtypesettingtrue\ignorespaces#1\removeunwantedspaces}%
+   \ifzeropt\wd\scratchbox\else
+     \doifelsenothing\@@nmwidth
+       {\box\scratchbox\tfskip}
+       {\hbox to \@@nmwidth{\box\scratchbox\hss}}%
+   \fi
+   \endgroup}
+
+\def\@@nmpos#1%
+  {\begingroup
+   \setbox\scratchbox\normalhbox{\trialtypesettingtrue\ignorespaces#1\removeunwantedspaces}%
+   \ifzeropt\wd\scratchbox\else
+     \doifelsenothing\@@nmwidth
+       {\tfskip\box\scratchbox}
+       {\hbox to \@@nmwidth{\hss\box\scratchbox}}%
+   \fi
+   \endgroup}
 
 %D This code will move to \type {page-flt.tex}.
 
@@ -768,21 +825,21 @@
   {\getparameters
      [\??tk#1#2]
      [%\c!state=\v!normal, % moved
-      \c!before=,  % both global and local are used
-      \c!after=,    % both global and local are used
-      \c!strut=, % the local one, not (yet) used
-      \c!style=\getvalue{\??tk#1\c!style},% hm, got lost
-      \c!color=\getvalue{\??tk#1\c!color},  % hm, got lost
+      \c!before=,% both global and local are used
+      \c!after=,%  both global and local are used
+      \c!strut=,%  the local one, not (yet) used
+      \c!style=\csname\??tk#1\c!style\endcsname,% hm, got lost
+      \c!color=\csname\??tk#1\c!color\endcsname,% hm, got lost
       \c!lefttext=,
       \c!middletext=,
       \c!righttext=,
       \c!marginedgetext=,
       \c!margintext=,
       \c!width=]%
-   \inheritparameter[\??tk#1#2][\c!leftstyle  ][\c!style ]%
-   \inheritparameter[\??tk#1#2][\c!rightstyle ][\c!style ]%
-   \inheritparameter[\??tk#1#2][\c!leftcolor   ][\c!color  ]%
-   \inheritparameter[\??tk#1#2][\c!rightcolor  ][\c!color  ]%
+   \inheritparameter[\??tk#1#2][\c!leftstyle ][\c!style ]%
+   \inheritparameter[\??tk#1#2][\c!rightstyle][\c!style ]%
+   \inheritparameter[\??tk#1#2][\c!leftcolor ][\c!color  ]%
+   \inheritparameter[\??tk#1#2][\c!rightcolor][\c!color  ]%
    \inheritparameter[\??tk#1#2][\c!leftwidth ][\c!width]%
    \inheritparameter[\??tk#1#2][\c!rightwidth][\c!width]}
 
diff --git a/tex/context/base/pdfr-def.mkii b/tex/context/base/pdfr-def.mkii
new file mode 100644
index 000000000..7554bda9e
--- /dev/null
+++ b/tex/context/base/pdfr-def.mkii
@@ -0,0 +1,843 @@
+% filename : pdfr-def.tex
+% comment  : generated by mtxrun --script chars --pdf
+% author   : Hans Hagen, PRAGMA-ADE, Hasselt NL
+% copyright: PRAGMA ADE / ConTeXt Development Team
+% license  : see context related readme files
+%
+\pdfglyphtounicode{space}{0020}%
+\pdfglyphtounicode{exclam}{0021}%
+\pdfglyphtounicode{quotedbl}{0022}%
+\pdfglyphtounicode{numbersign}{0023}%
+\pdfglyphtounicode{dollar}{0024}%
+\pdfglyphtounicode{percent}{0025}%
+\pdfglyphtounicode{ampersand}{0026}%
+\pdfglyphtounicode{quotesingle}{0027}%
+\pdfglyphtounicode{parenleft}{0028}%
+\pdfglyphtounicode{parenright}{0029}%
+\pdfglyphtounicode{asterisk}{002A}%
+\pdfglyphtounicode{plus}{002B}%
+\pdfglyphtounicode{comma}{002C}%
+\pdfglyphtounicode{hyphen}{002D}%
+\pdfglyphtounicode{period}{002E}%
+\pdfglyphtounicode{slash}{002F}%
+\pdfglyphtounicode{zero}{0030}%
+\pdfglyphtounicode{one}{0031}%
+\pdfglyphtounicode{two}{0032}%
+\pdfglyphtounicode{three}{0033}%
+\pdfglyphtounicode{four}{0034}%
+\pdfglyphtounicode{five}{0035}%
+\pdfglyphtounicode{six}{0036}%
+\pdfglyphtounicode{seven}{0037}%
+\pdfglyphtounicode{eight}{0038}%
+\pdfglyphtounicode{nine}{0039}%
+\pdfglyphtounicode{colon}{003A}%
+\pdfglyphtounicode{semicolon}{003B}%
+\pdfglyphtounicode{less}{003C}%
+\pdfglyphtounicode{equal}{003D}%
+\pdfglyphtounicode{greater}{003E}%
+\pdfglyphtounicode{question}{003F}%
+\pdfglyphtounicode{at}{0040}%
+\pdfglyphtounicode{A}{0041}%
+\pdfglyphtounicode{B}{0042}%
+\pdfglyphtounicode{C}{0043}%
+\pdfglyphtounicode{D}{0044}%
+\pdfglyphtounicode{E}{0045}%
+\pdfglyphtounicode{F}{0046}%
+\pdfglyphtounicode{G}{0047}%
+\pdfglyphtounicode{H}{0048}%
+\pdfglyphtounicode{I}{0049}%
+\pdfglyphtounicode{J}{004A}%
+\pdfglyphtounicode{K}{004B}%
+\pdfglyphtounicode{L}{004C}%
+\pdfglyphtounicode{M}{004D}%
+\pdfglyphtounicode{N}{004E}%
+\pdfglyphtounicode{O}{004F}%
+\pdfglyphtounicode{P}{0050}%
+\pdfglyphtounicode{Q}{0051}%
+\pdfglyphtounicode{R}{0052}%
+\pdfglyphtounicode{S}{0053}%
+\pdfglyphtounicode{T}{0054}%
+\pdfglyphtounicode{U}{0055}%
+\pdfglyphtounicode{V}{0056}%
+\pdfglyphtounicode{W}{0057}%
+\pdfglyphtounicode{X}{0058}%
+\pdfglyphtounicode{Y}{0059}%
+\pdfglyphtounicode{Z}{005A}%
+\pdfglyphtounicode{bracketleft}{005B}%
+\pdfglyphtounicode{backslash}{005C}%
+\pdfglyphtounicode{bracketright}{005D}%
+\pdfglyphtounicode{asciicircum}{005E}%
+\pdfglyphtounicode{underscore}{005F}%
+\pdfglyphtounicode{grave}{0060}%
+\pdfglyphtounicode{a}{0061}%
+\pdfglyphtounicode{b}{0062}%
+\pdfglyphtounicode{c}{0063}%
+\pdfglyphtounicode{d}{0064}%
+\pdfglyphtounicode{e}{0065}%
+\pdfglyphtounicode{f}{0066}%
+\pdfglyphtounicode{g}{0067}%
+\pdfglyphtounicode{h}{0068}%
+\pdfglyphtounicode{i}{0069}%
+\pdfglyphtounicode{j}{006A}%
+\pdfglyphtounicode{k}{006B}%
+\pdfglyphtounicode{l}{006C}%
+\pdfglyphtounicode{m}{006D}%
+\pdfglyphtounicode{n}{006E}%
+\pdfglyphtounicode{o}{006F}%
+\pdfglyphtounicode{p}{0070}%
+\pdfglyphtounicode{q}{0071}%
+\pdfglyphtounicode{r}{0072}%
+\pdfglyphtounicode{s}{0073}%
+\pdfglyphtounicode{t}{0074}%
+\pdfglyphtounicode{u}{0075}%
+\pdfglyphtounicode{v}{0076}%
+\pdfglyphtounicode{w}{0077}%
+\pdfglyphtounicode{x}{0078}%
+\pdfglyphtounicode{y}{0079}%
+\pdfglyphtounicode{z}{007A}%
+\pdfglyphtounicode{braceleft}{007B}%
+\pdfglyphtounicode{bar}{007C}%
+\pdfglyphtounicode{braceright}{007D}%
+\pdfglyphtounicode{asciitilde}{007E}%
+\pdfglyphtounicode{exclamdown}{00A1}%
+\pdfglyphtounicode{cent}{00A2}%
+\pdfglyphtounicode{sterling}{00A3}%
+\pdfglyphtounicode{currency}{00A4}%
+\pdfglyphtounicode{yen}{00A5}%
+\pdfglyphtounicode{brokenbar}{00A6}%
+\pdfglyphtounicode{section}{00A7}%
+\pdfglyphtounicode{dieresis}{00A8}%
+\pdfglyphtounicode{copyright}{00A9}%
+\pdfglyphtounicode{ordfeminine}{00AA}%
+\pdfglyphtounicode{guillemotleft}{00AB}%
+\pdfglyphtounicode{logicalnot}{00AC}%
+\pdfglyphtounicode{registered}{00AE}%
+\pdfglyphtounicode{macron}{00AF}%
+\pdfglyphtounicode{degree}{00B0}%
+\pdfglyphtounicode{plusminus}{00B1}%
+\pdfglyphtounicode{acute}{00B4}%
+\pdfglyphtounicode{mu}{00B5}%
+\pdfglyphtounicode{paragraph}{00B6}%
+\pdfglyphtounicode{periodcentered}{00B7}%
+\pdfglyphtounicode{cedilla}{00B8}%
+\pdfglyphtounicode{ordmasculine}{00BA}%
+\pdfglyphtounicode{guillemotright}{00BB}%
+\pdfglyphtounicode{onequarter}{00BC}%
+\pdfglyphtounicode{onehalf}{00BD}%
+\pdfglyphtounicode{threequarters}{00BE}%
+\pdfglyphtounicode{questiondown}{00BF}%
+\pdfglyphtounicode{Agrave}{00C0}%
+\pdfglyphtounicode{Aacute}{00C1}%
+\pdfglyphtounicode{Acircumflex}{00C2}%
+\pdfglyphtounicode{Atilde}{00C3}%
+\pdfglyphtounicode{Adieresis}{00C4}%
+\pdfglyphtounicode{Aring}{00C5}%
+\pdfglyphtounicode{AE}{00C6}%
+\pdfglyphtounicode{Ccedilla}{00C7}%
+\pdfglyphtounicode{Egrave}{00C8}%
+\pdfglyphtounicode{Eacute}{00C9}%
+\pdfglyphtounicode{Ecircumflex}{00CA}%
+\pdfglyphtounicode{Edieresis}{00CB}%
+\pdfglyphtounicode{Igrave}{00CC}%
+\pdfglyphtounicode{Iacute}{00CD}%
+\pdfglyphtounicode{Icircumflex}{00CE}%
+\pdfglyphtounicode{Idieresis}{00CF}%
+\pdfglyphtounicode{Eth}{00D0}%
+\pdfglyphtounicode{Ntilde}{00D1}%
+\pdfglyphtounicode{Ograve}{00D2}%
+\pdfglyphtounicode{Oacute}{00D3}%
+\pdfglyphtounicode{Ocircumflex}{00D4}%
+\pdfglyphtounicode{Otilde}{00D5}%
+\pdfglyphtounicode{Odieresis}{00D6}%
+\pdfglyphtounicode{multiply}{00D7}%
+\pdfglyphtounicode{Oslash}{00D8}%
+\pdfglyphtounicode{Ugrave}{00D9}%
+\pdfglyphtounicode{Uacute}{00DA}%
+\pdfglyphtounicode{Ucircumflex}{00DB}%
+\pdfglyphtounicode{Udieresis}{00DC}%
+\pdfglyphtounicode{Yacute}{00DD}%
+\pdfglyphtounicode{Thorn}{00DE}%
+\pdfglyphtounicode{germandbls}{00DF}%
+\pdfglyphtounicode{agrave}{00E0}%
+\pdfglyphtounicode{aacute}{00E1}%
+\pdfglyphtounicode{acircumflex}{00E2}%
+\pdfglyphtounicode{atilde}{00E3}%
+\pdfglyphtounicode{adieresis}{00E4}%
+\pdfglyphtounicode{aring}{00E5}%
+\pdfglyphtounicode{ae}{00E6}%
+\pdfglyphtounicode{ccedilla}{00E7}%
+\pdfglyphtounicode{egrave}{00E8}%
+\pdfglyphtounicode{eacute}{00E9}%
+\pdfglyphtounicode{ecircumflex}{00EA}%
+\pdfglyphtounicode{edieresis}{00EB}%
+\pdfglyphtounicode{igrave}{00EC}%
+\pdfglyphtounicode{iacute}{00ED}%
+\pdfglyphtounicode{icircumflex}{00EE}%
+\pdfglyphtounicode{idieresis}{00EF}%
+\pdfglyphtounicode{eth}{00F0}%
+\pdfglyphtounicode{ntilde}{00F1}%
+\pdfglyphtounicode{ograve}{00F2}%
+\pdfglyphtounicode{oacute}{00F3}%
+\pdfglyphtounicode{ocircumflex}{00F4}%
+\pdfglyphtounicode{otilde}{00F5}%
+\pdfglyphtounicode{odieresis}{00F6}%
+\pdfglyphtounicode{divide}{00F7}%
+\pdfglyphtounicode{oslash}{00F8}%
+\pdfglyphtounicode{ugrave}{00F9}%
+\pdfglyphtounicode{uacute}{00FA}%
+\pdfglyphtounicode{ucircumflex}{00FB}%
+\pdfglyphtounicode{udieresis}{00FC}%
+\pdfglyphtounicode{yacute}{00FD}%
+\pdfglyphtounicode{thorn}{00FE}%
+\pdfglyphtounicode{ydieresis}{00FF}%
+\pdfglyphtounicode{Amacron}{0100}%
+\pdfglyphtounicode{amacron}{0101}%
+\pdfglyphtounicode{Abreve}{0102}%
+\pdfglyphtounicode{abreve}{0103}%
+\pdfglyphtounicode{Aogonek}{0104}%
+\pdfglyphtounicode{aogonek}{0105}%
+\pdfglyphtounicode{Cacute}{0106}%
+\pdfglyphtounicode{cacute}{0107}%
+\pdfglyphtounicode{Ccircumflex}{0108}%
+\pdfglyphtounicode{ccircumflex}{0109}%
+\pdfglyphtounicode{Cdotaccent}{010A}%
+\pdfglyphtounicode{cdotaccent}{010B}%
+\pdfglyphtounicode{Ccaron}{010C}%
+\pdfglyphtounicode{ccaron}{010D}%
+\pdfglyphtounicode{Dcaron}{010E}%
+\pdfglyphtounicode{dcaron}{010F}%
+\pdfglyphtounicode{Dcroat}{0110}%
+\pdfglyphtounicode{dcroat}{0111}%
+\pdfglyphtounicode{Emacron}{0112}%
+\pdfglyphtounicode{emacron}{0113}%
+\pdfglyphtounicode{Ebreve}{0114}%
+\pdfglyphtounicode{ebreve}{0115}%
+\pdfglyphtounicode{Edotaccent}{0116}%
+\pdfglyphtounicode{edotaccent}{0117}%
+\pdfglyphtounicode{Eogonek}{0118}%
+\pdfglyphtounicode{eogonek}{0119}%
+\pdfglyphtounicode{Ecaron}{011A}%
+\pdfglyphtounicode{ecaron}{011B}%
+\pdfglyphtounicode{Gcircumflex}{011C}%
+\pdfglyphtounicode{gcircumflex}{011D}%
+\pdfglyphtounicode{Gbreve}{011E}%
+\pdfglyphtounicode{gbreve}{011F}%
+\pdfglyphtounicode{Gdotaccent}{0120}%
+\pdfglyphtounicode{gdotaccent}{0121}%
+\pdfglyphtounicode{Gcommaaccent}{0122}%
+\pdfglyphtounicode{gcommaaccent}{0123}%
+\pdfglyphtounicode{Hcircumflex}{0124}%
+\pdfglyphtounicode{hcircumflex}{0125}%
+\pdfglyphtounicode{Hbar}{0126}%
+\pdfglyphtounicode{hbar}{0127}%
+\pdfglyphtounicode{Itilde}{0128}%
+\pdfglyphtounicode{itilde}{0129}%
+\pdfglyphtounicode{Imacron}{012A}%
+\pdfglyphtounicode{imacron}{012B}%
+\pdfglyphtounicode{Ibreve}{012C}%
+\pdfglyphtounicode{ibreve}{012D}%
+\pdfglyphtounicode{Iogonek}{012E}%
+\pdfglyphtounicode{iogonek}{012F}%
+\pdfglyphtounicode{Idotaccent}{0130}%
+\pdfglyphtounicode{dotlessi}{0131}%
+\pdfglyphtounicode{IJ}{0132}%
+\pdfglyphtounicode{ij}{0133}%
+\pdfglyphtounicode{Jcircumflex}{0134}%
+\pdfglyphtounicode{jcircumflex}{0135}%
+\pdfglyphtounicode{Kcommaaccent}{0136}%
+\pdfglyphtounicode{kcommaaccent}{0137}%
+\pdfglyphtounicode{kgreenlandic}{0138}%
+\pdfglyphtounicode{Lacute}{0139}%
+\pdfglyphtounicode{lacute}{013A}%
+\pdfglyphtounicode{Lcommaaccent}{013B}%
+\pdfglyphtounicode{lcommaaccent}{013C}%
+\pdfglyphtounicode{Lcaron}{013D}%
+\pdfglyphtounicode{lcaron}{013E}%
+\pdfglyphtounicode{Ldot}{013F}%
+\pdfglyphtounicode{ldot}{0140}%
+\pdfglyphtounicode{Lslash}{0141}%
+\pdfglyphtounicode{lslash}{0142}%
+\pdfglyphtounicode{Nacute}{0143}%
+\pdfglyphtounicode{nacute}{0144}%
+\pdfglyphtounicode{Ncommaaccent}{0145}%
+\pdfglyphtounicode{ncommaaccent}{0146}%
+\pdfglyphtounicode{Ncaron}{0147}%
+\pdfglyphtounicode{ncaron}{0148}%
+\pdfglyphtounicode{napostrophe}{0149}%
+\pdfglyphtounicode{Eng}{014A}%
+\pdfglyphtounicode{eng}{014B}%
+\pdfglyphtounicode{Omacron}{014C}%
+\pdfglyphtounicode{omacron}{014D}%
+\pdfglyphtounicode{Obreve}{014E}%
+\pdfglyphtounicode{obreve}{014F}%
+\pdfglyphtounicode{Ohungarumlaut}{0150}%
+\pdfglyphtounicode{ohungarumlaut}{0151}%
+\pdfglyphtounicode{OE}{0152}%
+\pdfglyphtounicode{oe}{0153}%
+\pdfglyphtounicode{Racute}{0154}%
+\pdfglyphtounicode{racute}{0155}%
+\pdfglyphtounicode{Rcommaaccent}{0156}%
+\pdfglyphtounicode{rcommaaccent}{0157}%
+\pdfglyphtounicode{Rcaron}{0158}%
+\pdfglyphtounicode{rcaron}{0159}%
+\pdfglyphtounicode{Sacute}{015A}%
+\pdfglyphtounicode{sacute}{015B}%
+\pdfglyphtounicode{Scircumflex}{015C}%
+\pdfglyphtounicode{scircumflex}{015D}%
+\pdfglyphtounicode{Scedilla}{015E}%
+\pdfglyphtounicode{scedilla}{015F}%
+\pdfglyphtounicode{Scaron}{0160}%
+\pdfglyphtounicode{scaron}{0161}%
+\pdfglyphtounicode{Tcommaaccent}{0162}%
+\pdfglyphtounicode{tcommaaccent}{0163}%
+\pdfglyphtounicode{Tcaron}{0164}%
+\pdfglyphtounicode{tcaron}{0165}%
+\pdfglyphtounicode{Tbar}{0166}%
+\pdfglyphtounicode{tbar}{0167}%
+\pdfglyphtounicode{Utilde}{0168}%
+\pdfglyphtounicode{utilde}{0169}%
+\pdfglyphtounicode{Umacron}{016A}%
+\pdfglyphtounicode{umacron}{016B}%
+\pdfglyphtounicode{Ubreve}{016C}%
+\pdfglyphtounicode{ubreve}{016D}%
+\pdfglyphtounicode{Uring}{016E}%
+\pdfglyphtounicode{uring}{016F}%
+\pdfglyphtounicode{Uhungarumlaut}{0170}%
+\pdfglyphtounicode{uhungarumlaut}{0171}%
+\pdfglyphtounicode{Uogonek}{0172}%
+\pdfglyphtounicode{uogonek}{0173}%
+\pdfglyphtounicode{Wcircumflex}{0174}%
+\pdfglyphtounicode{wcircumflex}{0175}%
+\pdfglyphtounicode{Ycircumflex}{0176}%
+\pdfglyphtounicode{ycircumflex}{0177}%
+\pdfglyphtounicode{Ydieresis}{0178}%
+\pdfglyphtounicode{Zacute}{0179}%
+\pdfglyphtounicode{zacute}{017A}%
+\pdfglyphtounicode{Zdotaccent}{017B}%
+\pdfglyphtounicode{zdotaccent}{017C}%
+\pdfglyphtounicode{Zcaron}{017D}%
+\pdfglyphtounicode{zcaron}{017E}%
+\pdfglyphtounicode{longs}{017F}%
+\pdfglyphtounicode{florin}{0192}%
+\pdfglyphtounicode{Ohorn}{01A0}%
+\pdfglyphtounicode{ohorn}{01A1}%
+\pdfglyphtounicode{Uhorn}{01AF}%
+\pdfglyphtounicode{uhorn}{01B0}%
+\pdfglyphtounicode{Gcaron}{01E6}%
+\pdfglyphtounicode{gcaron}{01E7}%
+\pdfglyphtounicode{Aringacute}{01FA}%
+\pdfglyphtounicode{aringacute}{01FB}%
+\pdfglyphtounicode{AEacute}{01FC}%
+\pdfglyphtounicode{aeacute}{01FD}%
+\pdfglyphtounicode{Oslashacute}{01FE}%
+\pdfglyphtounicode{oslashacute}{01FF}%
+\pdfglyphtounicode{Scommaaccent}{0218}%
+\pdfglyphtounicode{scommaaccent}{0219}%
+\pdfglyphtounicode{afii57929}{02BC}%
+\pdfglyphtounicode{afii64937}{02BD}%
+\pdfglyphtounicode{circumflex}{02C6}%
+\pdfglyphtounicode{caron}{02C7}%
+\pdfglyphtounicode{breve}{02D8}%
+\pdfglyphtounicode{dotaccent}{02D9}%
+\pdfglyphtounicode{ring}{02DA}%
+\pdfglyphtounicode{ogonek}{02DB}%
+\pdfglyphtounicode{tilde}{02DC}%
+\pdfglyphtounicode{hungarumlaut}{02DD}%
+\pdfglyphtounicode{gravecomb}{0300}%
+\pdfglyphtounicode{acutecomb}{0301}%
+\pdfglyphtounicode{tildecomb}{0303}%
+\pdfglyphtounicode{hookabovecomb}{0309}%
+\pdfglyphtounicode{dotbelowcomb}{0323}%
+\pdfglyphtounicode{tonos}{0384}%
+\pdfglyphtounicode{dieresistonos}{0385}%
+\pdfglyphtounicode{Alphatonos}{0386}%
+\pdfglyphtounicode{anoteleia}{0387}%
+\pdfglyphtounicode{Epsilontonos}{0388}%
+\pdfglyphtounicode{Etatonos}{0389}%
+\pdfglyphtounicode{Iotatonos}{038A}%
+\pdfglyphtounicode{Omicrontonos}{038C}%
+\pdfglyphtounicode{Upsilontonos}{038E}%
+\pdfglyphtounicode{Omegatonos}{038F}%
+\pdfglyphtounicode{iotadieresistonos}{0390}%
+\pdfglyphtounicode{Alpha}{0391}%
+\pdfglyphtounicode{Beta}{0392}%
+\pdfglyphtounicode{Gamma}{0393}%
+\pdfglyphtounicode{Epsilon}{0395}%
+\pdfglyphtounicode{Zeta}{0396}%
+\pdfglyphtounicode{Eta}{0397}%
+\pdfglyphtounicode{Theta}{0398}%
+\pdfglyphtounicode{Iota}{0399}%
+\pdfglyphtounicode{Kappa}{039A}%
+\pdfglyphtounicode{Lambda}{039B}%
+\pdfglyphtounicode{Mu}{039C}%
+\pdfglyphtounicode{Nu}{039D}%
+\pdfglyphtounicode{Xi}{039E}%
+\pdfglyphtounicode{Omicron}{039F}%
+\pdfglyphtounicode{Pi}{03A0}%
+\pdfglyphtounicode{Rho}{03A1}%
+\pdfglyphtounicode{Sigma}{03A3}%
+\pdfglyphtounicode{Tau}{03A4}%
+\pdfglyphtounicode{Upsilon}{03A5}%
+\pdfglyphtounicode{Phi}{03A6}%
+\pdfglyphtounicode{Chi}{03A7}%
+\pdfglyphtounicode{Psi}{03A8}%
+\pdfglyphtounicode{Iotadieresis}{03AA}%
+\pdfglyphtounicode{Upsilondieresis}{03AB}%
+\pdfglyphtounicode{alphatonos}{03AC}%
+\pdfglyphtounicode{epsilontonos}{03AD}%
+\pdfglyphtounicode{etatonos}{03AE}%
+\pdfglyphtounicode{iotatonos}{03AF}%
+\pdfglyphtounicode{upsilondieresistonos}{03B0}%
+\pdfglyphtounicode{alpha}{03B1}%
+\pdfglyphtounicode{beta}{03B2}%
+\pdfglyphtounicode{gamma}{03B3}%
+\pdfglyphtounicode{delta}{03B4}%
+\pdfglyphtounicode{epsilon}{03B5}%
+\pdfglyphtounicode{zeta}{03B6}%
+\pdfglyphtounicode{eta}{03B7}%
+\pdfglyphtounicode{theta}{03B8}%
+\pdfglyphtounicode{iota}{03B9}%
+\pdfglyphtounicode{kappa}{03BA}%
+\pdfglyphtounicode{lambda}{03BB}%
+\pdfglyphtounicode{nu}{03BD}%
+\pdfglyphtounicode{xi}{03BE}%
+\pdfglyphtounicode{omicron}{03BF}%
+\pdfglyphtounicode{pi}{03C0}%
+\pdfglyphtounicode{rho}{03C1}%
+\pdfglyphtounicode{sigma1}{03C2}%
+\pdfglyphtounicode{sigma}{03C3}%
+\pdfglyphtounicode{tau}{03C4}%
+\pdfglyphtounicode{upsilon}{03C5}%
+\pdfglyphtounicode{phi}{03C6}%
+\pdfglyphtounicode{chi}{03C7}%
+\pdfglyphtounicode{psi}{03C8}%
+\pdfglyphtounicode{omega}{03C9}%
+\pdfglyphtounicode{iotadieresis}{03CA}%
+\pdfglyphtounicode{upsilondieresis}{03CB}%
+\pdfglyphtounicode{omicrontonos}{03CC}%
+\pdfglyphtounicode{upsilontonos}{03CD}%
+\pdfglyphtounicode{omegatonos}{03CE}%
+\pdfglyphtounicode{theta1}{03D1}%
+\pdfglyphtounicode{Upsilon1}{03D2}%
+\pdfglyphtounicode{phi1}{03D5}%
+\pdfglyphtounicode{omega1}{03D6}%
+\pdfglyphtounicode{afii10023}{0401}%
+\pdfglyphtounicode{afii10051}{0402}%
+\pdfglyphtounicode{afii10052}{0403}%
+\pdfglyphtounicode{afii10053}{0404}%
+\pdfglyphtounicode{afii10054}{0405}%
+\pdfglyphtounicode{afii10055}{0406}%
+\pdfglyphtounicode{afii10056}{0407}%
+\pdfglyphtounicode{afii10057}{0408}%
+\pdfglyphtounicode{afii10058}{0409}%
+\pdfglyphtounicode{afii10059}{040A}%
+\pdfglyphtounicode{afii10060}{040B}%
+\pdfglyphtounicode{afii10061}{040C}%
+\pdfglyphtounicode{afii10062}{040E}%
+\pdfglyphtounicode{afii10145}{040F}%
+\pdfglyphtounicode{afii10017}{0410}%
+\pdfglyphtounicode{afii10018}{0411}%
+\pdfglyphtounicode{afii10019}{0412}%
+\pdfglyphtounicode{afii10020}{0413}%
+\pdfglyphtounicode{afii10021}{0414}%
+\pdfglyphtounicode{afii10022}{0415}%
+\pdfglyphtounicode{afii10024}{0416}%
+\pdfglyphtounicode{afii10025}{0417}%
+\pdfglyphtounicode{afii10026}{0418}%
+\pdfglyphtounicode{afii10027}{0419}%
+\pdfglyphtounicode{afii10028}{041A}%
+\pdfglyphtounicode{afii10029}{041B}%
+\pdfglyphtounicode{afii10030}{041C}%
+\pdfglyphtounicode{afii10031}{041D}%
+\pdfglyphtounicode{afii10032}{041E}%
+\pdfglyphtounicode{afii10033}{041F}%
+\pdfglyphtounicode{afii10034}{0420}%
+\pdfglyphtounicode{afii10035}{0421}%
+\pdfglyphtounicode{afii10036}{0422}%
+\pdfglyphtounicode{afii10037}{0423}%
+\pdfglyphtounicode{afii10038}{0424}%
+\pdfglyphtounicode{afii10039}{0425}%
+\pdfglyphtounicode{afii10040}{0426}%
+\pdfglyphtounicode{afii10041}{0427}%
+\pdfglyphtounicode{afii10042}{0428}%
+\pdfglyphtounicode{afii10043}{0429}%
+\pdfglyphtounicode{afii10044}{042A}%
+\pdfglyphtounicode{afii10045}{042B}%
+\pdfglyphtounicode{afii10046}{042C}%
+\pdfglyphtounicode{afii10047}{042D}%
+\pdfglyphtounicode{afii10048}{042E}%
+\pdfglyphtounicode{afii10049}{042F}%
+\pdfglyphtounicode{afii10065}{0430}%
+\pdfglyphtounicode{afii10066}{0431}%
+\pdfglyphtounicode{afii10067}{0432}%
+\pdfglyphtounicode{afii10068}{0433}%
+\pdfglyphtounicode{afii10069}{0434}%
+\pdfglyphtounicode{afii10070}{0435}%
+\pdfglyphtounicode{afii10072}{0436}%
+\pdfglyphtounicode{afii10073}{0437}%
+\pdfglyphtounicode{afii10074}{0438}%
+\pdfglyphtounicode{afii10075}{0439}%
+\pdfglyphtounicode{afii10076}{043A}%
+\pdfglyphtounicode{afii10077}{043B}%
+\pdfglyphtounicode{afii10078}{043C}%
+\pdfglyphtounicode{afii10079}{043D}%
+\pdfglyphtounicode{afii10080}{043E}%
+\pdfglyphtounicode{afii10081}{043F}%
+\pdfglyphtounicode{afii10082}{0440}%
+\pdfglyphtounicode{afii10083}{0441}%
+\pdfglyphtounicode{afii10084}{0442}%
+\pdfglyphtounicode{afii10085}{0443}%
+\pdfglyphtounicode{afii10086}{0444}%
+\pdfglyphtounicode{afii10087}{0445}%
+\pdfglyphtounicode{afii10088}{0446}%
+\pdfglyphtounicode{afii10089}{0447}%
+\pdfglyphtounicode{afii10090}{0448}%
+\pdfglyphtounicode{afii10091}{0449}%
+\pdfglyphtounicode{afii10092}{044A}%
+\pdfglyphtounicode{afii10093}{044B}%
+\pdfglyphtounicode{afii10094}{044C}%
+\pdfglyphtounicode{afii10095}{044D}%
+\pdfglyphtounicode{afii10096}{044E}%
+\pdfglyphtounicode{afii10097}{044F}%
+\pdfglyphtounicode{afii10071}{0451}%
+\pdfglyphtounicode{afii10099}{0452}%
+\pdfglyphtounicode{afii10100}{0453}%
+\pdfglyphtounicode{afii10101}{0454}%
+\pdfglyphtounicode{afii10102}{0455}%
+\pdfglyphtounicode{afii10103}{0456}%
+\pdfglyphtounicode{afii10104}{0457}%
+\pdfglyphtounicode{afii10105}{0458}%
+\pdfglyphtounicode{afii10106}{0459}%
+\pdfglyphtounicode{afii10107}{045A}%
+\pdfglyphtounicode{afii10108}{045B}%
+\pdfglyphtounicode{afii10109}{045C}%
+\pdfglyphtounicode{afii10110}{045E}%
+\pdfglyphtounicode{afii10193}{045F}%
+\pdfglyphtounicode{afii10146}{0462}%
+\pdfglyphtounicode{afii10194}{0463}%
+\pdfglyphtounicode{afii10147}{0472}%
+\pdfglyphtounicode{afii10195}{0473}%
+\pdfglyphtounicode{afii10148}{0474}%
+\pdfglyphtounicode{afii10196}{0475}%
+\pdfglyphtounicode{afii10050}{0490}%
+\pdfglyphtounicode{afii10098}{0491}%
+\pdfglyphtounicode{afii10846}{04D9}%
+\pdfglyphtounicode{afii57799}{05B0}%
+\pdfglyphtounicode{afii57801}{05B1}%
+\pdfglyphtounicode{afii57800}{05B2}%
+\pdfglyphtounicode{afii57802}{05B3}%
+\pdfglyphtounicode{afii57793}{05B4}%
+\pdfglyphtounicode{afii57794}{05B5}%
+\pdfglyphtounicode{afii57795}{05B6}%
+\pdfglyphtounicode{afii57798}{05B7}%
+\pdfglyphtounicode{afii57797}{05B8}%
+\pdfglyphtounicode{afii57806}{05B9}%
+\pdfglyphtounicode{afii57796}{05BB}%
+\pdfglyphtounicode{afii57807}{05BC}%
+\pdfglyphtounicode{afii57839}{05BD}%
+\pdfglyphtounicode{afii57645}{05BE}%
+\pdfglyphtounicode{afii57841}{05BF}%
+\pdfglyphtounicode{afii57842}{05C0}%
+\pdfglyphtounicode{afii57804}{05C1}%
+\pdfglyphtounicode{afii57803}{05C2}%
+\pdfglyphtounicode{afii57658}{05C3}%
+\pdfglyphtounicode{afii57664}{05D0}%
+\pdfglyphtounicode{afii57665}{05D1}%
+\pdfglyphtounicode{afii57666}{05D2}%
+\pdfglyphtounicode{afii57667}{05D3}%
+\pdfglyphtounicode{afii57668}{05D4}%
+\pdfglyphtounicode{afii57669}{05D5}%
+\pdfglyphtounicode{afii57670}{05D6}%
+\pdfglyphtounicode{afii57671}{05D7}%
+\pdfglyphtounicode{afii57672}{05D8}%
+\pdfglyphtounicode{afii57673}{05D9}%
+\pdfglyphtounicode{afii57674}{05DA}%
+\pdfglyphtounicode{afii57675}{05DB}%
+\pdfglyphtounicode{afii57676}{05DC}%
+\pdfglyphtounicode{afii57677}{05DD}%
+\pdfglyphtounicode{afii57678}{05DE}%
+\pdfglyphtounicode{afii57679}{05DF}%
+\pdfglyphtounicode{afii57680}{05E0}%
+\pdfglyphtounicode{afii57681}{05E1}%
+\pdfglyphtounicode{afii57682}{05E2}%
+\pdfglyphtounicode{afii57683}{05E3}%
+\pdfglyphtounicode{afii57684}{05E4}%
+\pdfglyphtounicode{afii57685}{05E5}%
+\pdfglyphtounicode{afii57686}{05E6}%
+\pdfglyphtounicode{afii57687}{05E7}%
+\pdfglyphtounicode{afii57688}{05E8}%
+\pdfglyphtounicode{afii57689}{05E9}%
+\pdfglyphtounicode{afii57690}{05EA}%
+\pdfglyphtounicode{afii57716}{05F0}%
+\pdfglyphtounicode{afii57717}{05F1}%
+\pdfglyphtounicode{afii57718}{05F2}%
+\pdfglyphtounicode{afii57388}{060C}%
+\pdfglyphtounicode{afii57403}{061B}%
+\pdfglyphtounicode{afii57407}{061F}%
+\pdfglyphtounicode{afii57409}{0621}%
+\pdfglyphtounicode{afii57410}{0622}%
+\pdfglyphtounicode{afii57411}{0623}%
+\pdfglyphtounicode{afii57412}{0624}%
+\pdfglyphtounicode{afii57413}{0625}%
+\pdfglyphtounicode{afii57414}{0626}%
+\pdfglyphtounicode{afii57415}{0627}%
+\pdfglyphtounicode{afii57416}{0628}%
+\pdfglyphtounicode{afii57417}{0629}%
+\pdfglyphtounicode{afii57418}{062A}%
+\pdfglyphtounicode{afii57419}{062B}%
+\pdfglyphtounicode{afii57420}{062C}%
+\pdfglyphtounicode{afii57421}{062D}%
+\pdfglyphtounicode{afii57422}{062E}%
+\pdfglyphtounicode{afii57423}{062F}%
+\pdfglyphtounicode{afii57424}{0630}%
+\pdfglyphtounicode{afii57425}{0631}%
+\pdfglyphtounicode{afii57426}{0632}%
+\pdfglyphtounicode{afii57427}{0633}%
+\pdfglyphtounicode{afii57428}{0634}%
+\pdfglyphtounicode{afii57429}{0635}%
+\pdfglyphtounicode{afii57430}{0636}%
+\pdfglyphtounicode{afii57431}{0637}%
+\pdfglyphtounicode{afii57432}{0638}%
+\pdfglyphtounicode{afii57433}{0639}%
+\pdfglyphtounicode{afii57434}{063A}%
+\pdfglyphtounicode{afii57440}{0640}%
+\pdfglyphtounicode{afii57441}{0641}%
+\pdfglyphtounicode{afii57442}{0642}%
+\pdfglyphtounicode{afii57443}{0643}%
+\pdfglyphtounicode{afii57444}{0644}%
+\pdfglyphtounicode{afii57445}{0645}%
+\pdfglyphtounicode{afii57446}{0646}%
+\pdfglyphtounicode{afii57470}{0647}%
+\pdfglyphtounicode{afii57448}{0648}%
+\pdfglyphtounicode{afii57449}{0649}%
+\pdfglyphtounicode{afii57450}{064A}%
+\pdfglyphtounicode{afii57451}{064B}%
+\pdfglyphtounicode{afii57452}{064C}%
+\pdfglyphtounicode{afii57453}{064D}%
+\pdfglyphtounicode{afii57454}{064E}%
+\pdfglyphtounicode{afii57455}{064F}%
+\pdfglyphtounicode{afii57456}{0650}%
+\pdfglyphtounicode{afii57457}{0651}%
+\pdfglyphtounicode{afii57458}{0652}%
+\pdfglyphtounicode{afii57392}{0660}%
+\pdfglyphtounicode{afii57393}{0661}%
+\pdfglyphtounicode{afii57394}{0662}%
+\pdfglyphtounicode{afii57395}{0663}%
+\pdfglyphtounicode{afii57396}{0664}%
+\pdfglyphtounicode{afii57397}{0665}%
+\pdfglyphtounicode{afii57398}{0666}%
+\pdfglyphtounicode{afii57399}{0667}%
+\pdfglyphtounicode{afii57400}{0668}%
+\pdfglyphtounicode{afii57401}{0669}%
+\pdfglyphtounicode{afii57381}{066A}%
+\pdfglyphtounicode{afii63167}{066D}%
+\pdfglyphtounicode{afii57511}{0679}%
+\pdfglyphtounicode{afii57506}{067E}%
+\pdfglyphtounicode{afii57507}{0686}%
+\pdfglyphtounicode{afii57512}{0688}%
+\pdfglyphtounicode{afii57513}{0691}%
+\pdfglyphtounicode{afii57508}{0698}%
+\pdfglyphtounicode{afii57505}{06A4}%
+\pdfglyphtounicode{afii57509}{06AF}%
+\pdfglyphtounicode{afii57514}{06BA}%
+\pdfglyphtounicode{afii57519}{06D2}%
+\pdfglyphtounicode{afii57534}{06D5}%
+\pdfglyphtounicode{Wgrave}{1E80}%
+\pdfglyphtounicode{wgrave}{1E81}%
+\pdfglyphtounicode{Wacute}{1E82}%
+\pdfglyphtounicode{wacute}{1E83}%
+\pdfglyphtounicode{Wdieresis}{1E84}%
+\pdfglyphtounicode{wdieresis}{1E85}%
+\pdfglyphtounicode{Ygrave}{1EF2}%
+\pdfglyphtounicode{ygrave}{1EF3}%
+\pdfglyphtounicode{afii61664}{200C}%
+\pdfglyphtounicode{afii301}{200D}%
+\pdfglyphtounicode{afii299}{200E}%
+\pdfglyphtounicode{afii300}{200F}%
+\pdfglyphtounicode{figuredash}{2012}%
+\pdfglyphtounicode{endash}{2013}%
+\pdfglyphtounicode{emdash}{2014}%
+\pdfglyphtounicode{afii208}{2015}%
+\pdfglyphtounicode{underscoredbl}{2017}%
+\pdfglyphtounicode{quoteleft}{2018}%
+\pdfglyphtounicode{quoteright}{2019}%
+\pdfglyphtounicode{quotesinglbase}{201A}%
+\pdfglyphtounicode{quotereversed}{201B}%
+\pdfglyphtounicode{quotedblleft}{201C}%
+\pdfglyphtounicode{quotedblright}{201D}%
+\pdfglyphtounicode{quotedblbase}{201E}%
+\pdfglyphtounicode{dagger}{2020}%
+\pdfglyphtounicode{daggerdbl}{2021}%
+\pdfglyphtounicode{bullet}{2022}%
+\pdfglyphtounicode{onedotenleader}{2024}%
+\pdfglyphtounicode{twodotenleader}{2025}%
+\pdfglyphtounicode{ellipsis}{2026}%
+\pdfglyphtounicode{afii61573}{202C}%
+\pdfglyphtounicode{afii61574}{202D}%
+\pdfglyphtounicode{afii61575}{202E}%
+\pdfglyphtounicode{perthousand}{2030}%
+\pdfglyphtounicode{minute}{2032}%
+\pdfglyphtounicode{second}{2033}%
+\pdfglyphtounicode{guilsinglleft}{2039}%
+\pdfglyphtounicode{guilsinglright}{203A}%
+\pdfglyphtounicode{exclamdbl}{203C}%
+\pdfglyphtounicode{fraction}{2044}%
+\pdfglyphtounicode{colonmonetary}{20A1}%
+\pdfglyphtounicode{franc}{20A3}%
+\pdfglyphtounicode{lira}{20A4}%
+\pdfglyphtounicode{peseta}{20A7}%
+\pdfglyphtounicode{afii57636}{20AA}%
+\pdfglyphtounicode{dong}{20AB}%
+\pdfglyphtounicode{Euro}{20AC}%
+\pdfglyphtounicode{afii61248}{2105}%
+\pdfglyphtounicode{Ifraktur}{2111}%
+\pdfglyphtounicode{afii61289}{2113}%
+\pdfglyphtounicode{afii61352}{2116}%
+\pdfglyphtounicode{weierstrass}{2118}%
+\pdfglyphtounicode{Rfraktur}{211C}%
+\pdfglyphtounicode{prescription}{211E}%
+\pdfglyphtounicode{trademark}{2122}%
+\pdfglyphtounicode{Omega}{2126}%
+\pdfglyphtounicode{estimated}{212E}%
+\pdfglyphtounicode{aleph}{2135}%
+\pdfglyphtounicode{onethird}{2153}%
+\pdfglyphtounicode{twothirds}{2154}%
+\pdfglyphtounicode{oneeighth}{215B}%
+\pdfglyphtounicode{threeeighths}{215C}%
+\pdfglyphtounicode{fiveeighths}{215D}%
+\pdfglyphtounicode{seveneighths}{215E}%
+\pdfglyphtounicode{arrowleft}{2190}%
+\pdfglyphtounicode{arrowup}{2191}%
+\pdfglyphtounicode{arrowright}{2192}%
+\pdfglyphtounicode{arrowdown}{2193}%
+\pdfglyphtounicode{arrowboth}{2194}%
+\pdfglyphtounicode{arrowupdn}{2195}%
+\pdfglyphtounicode{arrowupdnbse}{21A8}%
+\pdfglyphtounicode{carriagereturn}{21B5}%
+\pdfglyphtounicode{arrowdblleft}{21D0}%
+\pdfglyphtounicode{arrowdblup}{21D1}%
+\pdfglyphtounicode{arrowdblright}{21D2}%
+\pdfglyphtounicode{arrowdbldown}{21D3}%
+\pdfglyphtounicode{arrowdblboth}{21D4}%
+\pdfglyphtounicode{universal}{2200}%
+\pdfglyphtounicode{partialdiff}{2202}%
+\pdfglyphtounicode{existential}{2203}%
+\pdfglyphtounicode{emptyset}{2205}%
+\pdfglyphtounicode{Delta}{2206}%
+\pdfglyphtounicode{gradient}{2207}%
+\pdfglyphtounicode{element}{2208}%
+\pdfglyphtounicode{notelement}{2209}%
+\pdfglyphtounicode{suchthat}{220B}%
+\pdfglyphtounicode{product}{220F}%
+\pdfglyphtounicode{summation}{2211}%
+\pdfglyphtounicode{minus}{2212}%
+\pdfglyphtounicode{asteriskmath}{2217}%
+\pdfglyphtounicode{radical}{221A}%
+\pdfglyphtounicode{proportional}{221D}%
+\pdfglyphtounicode{infinity}{221E}%
+\pdfglyphtounicode{orthogonal}{221F}%
+\pdfglyphtounicode{angle}{2220}%
+\pdfglyphtounicode{logicaland}{2227}%
+\pdfglyphtounicode{logicalor}{2228}%
+\pdfglyphtounicode{intersection}{2229}%
+\pdfglyphtounicode{union}{222A}%
+\pdfglyphtounicode{integral}{222B}%
+\pdfglyphtounicode{therefore}{2234}%
+\pdfglyphtounicode{similar}{223C}%
+\pdfglyphtounicode{congruent}{2245}%
+\pdfglyphtounicode{approxequal}{2248}%
+\pdfglyphtounicode{notequal}{2260}%
+\pdfglyphtounicode{equivalence}{2261}%
+\pdfglyphtounicode{lessequal}{2264}%
+\pdfglyphtounicode{greaterequal}{2265}%
+\pdfglyphtounicode{propersubset}{2282}%
+\pdfglyphtounicode{propersuperset}{2283}%
+\pdfglyphtounicode{notsubset}{2284}%
+\pdfglyphtounicode{reflexsubset}{2286}%
+\pdfglyphtounicode{reflexsuperset}{2287}%
+\pdfglyphtounicode{circleplus}{2295}%
+\pdfglyphtounicode{circlemultiply}{2297}%
+\pdfglyphtounicode{perpendicular}{22A5}%
+\pdfglyphtounicode{dotmath}{22C5}%
+\pdfglyphtounicode{house}{2302}%
+\pdfglyphtounicode{revlogicalnot}{2310}%
+\pdfglyphtounicode{integraltp}{2320}%
+\pdfglyphtounicode{integralbt}{2321}%
+\pdfglyphtounicode{angleleft}{2329}%
+\pdfglyphtounicode{angleright}{232A}%
+\pdfglyphtounicode{SF100000}{2500}%
+\pdfglyphtounicode{SF110000}{2502}%
+\pdfglyphtounicode{SF10000}{250C}%
+\pdfglyphtounicode{SF30000}{2510}%
+\pdfglyphtounicode{SF20000}{2514}%
+\pdfglyphtounicode{SF40000}{2518}%
+\pdfglyphtounicode{SF80000}{251C}%
+\pdfglyphtounicode{SF90000}{2524}%
+\pdfglyphtounicode{SF60000}{252C}%
+\pdfglyphtounicode{SF70000}{2534}%
+\pdfglyphtounicode{SF50000}{253C}%
+\pdfglyphtounicode{SF430000}{2550}%
+\pdfglyphtounicode{SF240000}{2551}%
+\pdfglyphtounicode{SF510000}{2552}%
+\pdfglyphtounicode{SF520000}{2553}%
+\pdfglyphtounicode{SF390000}{2554}%
+\pdfglyphtounicode{SF220000}{2555}%
+\pdfglyphtounicode{SF210000}{2556}%
+\pdfglyphtounicode{SF250000}{2557}%
+\pdfglyphtounicode{SF500000}{2558}%
+\pdfglyphtounicode{SF490000}{2559}%
+\pdfglyphtounicode{SF380000}{255A}%
+\pdfglyphtounicode{SF280000}{255B}%
+\pdfglyphtounicode{SF270000}{255C}%
+\pdfglyphtounicode{SF260000}{255D}%
+\pdfglyphtounicode{SF360000}{255E}%
+\pdfglyphtounicode{SF370000}{255F}%
+\pdfglyphtounicode{SF420000}{2560}%
+\pdfglyphtounicode{SF190000}{2561}%
+\pdfglyphtounicode{SF200000}{2562}%
+\pdfglyphtounicode{SF230000}{2563}%
+\pdfglyphtounicode{SF470000}{2564}%
+\pdfglyphtounicode{SF480000}{2565}%
+\pdfglyphtounicode{SF410000}{2566}%
+\pdfglyphtounicode{SF450000}{2567}%
+\pdfglyphtounicode{SF460000}{2568}%
+\pdfglyphtounicode{SF400000}{2569}%
+\pdfglyphtounicode{SF540000}{256A}%
+\pdfglyphtounicode{SF530000}{256B}%
+\pdfglyphtounicode{SF440000}{256C}%
+\pdfglyphtounicode{upblock}{2580}%
+\pdfglyphtounicode{dnblock}{2584}%
+\pdfglyphtounicode{block}{2588}%
+\pdfglyphtounicode{lfblock}{258C}%
+\pdfglyphtounicode{rtblock}{2590}%
+\pdfglyphtounicode{ltshade}{2591}%
+\pdfglyphtounicode{shade}{2592}%
+\pdfglyphtounicode{dkshade}{2593}%
+\pdfglyphtounicode{filledbox}{25A0}%
+\pdfglyphtounicode{H22073}{25A1}%
+\pdfglyphtounicode{H18543}{25AA}%
+\pdfglyphtounicode{H18551}{25AB}%
+\pdfglyphtounicode{filledrect}{25AC}%
+\pdfglyphtounicode{triagup}{25B2}%
+\pdfglyphtounicode{triagrt}{25BA}%
+\pdfglyphtounicode{triagdn}{25BC}%
+\pdfglyphtounicode{triaglf}{25C4}%
+\pdfglyphtounicode{lozenge}{25CA}%
+\pdfglyphtounicode{circle}{25CB}%
+\pdfglyphtounicode{H18533}{25CF}%
+\pdfglyphtounicode{invbullet}{25D8}%
+\pdfglyphtounicode{invcircle}{25D9}%
+\pdfglyphtounicode{openbullet}{25E6}%
+\pdfglyphtounicode{smileface}{263A}%
+\pdfglyphtounicode{invsmileface}{263B}%
+\pdfglyphtounicode{sun}{263C}%
+\pdfglyphtounicode{female}{2640}%
+\pdfglyphtounicode{male}{2642}%
+\pdfglyphtounicode{spade}{2660}%
+\pdfglyphtounicode{club}{2663}%
+\pdfglyphtounicode{heart}{2665}%
+\pdfglyphtounicode{diamond}{2666}%
+\pdfglyphtounicode{musicalnote}{266A}%
+\pdfglyphtounicode{musicalnotedbl}{266B}%
+%
+\endinput
diff --git a/tex/context/base/pdfr-def.tex b/tex/context/base/pdfr-def.tex
deleted file mode 100644
index 7554bda9e..000000000
--- a/tex/context/base/pdfr-def.tex
+++ /dev/null
@@ -1,843 +0,0 @@
-% filename : pdfr-def.tex
-% comment  : generated by mtxrun --script chars --pdf
-% author   : Hans Hagen, PRAGMA-ADE, Hasselt NL
-% copyright: PRAGMA ADE / ConTeXt Development Team
-% license  : see context related readme files
-%
-\pdfglyphtounicode{space}{0020}%
-\pdfglyphtounicode{exclam}{0021}%
-\pdfglyphtounicode{quotedbl}{0022}%
-\pdfglyphtounicode{numbersign}{0023}%
-\pdfglyphtounicode{dollar}{0024}%
-\pdfglyphtounicode{percent}{0025}%
-\pdfglyphtounicode{ampersand}{0026}%
-\pdfglyphtounicode{quotesingle}{0027}%
-\pdfglyphtounicode{parenleft}{0028}%
-\pdfglyphtounicode{parenright}{0029}%
-\pdfglyphtounicode{asterisk}{002A}%
-\pdfglyphtounicode{plus}{002B}%
-\pdfglyphtounicode{comma}{002C}%
-\pdfglyphtounicode{hyphen}{002D}%
-\pdfglyphtounicode{period}{002E}%
-\pdfglyphtounicode{slash}{002F}%
-\pdfglyphtounicode{zero}{0030}%
-\pdfglyphtounicode{one}{0031}%
-\pdfglyphtounicode{two}{0032}%
-\pdfglyphtounicode{three}{0033}%
-\pdfglyphtounicode{four}{0034}%
-\pdfglyphtounicode{five}{0035}%
-\pdfglyphtounicode{six}{0036}%
-\pdfglyphtounicode{seven}{0037}%
-\pdfglyphtounicode{eight}{0038}%
-\pdfglyphtounicode{nine}{0039}%
-\pdfglyphtounicode{colon}{003A}%
-\pdfglyphtounicode{semicolon}{003B}%
-\pdfglyphtounicode{less}{003C}%
-\pdfglyphtounicode{equal}{003D}%
-\pdfglyphtounicode{greater}{003E}%
-\pdfglyphtounicode{question}{003F}%
-\pdfglyphtounicode{at}{0040}%
-\pdfglyphtounicode{A}{0041}%
-\pdfglyphtounicode{B}{0042}%
-\pdfglyphtounicode{C}{0043}%
-\pdfglyphtounicode{D}{0044}%
-\pdfglyphtounicode{E}{0045}%
-\pdfglyphtounicode{F}{0046}%
-\pdfglyphtounicode{G}{0047}%
-\pdfglyphtounicode{H}{0048}%
-\pdfglyphtounicode{I}{0049}%
-\pdfglyphtounicode{J}{004A}%
-\pdfglyphtounicode{K}{004B}%
-\pdfglyphtounicode{L}{004C}%
-\pdfglyphtounicode{M}{004D}%
-\pdfglyphtounicode{N}{004E}%
-\pdfglyphtounicode{O}{004F}%
-\pdfglyphtounicode{P}{0050}%
-\pdfglyphtounicode{Q}{0051}%
-\pdfglyphtounicode{R}{0052}%
-\pdfglyphtounicode{S}{0053}%
-\pdfglyphtounicode{T}{0054}%
-\pdfglyphtounicode{U}{0055}%
-\pdfglyphtounicode{V}{0056}%
-\pdfglyphtounicode{W}{0057}%
-\pdfglyphtounicode{X}{0058}%
-\pdfglyphtounicode{Y}{0059}%
-\pdfglyphtounicode{Z}{005A}%
-\pdfglyphtounicode{bracketleft}{005B}%
-\pdfglyphtounicode{backslash}{005C}%
-\pdfglyphtounicode{bracketright}{005D}%
-\pdfglyphtounicode{asciicircum}{005E}%
-\pdfglyphtounicode{underscore}{005F}%
-\pdfglyphtounicode{grave}{0060}%
-\pdfglyphtounicode{a}{0061}%
-\pdfglyphtounicode{b}{0062}%
-\pdfglyphtounicode{c}{0063}%
-\pdfglyphtounicode{d}{0064}%
-\pdfglyphtounicode{e}{0065}%
-\pdfglyphtounicode{f}{0066}%
-\pdfglyphtounicode{g}{0067}%
-\pdfglyphtounicode{h}{0068}%
-\pdfglyphtounicode{i}{0069}%
-\pdfglyphtounicode{j}{006A}%
-\pdfglyphtounicode{k}{006B}%
-\pdfglyphtounicode{l}{006C}%
-\pdfglyphtounicode{m}{006D}%
-\pdfglyphtounicode{n}{006E}%
-\pdfglyphtounicode{o}{006F}%
-\pdfglyphtounicode{p}{0070}%
-\pdfglyphtounicode{q}{0071}%
-\pdfglyphtounicode{r}{0072}%
-\pdfglyphtounicode{s}{0073}%
-\pdfglyphtounicode{t}{0074}%
-\pdfglyphtounicode{u}{0075}%
-\pdfglyphtounicode{v}{0076}%
-\pdfglyphtounicode{w}{0077}%
-\pdfglyphtounicode{x}{0078}%
-\pdfglyphtounicode{y}{0079}%
-\pdfglyphtounicode{z}{007A}%
-\pdfglyphtounicode{braceleft}{007B}%
-\pdfglyphtounicode{bar}{007C}%
-\pdfglyphtounicode{braceright}{007D}%
-\pdfglyphtounicode{asciitilde}{007E}%
-\pdfglyphtounicode{exclamdown}{00A1}%
-\pdfglyphtounicode{cent}{00A2}%
-\pdfglyphtounicode{sterling}{00A3}%
-\pdfglyphtounicode{currency}{00A4}%
-\pdfglyphtounicode{yen}{00A5}%
-\pdfglyphtounicode{brokenbar}{00A6}%
-\pdfglyphtounicode{section}{00A7}%
-\pdfglyphtounicode{dieresis}{00A8}%
-\pdfglyphtounicode{copyright}{00A9}%
-\pdfglyphtounicode{ordfeminine}{00AA}%
-\pdfglyphtounicode{guillemotleft}{00AB}%
-\pdfglyphtounicode{logicalnot}{00AC}%
-\pdfglyphtounicode{registered}{00AE}%
-\pdfglyphtounicode{macron}{00AF}%
-\pdfglyphtounicode{degree}{00B0}%
-\pdfglyphtounicode{plusminus}{00B1}%
-\pdfglyphtounicode{acute}{00B4}%
-\pdfglyphtounicode{mu}{00B5}%
-\pdfglyphtounicode{paragraph}{00B6}%
-\pdfglyphtounicode{periodcentered}{00B7}%
-\pdfglyphtounicode{cedilla}{00B8}%
-\pdfglyphtounicode{ordmasculine}{00BA}%
-\pdfglyphtounicode{guillemotright}{00BB}%
-\pdfglyphtounicode{onequarter}{00BC}%
-\pdfglyphtounicode{onehalf}{00BD}%
-\pdfglyphtounicode{threequarters}{00BE}%
-\pdfglyphtounicode{questiondown}{00BF}%
-\pdfglyphtounicode{Agrave}{00C0}%
-\pdfglyphtounicode{Aacute}{00C1}%
-\pdfglyphtounicode{Acircumflex}{00C2}%
-\pdfglyphtounicode{Atilde}{00C3}%
-\pdfglyphtounicode{Adieresis}{00C4}%
-\pdfglyphtounicode{Aring}{00C5}%
-\pdfglyphtounicode{AE}{00C6}%
-\pdfglyphtounicode{Ccedilla}{00C7}%
-\pdfglyphtounicode{Egrave}{00C8}%
-\pdfglyphtounicode{Eacute}{00C9}%
-\pdfglyphtounicode{Ecircumflex}{00CA}%
-\pdfglyphtounicode{Edieresis}{00CB}%
-\pdfglyphtounicode{Igrave}{00CC}%
-\pdfglyphtounicode{Iacute}{00CD}%
-\pdfglyphtounicode{Icircumflex}{00CE}%
-\pdfglyphtounicode{Idieresis}{00CF}%
-\pdfglyphtounicode{Eth}{00D0}%
-\pdfglyphtounicode{Ntilde}{00D1}%
-\pdfglyphtounicode{Ograve}{00D2}%
-\pdfglyphtounicode{Oacute}{00D3}%
-\pdfglyphtounicode{Ocircumflex}{00D4}%
-\pdfglyphtounicode{Otilde}{00D5}%
-\pdfglyphtounicode{Odieresis}{00D6}%
-\pdfglyphtounicode{multiply}{00D7}%
-\pdfglyphtounicode{Oslash}{00D8}%
-\pdfglyphtounicode{Ugrave}{00D9}%
-\pdfglyphtounicode{Uacute}{00DA}%
-\pdfglyphtounicode{Ucircumflex}{00DB}%
-\pdfglyphtounicode{Udieresis}{00DC}%
-\pdfglyphtounicode{Yacute}{00DD}%
-\pdfglyphtounicode{Thorn}{00DE}%
-\pdfglyphtounicode{germandbls}{00DF}%
-\pdfglyphtounicode{agrave}{00E0}%
-\pdfglyphtounicode{aacute}{00E1}%
-\pdfglyphtounicode{acircumflex}{00E2}%
-\pdfglyphtounicode{atilde}{00E3}%
-\pdfglyphtounicode{adieresis}{00E4}%
-\pdfglyphtounicode{aring}{00E5}%
-\pdfglyphtounicode{ae}{00E6}%
-\pdfglyphtounicode{ccedilla}{00E7}%
-\pdfglyphtounicode{egrave}{00E8}%
-\pdfglyphtounicode{eacute}{00E9}%
-\pdfglyphtounicode{ecircumflex}{00EA}%
-\pdfglyphtounicode{edieresis}{00EB}%
-\pdfglyphtounicode{igrave}{00EC}%
-\pdfglyphtounicode{iacute}{00ED}%
-\pdfglyphtounicode{icircumflex}{00EE}%
-\pdfglyphtounicode{idieresis}{00EF}%
-\pdfglyphtounicode{eth}{00F0}%
-\pdfglyphtounicode{ntilde}{00F1}%
-\pdfglyphtounicode{ograve}{00F2}%
-\pdfglyphtounicode{oacute}{00F3}%
-\pdfglyphtounicode{ocircumflex}{00F4}%
-\pdfglyphtounicode{otilde}{00F5}%
-\pdfglyphtounicode{odieresis}{00F6}%
-\pdfglyphtounicode{divide}{00F7}%
-\pdfglyphtounicode{oslash}{00F8}%
-\pdfglyphtounicode{ugrave}{00F9}%
-\pdfglyphtounicode{uacute}{00FA}%
-\pdfglyphtounicode{ucircumflex}{00FB}%
-\pdfglyphtounicode{udieresis}{00FC}%
-\pdfglyphtounicode{yacute}{00FD}%
-\pdfglyphtounicode{thorn}{00FE}%
-\pdfglyphtounicode{ydieresis}{00FF}%
-\pdfglyphtounicode{Amacron}{0100}%
-\pdfglyphtounicode{amacron}{0101}%
-\pdfglyphtounicode{Abreve}{0102}%
-\pdfglyphtounicode{abreve}{0103}%
-\pdfglyphtounicode{Aogonek}{0104}%
-\pdfglyphtounicode{aogonek}{0105}%
-\pdfglyphtounicode{Cacute}{0106}%
-\pdfglyphtounicode{cacute}{0107}%
-\pdfglyphtounicode{Ccircumflex}{0108}%
-\pdfglyphtounicode{ccircumflex}{0109}%
-\pdfglyphtounicode{Cdotaccent}{010A}%
-\pdfglyphtounicode{cdotaccent}{010B}%
-\pdfglyphtounicode{Ccaron}{010C}%
-\pdfglyphtounicode{ccaron}{010D}%
-\pdfglyphtounicode{Dcaron}{010E}%
-\pdfglyphtounicode{dcaron}{010F}%
-\pdfglyphtounicode{Dcroat}{0110}%
-\pdfglyphtounicode{dcroat}{0111}%
-\pdfglyphtounicode{Emacron}{0112}%
-\pdfglyphtounicode{emacron}{0113}%
-\pdfglyphtounicode{Ebreve}{0114}%
-\pdfglyphtounicode{ebreve}{0115}%
-\pdfglyphtounicode{Edotaccent}{0116}%
-\pdfglyphtounicode{edotaccent}{0117}%
-\pdfglyphtounicode{Eogonek}{0118}%
-\pdfglyphtounicode{eogonek}{0119}%
-\pdfglyphtounicode{Ecaron}{011A}%
-\pdfglyphtounicode{ecaron}{011B}%
-\pdfglyphtounicode{Gcircumflex}{011C}%
-\pdfglyphtounicode{gcircumflex}{011D}%
-\pdfglyphtounicode{Gbreve}{011E}%
-\pdfglyphtounicode{gbreve}{011F}%
-\pdfglyphtounicode{Gdotaccent}{0120}%
-\pdfglyphtounicode{gdotaccent}{0121}%
-\pdfglyphtounicode{Gcommaaccent}{0122}%
-\pdfglyphtounicode{gcommaaccent}{0123}%
-\pdfglyphtounicode{Hcircumflex}{0124}%
-\pdfglyphtounicode{hcircumflex}{0125}%
-\pdfglyphtounicode{Hbar}{0126}%
-\pdfglyphtounicode{hbar}{0127}%
-\pdfglyphtounicode{Itilde}{0128}%
-\pdfglyphtounicode{itilde}{0129}%
-\pdfglyphtounicode{Imacron}{012A}%
-\pdfglyphtounicode{imacron}{012B}%
-\pdfglyphtounicode{Ibreve}{012C}%
-\pdfglyphtounicode{ibreve}{012D}%
-\pdfglyphtounicode{Iogonek}{012E}%
-\pdfglyphtounicode{iogonek}{012F}%
-\pdfglyphtounicode{Idotaccent}{0130}%
-\pdfglyphtounicode{dotlessi}{0131}%
-\pdfglyphtounicode{IJ}{0132}%
-\pdfglyphtounicode{ij}{0133}%
-\pdfglyphtounicode{Jcircumflex}{0134}%
-\pdfglyphtounicode{jcircumflex}{0135}%
-\pdfglyphtounicode{Kcommaaccent}{0136}%
-\pdfglyphtounicode{kcommaaccent}{0137}%
-\pdfglyphtounicode{kgreenlandic}{0138}%
-\pdfglyphtounicode{Lacute}{0139}%
-\pdfglyphtounicode{lacute}{013A}%
-\pdfglyphtounicode{Lcommaaccent}{013B}%
-\pdfglyphtounicode{lcommaaccent}{013C}%
-\pdfglyphtounicode{Lcaron}{013D}%
-\pdfglyphtounicode{lcaron}{013E}%
-\pdfglyphtounicode{Ldot}{013F}%
-\pdfglyphtounicode{ldot}{0140}%
-\pdfglyphtounicode{Lslash}{0141}%
-\pdfglyphtounicode{lslash}{0142}%
-\pdfglyphtounicode{Nacute}{0143}%
-\pdfglyphtounicode{nacute}{0144}%
-\pdfglyphtounicode{Ncommaaccent}{0145}%
-\pdfglyphtounicode{ncommaaccent}{0146}%
-\pdfglyphtounicode{Ncaron}{0147}%
-\pdfglyphtounicode{ncaron}{0148}%
-\pdfglyphtounicode{napostrophe}{0149}%
-\pdfglyphtounicode{Eng}{014A}%
-\pdfglyphtounicode{eng}{014B}%
-\pdfglyphtounicode{Omacron}{014C}%
-\pdfglyphtounicode{omacron}{014D}%
-\pdfglyphtounicode{Obreve}{014E}%
-\pdfglyphtounicode{obreve}{014F}%
-\pdfglyphtounicode{Ohungarumlaut}{0150}%
-\pdfglyphtounicode{ohungarumlaut}{0151}%
-\pdfglyphtounicode{OE}{0152}%
-\pdfglyphtounicode{oe}{0153}%
-\pdfglyphtounicode{Racute}{0154}%
-\pdfglyphtounicode{racute}{0155}%
-\pdfglyphtounicode{Rcommaaccent}{0156}%
-\pdfglyphtounicode{rcommaaccent}{0157}%
-\pdfglyphtounicode{Rcaron}{0158}%
-\pdfglyphtounicode{rcaron}{0159}%
-\pdfglyphtounicode{Sacute}{015A}%
-\pdfglyphtounicode{sacute}{015B}%
-\pdfglyphtounicode{Scircumflex}{015C}%
-\pdfglyphtounicode{scircumflex}{015D}%
-\pdfglyphtounicode{Scedilla}{015E}%
-\pdfglyphtounicode{scedilla}{015F}%
-\pdfglyphtounicode{Scaron}{0160}%
-\pdfglyphtounicode{scaron}{0161}%
-\pdfglyphtounicode{Tcommaaccent}{0162}%
-\pdfglyphtounicode{tcommaaccent}{0163}%
-\pdfglyphtounicode{Tcaron}{0164}%
-\pdfglyphtounicode{tcaron}{0165}%
-\pdfglyphtounicode{Tbar}{0166}%
-\pdfglyphtounicode{tbar}{0167}%
-\pdfglyphtounicode{Utilde}{0168}%
-\pdfglyphtounicode{utilde}{0169}%
-\pdfglyphtounicode{Umacron}{016A}%
-\pdfglyphtounicode{umacron}{016B}%
-\pdfglyphtounicode{Ubreve}{016C}%
-\pdfglyphtounicode{ubreve}{016D}%
-\pdfglyphtounicode{Uring}{016E}%
-\pdfglyphtounicode{uring}{016F}%
-\pdfglyphtounicode{Uhungarumlaut}{0170}%
-\pdfglyphtounicode{uhungarumlaut}{0171}%
-\pdfglyphtounicode{Uogonek}{0172}%
-\pdfglyphtounicode{uogonek}{0173}%
-\pdfglyphtounicode{Wcircumflex}{0174}%
-\pdfglyphtounicode{wcircumflex}{0175}%
-\pdfglyphtounicode{Ycircumflex}{0176}%
-\pdfglyphtounicode{ycircumflex}{0177}%
-\pdfglyphtounicode{Ydieresis}{0178}%
-\pdfglyphtounicode{Zacute}{0179}%
-\pdfglyphtounicode{zacute}{017A}%
-\pdfglyphtounicode{Zdotaccent}{017B}%
-\pdfglyphtounicode{zdotaccent}{017C}%
-\pdfglyphtounicode{Zcaron}{017D}%
-\pdfglyphtounicode{zcaron}{017E}%
-\pdfglyphtounicode{longs}{017F}%
-\pdfglyphtounicode{florin}{0192}%
-\pdfglyphtounicode{Ohorn}{01A0}%
-\pdfglyphtounicode{ohorn}{01A1}%
-\pdfglyphtounicode{Uhorn}{01AF}%
-\pdfglyphtounicode{uhorn}{01B0}%
-\pdfglyphtounicode{Gcaron}{01E6}%
-\pdfglyphtounicode{gcaron}{01E7}%
-\pdfglyphtounicode{Aringacute}{01FA}%
-\pdfglyphtounicode{aringacute}{01FB}%
-\pdfglyphtounicode{AEacute}{01FC}%
-\pdfglyphtounicode{aeacute}{01FD}%
-\pdfglyphtounicode{Oslashacute}{01FE}%
-\pdfglyphtounicode{oslashacute}{01FF}%
-\pdfglyphtounicode{Scommaaccent}{0218}%
-\pdfglyphtounicode{scommaaccent}{0219}%
-\pdfglyphtounicode{afii57929}{02BC}%
-\pdfglyphtounicode{afii64937}{02BD}%
-\pdfglyphtounicode{circumflex}{02C6}%
-\pdfglyphtounicode{caron}{02C7}%
-\pdfglyphtounicode{breve}{02D8}%
-\pdfglyphtounicode{dotaccent}{02D9}%
-\pdfglyphtounicode{ring}{02DA}%
-\pdfglyphtounicode{ogonek}{02DB}%
-\pdfglyphtounicode{tilde}{02DC}%
-\pdfglyphtounicode{hungarumlaut}{02DD}%
-\pdfglyphtounicode{gravecomb}{0300}%
-\pdfglyphtounicode{acutecomb}{0301}%
-\pdfglyphtounicode{tildecomb}{0303}%
-\pdfglyphtounicode{hookabovecomb}{0309}%
-\pdfglyphtounicode{dotbelowcomb}{0323}%
-\pdfglyphtounicode{tonos}{0384}%
-\pdfglyphtounicode{dieresistonos}{0385}%
-\pdfglyphtounicode{Alphatonos}{0386}%
-\pdfglyphtounicode{anoteleia}{0387}%
-\pdfglyphtounicode{Epsilontonos}{0388}%
-\pdfglyphtounicode{Etatonos}{0389}%
-\pdfglyphtounicode{Iotatonos}{038A}%
-\pdfglyphtounicode{Omicrontonos}{038C}%
-\pdfglyphtounicode{Upsilontonos}{038E}%
-\pdfglyphtounicode{Omegatonos}{038F}%
-\pdfglyphtounicode{iotadieresistonos}{0390}%
-\pdfglyphtounicode{Alpha}{0391}%
-\pdfglyphtounicode{Beta}{0392}%
-\pdfglyphtounicode{Gamma}{0393}%
-\pdfglyphtounicode{Epsilon}{0395}%
-\pdfglyphtounicode{Zeta}{0396}%
-\pdfglyphtounicode{Eta}{0397}%
-\pdfglyphtounicode{Theta}{0398}%
-\pdfglyphtounicode{Iota}{0399}%
-\pdfglyphtounicode{Kappa}{039A}%
-\pdfglyphtounicode{Lambda}{039B}%
-\pdfglyphtounicode{Mu}{039C}%
-\pdfglyphtounicode{Nu}{039D}%
-\pdfglyphtounicode{Xi}{039E}%
-\pdfglyphtounicode{Omicron}{039F}%
-\pdfglyphtounicode{Pi}{03A0}%
-\pdfglyphtounicode{Rho}{03A1}%
-\pdfglyphtounicode{Sigma}{03A3}%
-\pdfglyphtounicode{Tau}{03A4}%
-\pdfglyphtounicode{Upsilon}{03A5}%
-\pdfglyphtounicode{Phi}{03A6}%
-\pdfglyphtounicode{Chi}{03A7}%
-\pdfglyphtounicode{Psi}{03A8}%
-\pdfglyphtounicode{Iotadieresis}{03AA}%
-\pdfglyphtounicode{Upsilondieresis}{03AB}%
-\pdfglyphtounicode{alphatonos}{03AC}%
-\pdfglyphtounicode{epsilontonos}{03AD}%
-\pdfglyphtounicode{etatonos}{03AE}%
-\pdfglyphtounicode{iotatonos}{03AF}%
-\pdfglyphtounicode{upsilondieresistonos}{03B0}%
-\pdfglyphtounicode{alpha}{03B1}%
-\pdfglyphtounicode{beta}{03B2}%
-\pdfglyphtounicode{gamma}{03B3}%
-\pdfglyphtounicode{delta}{03B4}%
-\pdfglyphtounicode{epsilon}{03B5}%
-\pdfglyphtounicode{zeta}{03B6}%
-\pdfglyphtounicode{eta}{03B7}%
-\pdfglyphtounicode{theta}{03B8}%
-\pdfglyphtounicode{iota}{03B9}%
-\pdfglyphtounicode{kappa}{03BA}%
-\pdfglyphtounicode{lambda}{03BB}%
-\pdfglyphtounicode{nu}{03BD}%
-\pdfglyphtounicode{xi}{03BE}%
-\pdfglyphtounicode{omicron}{03BF}%
-\pdfglyphtounicode{pi}{03C0}%
-\pdfglyphtounicode{rho}{03C1}%
-\pdfglyphtounicode{sigma1}{03C2}%
-\pdfglyphtounicode{sigma}{03C3}%
-\pdfglyphtounicode{tau}{03C4}%
-\pdfglyphtounicode{upsilon}{03C5}%
-\pdfglyphtounicode{phi}{03C6}%
-\pdfglyphtounicode{chi}{03C7}%
-\pdfglyphtounicode{psi}{03C8}%
-\pdfglyphtounicode{omega}{03C9}%
-\pdfglyphtounicode{iotadieresis}{03CA}%
-\pdfglyphtounicode{upsilondieresis}{03CB}%
-\pdfglyphtounicode{omicrontonos}{03CC}%
-\pdfglyphtounicode{upsilontonos}{03CD}%
-\pdfglyphtounicode{omegatonos}{03CE}%
-\pdfglyphtounicode{theta1}{03D1}%
-\pdfglyphtounicode{Upsilon1}{03D2}%
-\pdfglyphtounicode{phi1}{03D5}%
-\pdfglyphtounicode{omega1}{03D6}%
-\pdfglyphtounicode{afii10023}{0401}%
-\pdfglyphtounicode{afii10051}{0402}%
-\pdfglyphtounicode{afii10052}{0403}%
-\pdfglyphtounicode{afii10053}{0404}%
-\pdfglyphtounicode{afii10054}{0405}%
-\pdfglyphtounicode{afii10055}{0406}%
-\pdfglyphtounicode{afii10056}{0407}%
-\pdfglyphtounicode{afii10057}{0408}%
-\pdfglyphtounicode{afii10058}{0409}%
-\pdfglyphtounicode{afii10059}{040A}%
-\pdfglyphtounicode{afii10060}{040B}%
-\pdfglyphtounicode{afii10061}{040C}%
-\pdfglyphtounicode{afii10062}{040E}%
-\pdfglyphtounicode{afii10145}{040F}%
-\pdfglyphtounicode{afii10017}{0410}%
-\pdfglyphtounicode{afii10018}{0411}%
-\pdfglyphtounicode{afii10019}{0412}%
-\pdfglyphtounicode{afii10020}{0413}%
-\pdfglyphtounicode{afii10021}{0414}%
-\pdfglyphtounicode{afii10022}{0415}%
-\pdfglyphtounicode{afii10024}{0416}%
-\pdfglyphtounicode{afii10025}{0417}%
-\pdfglyphtounicode{afii10026}{0418}%
-\pdfglyphtounicode{afii10027}{0419}%
-\pdfglyphtounicode{afii10028}{041A}%
-\pdfglyphtounicode{afii10029}{041B}%
-\pdfglyphtounicode{afii10030}{041C}%
-\pdfglyphtounicode{afii10031}{041D}%
-\pdfglyphtounicode{afii10032}{041E}%
-\pdfglyphtounicode{afii10033}{041F}%
-\pdfglyphtounicode{afii10034}{0420}%
-\pdfglyphtounicode{afii10035}{0421}%
-\pdfglyphtounicode{afii10036}{0422}%
-\pdfglyphtounicode{afii10037}{0423}%
-\pdfglyphtounicode{afii10038}{0424}%
-\pdfglyphtounicode{afii10039}{0425}%
-\pdfglyphtounicode{afii10040}{0426}%
-\pdfglyphtounicode{afii10041}{0427}%
-\pdfglyphtounicode{afii10042}{0428}%
-\pdfglyphtounicode{afii10043}{0429}%
-\pdfglyphtounicode{afii10044}{042A}%
-\pdfglyphtounicode{afii10045}{042B}%
-\pdfglyphtounicode{afii10046}{042C}%
-\pdfglyphtounicode{afii10047}{042D}%
-\pdfglyphtounicode{afii10048}{042E}%
-\pdfglyphtounicode{afii10049}{042F}%
-\pdfglyphtounicode{afii10065}{0430}%
-\pdfglyphtounicode{afii10066}{0431}%
-\pdfglyphtounicode{afii10067}{0432}%
-\pdfglyphtounicode{afii10068}{0433}%
-\pdfglyphtounicode{afii10069}{0434}%
-\pdfglyphtounicode{afii10070}{0435}%
-\pdfglyphtounicode{afii10072}{0436}%
-\pdfglyphtounicode{afii10073}{0437}%
-\pdfglyphtounicode{afii10074}{0438}%
-\pdfglyphtounicode{afii10075}{0439}%
-\pdfglyphtounicode{afii10076}{043A}%
-\pdfglyphtounicode{afii10077}{043B}%
-\pdfglyphtounicode{afii10078}{043C}%
-\pdfglyphtounicode{afii10079}{043D}%
-\pdfglyphtounicode{afii10080}{043E}%
-\pdfglyphtounicode{afii10081}{043F}%
-\pdfglyphtounicode{afii10082}{0440}%
-\pdfglyphtounicode{afii10083}{0441}%
-\pdfglyphtounicode{afii10084}{0442}%
-\pdfglyphtounicode{afii10085}{0443}%
-\pdfglyphtounicode{afii10086}{0444}%
-\pdfglyphtounicode{afii10087}{0445}%
-\pdfglyphtounicode{afii10088}{0446}%
-\pdfglyphtounicode{afii10089}{0447}%
-\pdfglyphtounicode{afii10090}{0448}%
-\pdfglyphtounicode{afii10091}{0449}%
-\pdfglyphtounicode{afii10092}{044A}%
-\pdfglyphtounicode{afii10093}{044B}%
-\pdfglyphtounicode{afii10094}{044C}%
-\pdfglyphtounicode{afii10095}{044D}%
-\pdfglyphtounicode{afii10096}{044E}%
-\pdfglyphtounicode{afii10097}{044F}%
-\pdfglyphtounicode{afii10071}{0451}%
-\pdfglyphtounicode{afii10099}{0452}%
-\pdfglyphtounicode{afii10100}{0453}%
-\pdfglyphtounicode{afii10101}{0454}%
-\pdfglyphtounicode{afii10102}{0455}%
-\pdfglyphtounicode{afii10103}{0456}%
-\pdfglyphtounicode{afii10104}{0457}%
-\pdfglyphtounicode{afii10105}{0458}%
-\pdfglyphtounicode{afii10106}{0459}%
-\pdfglyphtounicode{afii10107}{045A}%
-\pdfglyphtounicode{afii10108}{045B}%
-\pdfglyphtounicode{afii10109}{045C}%
-\pdfglyphtounicode{afii10110}{045E}%
-\pdfglyphtounicode{afii10193}{045F}%
-\pdfglyphtounicode{afii10146}{0462}%
-\pdfglyphtounicode{afii10194}{0463}%
-\pdfglyphtounicode{afii10147}{0472}%
-\pdfglyphtounicode{afii10195}{0473}%
-\pdfglyphtounicode{afii10148}{0474}%
-\pdfglyphtounicode{afii10196}{0475}%
-\pdfglyphtounicode{afii10050}{0490}%
-\pdfglyphtounicode{afii10098}{0491}%
-\pdfglyphtounicode{afii10846}{04D9}%
-\pdfglyphtounicode{afii57799}{05B0}%
-\pdfglyphtounicode{afii57801}{05B1}%
-\pdfglyphtounicode{afii57800}{05B2}%
-\pdfglyphtounicode{afii57802}{05B3}%
-\pdfglyphtounicode{afii57793}{05B4}%
-\pdfglyphtounicode{afii57794}{05B5}%
-\pdfglyphtounicode{afii57795}{05B6}%
-\pdfglyphtounicode{afii57798}{05B7}%
-\pdfglyphtounicode{afii57797}{05B8}%
-\pdfglyphtounicode{afii57806}{05B9}%
-\pdfglyphtounicode{afii57796}{05BB}%
-\pdfglyphtounicode{afii57807}{05BC}%
-\pdfglyphtounicode{afii57839}{05BD}%
-\pdfglyphtounicode{afii57645}{05BE}%
-\pdfglyphtounicode{afii57841}{05BF}%
-\pdfglyphtounicode{afii57842}{05C0}%
-\pdfglyphtounicode{afii57804}{05C1}%
-\pdfglyphtounicode{afii57803}{05C2}%
-\pdfglyphtounicode{afii57658}{05C3}%
-\pdfglyphtounicode{afii57664}{05D0}%
-\pdfglyphtounicode{afii57665}{05D1}%
-\pdfglyphtounicode{afii57666}{05D2}%
-\pdfglyphtounicode{afii57667}{05D3}%
-\pdfglyphtounicode{afii57668}{05D4}%
-\pdfglyphtounicode{afii57669}{05D5}%
-\pdfglyphtounicode{afii57670}{05D6}%
-\pdfglyphtounicode{afii57671}{05D7}%
-\pdfglyphtounicode{afii57672}{05D8}%
-\pdfglyphtounicode{afii57673}{05D9}%
-\pdfglyphtounicode{afii57674}{05DA}%
-\pdfglyphtounicode{afii57675}{05DB}%
-\pdfglyphtounicode{afii57676}{05DC}%
-\pdfglyphtounicode{afii57677}{05DD}%
-\pdfglyphtounicode{afii57678}{05DE}%
-\pdfglyphtounicode{afii57679}{05DF}%
-\pdfglyphtounicode{afii57680}{05E0}%
-\pdfglyphtounicode{afii57681}{05E1}%
-\pdfglyphtounicode{afii57682}{05E2}%
-\pdfglyphtounicode{afii57683}{05E3}%
-\pdfglyphtounicode{afii57684}{05E4}%
-\pdfglyphtounicode{afii57685}{05E5}%
-\pdfglyphtounicode{afii57686}{05E6}%
-\pdfglyphtounicode{afii57687}{05E7}%
-\pdfglyphtounicode{afii57688}{05E8}%
-\pdfglyphtounicode{afii57689}{05E9}%
-\pdfglyphtounicode{afii57690}{05EA}%
-\pdfglyphtounicode{afii57716}{05F0}%
-\pdfglyphtounicode{afii57717}{05F1}%
-\pdfglyphtounicode{afii57718}{05F2}%
-\pdfglyphtounicode{afii57388}{060C}%
-\pdfglyphtounicode{afii57403}{061B}%
-\pdfglyphtounicode{afii57407}{061F}%
-\pdfglyphtounicode{afii57409}{0621}%
-\pdfglyphtounicode{afii57410}{0622}%
-\pdfglyphtounicode{afii57411}{0623}%
-\pdfglyphtounicode{afii57412}{0624}%
-\pdfglyphtounicode{afii57413}{0625}%
-\pdfglyphtounicode{afii57414}{0626}%
-\pdfglyphtounicode{afii57415}{0627}%
-\pdfglyphtounicode{afii57416}{0628}%
-\pdfglyphtounicode{afii57417}{0629}%
-\pdfglyphtounicode{afii57418}{062A}%
-\pdfglyphtounicode{afii57419}{062B}%
-\pdfglyphtounicode{afii57420}{062C}%
-\pdfglyphtounicode{afii57421}{062D}%
-\pdfglyphtounicode{afii57422}{062E}%
-\pdfglyphtounicode{afii57423}{062F}%
-\pdfglyphtounicode{afii57424}{0630}%
-\pdfglyphtounicode{afii57425}{0631}%
-\pdfglyphtounicode{afii57426}{0632}%
-\pdfglyphtounicode{afii57427}{0633}%
-\pdfglyphtounicode{afii57428}{0634}%
-\pdfglyphtounicode{afii57429}{0635}%
-\pdfglyphtounicode{afii57430}{0636}%
-\pdfglyphtounicode{afii57431}{0637}%
-\pdfglyphtounicode{afii57432}{0638}%
-\pdfglyphtounicode{afii57433}{0639}%
-\pdfglyphtounicode{afii57434}{063A}%
-\pdfglyphtounicode{afii57440}{0640}%
-\pdfglyphtounicode{afii57441}{0641}%
-\pdfglyphtounicode{afii57442}{0642}%
-\pdfglyphtounicode{afii57443}{0643}%
-\pdfglyphtounicode{afii57444}{0644}%
-\pdfglyphtounicode{afii57445}{0645}%
-\pdfglyphtounicode{afii57446}{0646}%
-\pdfglyphtounicode{afii57470}{0647}%
-\pdfglyphtounicode{afii57448}{0648}%
-\pdfglyphtounicode{afii57449}{0649}%
-\pdfglyphtounicode{afii57450}{064A}%
-\pdfglyphtounicode{afii57451}{064B}%
-\pdfglyphtounicode{afii57452}{064C}%
-\pdfglyphtounicode{afii57453}{064D}%
-\pdfglyphtounicode{afii57454}{064E}%
-\pdfglyphtounicode{afii57455}{064F}%
-\pdfglyphtounicode{afii57456}{0650}%
-\pdfglyphtounicode{afii57457}{0651}%
-\pdfglyphtounicode{afii57458}{0652}%
-\pdfglyphtounicode{afii57392}{0660}%
-\pdfglyphtounicode{afii57393}{0661}%
-\pdfglyphtounicode{afii57394}{0662}%
-\pdfglyphtounicode{afii57395}{0663}%
-\pdfglyphtounicode{afii57396}{0664}%
-\pdfglyphtounicode{afii57397}{0665}%
-\pdfglyphtounicode{afii57398}{0666}%
-\pdfglyphtounicode{afii57399}{0667}%
-\pdfglyphtounicode{afii57400}{0668}%
-\pdfglyphtounicode{afii57401}{0669}%
-\pdfglyphtounicode{afii57381}{066A}%
-\pdfglyphtounicode{afii63167}{066D}%
-\pdfglyphtounicode{afii57511}{0679}%
-\pdfglyphtounicode{afii57506}{067E}%
-\pdfglyphtounicode{afii57507}{0686}%
-\pdfglyphtounicode{afii57512}{0688}%
-\pdfglyphtounicode{afii57513}{0691}%
-\pdfglyphtounicode{afii57508}{0698}%
-\pdfglyphtounicode{afii57505}{06A4}%
-\pdfglyphtounicode{afii57509}{06AF}%
-\pdfglyphtounicode{afii57514}{06BA}%
-\pdfglyphtounicode{afii57519}{06D2}%
-\pdfglyphtounicode{afii57534}{06D5}%
-\pdfglyphtounicode{Wgrave}{1E80}%
-\pdfglyphtounicode{wgrave}{1E81}%
-\pdfglyphtounicode{Wacute}{1E82}%
-\pdfglyphtounicode{wacute}{1E83}%
-\pdfglyphtounicode{Wdieresis}{1E84}%
-\pdfglyphtounicode{wdieresis}{1E85}%
-\pdfglyphtounicode{Ygrave}{1EF2}%
-\pdfglyphtounicode{ygrave}{1EF3}%
-\pdfglyphtounicode{afii61664}{200C}%
-\pdfglyphtounicode{afii301}{200D}%
-\pdfglyphtounicode{afii299}{200E}%
-\pdfglyphtounicode{afii300}{200F}%
-\pdfglyphtounicode{figuredash}{2012}%
-\pdfglyphtounicode{endash}{2013}%
-\pdfglyphtounicode{emdash}{2014}%
-\pdfglyphtounicode{afii208}{2015}%
-\pdfglyphtounicode{underscoredbl}{2017}%
-\pdfglyphtounicode{quoteleft}{2018}%
-\pdfglyphtounicode{quoteright}{2019}%
-\pdfglyphtounicode{quotesinglbase}{201A}%
-\pdfglyphtounicode{quotereversed}{201B}%
-\pdfglyphtounicode{quotedblleft}{201C}%
-\pdfglyphtounicode{quotedblright}{201D}%
-\pdfglyphtounicode{quotedblbase}{201E}%
-\pdfglyphtounicode{dagger}{2020}%
-\pdfglyphtounicode{daggerdbl}{2021}%
-\pdfglyphtounicode{bullet}{2022}%
-\pdfglyphtounicode{onedotenleader}{2024}%
-\pdfglyphtounicode{twodotenleader}{2025}%
-\pdfglyphtounicode{ellipsis}{2026}%
-\pdfglyphtounicode{afii61573}{202C}%
-\pdfglyphtounicode{afii61574}{202D}%
-\pdfglyphtounicode{afii61575}{202E}%
-\pdfglyphtounicode{perthousand}{2030}%
-\pdfglyphtounicode{minute}{2032}%
-\pdfglyphtounicode{second}{2033}%
-\pdfglyphtounicode{guilsinglleft}{2039}%
-\pdfglyphtounicode{guilsinglright}{203A}%
-\pdfglyphtounicode{exclamdbl}{203C}%
-\pdfglyphtounicode{fraction}{2044}%
-\pdfglyphtounicode{colonmonetary}{20A1}%
-\pdfglyphtounicode{franc}{20A3}%
-\pdfglyphtounicode{lira}{20A4}%
-\pdfglyphtounicode{peseta}{20A7}%
-\pdfglyphtounicode{afii57636}{20AA}%
-\pdfglyphtounicode{dong}{20AB}%
-\pdfglyphtounicode{Euro}{20AC}%
-\pdfglyphtounicode{afii61248}{2105}%
-\pdfglyphtounicode{Ifraktur}{2111}%
-\pdfglyphtounicode{afii61289}{2113}%
-\pdfglyphtounicode{afii61352}{2116}%
-\pdfglyphtounicode{weierstrass}{2118}%
-\pdfglyphtounicode{Rfraktur}{211C}%
-\pdfglyphtounicode{prescription}{211E}%
-\pdfglyphtounicode{trademark}{2122}%
-\pdfglyphtounicode{Omega}{2126}%
-\pdfglyphtounicode{estimated}{212E}%
-\pdfglyphtounicode{aleph}{2135}%
-\pdfglyphtounicode{onethird}{2153}%
-\pdfglyphtounicode{twothirds}{2154}%
-\pdfglyphtounicode{oneeighth}{215B}%
-\pdfglyphtounicode{threeeighths}{215C}%
-\pdfglyphtounicode{fiveeighths}{215D}%
-\pdfglyphtounicode{seveneighths}{215E}%
-\pdfglyphtounicode{arrowleft}{2190}%
-\pdfglyphtounicode{arrowup}{2191}%
-\pdfglyphtounicode{arrowright}{2192}%
-\pdfglyphtounicode{arrowdown}{2193}%
-\pdfglyphtounicode{arrowboth}{2194}%
-\pdfglyphtounicode{arrowupdn}{2195}%
-\pdfglyphtounicode{arrowupdnbse}{21A8}%
-\pdfglyphtounicode{carriagereturn}{21B5}%
-\pdfglyphtounicode{arrowdblleft}{21D0}%
-\pdfglyphtounicode{arrowdblup}{21D1}%
-\pdfglyphtounicode{arrowdblright}{21D2}%
-\pdfglyphtounicode{arrowdbldown}{21D3}%
-\pdfglyphtounicode{arrowdblboth}{21D4}%
-\pdfglyphtounicode{universal}{2200}%
-\pdfglyphtounicode{partialdiff}{2202}%
-\pdfglyphtounicode{existential}{2203}%
-\pdfglyphtounicode{emptyset}{2205}%
-\pdfglyphtounicode{Delta}{2206}%
-\pdfglyphtounicode{gradient}{2207}%
-\pdfglyphtounicode{element}{2208}%
-\pdfglyphtounicode{notelement}{2209}%
-\pdfglyphtounicode{suchthat}{220B}%
-\pdfglyphtounicode{product}{220F}%
-\pdfglyphtounicode{summation}{2211}%
-\pdfglyphtounicode{minus}{2212}%
-\pdfglyphtounicode{asteriskmath}{2217}%
-\pdfglyphtounicode{radical}{221A}%
-\pdfglyphtounicode{proportional}{221D}%
-\pdfglyphtounicode{infinity}{221E}%
-\pdfglyphtounicode{orthogonal}{221F}%
-\pdfglyphtounicode{angle}{2220}%
-\pdfglyphtounicode{logicaland}{2227}%
-\pdfglyphtounicode{logicalor}{2228}%
-\pdfglyphtounicode{intersection}{2229}%
-\pdfglyphtounicode{union}{222A}%
-\pdfglyphtounicode{integral}{222B}%
-\pdfglyphtounicode{therefore}{2234}%
-\pdfglyphtounicode{similar}{223C}%
-\pdfglyphtounicode{congruent}{2245}%
-\pdfglyphtounicode{approxequal}{2248}%
-\pdfglyphtounicode{notequal}{2260}%
-\pdfglyphtounicode{equivalence}{2261}%
-\pdfglyphtounicode{lessequal}{2264}%
-\pdfglyphtounicode{greaterequal}{2265}%
-\pdfglyphtounicode{propersubset}{2282}%
-\pdfglyphtounicode{propersuperset}{2283}%
-\pdfglyphtounicode{notsubset}{2284}%
-\pdfglyphtounicode{reflexsubset}{2286}%
-\pdfglyphtounicode{reflexsuperset}{2287}%
-\pdfglyphtounicode{circleplus}{2295}%
-\pdfglyphtounicode{circlemultiply}{2297}%
-\pdfglyphtounicode{perpendicular}{22A5}%
-\pdfglyphtounicode{dotmath}{22C5}%
-\pdfglyphtounicode{house}{2302}%
-\pdfglyphtounicode{revlogicalnot}{2310}%
-\pdfglyphtounicode{integraltp}{2320}%
-\pdfglyphtounicode{integralbt}{2321}%
-\pdfglyphtounicode{angleleft}{2329}%
-\pdfglyphtounicode{angleright}{232A}%
-\pdfglyphtounicode{SF100000}{2500}%
-\pdfglyphtounicode{SF110000}{2502}%
-\pdfglyphtounicode{SF10000}{250C}%
-\pdfglyphtounicode{SF30000}{2510}%
-\pdfglyphtounicode{SF20000}{2514}%
-\pdfglyphtounicode{SF40000}{2518}%
-\pdfglyphtounicode{SF80000}{251C}%
-\pdfglyphtounicode{SF90000}{2524}%
-\pdfglyphtounicode{SF60000}{252C}%
-\pdfglyphtounicode{SF70000}{2534}%
-\pdfglyphtounicode{SF50000}{253C}%
-\pdfglyphtounicode{SF430000}{2550}%
-\pdfglyphtounicode{SF240000}{2551}%
-\pdfglyphtounicode{SF510000}{2552}%
-\pdfglyphtounicode{SF520000}{2553}%
-\pdfglyphtounicode{SF390000}{2554}%
-\pdfglyphtounicode{SF220000}{2555}%
-\pdfglyphtounicode{SF210000}{2556}%
-\pdfglyphtounicode{SF250000}{2557}%
-\pdfglyphtounicode{SF500000}{2558}%
-\pdfglyphtounicode{SF490000}{2559}%
-\pdfglyphtounicode{SF380000}{255A}%
-\pdfglyphtounicode{SF280000}{255B}%
-\pdfglyphtounicode{SF270000}{255C}%
-\pdfglyphtounicode{SF260000}{255D}%
-\pdfglyphtounicode{SF360000}{255E}%
-\pdfglyphtounicode{SF370000}{255F}%
-\pdfglyphtounicode{SF420000}{2560}%
-\pdfglyphtounicode{SF190000}{2561}%
-\pdfglyphtounicode{SF200000}{2562}%
-\pdfglyphtounicode{SF230000}{2563}%
-\pdfglyphtounicode{SF470000}{2564}%
-\pdfglyphtounicode{SF480000}{2565}%
-\pdfglyphtounicode{SF410000}{2566}%
-\pdfglyphtounicode{SF450000}{2567}%
-\pdfglyphtounicode{SF460000}{2568}%
-\pdfglyphtounicode{SF400000}{2569}%
-\pdfglyphtounicode{SF540000}{256A}%
-\pdfglyphtounicode{SF530000}{256B}%
-\pdfglyphtounicode{SF440000}{256C}%
-\pdfglyphtounicode{upblock}{2580}%
-\pdfglyphtounicode{dnblock}{2584}%
-\pdfglyphtounicode{block}{2588}%
-\pdfglyphtounicode{lfblock}{258C}%
-\pdfglyphtounicode{rtblock}{2590}%
-\pdfglyphtounicode{ltshade}{2591}%
-\pdfglyphtounicode{shade}{2592}%
-\pdfglyphtounicode{dkshade}{2593}%
-\pdfglyphtounicode{filledbox}{25A0}%
-\pdfglyphtounicode{H22073}{25A1}%
-\pdfglyphtounicode{H18543}{25AA}%
-\pdfglyphtounicode{H18551}{25AB}%
-\pdfglyphtounicode{filledrect}{25AC}%
-\pdfglyphtounicode{triagup}{25B2}%
-\pdfglyphtounicode{triagrt}{25BA}%
-\pdfglyphtounicode{triagdn}{25BC}%
-\pdfglyphtounicode{triaglf}{25C4}%
-\pdfglyphtounicode{lozenge}{25CA}%
-\pdfglyphtounicode{circle}{25CB}%
-\pdfglyphtounicode{H18533}{25CF}%
-\pdfglyphtounicode{invbullet}{25D8}%
-\pdfglyphtounicode{invcircle}{25D9}%
-\pdfglyphtounicode{openbullet}{25E6}%
-\pdfglyphtounicode{smileface}{263A}%
-\pdfglyphtounicode{invsmileface}{263B}%
-\pdfglyphtounicode{sun}{263C}%
-\pdfglyphtounicode{female}{2640}%
-\pdfglyphtounicode{male}{2642}%
-\pdfglyphtounicode{spade}{2660}%
-\pdfglyphtounicode{club}{2663}%
-\pdfglyphtounicode{heart}{2665}%
-\pdfglyphtounicode{diamond}{2666}%
-\pdfglyphtounicode{musicalnote}{266A}%
-\pdfglyphtounicode{musicalnotedbl}{266B}%
-%
-\endinput
diff --git a/tex/context/base/pdfr-ec.mkii b/tex/context/base/pdfr-ec.mkii
new file mode 100644
index 000000000..b6604984c
--- /dev/null
+++ b/tex/context/base/pdfr-ec.mkii
@@ -0,0 +1,145 @@
+%D \module
+%D   [       file=pdfr-ec,
+%D        version=2005.07.27,
+%D          title=\CONTEXT\ PDF Font Resources,
+%D       subtitle=EC encoding,
+%D         author={Vladimir Volovich / Taco Hoekwater},
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 vector is derived (but reformatted a bit) from
+%D the one in \LaTeX's CMap package
+
+\startpdffontresource[ec]
+/CIDInit /ProcSet findresource begin
+12 dict begin
+  begincmap
+    /CIDSystemInfo
+      << /Registry (TeX)
+         /Ordering (T1)
+        /Supplement 0
+      >> def
+    /CMapName /TeX-T1-0 def
+    /CMapType 2 def
+    1 begincodespacerange
+      <00> 
+    endcodespacerange
+    10 beginbfrange
+      <0E> <0F> <2039>
+      <10> <12> <201C>
+      <15> <16> <2013>
+      <21> <26> <0021>
+      <28> <5F> <0028>
+      <61> <7E> <0061>
+        <00C0>
+        <00D8>
+        <00E0>
+        <00F8>
+    endbfrange
+    95 beginbfchar
+      <00> <0060>
+      <01> <00B4>
+      <02> <02C6>
+      <03> <02DC>
+      <04> <00A8>
+      <05> <02DD>
+      <06> <02DA>
+      <07> <02C7>
+      <08> <02D8>
+      <09> <00AF>
+      <0A> <02D9>
+      <0B> <00B8>
+      <0C> <02DB>
+      <0D> <201A>
+      <13> <00AB>
+      <14> <00BB>
+      <17> <200C>
+      <19> <0131>
+      <1B> <00660066>
+      <1C> <00660069>
+      <1D> <0066006C>
+      <1E> <006600660069>
+      <1F> <00660066006C>
+      <20> <2423>
+      <27> <2019>
+      <60> <2018>
+      <7F> <002D>
+      <80> <0102>
+      <81> <0104>
+      <82> <0106>
+      <83> <010C>
+      <84> <010E>
+      <85> <011A>
+      <86> <0118>
+      <87> <011E>
+      <88> <0139>
+      <89> <013D>
+      <8A> <0141>
+      <8B> <0143>
+      <8C> <0147>
+      <8D> <014A>
+      <8E> <0150>
+      <8F> <0154>
+      <90> <0158>
+      <91> <015A>
+      <92> <0160>
+      <93> <015E>
+      <94> <0164>
+      <95> <021A>
+      <96> <0170>
+      <97> <016E>
+      <98> <0178>
+      <99> <0179>
+      <9A> <017D>
+      <9B> <017B>
+      <9C> <0132>
+      <9D> <0130>
+      <9E> <0111>
+      <9F> <00A7>
+       <0103>
+       <0105>
+       <0107>
+       <010D>
+       <010F>
+       <011B>
+       <0119>
+       <011F>
+       <013A>
+       <013E>
+       <0142>
+       <0144>
+       <0148>
+       <014B>
+       <0151>
+       <0155>
+       <0159>
+       <015B>
+       <0161>
+       <015F>
+       <0165>
+       <021B>
+       <0171>
+       <016F>
+       <00FF>
+       <017A>
+       <017E>
+       <017C>
+       <0133>
+       <00A1>
+       <00BF>
+       <00A3>
+       <0152>
+       <00530053>
+       <0153>
+       <00DF>
+    endbfchar
+  endcmap
+CMapName currentdict /CMap defineresource pop end
+end
+\stoppdffontresource
+
+\endinput
diff --git a/tex/context/base/pdfr-ec.tex b/tex/context/base/pdfr-ec.tex
deleted file mode 100644
index b6604984c..000000000
--- a/tex/context/base/pdfr-ec.tex
+++ /dev/null
@@ -1,145 +0,0 @@
-%D \module
-%D   [       file=pdfr-ec,
-%D        version=2005.07.27,
-%D          title=\CONTEXT\ PDF Font Resources,
-%D       subtitle=EC encoding,
-%D         author={Vladimir Volovich / Taco Hoekwater},
-%D           date=\currentdate,
-%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 vector is derived (but reformatted a bit) from
-%D the one in \LaTeX's CMap package
-
-\startpdffontresource[ec]
-/CIDInit /ProcSet findresource begin
-12 dict begin
-  begincmap
-    /CIDSystemInfo
-      << /Registry (TeX)
-         /Ordering (T1)
-        /Supplement 0
-      >> def
-    /CMapName /TeX-T1-0 def
-    /CMapType 2 def
-    1 begincodespacerange
-      <00> 
-    endcodespacerange
-    10 beginbfrange
-      <0E> <0F> <2039>
-      <10> <12> <201C>
-      <15> <16> <2013>
-      <21> <26> <0021>
-      <28> <5F> <0028>
-      <61> <7E> <0061>
-        <00C0>
-        <00D8>
-        <00E0>
-        <00F8>
-    endbfrange
-    95 beginbfchar
-      <00> <0060>
-      <01> <00B4>
-      <02> <02C6>
-      <03> <02DC>
-      <04> <00A8>
-      <05> <02DD>
-      <06> <02DA>
-      <07> <02C7>
-      <08> <02D8>
-      <09> <00AF>
-      <0A> <02D9>
-      <0B> <00B8>
-      <0C> <02DB>
-      <0D> <201A>
-      <13> <00AB>
-      <14> <00BB>
-      <17> <200C>
-      <19> <0131>
-      <1B> <00660066>
-      <1C> <00660069>
-      <1D> <0066006C>
-      <1E> <006600660069>
-      <1F> <00660066006C>
-      <20> <2423>
-      <27> <2019>
-      <60> <2018>
-      <7F> <002D>
-      <80> <0102>
-      <81> <0104>
-      <82> <0106>
-      <83> <010C>
-      <84> <010E>
-      <85> <011A>
-      <86> <0118>
-      <87> <011E>
-      <88> <0139>
-      <89> <013D>
-      <8A> <0141>
-      <8B> <0143>
-      <8C> <0147>
-      <8D> <014A>
-      <8E> <0150>
-      <8F> <0154>
-      <90> <0158>
-      <91> <015A>
-      <92> <0160>
-      <93> <015E>
-      <94> <0164>
-      <95> <021A>
-      <96> <0170>
-      <97> <016E>
-      <98> <0178>
-      <99> <0179>
-      <9A> <017D>
-      <9B> <017B>
-      <9C> <0132>
-      <9D> <0130>
-      <9E> <0111>
-      <9F> <00A7>
-       <0103>
-       <0105>
-       <0107>
-       <010D>
-       <010F>
-       <011B>
-       <0119>
-       <011F>
-       <013A>
-       <013E>
-       <0142>
-       <0144>
-       <0148>
-       <014B>
-       <0151>
-       <0155>
-       <0159>
-       <015B>
-       <0161>
-       <015F>
-       <0165>
-       <021B>
-       <0171>
-       <016F>
-       <00FF>
-       <017A>
-       <017E>
-       <017C>
-       <0133>
-       <00A1>
-       <00BF>
-       <00A3>
-       <0152>
-       <00530053>
-       <0153>
-       <00DF>
-    endbfchar
-  endcmap
-CMapName currentdict /CMap defineresource pop end
-end
-\stoppdffontresource
-
-\endinput
diff --git a/tex/context/base/pdfr-il2.mkii b/tex/context/base/pdfr-il2.mkii
new file mode 100644
index 000000000..70bcb25da
--- /dev/null
+++ b/tex/context/base/pdfr-il2.mkii
@@ -0,0 +1,233 @@
+%D \module
+%D   [       file=pdfr-il2,
+%D        version=2000.12.10,
+%D          title=\CONTEXT\ PDF Font Resources,
+%D       subtitle=ISO Latin 2,
+%D         author={Ondrej Koala Vacha, Hans Hagen},
+%D           date=\currentdate,
+%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 vector is derived (but reformatted a bit) from a
+%D sample send to me by Petr Ferdus. There was some Czech
+%D comment in which I could recognize the name of Ondrej
+%D Koala Vacha. More information on setting up such a vector
+%D can be found in the \PDF\ reference manual.
+
+\startpdffontresource[il2]
+/CIDInit /ProcSet findresource begin
+12 dict begin
+  begincmap
+    /CIDSystemInfo
+      << /Registry (Adobe)
+         /Ordering (T1UV)
+         /Supplement 0
+      >> def
+    /CMapName /Adobe-Identity-UCS def
+    /CMapType 1 def
+    1 begincodespacerange
+      <00> 
+    endcodespacerange
+    %%FontSpecificEncoding
+    191 beginbfrange
+      <20> <20> <0020> % space         dec: 32 oct:040 hex:20
+      <21> <21> <0021> % exclam        dec: 33 oct:041 hex:21
+      <22> <22> <0022> % quotedbl      dec: 34 oct:042 hex:22
+      <23> <23> <0023> % numbersign    dec: 35 oct:043 hex:23
+      <24> <24> <0024> % dollar        dec: 36 oct:044 hex:24
+      <25> <25> <0025> % percent       dec: 37 oct:045 hex:25
+      <26> <26> <0026> % ampersand     dec: 38 oct:046 hex:26
+      <27> <27> <0027> % quotesingle   dec: 39 oct:047 hex:27
+      <28> <28> <0028> % parenleft     dec: 40 oct:050 hex:28
+      <29> <29> <0029> % parenright    dec: 41 oct:051 hex:29
+      <2a> <2a> <002a> % asterisk      dec: 42 oct:052 hex:2a
+      <2b> <2b> <002b> % plus          dec: 43 oct:053 hex:2b
+      <2c> <2c> <002c> % comma         dec: 44 oct:054 hex:2c
+      <2d> <2d> <002d> % hyphen        dec: 45 oct:055 hex:2d
+      <2e> <2e> <002e> % period        dec: 46 oct:056 hex:2e
+      <2f> <2f> <002f> % slash         dec: 47 oct:057 hex:2f
+      <30> <30> <0030> % zero          dec: 48 oct:060 hex:30
+      <31> <31> <0031> % one           dec: 49 oct:061 hex:31
+      <32> <32> <0032> % two           dec: 50 oct:062 hex:32
+      <33> <33> <0033> % three         dec: 51 oct:063 hex:33
+      <34> <34> <0034> % four          dec: 52 oct:064 hex:34
+      <35> <35> <0035> % five          dec: 53 oct:065 hex:35
+      <36> <36> <0036> % six           dec: 54 oct:066 hex:36
+      <37> <37> <0037> % seven         dec: 55 oct:067 hex:37
+      <38> <38> <0038> % eight         dec: 56 oct:070 hex:38
+      <39> <39> <0039> % nine          dec: 57 oct:071 hex:39
+      <3a> <3a> <003a> % colon         dec: 58 oct:072 hex:3a
+      <3b> <3b> <003b> % semicolon     dec: 59 oct:073 hex:3b
+      <3c> <3c> <003c> % less          dec: 60 oct:074 hex:3c
+      <3d> <3d> <003d> % equal         dec: 61 oct:075 hex:3d
+      <3e> <3e> <003e> % greater       dec: 62 oct:076 hex:3e
+      <3f> <3f> <003f> % question      dec: 63 oct:077 hex:3f
+      <40> <40> <0040> % at            dec: 64 oct:100 hex:40
+      <41> <41> <0041> % A             dec: 65 oct:101 hex:41
+      <42> <42> <0042> % B             dec: 66 oct:102 hex:42
+      <43> <43> <0043> % C             dec: 67 oct:103 hex:43
+      <44> <44> <0044> % D             dec: 68 oct:104 hex:44
+      <45> <45> <0045> % E             dec: 69 oct:105 hex:45
+      <46> <46> <0046> % F             dec: 70 oct:106 hex:46
+      <47> <47> <0047> % G             dec: 71 oct:107 hex:47
+      <48> <48> <0048> % H             dec: 72 oct:110 hex:48
+      <49> <49> <0049> % I             dec: 73 oct:111 hex:49
+      <4a> <4a> <004a> % J             dec: 74 oct:112 hex:4a
+      <4b> <4b> <004b> % K             dec: 75 oct:113 hex:4b
+      <4c> <4c> <004c> % L             dec: 76 oct:114 hex:4c
+      <4d> <4d> <004d> % M             dec: 77 oct:115 hex:4d
+      <4e> <4e> <004e> % N             dec: 78 oct:116 hex:4e
+      <4f> <4f> <004f> % O             dec: 79 oct:117 hex:4f
+      <50> <50> <0050> % P             dec: 80 oct:120 hex:50
+      <51> <51> <0051> % Q             dec: 81 oct:121 hex:51
+      <52> <52> <0052> % R             dec: 82 oct:122 hex:52
+      <53> <53> <0053> % S             dec: 83 oct:123 hex:53
+      <54> <54> <0054> % T             dec: 84 oct:124 hex:54
+      <55> <55> <0055> % U             dec: 85 oct:125 hex:55
+      <56> <56> <0056> % V             dec: 86 oct:126 hex:56
+      <57> <57> <0057> % W             dec: 87 oct:127 hex:57
+      <58> <58> <0058> % X             dec: 88 oct:130 hex:58
+      <59> <59> <0059> % Y             dec: 89 oct:131 hex:59
+      <5a> <5a> <005a> % Z             dec: 90 oct:132 hex:5a
+      <5b> <5b> <005b> % bracketleft   dec: 91 oct:133 hex:5b
+      <5c> <5c> <005c> % backslash     dec: 92 oct:134 hex:5c
+      <5d> <5d> <005d> % bracketright  dec: 93 oct:135 hex:5d
+      <5e> <5e> <005e> % asciicircum   dec: 94 oct:136 hex:5e
+      <5f> <5f> <005f> % underscore    dec: 95 oct:137 hex:5f
+      <60> <60> <0060> % grave         dec: 96 oct:140 hex:60
+      <61> <61> <0061> % a             dec: 97 oct:141 hex:61
+      <62> <62> <0062> % b             dec: 98 oct:142 hex:62
+      <63> <63> <0063> % c             dec: 99 oct:143 hex:63
+      <64> <64> <0064> % d             dec:100 oct:144 hex:64
+      <65> <65> <0065> % e             dec:101 oct:145 hex:65
+      <66> <66> <0066> % f             dec:102 oct:146 hex:66
+      <67> <67> <0067> % g             dec:103 oct:147 hex:67
+      <68> <68> <0068> % h             dec:104 oct:150 hex:68
+      <69> <69> <0069> % i             dec:105 oct:151 hex:69
+      <6a> <6a> <006a> % j             dec:106 oct:152 hex:6a
+      <6b> <6b> <006b> % k             dec:107 oct:153 hex:6b
+      <6c> <6c> <006c> % l             dec:108 oct:154 hex:6c
+      <6d> <6d> <006d> % m             dec:109 oct:155 hex:6d
+      <6e> <6e> <006e> % n             dec:110 oct:156 hex:6e
+      <6f> <6f> <006f> % o             dec:111 oct:157 hex:6f
+      <70> <70> <0070> % p             dec:112 oct:160 hex:70
+      <71> <71> <0071> % q             dec:113 oct:161 hex:71
+      <72> <72> <0072> % r             dec:114 oct:162 hex:72
+      <73> <73> <0073> % s             dec:115 oct:163 hex:73
+      <74> <74> <0074> % t             dec:116 oct:164 hex:74
+      <75> <75> <0075> % u             dec:117 oct:165 hex:75
+      <76> <76> <0076> % v             dec:118 oct:166 hex:76
+      <77> <77> <0077> % w             dec:119 oct:167 hex:77
+      <78> <78> <0078> % x             dec:120 oct:170 hex:78
+      <79> <79> <0079> % y             dec:121 oct:171 hex:79
+      <7a> <7a> <007a> % z             dec:122 oct:172 hex:7a
+      <7b> <7b> <007b> % braceleft     dec:123 oct:173 hex:7b
+      <7c> <7c> <007c> % bar           dec:124 oct:174 hex:7c
+      <7d> <7d> <007d> % braceright    dec:125 oct:175 hex:7d
+      <7e> <7e> <007e> % asciitilde    dec:126 oct:176 hex:7e
+        <00a0> % nbspace       dec:160 oct:240 hex:a0
+        <0104> % Aogonek       dec:161 oct:241 hex:a1
+        <00a2> % breve         dec:162 oct:242 hex:a2
+        <00a3> % Lslash        dec:163 oct:243 hex:a3
+        <00a4> % currency      dec:164 oct:244 hex:a4
+        <013d> % Lcaron        dec:165 oct:245 hex:a5
+        <015a> % Sacute        dec:166 oct:246 hex:a6
+        <00a7> % section       dec:167 oct:247 hex:a7
+        <00a8> % dieresis      dec:168 oct:250 hex:a8
+        <0160> % Scaron        dec:169 oct:251 hex:a9
+        <015e> % Scedilla      dec:170 oct:252 hex:aa
+        <0164> % Tcaron        dec:171 oct:253 hex:ab
+        <0179> % Zacute        dec:172 oct:254 hex:ac
+        <00ad> % sfthyphen     dec:173 oct:255 hex:ad
+        <017d> % Zcaron        dec:174 oct:256 hex:ae
+