From 84d94e9754958d12711a8f07086a3d815d305d40 Mon Sep 17 00:00:00 2001
From: Marius <mariausol@gmail.com>
Date: Thu, 12 Jan 2012 12:20:15 +0200
Subject: beta 2012.01.12 11:03

---
 tex/context/base/buff-ini.mkiv                     |    9 +-
 tex/context/base/cont-new.mkii                     |    2 +-
 tex/context/base/cont-new.mkiv                     |    2 +-
 tex/context/base/context-version.pdf               |  Bin 4074 -> 4063 bytes
 tex/context/base/context-version.png               |  Bin 104985 -> 103799 bytes
 tex/context/base/context.mkii                      |    2 +-
 tex/context/base/context.mkiv                      |    4 +-
 tex/context/base/core-ini.mkiv                     |    2 +-
 tex/context/base/core-mis.mkiv                     | 1029 +-------------------
 tex/context/base/enco-ini.mkiv                     |   38 +
 tex/context/base/grph-inc.lua                      |    2 +
 tex/context/base/grph-inc.mkiv                     |   19 +-
 tex/context/base/grph-trf.mkiv                     |    6 +-
 tex/context/base/mult-aux.mkiv                     |    3 +
 tex/context/base/mult-sys.mkiv                     |    5 +-
 tex/context/base/pack-com.mkiv                     |  350 +++++++
 tex/context/base/page-lay.mkiv                     |   14 +-
 tex/context/base/spac-ali.mkiv                     |    5 +
 tex/context/base/status-files.pdf                  |  Bin 24277 -> 24242 bytes
 tex/context/base/status-lua.pdf                    |  Bin 171571 -> 170726 bytes
 tex/context/base/status-mkiv.lua                   |   25 +-
 tex/context/base/supp-box.mkiv                     |    9 +
 tex/context/base/syst-lua.lua                      |    8 +-
 tex/context/base/typo-brk.lua                      |  116 ++-
 tex/context/base/typo-brk.mkiv                     |   88 +-
 tex/context/base/typo-cap.lua                      |   41 +-
 tex/context/base/typo-cap.mkiv                     |   70 +-
 tex/context/base/typo-del.mkiv                     |  607 ++++++++++++
 tex/context/base/typo-dig.lua                      |   41 +-
 tex/context/base/typo-dig.mkiv                     |    6 +-
 tex/context/base/typo-mar.mkiv                     |   20 +-
 tex/context/base/typo-rep.lua                      |   43 +-
 tex/context/base/typo-rep.mkiv                     |   10 +-
 tex/context/base/typo-spa.lua                      |   18 +-
 tex/generic/context/luatex/luatex-fonts-merged.lua |    2 +-
 35 files changed, 1375 insertions(+), 1221 deletions(-)
 create mode 100644 tex/context/base/pack-com.mkiv
 create mode 100644 tex/context/base/typo-del.mkiv

diff --git a/tex/context/base/buff-ini.mkiv b/tex/context/base/buff-ini.mkiv
index 0d240e1a9..0512910ce 100644
--- a/tex/context/base/buff-ini.mkiv
+++ b/tex/context/base/buff-ini.mkiv
@@ -34,7 +34,7 @@
   {\ctxcommand{erasebuffer("#1")}}
 
 \setuvalue{\e!start\v!buffer}%
-  {\bgroup
+  {\begingroup % (1)
    \obeylines
    \dosingleempty\buff_start}
 
@@ -45,7 +45,7 @@
   {\normalexpanded{\buff_pickup{#2}{#3}{#4}{}{\buff_stop{#4}}}}
 
 \unexpanded\def\grabbufferdata % was: \dostartbuffer
-  {\bgroup
+  {\begingroup % (1)
    \obeylines
    \doquadrupleempty\buff_grab_direct_indeed}
 
@@ -64,12 +64,13 @@
 
 \unexpanded\def\buff_pickup#1#2#3#4#5% name, startsequence, stopsequence, before, after
   {#4%
-   \bgroup
+   \begingroup % (2)
    \edef\catcodetableofbuffer{\number\catcodetable}%
    \ctxcommand{erasebuffer("#1")}%
    \setcatcodetable\vrbcatcodes
    \def\buff_finish
-     {\egroup
+     {\endgroup % (1)
+      \endgroup % (2)
       #5}%
    \def\buff_gobble##1#3% is detokenize needed? TEST
     %{\ctxcommand{grabbuffer("#1","#2","#3",\!!bs\detokenize{##1}\!!es)} % space ?
diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii
index 86e6a0374..43da43bd6 100644
--- a/tex/context/base/cont-new.mkii
+++ b/tex/context/base/cont-new.mkii
@@ -11,7 +11,7 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-\newcontextversion{2012.01.11 14:58}
+\newcontextversion{2012.01.12 11:03}
 
 %D This file is loaded at runtime, thereby providing an
 %D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv
index 89a754665..dd3bf86dd 100644
--- a/tex/context/base/cont-new.mkiv
+++ b/tex/context/base/cont-new.mkiv
@@ -11,7 +11,7 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-\newcontextversion{2012.01.11 14:58}
+\newcontextversion{2012.01.12 11:03}
 
 %D This file is loaded at runtime, thereby providing an
 %D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf
index edaaa063f..6c7fccec0 100644
Binary files a/tex/context/base/context-version.pdf and b/tex/context/base/context-version.pdf differ
diff --git a/tex/context/base/context-version.png b/tex/context/base/context-version.png
index 4a65db342..44fc1db1b 100644
Binary files a/tex/context/base/context-version.png and b/tex/context/base/context-version.png differ
diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii
index cefbf66b7..944066f75 100644
--- a/tex/context/base/context.mkii
+++ b/tex/context/base/context.mkii
@@ -20,7 +20,7 @@
 %D your styles an modules.
 
 \edef\contextformat {\jobname}
-\edef\contextversion{2012.01.11 14:58}
+\edef\contextversion{2012.01.12 11:03}
 
 %D For those who want to use this:
 
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index 65423c066..5f6719619 100644
--- a/tex/context/base/context.mkiv
+++ b/tex/context/base/context.mkiv
@@ -23,7 +23,7 @@
 %D up and the dependencies are more consistent.
 
 \edef\contextformat {\jobname}
-\edef\contextversion{2012.01.11 14:58}
+\edef\contextversion{2012.01.12 11:03}
 
 %D For those who want to use this:
 
@@ -406,6 +406,8 @@
 \loadmarkfile{strc-lnt}
 
 \loadmarkfile{core-mis}
+\loadmarkfile{pack-com}
+\loadmarkfile{typo-del}
 
 \loadmarkfile{grph-trf}
 \loadmarkfile{grph-inc}
diff --git a/tex/context/base/core-ini.mkiv b/tex/context/base/core-ini.mkiv
index cdaa02a21..0c369ff3a 100644
--- a/tex/context/base/core-ini.mkiv
+++ b/tex/context/base/core-ini.mkiv
@@ -36,7 +36,7 @@
 \appendtoks \registerparoptions          \to \everypar
 \appendtoks \flushsyncpositions          \to \everypar
 \appendtoks \flushpostponednodedata      \to \everypar
-\appendtoks \dohandlerepeatdelimitedtext \to \everypar
+\appendtoks \typo_delimited_repeat       \to \everypar
 \appendtoks \insertparagraphintro        \to \everypar
 
 \appendtoks \flushpostponedbookmark      \to \neverypar
diff --git a/tex/context/base/core-mis.mkiv b/tex/context/base/core-mis.mkiv
index 1e21fc60c..299a01fa2 100644
--- a/tex/context/base/core-mis.mkiv
+++ b/tex/context/base/core-mis.mkiv
@@ -1,4 +1,3 @@
-
 %D \module
 %D   [       file=core-mis,
 %D        version=1998.01.29,
@@ -16,21 +15,6 @@
 
 % needs to be redone
 
-% %D You would not expect the next macro in \CONTEXT,
-% %D wouldn't you? It's there to warn \LATEX\ users that
-% %D something is wrong.
-% %D
-% %D Obsolete now:
-% %
-% % \def\documentstyle{\showmessage\m!system3\empty\stoptekst}
-% %
-% % \let\documentclass=\documentstyle
-% %D \macros
-% %D   {simplifiedcommands, simplifycommands}
-% %D
-% %D I first needed this simplification in bookmarks. Users can
-% %D add their own if needed.
-
 \unprotect
 
 %D Sometimes (for instance in bookmarks) we need to simplify macro
@@ -60,15 +44,6 @@
 
 % THIS WAS MAIN-002.TEX
 
-%\def\checkinterlineskip
-%  {\ifvmode
-%     \ifdim\lastskip>\zeropoint
-%       \nointerlineskip
-%     \else\ifdim\lastkern>\zeropoint
-%       \nointerlineskip
-%     \fi\fi
-%   \fi}
-
 \def\horitems#1#2% #1=breedte #2=commandos
   {\scratchdimen#1%
    \divide\scratchdimen \nofitems
@@ -197,11 +172,6 @@
    \c!inbetween={\blank[\v!medium]},
    \c!after=\blank]
 
-% Te zijner tijd [plaats=boven,onder,midden] implementeren,
-% in dat geval moet eerst de maximale hoogte worden bepaald.
-%
-% Overigens kan een en ander mooier met \halign.
-
 % there is quite some historic balast in this mechanism, the next variant
 % is a first cleanup
 
@@ -419,6 +389,8 @@
    \paragraphparameter\c!after
    \egroup}
 
+% Is this used at all?
+
 \def\dosetuptab[#1]%
   {\getparameters[\??ta]
      [\c!headstyle=\v!normal,
@@ -445,663 +417,6 @@
 \setuptab
   [\c!location=\v!left]
 
-\unexpanded\def\celsius   #1{#1\mathematics{^\circ}C}
-\unexpanded\def\inch        {\mathematics{\prime\prime}} % was: \hbox{\rm\char125\relax}
-\unexpanded\def\fraction#1#2{\mathematics{#1\over#2}}
-
-% very dutch
-
-\unexpanded\def\graden      {\mathematics{^\circ}}
-
-\def\bedragprefix {\euro\normalfixedspace}
-\def\bedragsuffix {}
-\def\bedragempty  {\euro}
-
-\unexpanded\def\bedrag#1%
-  {\strut\hbox\bgroup
-   \let\normalfixedspace\nonbreakablespace
-   \doifelsenothing{#1}
-     {\bedragempty}
-     {\bedragprefix\digits{#1}\bedragsuffix}%
-   \egroup}
-
-% \definieeralineas[test][n=3]
-%
-% \stelalineasin[test][3][breedte=4cm,uitlijnen=links]
-%
-% \startopelkaar
-% \test hans \\ ton \\ \bedrag{1.000,--} \\
-% \test hans \\ ton \\ \bedrag{~.~~1,--} \\
-% \test hans \\ ton \\ \bedrag{~.~~1,~~} \\
-% \test hans \\ ton \\ \bedrag{~.100,--} \\
-% \test hans \\ ton \\ \subtot{1.000,--} \\
-% \test hans \\ ton \\ \bedrag{1.000,--} \\
-% \test hans \\ ton \\ \bedrag{1.000,--} \\
-% \test hans \\ ton \\ \totaal{1.000,--} \\
-% \test hans \\ ton \\ \bedrag{nihil,--} \\
-% \test hans \\ ton \\ \totaal{nihil,--} \\
-% \test hans \\ ton \\ \subtot{nihil,--} \\
-% \stopopelkaar
-
-\def\periodswidth  {.5em}
-\def\periodsdefault{3}    % was 5, but now it's like \unknown
-
-\unexpanded\def\periods
-  {\dosingleempty\doperiods}
-
-% \def\doperiods[#1]% todo: also n=,width= or maybe just #1,#2
-%   {\dontleavehmode
-%    \begingroup
-%    \scratchdimen\periodswidth
-%    \hbox to \iffirstargument#1\else\periodsdefault\fi \scratchdimen
-%      {\leaders\hbox to \scratchdimen{\hss.\hss}\hss}%
-%    \endgroup}
-%
-% better for export:
-
-\def\doperiods[#1]% todo: also n=,width= or maybe just #1,#2
-  {\dontleavehmode
-   \hbox\bgroup
-   \setbox\scratchbox\hbox to \periodswidth{\hss.\hss}%
-   \dorecurse{\iffirstargument#1\else\periodsdefault\fi}{\copy\scratchbox}%
-   \egroup}
-
-\unexpanded\def\unknown
-  {\periods\relax} % relax prevents lookahead for []
-
-% Example by Wolfgang Schuster on the context list:
-%
-% \unexpanded\def\fourdots{{\def\periodswidth{.3em}\periods[4]}}
-%
-% Hello\fourdots\ World\fourdots \par Hello\fourdots\ World.
-
-\setnewconstant\boundarycharactermode\plusone
-
-\def\midboundarycharacter#1#2%
-  {\ifcase\boundarycharactermode
-   \or
-     %\nobreak
-     \hskip\hspaceamount\currentlanguage{#2}%
-     \languageparameter#1%
-     %\nobreak
-      \hskip\hspaceamount\currentlanguage{#2}%
-   \or
-     \languageparameter#1%
-   \fi
-   \boundarycharactermode\plusone}
-
-\def\leftboundarycharacter#1#2%
-  {\ifcase\boundarycharactermode
-   \or
-     \languageparameter#1%
-     \nobreak
-     \hskip\hspaceamount\currentlanguage{#2}%
-   \or
-     \languageparameter#1%
-   \fi
-   \boundarycharactermode\plusone}
-
-\def\rightboundarycharacter#1#2%
-  {\ifcase\boundarycharactermode
-   \or
-     \prewordbreak %\nobreak
-     \hskip\hspaceamount\currentlanguage{#2}%
-     \languageparameter#1%
-   \or
-     \languageparameter#1%
-   \fi
-   \boundarycharactermode\plusone}
-
-% actually this is pretty old, but temporary moved here
-%
-% obsolete:
-
-\unexpanded\def\setuphyphenmark
-  {\dodoubleargument\getparameters[\??kp]}
-
-\unexpanded\def\setuphyphenmark[#1]% sign=normal|wide
-  {\dodoubleargument\getparameters[\??kp][#1]%
-   \doifelse\@@kpsign {\v!normal}% was inset?
-     {\let\textmodehyphen\normalhyphen  \let\textmodehyphendiscretionary\normalhyphendiscretionary}
-     {\let\textmodehyphen\composedhyphen\let\textmodehyphendiscretionary\composedhyphendiscretionary}}
-
-\setuphyphenmark[\c!sign=\v!wide]
-% % \setuphyphenmark[\c!sign=\v!normal]
-
-\definesymbol[\c!lefthyphen]  [\languageparameter\c!lefthyphen]
-\definesymbol[\c!righthyphen] [\languageparameter\c!righthyphen]
-\definesymbol[\c!hyphen]      [\languageparameter\c!hyphen]
-
-\def\normalhyphen
-  {\hbox{\directsymbol\empty\c!hyphen}}
-
-\def\composedhyphen
-  {\hbox{\directsymbol\empty\c!compoundhyphen}}
-
-\def\normalhyphendiscretionary
-  {\discretionary
-     {\hbox{\directsymbol\empty\c!righthyphen}}
-     {\hbox{\directsymbol\empty\c!lefthyphen}}
-     {\hbox{\directsymbol\empty\c!hyphen}}}
-
-\def\composedhyphendiscretionary
-  {\discretionary
-     {\hbox{\directsymbol\empty\c!rightcompoundhyphen}}
-     {\hbox{\directsymbol\empty\c!leftcompoundhyphen}}
-     {\hbox{\directsymbol\empty\c!compoundhyphen}}}
-
-\let\textmodehyphen             \composedhyphen
-\let\textmodehyphendiscretionary\composedhyphendiscretionary
-
-\definesymbol[\c!leftcompoundhyphen]  [\languageparameter\c!leftcompoundhyphen]
-\definesymbol[\c!rightcompoundhyphen] [\languageparameter\c!rightcompoundhyphen]
-\definesymbol[\c!compoundhyphen]      [\languageparameter\c!compoundhyphen]
-
-\definehspace [sentence]      [\zeropoint]
-\definehspace [intersentence] [.250em]
-
-\definesymbol
-  [\c!midsentence]
-  [\midboundarycharacter\c!midsentence{sentence}]
-
-\definesymbol
-  [\c!leftsentence]
-  [\leftboundarycharacter\c!leftsentence{sentence}]
-
-\definesymbol
-  [\c!rightsentence]
-  [\rightboundarycharacter\c!rightsentence{sentence}]
-
-\definesymbol
-  [\c!leftsubsentence]
-  [\leftboundarycharacter\c!leftsubsentence{sentence}]
-
-\definesymbol
-  [\c!rightsubsentence]
-  [\rightboundarycharacter\c!rightsubsentence{sentence}]
-
-\newsignal \subsentencesignal
-\newcount  \subsentencelevel
-
-\let\beforesubsentence\donothing
-\let\aftersubsentence \donothing
-
-% todo: make this language option
-%
-% \def\beforesubsentence{\removeunwantedspaces}
-% \def\aftersubsentence {\ignorespaces}
-
-\def\midsentence
-  {\symbol[\c!midsentence]}
-
-\def\beginofsubsentence
-  {\beforesubsentence
-   \ifdim\lastkern=\subsentencesignal
-     \unskip
-     \kern\hspaceamount\currentlanguage{intersentence}%
-   \fi
-   \global\advance\subsentencelevel\plusone
-   \ifnum\subsentencelevel=\plusone
-     \dontleavehmode % was \leaveoutervmode
-   \fi
-   \dostarttagged\t!subsentence\empty
-   \symbol[\ifodd\subsentencelevel\c!leftsentence\else\c!leftsubsentence\fi]%
-  }%  \ignorespaces}
-
-\def\endofsubsentence % relax prevents space gobbling
-  {\symbol[\ifodd\subsentencelevel\c!rightsentence\else\c!rightsubsentence\fi]%
-   \dostoptagged
-   \global\advance\subsentencelevel\minusone
-   \unskip
-   \kern\subsentencesignal\relax
-   \aftersubsentence}
-
-\def\beginofsubsentencespacing % relax prevents space gobbling
-  {\kern\subsentencesignal\relax}% \ignorespaces}
-
-\def\endofsubsentencespacing
-  {\ifdim\lastkern=\subsentencesignal
-     \unskip
-     \hskip\hspaceamount\currentlanguage{intersentence}%
-     % no good, actually language dependent:
-%     \ignorespaces
-   \else
-     \unskip
-   \fi}
-
-%D \startbuffer
-%D test |<|test |<|test|>| test|>| test \par
-%D test|<|test|<|test|>|test|>|test \par
-%D test |<||<|test|>||>| test \par
-%D test \directdiscretionary{<}test\directdiscretionary{>} test \par
-%D \stopbuffer
-%D
-%D \typebuffer
-%D \getbuffer
-
-\unexpanded\def\startsubsentence{\beginofsubsentence     \prewordbreak\beginofsubsentencespacing}
-\unexpanded\def\stopsubsentence {\endofsubsentencespacing\prewordbreak\endofsubsentence}
-\unexpanded\def\subsentence     {\groupedcommand\startsubsentence\stopsubsentence}
-
-\definehspace [quotation]      [\zeropoint]
-\definehspace [interquotation] [.125em]
-
-%definehspace [quote]  [\zeropoint]
-%definehspace [speech] [\zeropoint]
-
-\definehspace [quote]  [\hspaceamount\currentlanguage{quotation}]
-\definehspace [speech] [\hspaceamount\currentlanguage{quotation}]
-
-\definesymbol
-  [\c!leftquotation]
-  [\leftboundarycharacter\c!leftquotation{quotation}]
-
-\definesymbol
-  [\c!rightquotation]
-  [\rightboundarycharacter\c!rightquotation{quotation}]
-
-\definesymbol
-  [\c!leftquote]
-  [\leftboundarycharacter\c!leftquote{quote}]
-
-\definesymbol
-  [\c!rightquote]
-  [\rightboundarycharacter\c!rightquote{quote}]
-
-\definesymbol
-  [\c!leftspeech]
-  [\leftboundarycharacter\c!leftspeech{speech}]
-
-\definesymbol
-  [\c!rightspeech]
-  [\rightboundarycharacter\c!rightspeech{speech}]
-
-\definesymbol
-  [\c!middlespeech]
-  [\leftboundarycharacter\c!middlespeech{speech}]
-
-\appendtoks\def\quotation#1{"#1"}\to\simplifiedcommands
-\appendtoks\def\quote    #1{'#1'}\to\simplifiedcommands
-
-%D The next features was so desperately needed by Giuseppe
-%D Bilotta that he made a module for it. Since this is a
-%D typical example of core functionality, I decided to extend
-%D the low level quotation macros in such a way that a speech
-%D feature could be build on top of it. The speech opening and
-%D closing symbols are defined per language. Italian is an
-%D example of a language that has them set.
-
-% this will replace the quotation and speed definitions
-
-% todo: \typo_ namespace
-
-\newsignal\delimitedtextsignal
-
-\let\currentdelimitedtext\s!unknown
-
-\def\delimitedtextlevel{\csname\??ci:\currentdelimitedtext:\c!level\endcsname}
-
-\def\doinitializetextlevel#1%
-  {\ifcsname\??ci:#1:\c!level\endcsname
-     \csname\??ci:#1:\c!level\endcsname\zerocount
-   \else
-     \expandafter\newcount\csname\??ci:#1:\c!level\endcsname
-   \fi}
-
-\def\delimitedtextparameter#1% will be sped up
-  {\executeifdefined{\??ci\currentdelimitedtext:\number\delimitedtextlevel#1}%
-  {\executeifdefined{\??ci\currentdelimitedtext#1}%
-  {\executeifdefined{\??ci#1}\empty}}}
-
-\unexpanded\def\definedelimitedtext
-  {\dodoubleempty\dodefinedelimitedtext}
-
-\def\dodefinedelimitedtext[#1][#2]%
-  {\doinitializetextlevel{#1}%
-   \doifassignmentelse{#2}
-     {\getparameters
-        [\??ci#1]
-        [\c!location=\v!margin, % \v!text \v!paragraph
-         \c!spacebefore=,
-         \c!spaceafter=\delimitedtextparameter\c!spacebefore,
-         \c!style=\v!normal,
-         \c!color=,
-         \c!leftmargin=\zeropoint,
-         \c!rightmargin=\delimitedtextparameter\c!leftmargin,
-         \c!indentnext=\v!yes,
-         \c!before=,
-         \c!after=,
-         \c!left=,
-         \c!right=,
-        %\c!level=0,
-         \c!repeat=\v!no,
-         \c!method=,
-        #2]}%
-     {\doifdefined{#2}
-        {\copyparameters[\??ci#1][\??ci#2]
-           [\c!location,\c!spacebefore,\c!spaceafter,\c!style,\c!color,
-            \c!leftmargin,\c!rightmargin,\c!indentnext,
-            \c!before,\c!after,\c!left,\c!right]}}%
-   \doifsomething{#1}
-     {\setuvalue{#1}{\delimitedtext[#1]}%
-      \setuvalue{\e!start#1}{\startdelimitedtext[#1]}% u added
-      \setuvalue{\e!stop #1}{\stopdelimitedtext}}}   % u added
-
-\unexpanded\def\setupdelimitedtext
-  {\dotripleargument\dosetupdelimitedtext}
-
-\def\dosetupdelimitedtext[#1][#2][#3]% #2 = optional level
-  {\ifthirdargument
-     \getparameters[\??ci#1:#2][#3]%
-   \else\ifsecondargument
-     \getparameters[\??ci#1][#2]%
-   \else
-     \getparameters[\??ci][#1]%
-   \fi\fi}
-
-\def\dorepeatdelimitedtext
-  {\relax\ifcase\delimitedtextlevel\else
-     \dohandledelimitedtext\c!middle % maybe better \dohandleleftdelimitedtext
-   \fi}
-
-\let\dohandlerepeatdelimitedtext\relax
-
-\unexpanded\def\startdelimitedtext[#1]%
-  {\begingroup
-   \pushdelimitedtext{#1}%
-   \dostarttagged\t!delimitedblock\currentdelimitedtext
-   \doifelse{\delimitedtextparameter\c!method}\s!font
-     {\let\dostopdelimitedtext\typo_delimitedtexts_finish_font
-      \ignoredelimitedtext\c!left\ignorespaces}
-     {\doifelse{\delimitedtextparameter\c!repeat}\v!yes
-        {\let\dohandlerepeatdelimitedtext\dorepeatdelimitedtext}%
-        {\let\dohandlerepeatdelimitedtext\relax}%
-      \doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
-        {\dosingleempty\dostartdelimitedtextpar}\dostartdelimitedtexttxt}}
-
-\def\typo_delimitedtexts_finish_font
-  {\removeunwantedspaces\ignoredelimitedtext\c!right}
-
-\def\dostartdelimitedtextpar[#1]%
-   {\let\dostopdelimitedtext\dostopdelimitedtextpar
-    \doifsomething{\delimitedtextparameter\c!spacebefore}
-      {\blank[\delimitedtextparameter\c!spacebefore]}%
-    \delimitedtextparameter\c!before
-    % nicer:
-    % \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
-    % \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
-    % backward compatible:
-    \doifelsenothing{#1}
-      {\endgraf
-       \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
-       \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
-       \let\dodostopdelimitedtextpar\endgraf}
-      {\startnarrower[#1]\let\dodostopdelimitedtextpar\stopnarrower}%
-    % so far
-    \pushmacro\checkindentation
-    \doifsomething{\delimitedtextparameter\c!indenting} % WS
-      {\setupindenting[\delimitedtextparameter\c!indenting]}%
-    \begingroup
-    \dousestylehashparameter{\??ci\currentdelimitedtext}\c!style
-    \dousecolorhashparameter{\??ci\currentdelimitedtext}\c!color
-    \leftdelimitedtextmark
-    \ignorespaces}
-
-\def\dostopdelimitedtextpar
-   {\removeunwantedspaces
-    \removelastskip
-    \rightdelimitedtextmark
-    \endgroup
-    \popmacro\checkindentation
-    \dodostopdelimitedtextpar
-    \delimitedtextparameter\c!after
-    \doifsomething{\delimitedtextparameter\c!spaceafter}
-      {\blank[\delimitedtextparameter\c!spaceafter]}%
-    \useindentnextparameter\delimitedtextparameter
-    \dorechecknextindentation}% AM: This was missing!
-
-\def\dostartdelimitedtexttxt
-  {\let\dostopdelimitedtext\dostopdelimitedtexttxt
-   \begingroup
-   \dousestylehashparameter{\??ci\currentdelimitedtext}\c!style
-   \dousecolorhashparameter{\??ci\currentdelimitedtext}\c!color
-   \dohandleleftdelimitedtext\c!left
-   \ignorespaces}
-
-\def\dostopdelimitedtexttxt
-  {\removeunwantedspaces
-   \dohandlerightdelimitedtext\c!right
-   \endgroup}
-
-\unexpanded\def\stopdelimitedtext
-  {\dostopdelimitedtext
-   \dostoptagged
-   \popdelimitedtext
-   \endgroup}
-
-\def\pushdelimitedtext#1%
-  {\globalpushmacro\currentdelimitedtext
-   \def\currentdelimitedtext{#1}%
-   \global\advance\delimitedtextlevel\plusone}
-
-\def\popdelimitedtext
-  {\global\advance\delimitedtextlevel\minusone
-   \globalpopmacro\currentdelimitedtext}
-
-\unexpanded\def\delimitedtext[#1]%
-  {\dontleavehmode % following ones can be omited
-   \pushdelimitedtext{#1}%
-   \doifelse{\delimitedtextparameter\c!method}\s!font
-     {\dofontdrivendelimited}
-     {\doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
-      \dodelimitedtextpar\dodelimitedtexttxt}}
-
-% shortcuts
-
-\unexpanded\def\startdelimited{\startdelimitedtext}
-\unexpanded\def\stopdelimited {\stopdelimitedtext}  % no let, dynamically assigned
-           \def\delimited     {\delimitedtext}
-
-\def\leftdelimitedtextmark
-  {\doifsomething{\delimitedtextparameter\c!left}
-     {\setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
-      \dontleavehmode
-      \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
-      \box\scratchbox}}
-
-\def\rightdelimitedtextmark
-  {\doifsomething{\delimitedtextparameter\c!right}
-     {\hsmash{\delimitedtextparameter\c!right}}}
-
-% \starttext
-%    \hyphenatedword{groepsvrijstellingsverordeningen}\par
-%    \hyphenatedword{\quote{groepsvrijstellingsverordeningen}}\par
-%     \dorecurse{100}{\hskip300pt\hskip\recurselevel pt test \quote{xxx xxxx}.\par}
-%     \page \setuppapersize[A5][A4]
-%     \quotation {overly beautiful pusillanimous sesquipedalian
-%     longwinded} test test test test test test test test test test test
-%     test test test test test test test test test test test test test
-%     test test test test test test test test test test test test test
-%     test test test test test test test test test test test test test
-%     test test test
-% \stoptext
-
-\def\dohandledelimitedtext#1#2%
-  {\begingroup
-   \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
-   \ifdim\wd\scratchbox>\zeropoint
-     \ifdim\lastkern=\delimitedtextsignal
-       \unkern
-       \hskip\hspaceamount\currentlanguage{interquotation}%
-     \else
-       #2%
-     \fi
-     \ifhmode % else funny pagebeaks
-       \penalty\plustenthousand
-       \hskip\zeropoint % == \prewordbreak
-     \fi
-     \strut % new, needed below
-     \delimitedtextparameter#1% unhbox\scratchbox
-   % \penalty\plustenthousand % else overfull boxes, but that's better than dangling periods
-     \kern\delimitedtextsignal % +- \prewordbreak
-   \fi
-   \endgroup}
-
-\def\dohandleleftdelimitedtext#1#2%
-  {\begingroup
-   \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
-   \ifdim\wd\scratchbox>\zeropoint
-     \ifdim\lastkern=\delimitedtextsignal
-       \unkern
-       \hskip\hspaceamount\currentlanguage{interquotation}%
-     \else\ifdim\lastskip=\delimitedtextsignal
-       \unskip
-       \hskip\hspaceamount\currentlanguage{interquotation}%
-     \else
-       #2%
-     \fi\fi
-     \strut % new, needed below
-     \ifhmode % else funny pagebeaks
-       \penalty\plustenthousand
-       \hskip\zeropoint % == \prewordbreak
-     \fi
-     \strut % new, needed below
-     \delimitedtextparameter#1% unhbox\scratchbox
-     \hskip\delimitedtextsignal % +- \prewordbreak
-   \fi
-   \endgroup}
-
-\def\dohandlerightdelimitedtext#1#2%
-  {\begingroup
-   \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
-   \ifdim\wd\scratchbox>\zeropoint
-     \ifdim\lastkern=\delimitedtextsignal
-       \unkern
-       \penalty\plustenthousand
-       \hskip\hspaceamount\currentlanguage{interquotation}%
-     \else\ifdim\lastskip=\delimitedtextsignal
-       \unskip
-       \penalty\plustenthousand
-       \hskip\hspaceamount\currentlanguage{interquotation}%
-     \else
-       #2%
-     \fi\fi
-     \ifhmode % else funny pagebeaks
-       \penalty\plustenthousand
-       \hskip\zeropoint % == \prewordbreak
-     \fi
-     \strut % new, needed below
-     \delimitedtextparameter#1% unhbox\scratchbox
-     \kern\delimitedtextsignal % +- \prewordbreak
-   \fi
-   \endgroup}
-
-
-\def\ignoredelimitedtext#1%
-  {\delimitedtextparameter#1}
-
-\def\handledelimitedtext#1%
-  {\dohandledelimitedtext{#1}\relax}
-
-\def\handleleftdelimitedtext#1%
-  {\dohandleleftdelimitedtext{#1}\relax}
-
-\def\handlerightdelimitedtext#1%
-  {\dohandlerightdelimitedtext{#1}\relax}
-
-\unexpanded\def\dodelimitedtextpar
-  {\groupedcommand
-     {\dostarttagged\t!delimited\currentdelimitedtext % block?
-      \dohandleleftdelimitedtext\c!left\relax}
-     {\dohandlerightdelimitedtext\c!right\removelastskip
-      \dostoptagged
-      \popdelimitedtext}}
-
-\unexpanded\def\dodelimitedtexttxt
-  {\doifelse{\delimitedtextparameter\c!style}\v!normal
-     \doquoteddelimited\doattributeddelimited}
-
-\def\doquoteddelimited
-  {\groupedcommand
-     {\dostarttagged\t!delimited\currentdelimitedtext
-      \dohandleleftdelimitedtext\c!left\relax}
-     {\dohandlerightdelimitedtext\c!right
-      \removelastskip
-      \dostoptagged
-      \popdelimitedtext}}
-
-\def\doattributeddelimited
-  {\groupedcommand
-     {\dostarttagged\t!delimited\currentdelimitedtext
-      \dousestylehashparameter{\??ci\currentdelimitedtext}\c!style
-      \dousecolorhashparameter{\??ci\currentdelimitedtext}\c!color}
-     {\dostoptagged
-      \popdelimitedtext}}
-
-\def\dofontdrivendelimited
-  {\simplegroupedcommand
-     {\dostarttagged\t!delimited\currentdelimitedtext
-      \languageparameter{\c!left\currentdelimitedtext}}
-     {\languageparameter{\c!right\currentdelimitedtext}%
-      \dostoptagged
-      \popdelimitedtext}}
-
-% testcase for nesting:
-%
-% \quotation{... \quotation{...} ...}
-% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
-% \setupdelimitedtext[quotation][1][left=(,right=)]
-% \setupdelimitedtext[quotation][2][left={[},right={]}]
-% \setupdelimitedtext[quotation][3][left=\{,right=\}]
-% \quotation{... \quotation{...} ...}
-% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
-
-\definedelimitedtext
-  [\v!quotation]
-  [\c!left={\symbol[\c!leftquotation]},
-   \c!right={\symbol[\c!rightquotation]},
-   \c!leftmargin=\v!standard]
-
-\definedelimitedtext
-  [\v!quote][\v!quotation]
-
-\setupdelimitedtext
-  [\v!quote]
-  [\c!location=\v!text,
-   \c!left={\symbol[\c!leftquote]},
-   \c!right={\symbol[\c!rightquote]}]
-
-\definedelimitedtext
-   [\v!blockquote][\v!quotation]
-
-\setupdelimitedtext
-  [\v!blockquote]
-  [\c!left=,
-   \c!right=]
-
-\definedelimitedtext
-  [\v!speech][\v!quotation]
-
-\setupdelimitedtext
-  [\v!speech]
-  [\c!repeat=\v!yes,
-   \c!left={\symbol[\c!leftspeech]},
-   \c!middle={\symbol[\c!middlespeech]},
-   \c!right={\symbol[\c!rightspeech]}]
-
-% how do we call an tight quote
-%
-% \definedelimitedtext
-%    [\v!quotation][\v!quotation]
-%
-% \setupdelimitedtext
-%   [\v!quotation]
-%   [\c!indentnext=\v!no,
-%    \c!spacebefore=\v!nowhite]
-
-\unexpanded\def\setupquotation{\setupdelimitedtext[\v!quotation]}
-\unexpanded\def\setupquote    {\setupdelimitedtext[\v!quote]}
-
 % seldom used, move from kernel to run time module
 
 \ifx\tfx\undefined \let\tfx\relax \fi
@@ -1219,41 +534,6 @@
 
 \let\grid\basegrid
 
-% only used at pragma, move from kernel to run time module
-
-\def\referraldate
-  {\currentdate[\v!referral]}
-
-\def\doreferral[#1]%
-   {\noheaderandfooterlines
-    \bgroup
-    \getparameters
-      [\??km]
-      [\c!bet=\unknown,\c!dat=\unknown,\c!ken=\unknown,
-       \c!from=,\c!to=,\c!ref=,#1]%
-    % moet anders, hoort niet in 01b
-    \assigntranslation[\s!nl=referentie,\s!en=reference,\s!de=Referenz,\s!hr=referenca,\s!sp=referencia]\to\@@@kmref
-    \assigntranslation[\s!nl=van,\s!en=from,\s!de=Von,\s!hr=od,\s!sp=de]\to\@@@kmvan
-    \assigntranslation[\s!nl=aan,\s!en=to,\s!de=An,\s!hr=za,\s!sp=a]\to\@@@kmaan
-    \assigntranslation[\s!nl=betreft,\s!en=concerns,\s!de=Betreff,\s!hr=predmet,\s!sp=]\to\@@@kmbet
-    \assigntranslation[\s!nl=datum,\s!en=date,\s!de=Datum,\s!hr=datum,\s!sp=fecha]\to\@@@kmdat
-    \assigntranslation[\s!nl=kenmerk,\s!en=mark,\s!de=Kennzeichen,\s!hr=oznaka,\s!sp=]\to\@@@kmken
-    %
-    \definetabulate[\s!dummy][|l|p|]
-    \startdummy
-      \NC\@@@kmbet\EQ\@@kmbet\NC\NR
-      \NC\@@@kmdat\EQ\@@kmdat\NC\NR
-      \NC\@@@kmken\EQ\expanded{\smallcapped{\@@kmken}}\NC\NR
-      \doifsomething{\@@kmfrom\@@kmto}{\NC\NC\NC\NR}%
-      \doifsomething \@@kmfrom         {\NC\@@@kmvan\EQ\@@kmfrom\NC\NR}%
-      \doifsomething \@@kmto         {\NC\@@@kmaan\EQ\@@kmto\NC\NR}%
-      \doifsomething \@@kmref         {\NC\NC\NC\NR\NC\@@@kmref\EQ\@@kmref\NC\NR}%
-    \stopdummy
-    \egroup}
-
-\def\referral
-  {\dosingleargument\doreferral}
-
 \definetabulate
   [\v!legend]
   [|emj1|i1|mR|]
@@ -1433,6 +713,12 @@
 %D       \stopitemize}}
 %D \stoptyping
 
+\newsystemmode{pairedbox}
+
+\appendtoks
+    \global\resetsystemmode{pairedbox}%
+\to \everyinsidefloat
+
 \newbox\firstpairedbox
 \newbox\secondpairedbox
 
@@ -1610,294 +896,6 @@
 
 \definepairedbox[\v!legend]
 
-%D Goody (to be reconsidered):
-
-\newsystemmode{combination}
-\newsystemmode{pairedbox}
-
-\appendtoks
-    \global\resetsystemmode{combination}%
-    \global\resetsystemmode{pairedbox}%
-\to \everyinsidefloat
-
-% todo: \startcombination \startcomb \stopcomb ...
-
-% needs to be mkiv'd (we could map this onto bTABLE)
-
-\newcount\horcombination  % counter
-\newcount\totcombination
-
-\unexpanded\def\definecombination
-  {\dodoubleempty\dodefinecombination}
-
-\def\dodefinecombination[#1][#2]%
-  {\copyparameters
-     [\??co#1][\??co]
-     [\c!width,\c!height,\c!distance,\c!location,%
-      \c!before,\c!inbetween,\c!after,\c!align,%
-      \c!style,\c!color]%
-   \getparameters
-     [\??co#1][#2]}
-
-\unexpanded\def\setupcombinations
-  {\dodoubleempty\dosetupcombinations}
-
-\def\dosetupcombinations[#1][#2]%
-  {\ifsecondargument
-     \getparameters[\??co#1][#2]%
-   \else
-     \getparameters[\??co][#1]%
-   \fi}
-
-\def\combinationparameter#1%
-  {\csname\??co\currentcombination#1\endcsname}%
-
-\unexpanded\def\startcombination
-  {\bgroup % so we can grab a group
-   \dodoubleempty\dostartcombination}
-
-% \startcombination      {alpha} {a} {beta} {b} \stopcombination
-% \startcombination[2*1] {alpha} {a} {beta} {b} \stopcombination
-% \startcombination[1*2] {alpha} {a} {beta} {b} \stopcombination
-% \startcombination[2]   {alpha} {a} {beta} {b} \stopcombination
-
-\def\dostartcombination[#1][#2]% needs a cleanup, also nx ny (pretty old, this one)
-  {\global\setsystemmode{combination}%
-   \doifnothing{#1}\firstargumentfalse      % to be sure (when called in macros)
-   \doifnothing{#2}\secondargumentfalse     % to be sure (when called in macros)
-   \ifsecondargument % todo: nx ny
-     \def\currentcombination{#1}%
-     \edef\currentcombinationspec{#2*1*}%
-   \else % better : \doifcombinationelse ... \??co#1\c!location
-      \doifinstringelse{*}{#1}
-       {\let\currentcombination\empty
-        \edef\currentcombinationspec{#1*1*}}
-       {\doifnumberelse{#1}
-          {\let\currentcombination\empty
-           \edef\currentcombinationspec{#1*1*}}
-          {\def\currentcombination{#1}%
-           \edef\currentcombinationspec{2*1*}}}%
-   \fi
-   \forgetall
-   \dostarttagged\t!combination\currentcombination
-   \doifelse{\combinationparameter\c!height}\v!fit
-     \vbox {\vbox to \combinationparameter\c!height}%
-   \bgroup
-   \let\combination\empty % permits \combination{}{} handy for cld
-   \setuphorizontaldivision
-     [\c!n=\v!fit,\c!distance=\combinationparameter\c!distance]%
-   \expanded{\dodostartcombination[\currentcombinationspec]}}
-
-\ifdefined\dotagcombination \else \let\dotagcombination\relax \fi
-
-\long\def\dodostartcombination[#1*#2*#3]%
-  {\global\horcombination#1%
-   \global\totcombination#2%
-   \dotagcombination
-   \global\setbox\combinationstack\emptybox
-   \xdef\maxhorcombination{\the\horcombination}%
-   \multiply\totcombination\horcombination
-   \tabskip\zeropoint
-   \doifelse{\combinationparameter\c!width}\v!fit
-     {\halign}{\halign to \combinationparameter\c!width}%
-   \bgroup
-   &%
-   %\hfil##\hfil% now : location={left,top}
-   \expanded{\doifnotinset{\v!left}{\combinationparameter\c!location}}\hfil
-   ##%
-   \expanded{\doifnotinset{\v!right}{\combinationparameter\c!location}}\hfil
-   &%
-   \tabskip\zeropoint \!!plus 1fill
-   ##%
-   \cr
-   \docombination}
-
-\def\docombination % we want to add struts but still ignore an empty box
-  {\dostarttagged\t!combinationpair\empty
-   \dostarttagged\t!combinationcontent\empty
-   \dowithnextboxcs\docombinationfinish\hbox}
-
-\def\docombinationfinish % we want to add struts but still ignore an empty box
-  {\dostoptagged
-   \setbox0\flushnextbox
-   \dostarttagged\t!combinationcaption\empty
-   \dowithnextbox
-     {\dostoptagged
-      \dostoptagged
-      \setbox2\flushnextbox
-      \dodocombination}%
-   \vtop\bgroup
-     \afterassignment\donextcombination\let\nexttoken=}
-
-\def\donextcombination
-  {\futurelet\nexttoken\donextnextcombination}
-
-\def\donextnextcombination
-  {\ifx\nexttoken\egroup \else % the next box is empty
-     \hsize\wd0
-     \setupalign[\combinationparameter\c!align]%
-     \dousestylehashparameter{\??co\currentcombination}\c!style
-     \dousecolorhashparameter{\??co\currentcombination}\c!color
-     \bgroup
-     \aftergroup\endstrut
-     \aftergroup\egroup
-     \begstrut
-   \fi}
-
-\def\depthonlybox
-  {\dowithnextbox{\vtop{\hsize\wd\nextbox\kern\zeropoint\box\nextbox}}\vbox}
-
-\def\dodocombination
-  {\vbox
-     {\forgetall % \setupwhitespace[\v!none]%
-      \let\next\vbox
-      \expanded{\processallactionsinset[\combinationparameter\c!location]}
-        [    \v!top=>\let\next\depthonlybox, % \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
-       \doubleexpandafter\docombinationa
-     \else
-       \doubleexpandafter\docombinationb
-     \fi
-   \else
-     \expandafter\docombinationc
-   \fi}
-
-\def\docombinationa
-  {\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}
-
-\def\docombinationb
-  {&&&\hskip\combinationparameter\c!distance&\docombination}
-
-\def\docombinationc
-  {\cr
-   \flushcombinationstack
-   \egroup}
-
-% formally ok:
-%
-% \unexpanded\def\stopcombination
-%   {\egroup
-%    \egroup}
-%
-% more robust:
-%
-% \unexpanded\def\stopcombination
-%   {{}{}{}{}{}{}{}{}% catches (at most 4) missing entries
-%    \egroup
-%    \egroup}
-%
-% even better:
-
-\unexpanded\def\stopcombination
-  {{\scratchtoks{{}{}{}}\dorecurse\totcombination{\appendtoks{}{}{}{}\to\scratchtoks}\expandafter}\the\scratchtoks
-   \egroup
-   \dostoptagged
-   \egroup}
-
-\newbox\combinationstack
-
-\def\saveoncombinationstack#1%
-  {\global\setbox\combinationstack\hbox
-     {\hbox{\box#1}\unhbox\combinationstack}}
-
-\def\flushcombinationstack
-  {\noalign
-     {\ifdim\ht\combinationstack>\zeropoint
-        \nointerlineskip % nieuw
-        \combinationparameter\c!inbetween
-        \global\horcombination\maxhorcombination
-        \globallet\doflushcombinationstack\dodoflushcombinationstack
-      \else
-        \global\setbox\combinationstack\emptybox
-        \globallet\doflushcombinationstack\donothing
-      \fi}%
-   \doflushcombinationstack\crcr}
-
-\gdef\dodoflushcombinationstack
-  {\global\setbox\combinationstack\hbox
-     {\unhbox\combinationstack
-      \global\setbox1\lastbox}%
-   \box1% \ruledhbox{\box1}%
-   \global\advance\horcombination\minusone\relax
-   \ifnum\horcombination>\zerocount
-     \expandafter\dodoflushcombinationstacknext
-   \else
-     \global\setbox\combinationstack\emptybox
-   \fi}
-
-\def\dodoflushcombinationstacknext
-  {&&&&\doflushcombinationstack}
-
-\setupcombinations
-  [\c!width=\v!fit,
-   \c!height=\v!fit,
-   \c!distance=1em,
-   \c!location=\v!bottom, % can be something {top,left}
-   \c!before=\blank,
-   \c!inbetween={\blank[\v!medium]},
-   \c!style=,
-   \c!color=,
-   \c!after=,
-   \c!align=\v!middle]
-
-%D \macros
-%D   {startfloatcombination}
-%D
-%D \setupexternalfigures[directory={../sample}]
-%D \startbuffer
-%D \placefigure
-%D   [left,none]
-%D   {}
-%D   {\startfloatcombination[2*2]
-%D      \placefigure{alpha}{\externalfigure[cow.pdf][width=1cm]}
-%D      \placefigure{beta} {\externalfigure[cow.pdf][width=2cm]}
-%D      \placefigure{gamma}{\externalfigure[cow.pdf][width=3cm]}
-%D      \placefigure{delta}{\externalfigure[cow.pdf][width=4cm]}
-%D    \stopfloatcombination}
-%D
-%D \input tufte
-%D \stopbuffer
-%D
-%D \typebuffer \getbuffer
-
-\unexpanded\def\startfloatcombination
-  {\dodoubleempty\dostartfloatcombination}
-
-\let\startfloatcombination\relax
-
-\def\dostartfloatcombination[#1][#2]%
-  {\vbox\bgroup
-  %\insidecolumnstrue % trick, forces no centering, todo: proper switch/feature
-   \postcenterfloatmethod\zerocount
-   \forcelocalfloats
-   \unexpanded\def\stopfloatcombination{\dostopfloatcombination{#1}}}
-
-\unexpanded\def\dostopfloatcombination#1%
-  {\scratchtoks\emptytoks
-   \dorecurse\noflocalfloats
-     {\appendetoks{\noexpand\getlocalfloat{\recurselevel}}{}\to\scratchtoks}% brrr
-   \expanded{\startcombination[#1]\the\scratchtoks}\stopcombination
-   \resetlocalfloats
-  \egroup}
-
 \unexpanded\def\placerelativetoeachother#1#2%
   {\bgroup
    \dowithnextbox
@@ -1957,9 +955,8 @@
   [\c!distance=\emwidth,
    \c!n=\v!fit]
 
-%D This one is for Daniel Pittman, who wanted tight
-%D fractions. We show three versions. First the simple
-%D one using \type {\low} and \type {high}:
+%D This one is for Daniel Pittman, who wanted tight fractions. We show
+%D three versions. First the simple one using \type {\low} and \type {high}:
 %D
 %D \startbuffer
 %D \def\vfrac#1#2%
@@ -2017,7 +1014,7 @@
         \lower\dp0\hbox{\raise\dp2\hbox{\txx#2}}%
       \fi}}
 
-\ifx\vfrac\undefined \let\vfrac\vulgarfraction \fi
+\ifdefined\vfrac \else \let\vfrac\vulgarfraction \fi
 
 %D \starttabulate
 %D \HL
@@ -2029,7 +1026,7 @@
 %D \NC 3 \NC \vulgarfractionmethod3 \vulgarfraction{1}{2} \NC\NR
 %D \HL
 %D \stoptabulate
-
+
 %D Under construction:
 %D
 %D \starttyping
@@ -2041,6 +1038,8 @@
 %D \commalistsentence[a,b,c][+,-]
 %D \stoptyping
 
+% obsolete .. use lua instead
+
 \let\handlecommalistsentence\firstofoneargument
 
 \def\commalistsentenceone{and-1}
diff --git a/tex/context/base/enco-ini.mkiv b/tex/context/base/enco-ini.mkiv
index a5dc60f93..d225f07af 100644
--- a/tex/context/base/enco-ini.mkiv
+++ b/tex/context/base/enco-ini.mkiv
@@ -339,4 +339,42 @@
 \unexpanded\def\textplus
   {\char"002B } % plus
 
+%D Moved from core-mis:
+
+\unexpanded\def\celsius   #1{#1\mathematics{^\circ}C}
+\unexpanded\def\inch        {\mathematics{\prime\prime}} % was: \hbox{\rm\char125\relax}
+\unexpanded\def\fraction#1#2{\mathematics{#1\over#2}}
+
+\def\periodswidth  {.5em}
+\def\periodsdefault{3}    % was 5, but now it's like \unknown
+
+\unexpanded\def\periods
+  {\dosingleempty\doperiods}
+
+% \def\doperiods[#1]% todo: also n=,width= or maybe just #1,#2
+%   {\dontleavehmode
+%    \begingroup
+%    \scratchdimen\periodswidth
+%    \hbox to \iffirstargument#1\else\periodsdefault\fi \scratchdimen
+%      {\leaders\hbox to \scratchdimen{\hss.\hss}\hss}%
+%    \endgroup}
+%
+% better for export:
+
+\unexpanded\def\doperiods[#1]% todo: also n=,width= or maybe just #1,#2
+  {\dontleavehmode
+   \hbox\bgroup
+   \setbox\scratchbox\hbox to \periodswidth{\hss.\hss}%
+   \dorecurse{\iffirstargument#1\else\periodsdefault\fi}{\copy\scratchbox}%
+   \egroup}
+
+\unexpanded\def\unknown
+  {\periods\relax} % relax prevents lookahead for []
+
+% Example by Wolfgang Schuster on the context list:
+%
+% \unexpanded\def\fourdots{{\def\periodswidth{.3em}\periods[4]}}
+%
+% Hello\fourdots\ World\fourdots \par Hello\fourdots\ World.
+
 \protect \endinput
diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua
index bc5c4f12d..db94c62e4 100644
--- a/tex/context/base/grph-inc.lua
+++ b/tex/context/base/grph-inc.lua
@@ -8,6 +8,8 @@ if not modules then modules = { } end modules ['grph-inc'] = {
 
 -- figures -> managers.figures
 
+-- todo: empty filename or only suffix always false (not found)
+
 -- lowercase types
 -- mps tex tmp svg
 -- partly qualified
diff --git a/tex/context/base/grph-inc.mkiv b/tex/context/base/grph-inc.mkiv
index 58d1e2b62..633130ea9 100644
--- a/tex/context/base/grph-inc.mkiv
+++ b/tex/context/base/grph-inc.mkiv
@@ -290,6 +290,7 @@
         height     = "\@@efheight", % can be crap
     } }%
    \ctxlua{figures.identify()}%
+   % also mode: checkpresense only
    \ifconditional\testexternalfigureonly
       \ifcase\figurestatus \else
         \ctxlua{figures.check()}%
@@ -325,7 +326,7 @@
 
 \newsystemmode\v!figure
 
-\def\signalexternalfigure % global
+\def\signalexternalfigure % global (dup call to status)
   {\ifcase\figurestatus
      \global\resetsystemmode\v!figure % todo, also: \v!resource
    \else
@@ -406,9 +407,21 @@
 
 \let\getfiguredimensionsonly\getfiguredimensions
 
-\def\doiffigureelse#1%
+% \unexpanded\def\doiffigureelse#1%
+%   {\getfiguredimensions[#1]% so data is available !
+%    \ifdim\figurewidth=\zeropoint % todo: \figurestatus
+%      \expandafter\secondoftwoarguments
+%    \else
+%      \expandafter\firstoftwoarguments
+%    \fi}
+
+% \unexpanded\def\doiffigureelse#1% just low level call
+%   {\getfiguredimensions[#1]% so data is available ! ... grouped so status is local
+%    \doifmodeelse{*\v!figure}\firstoftwoarguments\secondoftwoarguments} % mode is set global
+
+\unexpanded\def\doiffigureelse#1%
   {\getfiguredimensions[#1]% so data is available !
-   \ifdim\figurewidth=\zeropoint % todo: \figurestatus
+   \ifcase\figurestatus
      \expandafter\secondoftwoarguments
    \else
      \expandafter\firstoftwoarguments
diff --git a/tex/context/base/grph-trf.mkiv b/tex/context/base/grph-trf.mkiv
index b3392a9b7..a33e5606d 100644
--- a/tex/context/base/grph-trf.mkiv
+++ b/tex/context/base/grph-trf.mkiv
@@ -823,7 +823,7 @@
    \settrue \c_grph_rotate_obey_depth
    \grph_rotate_framed}
 
-\def\dorotatebox#1% {angle} \hbox/\vbox/\vtop % a fast low level one
+\unexpanded\def\dorotatebox#1% {angle} \hbox/\vbox/\vtop % a fast low level one
   {\ifcase#1\relax
      \expandafter\gobbleoneargument
    \else
@@ -837,7 +837,9 @@
      \dowithnextboxcs\grph_rotate_finish_box}
 
 \def\grph_rotate_finish_box
-  {\getvalue{\??rotatelocation\v!broad}%
+  {\setfalse\c_grph_rotate_not_fit      % this is the same as broad but
+   \setfalse\c_grph_rotate_center       % without the following grab as
+   \setfalse\c_grph_rotate_obey_depth   % we call finish directly
    \grph_rotate_finish_indeed
    \egroup
    \egroup}
diff --git a/tex/context/base/mult-aux.mkiv b/tex/context/base/mult-aux.mkiv
index e50a7470c..d9ac110c9 100644
--- a/tex/context/base/mult-aux.mkiv
+++ b/tex/context/base/mult-aux.mkiv
@@ -11,6 +11,9 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
+% todo: setupxxx and setupxxxs (so a plural for the root setup and
+% we can consider blocking the root)
+
 %D A generalization of \MKIV-like inheritance. Just something to play
 %D with (interface might change). The code here evolved in an email
 %D exchange between me and Wolgang Schuster.
diff --git a/tex/context/base/mult-sys.mkiv b/tex/context/base/mult-sys.mkiv
index 816a32d4f..205e67009 100644
--- a/tex/context/base/mult-sys.mkiv
+++ b/tex/context/base/mult-sys.mkiv
@@ -439,9 +439,8 @@
 \definesystemvariable {br}   % sideBaR
 \definesystemvariable {bx}   % BackendExport
 \definesystemvariable {cb}   % CollectBox
-\definesystemvariable {ci}   % CItaat
+% \definesystemvariable {ci}   % CItaat
 \definesystemvariable {cm}   % CheMical
-\definesystemvariable {co}   % COmbinaties
 \definesystemvariable {cp}   % CliP
 \definesystemvariable {da}   % DAte
 \definesystemvariable {db}   % Labels
@@ -478,7 +477,6 @@
 \definesystemvariable {it}   % stelInTerliniein
 \definesystemvariable {iv}   % stelInvulLijnenin
 \definesystemvariable {ka}   % KAntlijn
-\definesystemvariable {kk}   % Kapitalen
 \definesystemvariable {kl}   % KoLommen
 \definesystemvariable {km}   % KenMerk
 \definesystemvariable {kp}   % KopPelteken
@@ -559,6 +557,7 @@
 
 \definesystemvariable{cs} % CharacterSpacing
 \definesystemvariable{ts} % TypeScript
+\definesystemvariable{kk} % Kapitalen
 
 %D Next we define some language independant one letter
 %D variables and keywords. We can actually make these
diff --git a/tex/context/base/pack-com.mkiv b/tex/context/base/pack-com.mkiv
new file mode 100644
index 000000000..be06b2e86
--- /dev/null
+++ b/tex/context/base/pack-com.mkiv
@@ -0,0 +1,350 @@
+%D \module
+%D   [       file=pack-com, % used to be in core-mis,
+%D        version=20120111,
+%D          title=\CONTEXT\ Packing Macros,
+%D       subtitle=Combinations,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Combinations}
+
+\unprotect
+
+%D We could of course map combinations onto one of the table
+%D mechanisms but as it has served us well for ages we keep
+%D this one. The code has been cleaned up a bit and mkiv'd.
+%D
+%D Okay ... I might luafy this one eventually.
+
+% \startcombination      {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[2*1] {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[1*2] {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[2]   {alpha} {a} {beta} {b} \stopcombination
+
+% todo: \startcombination \startcomb \stopcomb ...
+
+\ifdefined\dotagcombination \else \let\dotagcombination\relax \fi
+
+\newsystemmode{combination}
+
+\appendtoks
+    \global\resetsystemmode{combination}%
+\to \everyinsidefloat
+
+\newcount\c_pack_combinations_x
+\newcount\c_pack_combinations_n
+\newcount\c_pack_combinations_max
+\newbox  \b_pack_combinations_captions
+\newbox  \b_pack_combinations_content
+\newbox  \b_pack_combinations_caption
+\newbox  \b_pack_combinations_temp % global
+
+\installcorenamespace{combination}
+
+\installcommandhandler \??combination {combination} \??combination
+
+\setupcombination
+  [\c!width=\v!fit,
+   \c!height=\v!fit,
+   \c!distance=\emwidth,
+   \c!location=\v!bottom, % can be something {top,left}
+   \c!before=\blank,
+   \c!inbetween={\blank[\v!medium]},
+  %\c!style=,
+  %\c!color=,
+  %\c!after=,
+   \c!align=\v!middle]
+
+\let\setupcombinations\setupcombination % for the moment (we might distinguish)
+
+\installcorenamespace{combinationlocation}
+
+\let\m_pack_combinations_rightfiller\hfil
+\let\m_pack_combinations_leftfiller \hfil
+\let\m_pack_combinations_valigner   \firstofoneargument
+
+\setvalue{\??combinationlocation\v!left  }{\let\m_pack_combinations_leftfiller\relax}
+\setvalue{\??combinationlocation\v!right }{\let\m_pack_combinations_rightfiller\relax}
+\setvalue{\??combinationlocation\v!top   }{\let\m_pack_combinations_valigner\depthonlybox}
+\setvalue{\??combinationlocation\v!middle}{\let\m_pack_combinations_valigner\halfwaybox}
+
+\def\pack_combinations_location_step#1%
+  {\csname\??combinationlocation#1\endcsname}
+
+\unexpanded\def\startcombination
+  {\bgroup % so we can grab a group
+   \dodoubleempty\pack_combinations_start}
+
+% formally ok:
+%
+% \unexpanded\def\stopcombination
+%   {\egroup
+%    \egroup}
+%
+% more robust:
+%
+% \unexpanded\def\stopcombination
+%   {{}{}{}{}{}{}{}{}% catches (at most 4) missing entries
+%    \egroup
+%    \egroup}
+%
+% even better:
+%
+% \unexpanded\def\stopcombination
+%   {\bgroup
+%    \scratchtoks{{}}%
+%    \dorecurse\c_pack_combinations_n
+%      {\scratchtoks\expandafter{\the\scratchtoks{}{}}}%
+%    \expandafter\egroup\the\scratchtoks
+%    \egroup
+%    \dostoptagged
+%    \egroup}
+%
+% faster
+
+\unexpanded\def\stopcombination
+  {\bgroup\normalexpanded{\egroup{}\ctxcommand{ntimes("{}{}",\number\c_pack_combinations_n)}}%
+   \dostoptagged
+   \egroup
+   \egroup}
+
+\def\pack_combinations_start[#1][#2]% needs a cleanup, also nx ny (pretty old, this one)
+  {\global\setsystemmode{combination}%
+   %
+%    \doifnothing{#1}\firstargumentfalse      % to be sure (when called in macros)
+%    \doifnothing{#2}\secondargumentfalse     % to be sure (when called in macros)
+%    \ifsecondargument % todo: nx ny
+%      \edef\currentcombination{#1}%
+%      \edef\currentcombinationspec{#2*\plusone*}%
+%    \else % better : \doifcombinationelse ... \??co#1\c!location
+%      \doifinstringelse{*}{#1}
+%        {\let\currentcombination\empty
+%         \edef\currentcombinationspec{#1*\plusone*}}
+%        {\doifnumberelse{#1}
+%           {\let\currentcombination\empty
+%            \edef\currentcombinationspec{#1*\plusone*}}
+%           {\edef\currentcombination{#1}%
+%            \edef\currentcombinationspec{\plustwo*\plusone*}}}%
+%    \fi
+   %
+   % todo : move split to here
+   %
+   \edef\currentcombination{#1}%
+   \edef\currentcombinationspec{#2}%
+   \ifx\currentcombinationspec\empty
+     \doifinstringelse{*}\currentcombination
+       {\edef\currentcombinationspec{\currentcombination*\plusone*}%
+        \let\currentcombination\empty}
+       {\doifnumberelse\currentcombination
+          {\edef\currentcombinationspec{\currentcombination*\plusone*}%
+           \let\currentcombination\empty}
+          {\edef\currentcombinationspec{\plustwo*\plusone*}}}%
+   \else
+     \edef\currentcombinationspec{\currentcombinationspec*\plusone*}%
+   \fi
+   %
+   \forgetall
+   %
+   \edef\p_height  {\combinationparameter\c!height}%
+   \edef\p_width   {\combinationparameter\c!width}%
+   \edef\p_location{\combinationparameter\c!location}%
+   \edef\p_align   {\combinationparameter\c!align}%
+   \edef\p_distance{\combinationparameter\c!distance}%
+   %
+   \let\m_pack_combinations_rightfiller\relax
+   \let\m_pack_combinations_leftfiller \relax
+   \let\m_pack_combinations_valigner   \vbox
+   \processcommacommand[\p_location]\pack_combinations_location_step
+   %
+   \dostarttagged\t!combination\currentcombination
+   \vbox \ifx\p_height\v!fit\else to \p_height \fi \bgroup
+   \let\combination\empty % permits \combination{}{} handy for cld
+   \setuphorizontaldivision[\c!n=\v!fit,\c!distance=\p_distance]%
+   \normalexpanded{\pack_combinations_start_indeed[\currentcombinationspec]}}
+
+\unexpanded\def\pack_combinations_start_indeed[#1*#2*#3]%
+  {\global\c_pack_combinations_x#1\relax
+   \global\c_pack_combinations_n#2\relax
+   \dotagcombination
+   \global\setbox\b_pack_combinations_captions\emptybox
+   \global\c_pack_combinations_max\c_pack_combinations_x
+   \multiply\c_pack_combinations_n\c_pack_combinations_x
+   \tabskip\zeropoint
+   \halign \ifx\p_width\v!fit\else to \p_width \fi \bgroup
+   \aligntab
+   \m_pack_combinations_leftfiller
+   \alignmark\alignmark
+   \m_pack_combinations_rightfiller
+   \aligntab
+   \tabskip\zeropoint \!!plus 1fill
+   \alignmark\alignmark
+   \cr
+   \pack_combinations_pickup}
+
+\def\pack_combinations_pickup % we want to add struts but still ignore an empty box
+  {\dostarttagged\t!combinationpair\empty
+   \dostarttagged\t!combinationcontent\empty
+   \dowithnextboxcs\pack_combinations_pickup_content\hbox}
+
+\def\pack_combinations_pickup_content % we want to add struts but still ignore an empty box
+  {\dostoptagged
+   \setbox\b_pack_combinations_content\box\nextbox
+   \dostarttagged\t!combinationcaption\empty
+   \dowithnextboxcs\pack_combinations_pickup_caption\vtop\bgroup
+     \afterassignment\pack_combinations_caption_first
+     \let\nexttoken=}
+
+\def\pack_combinations_pickup_caption
+  {\dostoptagged
+   \dostoptagged
+   \setbox\b_pack_combinations_caption\box\nextbox
+   \pack_combinations_pickup_package_pair}
+
+\def\pack_combinations_caption_first
+  {\futurelet\nexttoken\pack_combinations_caption_second}
+
+\def\pack_combinations_caption_second
+  {\ifx\nexttoken\egroup
+     % the caption is empty
+   \else
+     \hsize\wd\b_pack_combinations_content
+     \ifx\p_align\empty\else\setupalign[\p_align]\fi
+     \usecombinationstyleandcolor\c!style\c!color
+     \bgroup
+     \aftergroup\endstrut
+     \aftergroup\egroup
+     \begstrut
+   \fi}
+
+\def\pack_combinations_pickup_package_pair % we need to store the caption row
+  {\vbox
+     {\forgetall
+      \m_pack_combinations_valigner{\copy\b_pack_combinations_content}%
+      % we need to save the caption for a next alignment line
+      \pack_combinations_save_caption}%
+   \ifnum\c_pack_combinations_n>\plusone
+     \global\advance\c_pack_combinations_n\minusone
+     \global\advance\c_pack_combinations_x\minusone
+     \ifcase\c_pack_combinations_x
+       \doubleexpandafter\pack_combinations_pickup_package_pair_a
+     \else
+       \doubleexpandafter\pack_combinations_pickup_package_pair_b
+     \fi
+   \else
+     \singleexpandafter\pack_combinations_pickup_package_pair_c
+   \fi}
+
+\def\pack_combinations_pickup_package_pair_a
+  {\cr
+   \pack_combinations_flush_captions
+   \noalign
+     {\forgetall
+      \global\setbox\b_pack_combinations_captions\emptybox
+      \nointerlineskip
+      \combinationparameter\c!after
+      \combinationparameter\c!before
+      \vss
+      \nointerlineskip}%
+   \global\c_pack_combinations_x\c_pack_combinations_max
+   \pack_combinations_pickup}
+
+\def\pack_combinations_pickup_package_pair_b
+  {\aligntab
+   \aligntab
+   \aligntab
+   \hskip\p_distance
+   \aligntab
+   \pack_combinations_pickup}
+
+\def\pack_combinations_pickup_package_pair_c
+  {\cr
+   \pack_combinations_flush_captions
+   \egroup}
+
+\def\pack_combinations_save_caption
+  {\global\setbox\b_pack_combinations_captions\hbox
+     {\hbox{\box\b_pack_combinations_caption}%
+      \unhbox\b_pack_combinations_captions}}
+
+\def\pack_combinations_flush_captions
+  {\noalign
+     {\ifdim\ht\b_pack_combinations_captions>\zeropoint
+        \nointerlineskip % indeed
+        \combinationparameter\c!inbetween
+        \global\c_pack_combinations_x\c_pack_combinations_max
+        \globallet\pack_combinations_flush_captions_indeed\pack_combinations_flush_captions_yes
+      \else
+        \global\setbox\b_pack_combinations_captions\emptybox
+        \globallet\pack_combinations_flush_captions_indeed\pack_combinations_flush_captions_nop
+      \fi}%
+   \pack_combinations_flush_captions_indeed
+   \crcr}
+
+\def\pack_combinations_flush_captions_yes
+  {\global\setbox\b_pack_combinations_captions\hbox
+     {\unhbox\b_pack_combinations_captions
+      \global\setbox\b_pack_combinations_temp\lastbox}%
+   \box\b_pack_combinations_temp
+   \global\advance\c_pack_combinations_x\minusone\relax
+   \ifnum\c_pack_combinations_x>\zerocount
+     \expandafter\pack_combinations_flush_captions_yes_followup
+   \else
+     \global\setbox\b_pack_combinations_captions\emptybox
+   \fi}
+
+\let\pack_combinations_flush_captions_nop\donothing
+
+\def\pack_combinations_flush_captions_yes_followup
+  {\aligntab
+   \aligntab
+   \aligntab
+   \aligntab
+   \pack_combinations_flush_captions_indeed}
+
+%D \macros
+%D   {startfloatcombination}
+%D
+%D \setupexternalfigures[directory={../sample}]
+%D \startbuffer
+%D \placefigure
+%D   [left,none]
+%D   {}
+%D   {\startfloatcombination[2*2]
+%D      \placefigure{alpha}{\externalfigure[cow.pdf][width=1cm]}
+%D      \placefigure{beta} {\externalfigure[cow.pdf][width=2cm]}
+%D      \placefigure{gamma}{\externalfigure[cow.pdf][width=3cm]}
+%D      \placefigure{delta}{\externalfigure[cow.pdf][width=4cm]}
+%D    \stopfloatcombination}
+%D
+%D \input tufte
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\unexpanded\def\startfloatcombination
+  {\dodoubleempty\pack_combinations_start_float}
+
+\let\stopfloatcombination\relax
+
+\def\pack_combinations_start_float[#1][#2]%
+  {\vbox\bgroup
+  %\insidecolumnstrue % trick, forces no centering, todo: proper switch/feature
+   \postcenterfloatmethod\zerocount
+   \forcelocalfloats
+   \unexpanded\def\stopfloatcombination{\pack_combinations_stop_float{#1}}}
+
+\def\pack_combinations_stop_float#1%
+  {\scratchtoks\emptytoks
+   \dorecurse\noflocalfloats
+     {\appendetoks{\noexpand\getlocalfloat{\recurselevel}}{}\to\scratchtoks}% brrr
+   \expanded{\startcombination[#1]\the\scratchtoks}\stopcombination
+   \resetlocalfloats
+  \egroup}
+
+
+\protect \endinput
diff --git a/tex/context/base/page-lay.mkiv b/tex/context/base/page-lay.mkiv
index 525017954..d00de2c31 100644
--- a/tex/context/base/page-lay.mkiv
+++ b/tex/context/base/page-lay.mkiv
@@ -814,20 +814,24 @@
 
 \newconditional\c_page_layouts_location_is_set
 
-\def\page_layouts_location_reset
+\def\page_layouts_location_reset % we start in the left top and mirror right pages
   {\setfalse\c_page_layouts_location_is_set
    \let\v_page_target_left_fill  \relax
-   \let\v_page_target_right_fill \relax
+   \let\v_page_target_right_fill \hss % ? \relax
    \let\v_page_target_top_fill   \relax
-   \let\v_page_target_bottom_fill\relax}
+   \let\v_page_target_bottom_fill\vss} % \relax}
 
 \setvalue{\??layoutlocation\v!right      }{\settrue\c_page_layouts_location_is_set
-                                           \let\v_page_target_left_fill  \hss}
+                                           \let\v_page_target_left_fill  \hss
+                                           \let\v_page_target_right_fill \relax}
 \setvalue{\??layoutlocation\v!left       }{\settrue\c_page_layouts_location_is_set
+                                           \let\v_page_target_left_fill  \relax
                                            \let\v_page_target_right_fill \hss}
 \setvalue{\??layoutlocation\v!bottom     }{\settrue\c_page_layouts_location_is_set
-                                           \let\v_page_target_top_fill   \vss}
+                                           \let\v_page_target_top_fill   \vss
+                                           \let\v_page_target_bottom_fill\relax}
 \setvalue{\??layoutlocation\v!top        }{\settrue\c_page_layouts_location_is_set
+                                           \let\v_page_target_top_fill   \relax
                                            \let\v_page_target_bottom_fill\vss}
 \setvalue{\??layoutlocation\v!middle     }{\settrue\c_page_layouts_location_is_set
                                            \let\v_page_target_left_fill  \hss
diff --git a/tex/context/base/spac-ali.mkiv b/tex/context/base/spac-ali.mkiv
index 01bd565c0..6cc04b203 100644
--- a/tex/context/base/spac-ali.mkiv
+++ b/tex/context/base/spac-ali.mkiv
@@ -236,6 +236,10 @@
     \newconditional\raggedonelinerstate  % public
 \fi
 
+% \appendtoks
+%     \setfalse\raggedonelinerstate
+% \to \everyforgetall
+
 \newconstant\raggedstatus % public
 
 \newconstant\c_spac_align_state_horizontal
@@ -262,6 +266,7 @@
    \spaceskip  \zeropoint
    \xspaceskip \zeropoint
    \parfillskip\s_zero_plus_one_fil % new
+   \setfalse\raggedonelinerstate    % now here
    \let\updateraggedskips\relax}    % no need for adaption
 
 \unexpanded\def\spac_align_set_horizontal_left
diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf
index cf02f71fc..e8412cf30 100644
Binary files a/tex/context/base/status-files.pdf and b/tex/context/base/status-files.pdf differ
diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf
index da0b60f3f..af0fbaf85 100644
Binary files a/tex/context/base/status-lua.pdf and b/tex/context/base/status-lua.pdf differ
diff --git a/tex/context/base/status-mkiv.lua b/tex/context/base/status-mkiv.lua
index 8968cd993..320bcd414 100644
--- a/tex/context/base/status-mkiv.lua
+++ b/tex/context/base/status-mkiv.lua
@@ -783,12 +783,12 @@ return {
         {
             filename = "typo-pag",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "typo-mar",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "buff-ini",
@@ -1031,22 +1031,22 @@ return {
         {
             filename = "typo-brk",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "typo-cap",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "typo-dig",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "typo-rep",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
         },
         {
             filename = "typo-txt",
@@ -1057,7 +1057,8 @@ return {
         {
             filename = "typo-par",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
+            comment  = "might get extended",
         },
         {
             filename = "type-ini",
@@ -1266,6 +1267,16 @@ return {
             marktype = "mkiv",
             status   = "unknown",
         },
+        {
+            filename = "pack-com",
+            marktype = "mkiv",
+            status   = "okay",
+        },
+        {
+            filename = "typo-del",
+            marktype = "mkiv",
+            status   = "unknown",
+        },
         {
             filename = "grph-trf",
             marktype = "mkiv",
diff --git a/tex/context/base/supp-box.mkiv b/tex/context/base/supp-box.mkiv
index 0c78994ea..5981b97f0 100644
--- a/tex/context/base/supp-box.mkiv
+++ b/tex/context/base/supp-box.mkiv
@@ -2454,6 +2454,15 @@
    \lower.5\ht\nextbox\box\nextbox
    \egroup}
 
+\unexpanded\def\depthonlybox
+  {\vtop\bgroup
+   \dowithnextboxcs\syst_boxes_depthonlybox_finish\vbox}
+
+\def\syst_boxes_depthonlybox_finish
+  {\hsize\wd\nextbox
+   \kern\zeropoint\box\nextbox
+   \egroup}
+
 %D New:
 
 \def\setdimentoatleast#1#2{\ifdim#1>\zeropoint\else#1=#2\fi}
diff --git a/tex/context/base/syst-lua.lua b/tex/context/base/syst-lua.lua
index 000b16963..e5c6c8242 100644
--- a/tex/context/base/syst-lua.lua
+++ b/tex/context/base/syst-lua.lua
@@ -6,10 +6,12 @@ if not modules then modules = { } end modules ['syst-lua'] = {
     license   = "see context related readme files"
 }
 
-local format, find, match = string.format, string.find, string.match
+local format, find, match, rep = string.format, string.find, string.match, string.rep
 local tonumber = tonumber
 local S, lpegmatch, lpegtsplitat = lpeg.S, lpeg.match, lpeg.tsplitat
 
+local context = context
+
 commands = commands or { }
 
 function commands.writestatus(...) logs.status(...) end -- overloaded later
@@ -95,3 +97,7 @@ function commands.firstinlist(str)
     local first = match(str,"^([^,]+),")
     context(first or str)
 end
+
+function commands.ntimes(str,n)
+    context(rep(str,n or 1))
+end
diff --git a/tex/context/base/typo-brk.lua b/tex/context/base/typo-brk.lua
index fe0258bcc..14f0b8b47 100644
--- a/tex/context/base/typo-brk.lua
+++ b/tex/context/base/typo-brk.lua
@@ -32,10 +32,13 @@ local remove_node        = nodes.remove -- ! nodes
 local link_nodes         = nodes.link
 
 local texattribute       = tex.attribute
+local unsetvalue         = attributes.unsetvalue
 
 local nodepool           = nodes.pool
 local tasks              = nodes.tasks
 
+local v_reset            = interfaces.variables.reset
+
 local new_penalty        = nodepool.penalty
 local new_glue           = nodepool.glue
 local new_disc           = nodepool.disc
@@ -54,7 +57,7 @@ typesetters.breakpoints  = typesetters.breakpoints or {}
 local breakpoints        = typesetters.breakpoints
 
 breakpoints.mapping      = breakpoints.mapping or { }
-local mapping            = breakpoints.mapping
+breakpoints.numbers      = breakpoints.numbers or { }
 
 breakpoints.methods      = breakpoints.methods or { }
 local methods            = breakpoints.methods
@@ -64,27 +67,12 @@ breakpoints.attribute    = a_breakpoints
 
 storage.register("typesetters/breakpoints/mapping", breakpoints.mapping, "typesetters.breakpoints.mapping")
 
-function breakpoints.setreplacement(id,char,language,settings)
-    char = utfbyte(char)
-    local map = mapping[id]
-    if not map then
-        map = { }
-        mapping[id] = map
-    end
-    local cmap = map[char]
-    if not cmap then
-        cmap = { }
-        map[char] = cmap
-    end
-    local left, right, middle = settings.left, settings.right, settings.middle
-    cmap[language or ""] = {
-        type   = tonumber(settings.type)   or 1,
-        nleft  = tonumber(settings.nleft)  or 1,
-        nright = tonumber(settings.nright) or 1,
-        left   = left   ~= "" and left     or nil,
-        right  = right  ~= "" and right    or nil,
-        middle = middle ~= "" and middle   or nil,
-    } -- was { type or 1, before or 1, after or 1 }
+local mapping            = breakpoints.mapping
+local numbers            = breakpoints.mapping
+
+for i=1,#mapping do
+    local m = mapping[i]
+    numbers[m.name] = m
 end
 
 local function insert_break(head,start,before,after)
@@ -167,12 +155,13 @@ local function process(namespace,attribute,head)
     while start do
         local id = start.id
         if id == glyph_code then
-            local attr = has_attribute(start,attribute)
+            local attr = has_attribute(start,a_breakpoints)
             if attr and attr > 0 then
-                unset_attribute(start,attribute) -- maybe test for subtype > 256 (faster)
+                unset_attribute(start,a_breakpoints) -- maybe test for subtype > 256 (faster)
                 -- look ahead and back n chars
-                local map = mapping[attr]
-                if map then
+                local data = mapping[attr]
+                if data then
+                    local map = data.characters
                     local cmap = map[start.char]
                     if cmap then
                         local lang = start.lang
@@ -230,15 +219,64 @@ local function process(namespace,attribute,head)
     return head, done
 end
 
-function breakpoints.set(n)
-    if trace_breakpoints then
-        report_breakpoints("enabling breakpoints handler")
+local enabled = false
+
+function breakpoints.define(name)
+    local data = numbers[name]
+    if data then
+        -- error
+    else
+        local number = #mapping + 1
+        local data = {
+            name       = name,
+            number     = number,
+            characters = { },
+        }
+        mapping[number] = data
+        numbers[name]   = data
+    end
+end
+
+function breakpoints.setreplacement(name,char,language,settings)
+    char = utfbyte(char)
+    local data = numbers[name]
+    if data then
+        local characters = data.characters
+        local cmap = characters[char]
+        if not cmap then
+            cmap = { }
+            characters[char] = cmap
+        end
+        local left, right, middle = settings.left, settings.right, settings.middle
+        cmap[language or ""] = {
+            type   = tonumber(settings.type)   or 1,
+            nleft  = tonumber(settings.nleft)  or 1,
+            nright = tonumber(settings.nright) or 1,
+            left   = left   ~= "" and left     or nil,
+            right  = right  ~= "" and right    or nil,
+            middle = middle ~= "" and middle   or nil,
+        } -- was { type or 1, before or 1, after or 1 }
     end
-    tasks.enableaction("processors","typesetters.breakpoints.handler")
-    function breakpoints.set(n)
-        texattribute[a_breakpoints] = n
+end
+
+function breakpoints.set(n)
+    if n == v_reset then
+        n = unsetvalue
+    else
+        n = mapping[n]
+        if not n then
+            n = unsetvalue
+        else
+            if not enabled then
+                if trace_breakpoints then
+                    report_breakpoints("enabling breakpoints handler")
+                end
+                tasks.enableaction("processors","typesetters.breakpoints.handler")
+            end
+            n = n.number
+        end
     end
-    breakpoints.set(n)
+    texattribute[a_breakpoints] = n
 end
 
 breakpoints.handler = nodes.installattributehandler {
@@ -247,6 +285,12 @@ breakpoints.handler = nodes.installattributehandler {
     processor = process,
 }
 
-function breakpoints.enable()
-    tasks.enableaction("processors","typesetters.breakpoints.handler")
-end
+-- function breakpoints.enable()
+--     tasks.enableaction("processors","typesetters.breakpoints.handler")
+-- end
+
+-- interface
+
+commands.definebreakpoints = breakpoints.define
+commands.definebreakpoint  = breakpoints.setreplacement
+commands.setbreakpoints    = breakpoints.set
diff --git a/tex/context/base/typo-brk.mkiv b/tex/context/base/typo-brk.mkiv
index cd2db6212..23253240c 100644
--- a/tex/context/base/typo-brk.mkiv
+++ b/tex/context/base/typo-brk.mkiv
@@ -15,73 +15,65 @@
 
 \unprotect
 
+% hm, we cannot prebuild lists, font dependent
+%
+% -- type nleft nright language left right middle
+%
+% -- we might eventually stick to only method 5
+
 \registerctxluafile{typo-brk}{1.001}
 
 \definesystemattribute[breakpoint][public]
 
-% compound stuff (under construction)
-
-\newbox\breakpointbox
-
 \exhyphenchar\minusone % we use a different order then base tex, so we really need this
 
-\newcount \maxbreakpointsid
-
 \unexpanded\def\definebreakpoints
-  {\dosingleargument\dodefinebreakpoints}
-
-\def\dodefinebreakpoints[#1]%
-  {\ifcsname\??bp:#1\endcsname \else
-     \global\advance\maxbreakpointsid\plusone
-     \setxvalue{\??bp:#1}{\number\maxbreakpointsid}%
-   \fi}
-
-\def\installbreakpoint
-  {\dotripleempty\doinstallbreakpoint}
-
-% hm, we cannot prebuild lists, font dependent
-%
-% -- type nleft nright language left right middle
-%
-% -- we might eventually stick to only method 5
-
-\def\doinstallbreakpoint[#1][#2][#3]%
-  {\ifcsname\??bp:#1\endcsname
-     \begingroup
-     \getparameters[\??bp][\c!type=1,\c!nleft=3,\c!nright=3,\s!language=,\c!left=,\c!right=,\c!middle=,#3]%
-     \ctxlua{typesetters.breakpoints.setreplacement(\csname\??bp:#1\endcsname, "#2", "\reallanguagetag\@@bplanguage", {
-            type =  \@@bptype,
-           nleft = "\@@bpnleft",
-          nright = "\@@bpnright",
-           right = "\@@bpright",
-            left = "\@@bpleft",
-          middle = "\@@bpmiddle"
-     } )}% todo: table
-     \endgroup
-   \fi}
+  {\dosingleargument\typo_breakpoints_define}
+
+\def\typo_breakpoints_define[#1]%
+  {\ctxcommand{definebreakpoints("#1")}}
+
+\def\definebreakpoint
+  {\dotripleempty\typo_breakpoints_define_character}
+
+\def\typo_breakpoints_define_character[#1][#2][#3]% name char settings
+  {\begingroup
+   \getparameters[\??bp][\c!type=1,\c!nleft=3,\c!nright=3,\s!language=,\c!left=,\c!right=,\c!middle=,#3]%
+   \ctxcommand{definebreakpoint("#1", "#2", "\reallanguagetag\@@bplanguage", {
+          type =  \@@bptype,
+         nleft = "\@@bpnleft",
+        nright = "\@@bpnright",
+         right = "\@@bpright",
+          left = "\@@bpleft",
+        middle = "\@@bpmiddle"
+   } )}%
+   \endgroup}
 
 \unexpanded\def\setbreakpoints[#1]%
-  {\ctxlua{typesetters.breakpoints.set(\number\csname\??bp:#1\endcsname)}}
+  {\ctxcommand{setbreakpoints("#1")}}
 
-\letvalue{\??bp:\s!reset}\attributeunsetvalue
+\unexpanded\def\resetbreakpoints
+  {\attribute\breakpointattribute\attributeunsetvalue}
 
 \definebreakpoints[compound]
 
-\installbreakpoint [compound] [+] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
-\installbreakpoint [compound] [-] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
-\installbreakpoint [compound] [/] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
-\installbreakpoint [compound] [(] [\c!nleft=3,\c!nright=3,\c!type=2] % type=5,middle=(,left=(-,right=
-\installbreakpoint [compound] [)] [\c!nleft=3,\c!nright=3,\c!type=3] % type=5,middle=),left=,right=-)
+\definebreakpoint [compound] [+] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
+\definebreakpoint [compound] [-] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
+\definebreakpoint [compound] [/] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
+\definebreakpoint [compound] [(] [\c!nleft=3,\c!nright=3,\c!type=2] % type=5,middle=(,left=(-,right=
+\definebreakpoint [compound] [)] [\c!nleft=3,\c!nright=3,\c!type=3] % type=5,middle=),left=,right=-)
+
+\let\installbreakpoint\definebreakpoint % for a while
 
 % \start \hsize 1.5cm \setbreakpoints[compound]
-%     \installbreakpoint [compound] [-] [nleft=3,nright=3,type=5,left=,right={-},middle={-}]
-%     \installbreakpoint [compound] [(] [nleft=3,nright=3,type=5,left=,right={(-},middle={(}]
-%     \installbreakpoint [compound] [)] [nleft=3,nright=3,type=5,left={-)},right=,middle={)}]
+%     \definebreakpoint [compound] [-] [nleft=3,nright=3,type=5,left=,right={-},middle={-}]
+%     \definebreakpoint [compound] [(] [nleft=3,nright=3,type=5,left=,right={(-},middle={(}]
+%     \definebreakpoint [compound] [)] [nleft=3,nright=3,type=5,left={-)},right=,middle={)}]
 %     composed-word\par composed(word)\par
 % \stop
 
 % \mainlanguage[czech]
-% \installbreakpoint [compound] [\number`-] [language=cs,nleft=3,nright=3,type=4]
+% \definebreakpoint [compound] [\number`-] [language=cs,nleft=3,nright=3,type=4]
 % \setbreakpoints[compound]
 % \start \hsize 1mm test-test \par \stop
 
diff --git a/tex/context/base/typo-cap.lua b/tex/context/base/typo-cap.lua
index 2e20a95e7..3d70ffbfd 100644
--- a/tex/context/base/typo-cap.lua
+++ b/tex/context/base/typo-cap.lua
@@ -4,7 +4,7 @@ if not modules then modules = { } end modules ['typo-cap'] = {
     author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
     copyright = "PRAGMA ADE / ConTeXt Development Team",
     license   = "see context related readme files"
-}
+    }
 
 local next, type = next, type
 local format, insert = string.format, table.insert
@@ -23,6 +23,7 @@ local traverse_id     = node.traverse_id
 local copy_node       = node.copy
 
 local texattribute    = tex.attribute
+local unsetvalue      = attributes.unsetvalue
 
 local nodecodes       = nodes.nodecodes
 local skipcodes       = nodes.skipcodes
@@ -40,6 +41,8 @@ local fonthashes      = fonts.hashes
 local fontdata        = fonthashes.identifiers
 local fontchar        = fonthashes.characters
 
+local v_reset         = interfaces.variables.reset
+
 local chardata        = characters.data
 
 typesetters           = typesetters or { }
@@ -257,19 +260,29 @@ end
 local m, enabled = 0, false -- a trick to make neighbouring ranges work
 
 function cases.set(n)
-    if not enabled then
-        tasks.enableaction("processors","typesetters.cases.handler")
-        if trace_casing then
-            report_casing("enabling case handler")
-        end
-        enabled = true
-    end
-    if m == 100 then
-        m = 1
+    if n == v_reset then
+        n = unsetvalue
     else
-        m = m + 1
+        n = tonumber(n)
+        if n then
+            if not enabled then
+                tasks.enableaction("processors","typesetters.cases.handler")
+                if trace_casing then
+                    report_casing("enabling case handler")
+                end
+                enabled = true
+            end
+            if m == 100 then
+                m = 1
+            else
+                m = m + 1
+            end
+            n = m * 100 + n
+        else
+            n = unsetvalue
+        end
     end
-    texattribute[a_cases] = m * 100 + n
+    texattribute[a_cases] = n
 end
 
 cases.handler = nodes.installattributehandler {
@@ -277,3 +290,7 @@ cases.handler = nodes.installattributehandler {
     namespace = cases,
     processor = process,
 }
+
+-- interface
+
+commands.setcharactercasing = cases.set
diff --git a/tex/context/base/typo-cap.mkiv b/tex/context/base/typo-cap.mkiv
index 2ed50ce20..713beaa31 100644
--- a/tex/context/base/typo-cap.mkiv
+++ b/tex/context/base/typo-cap.mkiv
@@ -49,22 +49,22 @@
 % test \word{test TEST \TeX} test
 % test \Word{test TEST \TeX} test
 
-\unexpanded\def\setcharactercasing[#1]%
-  {\ctxlua{typesetters.cases.set(\number#1)}}
+\unexpanded\def\setcharactercasing[#1]% mayb eat some point we will introduce names alongside numbers
+  {\ctxcommand{setcharactercasing("#1")}}
 
 % todo: names casings
 
-\unexpanded\def\WORD {\groupedcommand{\setcharactercasing[\plusone  ]}{}}
-\unexpanded\def\word {\groupedcommand{\setcharactercasing[\plustwo  ]}{}}
-\unexpanded\def\Word {\groupedcommand{\setcharactercasing[\plusthree]}{}}
-\unexpanded\def\Words{\groupedcommand{\setcharactercasing[\plusfour ]}{}}
+\unexpanded\def\WORD {\groupedcommand{\setcharactercasing[1]}{}}
+\unexpanded\def\word {\groupedcommand{\setcharactercasing[2]}{}}
+\unexpanded\def\Word {\groupedcommand{\setcharactercasing[3]}{}}
+\unexpanded\def\Words{\groupedcommand{\setcharactercasing[4]}{}}
 
-% this will become:
+% This might become:
 %
-% \unexpanded\def\WORD {\bgroup\def\g_word{\setcharactercasing[\plusone  ]}\afterassignment\g_word\let\nexttoken}
-% \unexpanded\def\word {\bgroup\def\g_word{\setcharactercasing[\plustwo  ]}\afterassignment\g_word\let\nexttoken}
-% \unexpanded\def\Word {\bgroup\def\g_word{\setcharactercasing[\plusthree]}\afterassignment\g_word\let\nexttoken}
-% \unexpanded\def\Words{\bgroup\def\g_word{\setcharactercasing[\plusfour ]}\afterassignment\g_word\let\nexttoken}
+% \unexpanded\def\WORD {\bgroup\def\g_word{\setcharactercasing[1]}\afterassignment\g_word\let\nexttoken}
+% \unexpanded\def\word {\bgroup\def\g_word{\setcharactercasing[2]}\afterassignment\g_word\let\nexttoken}
+% \unexpanded\def\Word {\bgroup\def\g_word{\setcharactercasing[3]}\afterassignment\g_word\let\nexttoken}
+% \unexpanded\def\Words{\bgroup\def\g_word{\setcharactercasing[4]}\afterassignment\g_word\let\nexttoken}
 %
 % so no longer {\Word test} and { } mandate (also later \groupedcommands will go)
 
@@ -127,33 +127,33 @@
 
 \let\disablepseudocaps\relax % maybe used elsewhere
 
-\newconditional\pseudocapsenabled
+\newconditional\c_typo_capitals_pseudo
 
-\def\usepseudocaps{\settrue \pseudocapsenabled}
-\def\userealcaps  {\setfalse\pseudocapsenabled}
+\unexpanded\def\usepseudocaps{\settrue \c_typo_capitals_pseudo}
+\unexpanded\def\userealcaps  {\setfalse\c_typo_capitals_pseudo}
 
 \usepseudocaps
 
 % we use char0 as placeholder for the larger font
 
-\unexpanded\def\pseudosmallcapped{\groupedcommand{\setcharactercasing[\plusone ]\signalcharacter\tx}{}} % all upper
-\unexpanded\def\pseudoSmallcapped{\groupedcommand{\setcharactercasing[\plusfive]\signalcharacter\tx}{}} % one upper + font
-\unexpanded\def\pseudoSmallCapped{\groupedcommand{\setcharactercasing[\plussix ]\signalcharacter\tx}{}} % some upper + font
+\unexpanded\def\pseudosmallcapped{\groupedcommand{\setcharactercasing[1]\signalcharacter\tx}{}} % all upper
+\unexpanded\def\pseudoSmallcapped{\groupedcommand{\setcharactercasing[5]\signalcharacter\tx}{}} % one upper + font
+\unexpanded\def\pseudoSmallCapped{\groupedcommand{\setcharactercasing[6]\signalcharacter\tx}{}} % some upper + font
 
-\unexpanded\def\realsmallcapped  {\groupedcommand{\sc\setcharactercasing[\plusone  ]}{}} % all lower
-\unexpanded\def\realSmallcapped  {\groupedcommand{\sc\setcharactercasing[\plusthree]}{}} % one upper + font
-\unexpanded\def\realSmallCapped  {\groupedcommand{\sc\setcharactercasing[\plusfour ]}{}} % some upper
+\unexpanded\def\realsmallcapped  {\groupedcommand{\sc\setcharactercasing[1]}{}} % all lower
+\unexpanded\def\realSmallcapped  {\groupedcommand{\sc\setcharactercasing[3]}{}} % one upper + font
+\unexpanded\def\realSmallCapped  {\groupedcommand{\sc\setcharactercasing[4]}{}} % some upper
 
-\unexpanded\def\dohandlesmallcaps
-  {\ifconditional\pseudocapsenabled
+\unexpanded\def\typo_capitals_smallcaps
+  {\ifconditional\c_typo_capitals_pseudo
      \expandafter\firstoftwoarguments
    \else
      \expandafter\secondoftwoarguments
    \fi}
 
-\unexpanded\def\smallcapped{\dohandlesmallcaps\pseudosmallcapped\realsmallcapped}
-\unexpanded\def\Smallcapped{\dohandlesmallcaps\pseudoSmallcapped\realSmallcapped}
-\unexpanded\def\SmallCapped{\dohandlesmallcaps\pseudoSmallCapped\realSmallCapped}
+\unexpanded\def\smallcapped{\typo_capitals_smallcaps\pseudosmallcapped\realsmallcapped}
+\unexpanded\def\Smallcapped{\typo_capitals_smallcaps\pseudoSmallcapped\realSmallcapped}
+\unexpanded\def\SmallCapped{\typo_capitals_smallcaps\pseudoSmallCapped\realSmallCapped}
 
 \unexpanded\def\autocap{\ifmmode\expandafter\normalcap\else\expandafter\smallcapped\fi}
 
@@ -171,7 +171,7 @@
 
 %D As suggested by WS:
 
-\unexpanded\def\notsmallcapped{\groupedcommand{\setcharactercasing[\plustwo]\signalcharacter}{}}
+\unexpanded\def\notsmallcapped{\groupedcommand{\setcharactercasing[2]\signalcharacter}{}}
 
 %D \macros
 %D   {setupcapitals}
@@ -183,16 +183,18 @@
 
 \let\normalsmallcapped\smallcapped
 
+\definesystemvariable{kk}
+
 \unexpanded\def\setupcapitals
-  {\dosingleempty\dosetupcapitals}
+  {\dosingleempty\typo_capitals_setup}
 
-\def\dosetupcapitals[#1]% todo: don't use grouping just a switch
+\def\typo_capitals_setup[#1]% todo: don't use grouping just a switch
   {\getparameters[\??kk][#1]%
    \doifelse\@@kktitle\v!yes
-     {\definealternativestyle[\v!capital][\normalsmallcapped][\normalsmallcapped]%
-      \definealternativestyle[\v!smallcaps][\sc][\sc]}
-     {\definealternativestyle[\v!capital][\normalsmallcapped][\normalWORD]%
-      \definealternativestyle[\v!smallcaps][\sc][\normalWORD]}%
+     {\definealternativestyle[\v!capital  ][\normalsmallcapped][\normalsmallcapped]%
+      \definealternativestyle[\v!smallcaps][\sc               ][\sc               ]}
+     {\definealternativestyle[\v!capital  ][\normalsmallcapped][\normalWORD       ]%
+      \definealternativestyle[\v!smallcaps][\sc               ][\normalWORD       ]}%
    \doifelse\@@kksc\v!yes\userealcaps\usepseudocaps}
 
 \let\uppercased\normalWORD
@@ -200,7 +202,7 @@
 
 \setupcapitals
   [\c!title=\v!yes,
-   sc=\v!no] % no \c!sc any longer
+   \s!sc=\v!no] % no \c!sc any longer
 
 % \definestartstop is not yet in available at core-spa time
 %
@@ -208,7 +210,7 @@
 %
 % \definestartstop[randomized][\c!before=\dosetattribute{case}{8},\c!after=]
 
-\def\randomizetext{\groupedcommand{\attribute\caseattribute\pluseight}{}}
+\unexpanded\def\randomizetext{\groupedcommand{\attribute\caseattribute\pluseight}{}}
 
 \definestartstop[randomized][\c!before=\dosetattribute{case}{8},\c!after=]
 
diff --git a/tex/context/base/typo-del.mkiv b/tex/context/base/typo-del.mkiv
new file mode 100644
index 000000000..b2213db65
--- /dev/null
+++ b/tex/context/base/typo-del.mkiv
@@ -0,0 +1,607 @@
+%D \module
+%D   [       file=typo-del, % moved from core-mis,
+%D        version=20110112,
+%D          title=\CONTEXT\ Typesetting Macros,
+%D       subtitle=Delimited Content,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Typesetting Macros / Delimited Content}
+
+\unprotect
+
+% THIS IS OBSOLETE:
+
+\unexpanded\def\setuphyphenmark
+  {\dodoubleargument\getparameters[\??kp]}
+
+\unexpanded\def\setuphyphenmark[#1]% sign=normal|wide
+  {\dodoubleargument\getparameters[\??kp][#1]%
+   \doifelse\@@kpsign {\v!normal}% was inset?
+     {\let\textmodehyphen\normalhyphen  \let\textmodehyphendiscretionary\normalhyphendiscretionary}
+     {\let\textmodehyphen\composedhyphen\let\textmodehyphendiscretionary\composedhyphendiscretionary}}
+
+\setuphyphenmark[\c!sign=\v!wide]
+
+\definesymbol[\c!lefthyphen]  [\languageparameter\c!lefthyphen]
+\definesymbol[\c!righthyphen] [\languageparameter\c!righthyphen]
+\definesymbol[\c!hyphen]      [\languageparameter\c!hyphen]
+
+\def\normalhyphen
+  {\hbox{\directsymbol\empty\c!hyphen}}
+
+\def\composedhyphen
+  {\hbox{\directsymbol\empty\c!compoundhyphen}}
+
+\def\normalhyphendiscretionary
+  {\discretionary
+     {\hbox{\directsymbol\empty\c!righthyphen}}
+     {\hbox{\directsymbol\empty\c!lefthyphen}}
+     {\hbox{\directsymbol\empty\c!hyphen}}}
+
+\def\composedhyphendiscretionary
+  {\discretionary
+     {\hbox{\directsymbol\empty\c!rightcompoundhyphen}}
+     {\hbox{\directsymbol\empty\c!leftcompoundhyphen}}
+     {\hbox{\directsymbol\empty\c!compoundhyphen}}}
+
+\let\textmodehyphen             \composedhyphen
+\let\textmodehyphendiscretionary\composedhyphendiscretionary
+
+\definesymbol[\c!leftcompoundhyphen]  [\languageparameter\c!leftcompoundhyphen]
+\definesymbol[\c!rightcompoundhyphen] [\languageparameter\c!rightcompoundhyphen]
+\definesymbol[\c!compoundhyphen]      [\languageparameter\c!compoundhyphen]
+
+% TILL HERE
+
+\setnewconstant\boundarycharactermode\plusone
+
+\unexpanded\def\midboundarycharacter#1#2%
+  {\ifcase\boundarycharactermode
+   \or
+     %\nobreak
+     \hskip\hspaceamount\currentlanguage{#2}%
+     \languageparameter#1%
+     %\nobreak
+      \hskip\hspaceamount\currentlanguage{#2}%
+   \or
+     \languageparameter#1%
+   \fi
+   \boundarycharactermode\plusone}
+
+\unexpanded\def\leftboundarycharacter#1#2%
+  {\ifcase\boundarycharactermode
+   \or
+     \languageparameter#1%
+     \nobreak
+     \hskip\hspaceamount\currentlanguage{#2}%
+   \or
+     \languageparameter#1%
+   \fi
+   \boundarycharactermode\plusone}
+
+\unexpanded\def\rightboundarycharacter#1#2%
+  {\ifcase\boundarycharactermode
+   \or
+     \prewordbreak %\nobreak
+     \hskip\hspaceamount\currentlanguage{#2}%
+     \languageparameter#1%
+   \or
+     \languageparameter#1%
+   \fi
+   \boundarycharactermode\plusone}
+
+\definehspace [sentence]      [\zeropoint]
+\definehspace [intersentence] [.250\emwidth]
+
+\definesymbol
+  [\c!midsentence]
+  [\midboundarycharacter\c!midsentence{sentence}]
+
+\definesymbol
+  [\c!leftsentence]
+  [\leftboundarycharacter\c!leftsentence{sentence}]
+
+\definesymbol
+  [\c!rightsentence]
+  [\rightboundarycharacter\c!rightsentence{sentence}]
+
+\definesymbol
+  [\c!leftsubsentence]
+  [\leftboundarycharacter\c!leftsubsentence{sentence}]
+
+\definesymbol
+  [\c!rightsubsentence]
+  [\rightboundarycharacter\c!rightsubsentence{sentence}]
+
+\newsignal \d_typo_subsentence_signal
+\newcount  \c_typo_subsentence_nesting
+
+\let\beforesubsentence\donothing
+\let\aftersubsentence \donothing
+
+% todo: make this language option
+%
+% \def\beforesubsentence{\removeunwantedspaces}
+% \def\aftersubsentence {\ignorespaces}
+
+\unexpanded\def\midsentence
+  {\symbol[\c!midsentence]}
+
+\unexpanded\def\beginofsubsentence
+  {\beforesubsentence
+   \ifdim\lastkern=\d_typo_subsentence_signal
+     \unskip
+     \kern\hspaceamount\currentlanguage{intersentence}%
+   \fi
+   \global\advance\c_typo_subsentence_nesting\plusone
+   \ifnum\c_typo_subsentence_nesting=\plusone
+     \dontleavehmode % was \leaveoutervmode
+   \fi
+   \dostarttagged\t!subsentence\empty
+   \symbol[\ifodd\c_typo_subsentence_nesting\c!leftsentence\else\c!leftsubsentence\fi]%
+  }%  \ignorespaces}
+
+\unexpanded\def\endofsubsentence % relax prevents space gobbling
+  {\symbol[\ifodd\c_typo_subsentence_nesting\c!rightsentence\else\c!rightsubsentence\fi]%
+   \dostoptagged
+   \global\advance\c_typo_subsentence_nesting\minusone
+   \unskip
+   \kern\d_typo_subsentence_signal\relax
+   \aftersubsentence}
+
+\unexpanded\def\beginofsubsentencespacing % relax prevents space gobbling
+  {\kern\d_typo_subsentence_signal\relax}% \ignorespaces}
+
+\unexpanded\def\endofsubsentencespacing
+  {\ifdim\lastkern=\d_typo_subsentence_signal
+     \unskip
+     \hskip\hspaceamount\currentlanguage{intersentence}%
+     % no good, actually language dependent:
+%     \ignorespaces
+   \else
+     \unskip
+   \fi}
+
+%D \startbuffer
+%D test |<|test |<|test|>| test|>| test \par
+%D test|<|test|<|test|>|test|>|test \par
+%D test |<||<|test|>||>| test \par
+%D test \directdiscretionary{<}test\directdiscretionary{>} test \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \getbuffer
+
+\unexpanded\def\startsubsentence{\beginofsubsentence     \prewordbreak\beginofsubsentencespacing}
+\unexpanded\def\stopsubsentence {\endofsubsentencespacing\prewordbreak\endofsubsentence}
+\unexpanded\def\subsentence     {\groupedcommand\startsubsentence\stopsubsentence}
+
+\definehspace [quotation]      [\zeropoint]
+\definehspace [interquotation] [.125em]
+
+%definehspace [quote]  [\zeropoint]
+%definehspace [speech] [\zeropoint]
+
+\definehspace [quote]  [\hspaceamount\currentlanguage{quotation}]
+\definehspace [speech] [\hspaceamount\currentlanguage{quotation}]
+
+\definesymbol
+  [\c!leftquotation]
+  [\leftboundarycharacter\c!leftquotation{quotation}]
+
+\definesymbol
+  [\c!rightquotation]
+  [\rightboundarycharacter\c!rightquotation{quotation}]
+
+\definesymbol
+  [\c!leftquote]
+  [\leftboundarycharacter\c!leftquote{quote}]
+
+\definesymbol
+  [\c!rightquote]
+  [\rightboundarycharacter\c!rightquote{quote}]
+
+\definesymbol
+  [\c!leftspeech]
+  [\leftboundarycharacter\c!leftspeech{speech}]
+
+\definesymbol
+  [\c!rightspeech]
+  [\rightboundarycharacter\c!rightspeech{speech}]
+
+\definesymbol
+  [\c!middlespeech]
+  [\leftboundarycharacter\c!middlespeech{speech}]
+
+\appendtoks\def\quotation#1{"#1"}\to\simplifiedcommands
+\appendtoks\def\quote    #1{'#1'}\to\simplifiedcommands
+
+%D The next features was so desperately needed by Giuseppe
+%D Bilotta that he made a module for it. Since this is a
+%D typical example of core functionality, I decided to extend
+%D the low level quotation macros in such a way that a speech
+%D feature could be build on top of it. The speech opening and
+%D closing symbols are defined per language. Italian is an
+%D example of a language that has them set.
+
+\newsignal\d_typo_delimited_signal
+
+\let\currentdelimitedtext\s!unknown
+
+\let\delimitedtextlevel\!!zerocount
+
+\def\c_typo_delimited_nesting{\csname\??delimitedtextlevel\currentparentdelimitedtext\endcsname}
+
+\def\typo_delimited_push#1%
+  {\globalpushmacro\currentdelimitedtext
+   \def\currentdelimitedtext{#1}%
+   \let\currentparentdelimitedtext\currentdelimitedtext
+   \global\advance\c_typo_delimited_nesting\plusone
+   \edef\delimitedtextlevel{\number\c_typo_delimited_nesting}%
+   \normalexpanded{\chaintocurrentdelimitedtext{\currentparentdelimitedtext:\delimitedtextlevel}}%
+   \edef\currentdelimitedtext{\currentparentdelimitedtext:\delimitedtextlevel}}
+
+\def\typo_delimited_pop
+  {\global\advance\c_typo_delimited_nesting\minusone
+   \globalpopmacro\currentdelimitedtext}
+
+\installcorenamespace{delimitedtext}
+\installcorenamespace{delimitedtextlevel}
+
+\installcommandhandler \??delimitedtext {delimitedtext} \??delimitedtext
+
+\appendtoks
+    \expandafter\newcount\csname\??delimitedtextlevel\currentdelimitedtext\endcsname
+    \setuevalue{\currentdelimitedtext        }{\delimitedtext[\currentdelimitedtext]}%
+    \setuevalue{\e!start\currentdelimitedtext}{\startdelimitedtext[\currentdelimitedtext]}%
+    \setuevalue{\e!stop \currentdelimitedtext}{\stopdelimitedtext}%
+\to \everydefinedelimitedtext
+
+\setupdelimitedtext
+  [\c!location=\v!margin, % \v!text \v!paragraph
+   \c!spacebefore=,
+   \c!spaceafter=\delimitedtextparameter\c!spacebefore,
+   \c!style=\v!normal,
+   \c!color=,
+   \c!leftmargin=\zeropoint,
+   \c!rightmargin=\delimitedtextparameter\c!leftmargin,
+   \c!indentnext=\v!yes,
+   \c!before=,
+   \c!after=,
+   \c!left=,
+   \c!right=,
+  %\c!level=0,
+   \c!method=,
+   \c!repeat=\v!no]
+
+\def\typo_delimited_repeat_ideed
+  {\relax\ifcase\delimitedtextlevel\else
+     \typo_delimited_handle_middle\c!middle
+   \fi}
+
+\let\typo_delimited_repeat\relax
+
+\unexpanded\def\startdelimitedtext[#1]%
+  {\begingroup
+   \typo_delimited_push{#1}%
+   \dostarttagged\t!delimitedblock\currentdelimitedtext
+   \edef\p_method{\delimitedtextparameter\c!method}%
+   \ifx\p_method\s!font
+     \expandafter\typo_delimited_start_font
+   \else
+     \expandafter\typo_delimited_start_other
+   \fi}
+
+\let\typo_delimited_stop\relax % hooks into \everypar
+
+\def\typo_delimited_start_font
+  {\let\typo_delimited_stop\typo_delimitedtexts_finish_font
+   \delimitedtextparameter\c!left
+   \ignorespaces}
+
+\def\typo_delimited_start_other
+  {\edef\p_repeat{\delimitedtextparameter\c!repeat}%
+   \ifx\p_repeat\v!yes
+     \let\typo_delimited_repeat\typo_delimited_repeat_ideed
+   \else
+     \let\typo_delimited_repeat\relax
+   \fi
+   \edef\p_location{\delimitedtextparameter\c!location}%
+   \ifx\p_location\v!paragraph
+     \singleexpandafter\typo_delimited_start_par
+   \else\ifx\p_location\v!margin
+     \doubleexpandafter\typo_delimited_start_par
+   \else
+     \doubleexpandafter\typo_delimited_start_txt
+   \fi\fi}
+
+\def\typo_delimitedtexts_finish_font
+  {\removeunwantedspaces\delimitedtextparameter\c!right}
+
+\def\typo_delimited_start_par
+  {\dosingleempty\typo_delimited_start_par_indeed}
+
+\def\typo_delimited_start_par_indeed[#1]%
+  {\let\typo_delimited_stop\typo_delimited_stop_par
+   \doifsomething{\delimitedtextparameter\c!spacebefore}
+     {\blank[\delimitedtextparameter\c!spacebefore]}%
+   \delimitedtextparameter\c!before
+   \edef\m_typo_delimited_narrower{#1}%
+   \ifx\m_typo_delimited_narrower\empty
+     \endgraf
+     \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
+     \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
+     \let\typo_delimited_stop_par_indeed\endgraf
+   \else % backward compatible direct directive
+     \startnarrower[#1]%
+     \let\typo_delimited_stop_par_indeed\stopnarrower
+   \fi
+   % so far
+   \pushmacro\checkindentation
+   \doifsomething{\delimitedtextparameter\c!indenting} % WS
+     {\setupindenting[\delimitedtextparameter\c!indenting]}%
+   \begingroup
+   \usedelimitedtextstyleandcolor\c!style\c!color
+   \leftdelimitedtextmark
+   \ignorespaces}
+
+\def\typo_delimited_stop_par
+   {\removeunwantedspaces
+    \removelastskip
+    \rightdelimitedtextmark
+    \endgroup
+    \popmacro\checkindentation
+    \typo_delimited_stop_par_indeed
+    \delimitedtextparameter\c!after
+    \doifsomething{\delimitedtextparameter\c!spaceafter}
+      {\blank[\delimitedtextparameter\c!spaceafter]}%
+    \useindentnextparameter\delimitedtextparameter
+    \dorechecknextindentation}% AM: This was missing!
+
+\def\typo_delimited_start_txt
+  {\let\typo_delimited_stop\typo_delimited_stop_txt
+   \begingroup
+   \usedelimitedtextstyleandcolor\c!style\c!color
+   \typo_delimited_handle_left\c!left
+   \ignorespaces}
+
+\def\typo_delimited_stop_txt
+  {\removeunwantedspaces
+   \typo_delimited_handle_right\c!right
+   \endgroup}
+
+\unexpanded\def\stopdelimitedtext
+  {\typo_delimited_stop
+   \dostoptagged
+   \typo_delimited_pop
+   \endgroup}
+
+\unexpanded\def\delimitedtext[#1]%
+  {\dontleavehmode % following ones can be omited
+   \typo_delimited_push{#1}%
+   \edef\p_method{\delimitedtextparameter\c!method}%
+   \ifx\p_method\s!font
+     \expandafter\typo_delimited_fontdriven
+   \else
+     \expandafter\typo_delimited_other
+   \fi}
+
+\def\typo_delimited_other
+  {\edef\p_location{\delimitedtextparameter\c!location}%
+   \ifx\p_location\v!paragraph
+     \singleexpandafter\typo_delimited_par
+   \else\ifx\p_location\v!margin
+     \doubleexpandafter\typo_delimited_par
+   \else
+     \doubleexpandafter\typo_delimited_txt
+   \fi\fi}
+
+% shortcuts
+
+\unexpanded\def\startdelimited{\startdelimitedtext}
+\unexpanded\def\stopdelimited {\stopdelimitedtext}  % no let, dynamically assigned
+           \def\delimited     {\delimitedtext}
+
+\unexpanded\def\leftdelimitedtextmark
+  {\doifsomething{\delimitedtextparameter\c!left}
+     {\setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
+      \dontleavehmode
+      \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
+      \box\scratchbox}}
+
+\unexpanded\def\rightdelimitedtextmark
+  {\doifsomething{\delimitedtextparameter\c!right}
+     {\hsmash{\delimitedtextparameter\c!right}}}
+
+% \starttext
+%    \hyphenatedword{groepsvrijstellingsverordeningen}\par
+%    \hyphenatedword{\quote{groepsvrijstellingsverordeningen}}\par
+%     \dorecurse{100}{\hskip300pt\hskip\recurselevel pt test \quote{xxx xxxx}.\par}
+%     \page \setuppapersize[A5][A4]
+%     \quotation {overly beautiful pusillanimous sesquipedalian
+%     longwinded} test test test test test test test test test test test
+%     test test test test test test test test test test test test test
+%     test test test test test test test test test test test test test
+%     test test test test test test test test test test test test test
+%     test test test
+% \stoptext
+
+\def\typo_delimited_handle_middle#1%
+  {\begingroup
+   \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+   \ifdim\wd\scratchbox>\zeropoint
+     \ifdim\lastkern=\d_typo_delimited_signal
+       \unkern
+       \hskip\hspaceamount\currentlanguage{interquotation}%
+     \fi
+     \ifhmode % else funny pagebeaks
+       \penalty\plustenthousand
+       \hskip\zeropoint % == \prewordbreak
+     \fi
+     \strut % new, needed below
+     \delimitedtextparameter#1% unhbox\scratchbox
+   % \penalty\plustenthousand % else overfull boxes, but that's better than dangling periods
+     \kern\d_typo_delimited_signal % +- \prewordbreak
+   \fi
+   \endgroup}
+
+\def\typo_delimited_handle_left#1%
+  {\begingroup
+   \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+   \ifdim\wd\scratchbox>\zeropoint
+     \ifdim\lastkern=\d_typo_delimited_signal
+       \unkern
+       \hskip\hspaceamount\currentlanguage{interquotation}%
+     \else\ifdim\lastskip=\d_typo_delimited_signal
+       \unskip
+       \hskip\hspaceamount\currentlanguage{interquotation}%
+     \fi\fi
+     \strut % new, needed below
+     \ifhmode % else funny pagebeaks
+       \penalty\plustenthousand
+       \hskip\zeropoint % == \prewordbreak
+     \fi
+     \strut % new, needed below
+     \delimitedtextparameter#1% unhbox\scratchbox
+     \hskip\d_typo_delimited_signal % +- \prewordbreak
+   \fi
+   \endgroup}
+
+\def\typo_delimited_handle_right#1%
+  {\begingroup
+   \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+   \ifdim\wd\scratchbox>\zeropoint
+     \ifdim\lastkern=\d_typo_delimited_signal
+       \unkern
+       \penalty\plustenthousand
+       \hskip\hspaceamount\currentlanguage{interquotation}%
+     \else\ifdim\lastskip=\d_typo_delimited_signal
+       \unskip
+       \penalty\plustenthousand
+       \hskip\hspaceamount\currentlanguage{interquotation}%
+     \fi\fi
+     \ifhmode % else funny pagebeaks
+       \penalty\plustenthousand
+       \hskip\zeropoint % == \prewordbreak
+     \fi
+     \strut % new, needed below
+     \delimitedtextparameter#1% unhbox\scratchbox
+     \kern\d_typo_delimited_signal % +- \prewordbreak
+   \fi
+   \endgroup}
+
+\unexpanded\def\typo_delimited_par
+  {\groupedcommand
+     {\dostarttagged\t!delimited\currentdelimitedtext % block?
+      \typo_delimited_handle_left\c!left}
+     {\typo_delimited_handle_right\c!right
+      \removelastskip
+      \dostoptagged
+      \typo_delimited_pop}}
+
+\unexpanded\def\typo_delimited_txt
+  {\doifelse{\delimitedtextparameter\c!style}\v!normal
+     \typo_delimited_quoted
+     \typo_delimited_attributed}
+
+\def\typo_delimited_quoted_b
+  {\dostarttagged\t!delimited\currentdelimitedtext
+   \typo_delimited_handle_left\c!left}
+
+\def\typo_delimited_quoted_e
+  {\typo_delimited_handle_right\c!right
+   \removelastskip
+   \dostoptagged
+   \typo_delimited_pop}
+
+\def\typo_delimited_attributed_b
+  {\dostarttagged\t!delimited\currentdelimitedtext
+   \usedelimitedtextstyleandcolor\c!style\c!color}
+
+\def\typo_delimited_attributed_e
+  {\dostoptagged
+   \typo_delimited_pop}
+
+\def\typo_delimited_fontdriven_b
+  {\dostarttagged\t!delimited\currentdelimitedtext
+   \languageparameter{\c!left\currentdelimitedtext}}
+
+\def\typo_delimited_fontdriven_e
+  {\languageparameter{\c!right\currentdelimitedtext}%
+   \dostoptagged
+   \typo_delimited_pop}
+
+% We now assume proper argument usage (so no longer grouped
+% command).
+
+% \def\typo_delimited_quoted    {\groupedcommand      \typo_delimited_quoted_b    \typo_delimited_quoted_e    }
+% \def\typo_delimited_attributed{\groupedcommand      \typo_delimited_attributed_b\typo_delimited_attributed_e}
+% \def\typo_delimited_fontdriven{\simplegroupedcommand\typo_delimited_fontdriven_b\typo_delimited_fontdriven_e}
+
+\def\typo_delimited_quoted    {\bgroup\typo_delimited_quoted_b    \aftergroup\typo_delimited_quoted_e    \let\next=}
+\def\typo_delimited_attributed{\bgroup\typo_delimited_attributed_b\aftergroup\typo_delimited_attributed_e\let\next=}
+\def\typo_delimited_fontdriven{\bgroup\typo_delimited_fontdriven_b\aftergroup\typo_delimited_fontdriven_e\let\next=}
+
+% testcase for nesting:
+%
+% \quotation{... \quotation{...} ...}
+% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
+% \setupdelimitedtext[quotation][1][left=(,right=)]
+% \setupdelimitedtext[quotation][2][left={[},right={]}]
+% \setupdelimitedtext[quotation][3][left=\{,right=\}]
+% \quotation{... \quotation{...} ...}
+% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
+
+\definedelimitedtext
+  [\v!quotation]
+  [\c!left={\symbol[\c!leftquotation]},
+   \c!right={\symbol[\c!rightquotation]},
+   \c!leftmargin=\v!standard]
+
+\definedelimitedtext
+  [\v!quote][\v!quotation]
+
+\setupdelimitedtext
+  [\v!quote]
+  [\c!location=\v!text,
+   \c!left={\symbol[\c!leftquote]},
+   \c!right={\symbol[\c!rightquote]}]
+
+\definedelimitedtext
+   [\v!blockquote][\v!quotation]
+
+\setupdelimitedtext
+  [\v!blockquote]
+  [\c!left=,
+   \c!right=]
+
+\definedelimitedtext
+  [\v!speech][\v!quotation]
+
+\setupdelimitedtext
+  [\v!speech]
+  [\c!repeat=\v!yes,
+   \c!left={\symbol[\c!leftspeech]},
+   \c!middle={\symbol[\c!middlespeech]},
+   \c!right={\symbol[\c!rightspeech]}]
+
+% how do we call an tight quote
+%
+% \definedelimitedtext
+%    [\v!quotation][\v!quotation]
+%
+% \setupdelimitedtext
+%   [\v!quotation]
+%   [\c!indentnext=\v!no,
+%    \c!spacebefore=\v!nowhite]
+
+\unexpanded\def\setupquotation{\setupdelimitedtext[\v!quotation]}
+\unexpanded\def\setupquote    {\setupdelimitedtext[\v!quote]}
+
+\protect \endinput
diff --git a/tex/context/base/typo-dig.lua b/tex/context/base/typo-dig.lua
index 1e4a02fc6..f11b3b0e3 100644
--- a/tex/context/base/typo-dig.lua
+++ b/tex/context/base/typo-dig.lua
@@ -28,6 +28,7 @@ local insert_before   = node.insert_before
 local insert_after    = node.insert_after
 
 local texattribute    = tex.attribute
+local unsetvalue      = attributes.unsetvalue
 
 local nodecodes       = nodes.nodecodes
 local glyph_code      = nodecodes.glyph
@@ -42,6 +43,8 @@ local fontdata        = fonthashes.identifiers
 local chardata        = fonthashes.characters
 local quaddata        = fonthashes.quads
 
+local v_reset         = interfaces.variables.reset
+
 local charbase        = characters.data
 local getdigitwidth   = fonts.helpers.getdigitwidth
 
@@ -125,20 +128,30 @@ end
 
 local m, enabled = 0, false -- a trick to make neighbouring ranges work
 
-function digits.set(n)
-    if not enabled then
-        tasks.enableaction("processors","typesetters.digits.handler")
-        if trace_digits then
-            report_digits("enabling digit handler")
-        end
-        enabled = true
-    end
-    if m == 100 then
-        m = 1
+function digits.set(n) -- number or 'reset'
+    if n == v_reset then
+        n = unsetvalue
     else
-        m = m + 1
+        n = tonumber(n)
+        if n then
+            if not enabled then
+                tasks.enableaction("processors","typesetters.digits.handler")
+                if trace_digits then
+                    report_digits("enabling digit handler")
+                end
+                enabled = true
+            end
+            if m == 100 then
+                m = 1
+            else
+                m = m + 1
+            end
+            n = m * 100 + n
+        else
+            n = unsetvalue
+        end
     end
-    texattribute[a_digits] = m * 100 + n
+    texattribute[a_digits] = n
 end
 
 digits.handler = nodes.installattributehandler {
@@ -146,3 +159,7 @@ digits.handler = nodes.installattributehandler {
     namespace = digits,
     processor = process,
 }
+
+-- interface
+
+commands.setdigitsmanipulation = digits.set
diff --git a/tex/context/base/typo-dig.mkiv b/tex/context/base/typo-dig.mkiv
index 03be1bffc..832ebbec4 100644
--- a/tex/context/base/typo-dig.mkiv
+++ b/tex/context/base/typo-dig.mkiv
@@ -39,7 +39,7 @@
 %D \stoplines
 
 \unexpanded\def\setdigitsmanipulation[#1]%
-  {\ctxlua{typesetters.digits.set(\number#1)}}
+  {\ctxcommand{setdigitsmanipulation("#1")}}
 
 \unexpanded\def\resetdigitsmanipulation
   {\attribute\digitsattribute\attributeunsetvalue}
@@ -48,8 +48,8 @@
     \resetdigitsmanipulation
 \to \everyresettypesetting
 
-\unexpanded\def\equaldigits{\groupedcommand{\setdigitsmanipulation[\plusone]}{}}
-\unexpanded\def\dummydigit {\hphantom{\setdigitsmanipulation[\plusone]0}}
+\unexpanded\def\equaldigits{\groupedcommand{\setdigitsmanipulation[\number\plusone]}{}}
+\unexpanded\def\dummydigit {\hphantom      {\setdigitsmanipulation[\number\plusone]0}}
 
 \appendtoks
     \resetcharacterspacing
diff --git a/tex/context/base/typo-mar.mkiv b/tex/context/base/typo-mar.mkiv
index 0d5c5a5b9..987ce9a12 100644
--- a/tex/context/base/typo-mar.mkiv
+++ b/tex/context/base/typo-mar.mkiv
@@ -155,26 +155,26 @@
 
 \unexpanded\def\margindata
   {\iftrialtypesetting
-     \expandafter\nomargindata
+     \expandafter\typo_margins_data_nop
    \else
-     \expandafter\domargindata
+     \expandafter\typo_margins_data_yes
    \fi}
 
-\def\nomargindata[#name]%
-  {\dodoubleempty\donomargindata}
+\def\typo_margins_data_nop[#name]%
+  {\dodoubleempty\typo_margins_data_nop_indeed}
 
-\def\domargindata[#name]%
+\def\typo_margins_data_yes[#name]%
   {\setfalse\inhibitmargindata % flushing afterwards
    \begingroup
   %\settrue\inhibitmargindata  % no flushing in here
    \def\currentmargindata{#name}%
    \let\currentmarginframed\currentmargindata
-   \dodoubleempty\dodomargindata}
+   \dodoubleempty\typo_margins_data_yes_indeed}
 
-\unexpanded\def\donomargindata[#dataparameters][#textparameters]#content%
+\unexpanded\def\typo_margins_data_nop_indeed[#dataparameters][#textparameters]#content%
   {}
 
-\unexpanded\def\dodomargindata[#dataparameters][#textparameters]#content%
+\unexpanded\def\typo_margins_data_yes_indeed[#dataparameters][#textparameters]#content%
   {\iffirstargument
      \setupcurrentmargindata[#dataparameters]%
    \fi
@@ -365,9 +365,9 @@
 \let\definemarginline\definemargindata
 
 \unexpanded\def\defineinmargin
-  {\doquadrupleempty\dodefineinmargin}
+  {\doquadrupleempty\typo_inmargin_define}
 
-\def\dodefineinmargin[#name][#location][#align][#settings]% not completely compatible
+\def\typo_inmargin_define[#name][#location][#align][#settings]% not completely compatible
   {\definemargindata[#name][\c!location=#location,\c!align=#align,#settings]%
    \definemarginframed[#name][#location][\c!align=#align,#settings]}
 
diff --git a/tex/context/base/typo-rep.lua b/tex/context/base/typo-rep.lua
index 5ecff5586..0d9bf8cc1 100644
--- a/tex/context/base/typo-rep.lua
+++ b/tex/context/base/typo-rep.lua
@@ -24,12 +24,17 @@ local has_attribute = node.has_attribute
 
 local chardata      = characters.data
 local collected     = false
-local attribute     = attributes.private("stripping")
+local a_stripping   = attributes.private("stripping")
 local fontdata      = fonts.hashes.identifiers
 local tasks         = nodes.tasks
 
-local nodecodes    = nodes.nodecodes
-local glyph_code   = nodecodes.glyph
+local texattribute  = tex.attribute
+local unsetvalue    = attributes.unsetvalue
+
+local v_reset       = interfaces.variables.reset
+
+local nodecodes     = nodes.nodecodes
+local glyph_code    = nodecodes.glyph
 
 -- todo: other namespace -> typesetters
 
@@ -74,7 +79,7 @@ function nodes.handlers.stripping(head)
     while current do
         if current.id == glyph_code then
             -- it's more efficient to keep track of what needs to be kept
-            local todo = has_attribute(current,attribute)
+            local todo = has_attribute(current,a_stripping)
             if todo == 1 then
                 local char = current.char
                 local what = glyphs[char]
@@ -94,11 +99,31 @@ function nodes.handlers.stripping(head)
     return head, done
 end
 
+local enabled = false
+
+function stripping.set(n) -- number or 'reset'
+    if n == v_reset then
+        n = unsetvalue
+    else
+        n = tonumber(n)
+        if n then
+            if not enabled then
+                if initialize then initialize() end
+                tasks.enableaction("processors","nodes.handlers.stripping")
+                enabled = true
+            end
+        else
+            n = unsetvalue
+        end
+    end
+    texattribute[a_stripping] = n
+end
+
+-- why not in task-ini?
+
 tasks.appendaction("processors","fonts","nodes.handlers.stripping",nil,"nodes.handlers.characters")
 tasks.disableaction("processors","nodes.handlers.stripping")
 
-function nodes.stripping.enable()
-    if initialize then initialize() end
-    tasks.enableaction("processors","nodes.handlers.stripping")
-    function nodes.stripping.enable() end
-end
+-- interface
+
+commands.setcharacterstripping = stripping.set
diff --git a/tex/context/base/typo-rep.mkiv b/tex/context/base/typo-rep.mkiv
index c13d7eeb7..46b439491 100644
--- a/tex/context/base/typo-rep.mkiv
+++ b/tex/context/base/typo-rep.mkiv
@@ -37,17 +37,15 @@
 
 \definesystemattribute[stripping][public]
 
-\def\setcharacterstripping
-  {\ctxlua{nodes.stripping.enable()}%
-   \gdef\setcharacterstripping[##1]{\attribute\strippingattribute##1\relax}%
-   \setcharacterstripping}
+\unexpanded\def\setcharacterstripping[#1]%
+  {\ctxcommand{setcharacterstripping("#1")}}
 
-\def\resetcharacterstripping
+\unexpanded\def\resetcharacterstripping
   {\attribute\strippingattribute\attributeunsetvalue}
 
 % maybe .. this might disappear, but is handy for testing
 
-\def\forcecharacterstripping % secret command
+\unexpanded\def\forcecharacterstripping % secret command
   {\ctxlua{fonts.handlers.otf.features.register("formatters",true)}}
 
 \protect \endinput
diff --git a/tex/context/base/typo-spa.lua b/tex/context/base/typo-spa.lua
index 5b80c7178..9e653ad55 100644
--- a/tex/context/base/typo-spa.lua
+++ b/tex/context/base/typo-spa.lua
@@ -30,6 +30,8 @@ local quaddata           = fonthashes.quads
 local texattribute       = tex.attribute
 local unsetvalue         = attributes.unsetvalue
 
+local v_reset            = interfaces.variables.reset
+
 local nodecodes          = nodes.nodecodes
 local glyph_code         = nodecodes.glyph
 
@@ -192,12 +194,18 @@ function spacings.setup(name,char,settings)
 end
 
 function spacings.set(name)
-    if not enabled then
-        tasks.enableaction("processors","typesetters.spacings.handler")
-        enabled = true
+    local n = unsetvalue
+    if name ~= v_reset then
+        local data = numbers[name]
+        if data then
+            if not enabled then
+                tasks.enableaction("processors","typesetters.spacings.handler")
+                enabled = true
+            end
+            n = data.number or unsetvalue
+        end
     end
-    local data = numbers[name]
-    texattribute[a_spacings] = data and data.number or unsetvalue
+    texattribute[a_spacings] = n
 end
 
 function spacings.reset()
diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua
index 50eb86f93..c5a3e3028 100644
--- a/tex/generic/context/luatex/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
 -- merged file : luatex-fonts-merged.lua
 -- parent file : luatex-fonts.lua
--- merge date  : 01/11/12 14:58:36
+-- merge date  : 01/12/12 11:03:39
 
 do -- begin closure to overcome local limits and interference
 
-- 
cgit v1.2.3