From 8f58f4428d70961938e9151097886d861b3faeb3 Mon Sep 17 00:00:00 2001
From: Han-Wen Nienhuys <hanwen@xs4all.nl>
Date: Mon, 12 Apr 1999 11:53:52 +0200
Subject: [PATCH] release: 1.1.39

---
 AIMS                                          |  92 +++++++++
 Documentation/CodingStyle.yo                  |  22 +-
 Documentation/GNUmakefile                     |   2 +-
 Documentation/index.yo                        |   1 +
 Documentation/links.yo                        |   4 +-
 Documentation/tex/GNUmakefile                 |   3 +-
 Documentation/tex/lilypond-regtest.doc        |  82 ++++++++
 Documentation/tex/mudela-book-doc.doc         |  10 +-
 Documentation/tex/testje.fly                  |   2 +
 NEWS                                          |  36 +++-
 NEWS-1.0                                      |   1 -
 TODO                                          |  24 ++-
 VERSION                                       |   4 +-
 buildscripts/mutopia-index.py                 |  20 +-
 buildscripts/profile-conf.sh                  |   2 +-
 buildscripts/ps-to-pfa.py                     |  45 ++--
 flower/include/cons.hh                        | 166 ++++-----------
 flower/include/interval.hh                    |  21 +-
 flower/include/killing-cons.tcc               |  10 +-
 flower/include/scalar.hh                      |   1 +
 flower/include/string-convert.hh              |  55 ++---
 flower/include/string.hh                      |   1 +
 flower/string-convert.cc                      |   8 +
 flower/string.cc                              |   5 +
 input/bugs/auto-beam.ly                       |  21 --
 input/bugs/auto-grace.ly                      |   6 -
 input/bugs/beam-translator.ly                 |  25 ---
 input/bugs/biem.ly                            |  32 ---
 input/bugs/core.ly                            |  95 ---------
 input/bugs/ctie-bug.fly                       |   1 -
 input/bugs/mats.ly                            |  78 -------
 input/bugs/time-grouping.ly                   |  16 --
 input/praeludium-fuga-E.ly                    |  10 +-
 input/test/beam-interstaff.ly                 |   2 +-
 input/test/beam-repeat.ly                     |  10 +
 input/test/collisions.ly                      |  34 +--
 input/test/rest-collision.ly                  |  35 ++++
 input/test/rest.fly                           |   5 +
 input/test/slur-interstaff.ly                 |  14 +-
 input/test/tup.ly                             |   8 +-
 lib/source-file.cc                            |   4 +-
 lib/source.cc                                 |   6 +-
 lily/abbrev.cc                                |   2 +-
 lily/bar.cc                                   |  14 +-
 lily/beam.cc                                  |  56 ++---
 lily/bezier.cc                                | 120 +++++------
 lily/chord-name-engraver.cc                   |   2 +-
 lily/collision.cc                             |  42 ++--
 lily/compressed-music.cc                      |  23 ---
 lily/directional-spanner.cc                   |   8 +-
 lily/encompass-info.cc                        |  25 ++-
 lily/font-size-engraver.cc                    |   5 +-
 lily/gourlay-breaking.cc                      |   6 +-
 lily/include/auto-beam-engraver.hh            |   2 +
 lily/include/beam.hh                          |   6 +-
 lily/include/directional-spanner.hh           |   2 +-
 lily/include/encompass-info.hh                |   1 +
 lily/include/lily-guile.hh                    |   8 +
 lily/include/lily-proto.hh                    |   4 +-
 lily/include/molecule.hh                      |  31 ++-
 lily/include/music-wrapper.hh                 |   2 +-
 lily/include/note-column.hh                   |   7 +-
 lily/include/p-col.hh                         |  20 +-
 lily/include/protected-scm.hh                 |   3 +-
 lily/include/rest-collision.hh                |   1 -
 lily/include/rod.hh                           |   1 -
 lily/include/score-column.hh                  |  21 +-
 lily/include/slur.hh                          |   6 +-
 lily/include/spring-spacer.hh                 |   2 +-
 lily/include/stem.hh                          |   2 +-
 lily/include/tie.hh                           |   2 +-
 ...rator.hh => time-scaled-music-iterator.hh} |  10 +-
 ...mpressed-music.hh => time-scaled-music.hh} |  12 +-
 lily/include/tuplet-engraver.hh               |   2 +-
 lily/include/tuplet-spanner.hh                |  15 +-
 lily/key-item.cc                              |   1 +
 lily/lily-guile.cc                            | 194 ++++++++++++++++++
 lily/lookup.cc                                |  94 +++++----
 lily/lyric-engraver.cc                        |   2 +-
 lily/main.cc                                  |   2 +
 lily/midi-item.cc                             |   4 +-
 lily/misc.cc                                  |  12 +-
 lily/molecule.cc                              |  60 ++++--
 lily/music-iterator.cc                        |   8 +-
 lily/music-list.cc                            |  25 ++-
 lily/music-output-def.cc                      |   7 +-
 lily/music-sequence.cc                        |   8 +-
 lily/music-wrapper.cc                         |   6 +
 lily/note-column.cc                           |  49 ++++-
 lily/p-col.cc                                 |  46 +----
 lily/paper-def.cc                             |   8 +-
 lily/paper-outputter.cc                       |   4 +-
 lily/parser.yy                                |  18 +-
 lily/performance.cc                           |   4 +-
 lily/protected-scm.cc                         |  34 ++-
 lily/repeat-engraver.cc                       |  16 +-
 lily/request-iterator.cc                      |   8 +-
 lily/rest-collision-engraver.cc               |   2 +-
 lily/rest-collision.cc                        |  92 +++++----
 lily/rest.cc                                  |  20 +-
 lily/rod.cc                                   |  13 --
 lily/score-column.cc                          |  44 +---
 lily/score-element.cc                         |   9 -
 lily/score-engraver.cc                        |  35 +---
 lily/separating-group-spanner.cc              |  31 ++-
 lily/separating-line-group-engraver.cc        |   2 +-
 lily/sequential-music-iterator.cc             |   8 +-
 lily/simultaneous-music-iterator.cc           |  22 +-
 lily/single-malt-grouping-item.cc             |  11 +-
 lily/slur.cc                                  | 117 ++++++-----
 lily/spacing-engraver.cc                      | 120 +++++++++++
 lily/spring-spacer.cc                         |  81 +++-----
 lily/stem-engraver.cc                         |  17 +-
 lily/stem-info.cc                             |   5 +
 lily/stem.cc                                  |  10 +-
 lily/tie-engraver.cc                          |   6 +
 lily/tie.cc                                   |   6 +-
 ...rator.cc => time-scaled-music-iterator.cc} |  10 +-
 lily/time-scaled-music.cc                     |  23 +++
 lily/timing-translator.cc                     |   4 +-
 lily/translator-group.cc                      |  40 ++--
 lily/tuplet-engraver.cc                       |  17 +-
 lily/tuplet-spanner.cc                        |  53 ++---
 lily/volta-spanner.cc                         |   5 +-
 lily/word-wrap.cc                             |  38 ++--
 ly/engraver.ly                                |   1 +
 ly/params.ly                                  |   8 +-
 ly/property.ly                                |  37 ++--
 make/mudela-rules.make                        |   2 +-
 make/out/lelievijver.lsm                      |   8 +-
 make/out/lilypond.lsm                         |   8 +-
 make/out/lilypond.spec                        |   4 +-
 make/toplevel.make.in                         |   2 +-
 mf/feta-bolletjes.mf                          |   2 +-
 mf/feta-eindelijk.mf                          | 142 +++++++++----
 mf/feta-generic.mf                            |   5 +-
 mf/feta-klef.mf                               |   8 +-
 mf/feta-macros.mf                             |  12 +-
 mi2mu/include/midi-track-parser.hh            |   4 +-
 mi2mu/include/mudela-column.hh                |   6 +-
 mi2mu/include/mudela-item.hh                  | 112 +++++-----
 mi2mu/include/mudela-score.hh                 |  48 ++---
 mi2mu/include/mudela-staff.hh                 |  17 +-
 mi2mu/include/mudela-voice.hh                 |  19 +-
 mi2mu/midi-track-parser.cc                    |  23 ++-
 mi2mu/mudela-column.cc                        |   2 +-
 mi2mu/mudela-score.cc                         | 134 +++++++-----
 mi2mu/mudela-staff.cc                         | 117 +++++------
 mi2mu/mudela-voice.cc                         |  36 ++--
 mi2mu/template9.cc                            |  32 +++
 ps/lily.ps                                    |   5 +-
 ps/lilyponddefs.ps                            |  26 ++-
 scm/lily.scm                                  |  44 ++--
 scripts/mudela-book.py                        |  86 ++++++--
 scripts/mup-to-ly.py                          |   2 +
 stepmake/stepmake/metapost-rules.make         |   7 +-
 156 files changed, 2218 insertions(+), 1674 deletions(-)
 create mode 100644 AIMS
 create mode 100644 Documentation/tex/lilypond-regtest.doc
 create mode 100644 Documentation/tex/testje.fly
 delete mode 100644 input/bugs/auto-beam.ly
 delete mode 100644 input/bugs/auto-grace.ly
 delete mode 100644 input/bugs/beam-translator.ly
 delete mode 100644 input/bugs/biem.ly
 delete mode 100644 input/bugs/core.ly
 delete mode 100644 input/bugs/ctie-bug.fly
 delete mode 100644 input/bugs/mats.ly
 delete mode 100644 input/bugs/time-grouping.ly
 create mode 100644 input/test/beam-repeat.ly
 create mode 100644 input/test/rest-collision.ly
 create mode 100644 input/test/rest.fly
 delete mode 100644 lily/compressed-music.cc
 rename lily/include/{compressed-music-iterator.hh => time-scaled-music-iterator.hh} (50%)
 rename lily/include/{compressed-music.hh => time-scaled-music.hh} (53%)
 create mode 100644 lily/spacing-engraver.cc
 rename lily/{compressed-music-iterator.cc => time-scaled-music-iterator.cc} (56%)
 create mode 100644 lily/time-scaled-music.cc

diff --git a/AIMS b/AIMS
new file mode 100644
index 0000000000..ae5d5a9658
--- /dev/null
+++ b/AIMS
@@ -0,0 +1,92 @@
+[From a posting in rec.music.classical.guitar]
+
+I started coding on Lilypond because I am fascinated by music and by
+typography.  I have never used any egngraving software, and do not
+feel the need to investigate other programs, for the simple reason
+that I have no need of typesetting music.  In fact, I almost never use
+Lilypond. I believe that the largest thing I ever entered was Bach's
+WTK-I fugue 2, two pages of piano music.  I entered it about 1.5 years
+ago.
+
+I am fascinated by this complicated problem, typesetting music with a
+computer.  And that is why I started writing Lilypond: purely for the
+hack value, for the fun of coding.  To me, music notation is like a
+giant puzzle. I have been coding on Lilypond and studying music
+notation in my spare time for the past three years.  Since this is my
+hobby, strictly spoken I have no obligations concerning Lily, neither
+moral, nor legal.  Of course, I am open to pleas and requests and
+often do respond to them, but I have the choice to ignore them, and
+occasionally I do.
+
+Lilypond tries to typeset music *automatically*.  We (*) try to put as
+much of our knowledge of music typography into the program as
+possible, and have as little typographical information in the input as
+possible.  Basically, you ought to be able to produce nicely printed
+scores with Lilypond without knowing anything about engraving.
+
+	footnote (*): We = me and Jan Nieuwenhuizen, who wrote about
+	30% of the code, and provided most of the examples.)
+
+A second important issue is that Lilypond is free. Not only in the
+sense that you can download Lilypond at no charge, but it is also free
+as in "free speech".  User are free to modify the program to suit
+their needs, and redistribute or sell the program.  Moreover, since
+the program can be downloaded at no cost, I don't gain anything if it
+gets more users.  And here I mean "use" as opposed to "use and
+enhance" or "use and give helpful comments".
+
+We have not made a program for professionals, and as a result, hackers
+have begun to use it.  Some of them have sent me modifications that
+improve the software.  This is good for us, because it helps us solve
+our puzzle more quickly.  We would have made the program useful for
+professionals like you, presumably they would start using it, be glad
+they didn't have to pay, and ignore me.  That would not help me solve
+my puzzle; I don't gain anything.
+
+The system has reached a point that it is useful for quite a lot of
+people (we get about 200 downloads per month from the main FTP site),
+and a lot of my users have thanked me for rescuing them from tedious
+typesetting work using Finale, Encore and what-have-you-more.  I have
+a user in Russia who tries make a living by typesetting a 260-page
+book on harmonic-theory using Lilypond.  I have a user that can
+typeset his own 45 page orchestral score.  Laymen have called our
+printout of the Bach Cello Suite 2 of "professional quality".
+
+This program is now useful to more people than a program solely aimed
+at professional use.
+
+Obviously, we're not finished yet, since the program still contains
+quite a lot bugs.  We know the examples on the website contain lots of
+errors.  Tweaking the input to fix up and hide the errors would cost
+us a lot of time. Time that is better spent improving the program
+itself. So, we don't hide the errors.
+
+Most of the errors that are shown on the website are not caused by our
+lack of knowledge, but rather by a lack of time and the sheer
+complexity of this big puzzle we're solving.
+
+In the end, we also want a system that is fully tweakable, so you can
+also produce professional quality typesetting.  But being
+straightforward to use for non-professionals is more important now.
+
+Finally, I would like to stress that my goals while programming on
+LilyPond are separate from my beliefs of what should be done with the
+program. I can not control what the program is used for, nor do I want
+to. People can typeset lullabies for their baby daughters or racist
+warsongs to help fascist leaders.
+
+A fortiori, I can not control what copyright users place on their
+input and output.  If you want to do commercial music editing (with
+LilyPond) you can publish scores on paper and keep the input and
+output to your self.  You can publish the score online, and keep the
+input to yourself.  You can put the input online as well, while
+forbidding modifications.  You can publish the input and allow
+modifications.
+
+This is all up to the user of the software, not to me.
+
+
+Han-Wen Nienhuys,
+
+April 11, 1999
+
diff --git a/Documentation/CodingStyle.yo b/Documentation/CodingStyle.yo
index 0399384be6..ec80eb456a 100644
--- a/Documentation/CodingStyle.yo
+++ b/Documentation/CodingStyle.yo
@@ -106,9 +106,9 @@ verb(
 nsubsect(MEMBERS)
 
 verb(
-	Class::member()
+	Class::member ()
 	Type Class::member_type_
-	Type Class::member_type()
+	Type Class::member_type ()
 )
 
 the code(type) is a Hungarian notation postfix for code(Type). See below
@@ -122,7 +122,7 @@ included.
 
 Don't laugh. It took us a whole evening/night to figure out one of
 these bugs, because we had a macro that looked like
-code(DECLARE_VIRTUAL_FUNCTIONS()). 
+code(DECLARE_VIRTUAL_FUNCTIONS ()). 
 
 nsubsect(BROKEN CODE)
 
@@ -148,7 +148,7 @@ verb(
 		Long class documentation.
 		(Hungarian postfix)
 
-		TODO Fix boring_member()
+		TODO Fix boring_member ()
 	*/
 	class Class {
 		/**
@@ -160,14 +160,14 @@ verb(
 
 
 		/**
-			short memo. long doco of member()
+			short memo. long doco of member ()
 			@param description of arguments
 			@return Rettype
 		*/
-		Rettype member(Argtype);
+		Rettype member (Argtype);
 
 		/// memo only
-		boring_member() {
+		boring_member () {
 			data_member_ = 121; // ugh
 		}
 	};
@@ -183,15 +183,15 @@ Standard methods:
 
 verb(
 	///check that *this satisfies its invariants, abort if not.
-	void OK() const
+	void OK () const
 
 	/// print *this (and substructures) to debugging log
-	void print() const
+	void print () const
 
 	/**
-	protected member. Usually invoked by non-virtual XXXX()
+	protected member. Usually invoked by non-virtual XXXX ()
 	*/
-	virtual do_XXXX()
+	virtual do_XXXX ()
 
 	/**add some data to *this.
 	Presence of these methods usually imply that it is not feasible to this
diff --git a/Documentation/GNUmakefile b/Documentation/GNUmakefile
index 1bba1d360f..01dfbe9578 100644
--- a/Documentation/GNUmakefile
+++ b/Documentation/GNUmakefile
@@ -5,7 +5,7 @@ depth = ..
 NAME = documentation
 SUBDIRS=man tex pictures topdocs ntweb
 STEPMAKE_TEMPLATES=documentation 
-README_TOP_FILES=NEWS DEDICATION TODO ANNOUNCE-0.1
+README_TOP_FILES=NEWS DEDICATION TODO ANNOUNCE-0.1 AIMS
 INFO_FILES = $(wildcard $(outdir)/$(package).info*)
 
 EXTRA_DIST_FILES = gnu-music-history TODO 
diff --git a/Documentation/index.yo b/Documentation/index.yo
index 8fc8a4aed9..6f11bcad7c 100644
--- a/Documentation/index.yo
+++ b/Documentation/index.yo
@@ -26,6 +26,7 @@ it()url(Microsoft Windows instructions)(README-W32.html)
 nsubsect(Why: Background Information)
 
 itemize(
+it() url(Why?)(AIMS.html)
 it() url(Design criteria)(MANIFESTO.html)
 it()url(The GNU Music project)(gnu-music.html)
 it()url(Mutopia -- Music To the People)(mutopia.html)
diff --git a/Documentation/links.yo b/Documentation/links.yo
index b829b76be3..3617caae07 100644
--- a/Documentation/links.yo
+++ b/Documentation/links.yo
@@ -35,7 +35,7 @@ dit(lurl(http://www.iat.unc.edu/technology/music/music.html))
 dit(lurl(http://www.ram.org/ramblings/philosophy/fmp.html))
     Musings on free music, plus hints how to record your own (free) music.
 
-dit(lurl(http://www.cyberus.ca/~jdsankey/harpsichord.html))
+dit(lurl(http://www.geocities.com/Vienna/Studio/1714/))
 	John Sankey has taken up the task of recording classical
 music, and distributing the results at no cost.
 )
@@ -101,6 +101,8 @@ dit(lurl(http://www.ssc.com/linux/))
     The Number One Free Operating System Kernel: Linux 
 dit(lurl( http://sound.condorow.net))
     Dave Philips' Linux sound applications page
+dit(lurl(http://www4.smart.net/~jcovey/scores.html))
+	Jeff Covey's guitar music=
 dit(lurl(http://www.home.fh-karlsruhe.de/~rost0001/web/musik/musik.html))
     Stochastic composing using LilyPond 
 dit(lurl(http://www.medieval.org/emfaq/scores/software.html))
diff --git a/Documentation/tex/GNUmakefile b/Documentation/tex/GNUmakefile
index aaea8b17a7..496c0b7571 100644
--- a/Documentation/tex/GNUmakefile
+++ b/Documentation/tex/GNUmakefile
@@ -16,7 +16,7 @@ OUTTEX_FILES = $(addprefix $(outdir)/, $(TEX_FILES))
 OUTDOC_FILES = $(addprefix $(outdir)/, $(DOC_FILES))
 EL_FILES = $(wildcard *.el)
 BIB_FILES= $(wildcard *.bib)
-EXTRA_DIST_FILES= $(BIB_FILES) $(DOC_FILES) $(DATA_FILES) $(EL_FILES) $(YO_URG_FILES) $(TEX_FILES) $(wildcard *.sty)
+EXTRA_DIST_FILES= $(BIB_FILES) $(DOC_FILES) $(DATA_FILES) $(EL_FILES) $(YO_URG_FILES) $(TEX_FILES) $(wildcard *.sty) testje.fly
 HTML_FILES = $(addprefix $(outdir)/, $(YO_FILES:.yo=.html))
 PS_FILES = $(DVI_FILES:.dvi=.ps)
 
@@ -33,7 +33,6 @@ include $(depth)/make/stepmake.make
 
 dvi: $(OUT_BIB_FILES) $(DVI_FILES)
 
-
 ps: $(PS_FILES)
 
 # urg
diff --git a/Documentation/tex/lilypond-regtest.doc b/Documentation/tex/lilypond-regtest.doc
new file mode 100644
index 0000000000..be31df81b4
--- /dev/null
+++ b/Documentation/tex/lilypond-regtest.doc
@@ -0,0 +1,82 @@
+% -*-LaTeX-*-
+\documentclass{article}
+
+\begin{document}
+\title{LilyPond feature test}
+\author{Han-Wen Nienhuys}
+\maketitle
+
+This document tries give an brief overview of LilyPond features. When
+the text correspond with  the shown notation, we consider LilyPond
+Officially BugFree (tm).
+
+\section{Notes and rests} 
+
+Rests.  Note that the dot of 8th, 16th and 32nd rests rest should be
+next to the top of the rest.  All rests except the whole rest are
+centered on the middle staff line.  
+
+\mudelafile{rest.fly}
+
+Note head shapes are settable.  The stem endings should be adjusted
+per note head
+
+\mudelafile{noteheadstyle.fly}
+
+
+\section{Beams, slurs and other spanners}
+
+%Beams should not interfere with various items on the staff (amongst
+%others repeat signs)
+%
+% \mud elafile{beam-repeat.ly}
+
+Beams can be typeset over fixed distance aligned staffs, beam
+beautification doesn't really work, but knees do. Beams should be
+behave well, whereever the switching point is.
+
+\mudelafile{beam-interstaff.ly}
+
+The same goes for slurs. They behave decently when broken across
+linebreak.
+
+\mudelafile{slur-interstaff.ly}
+
+Tuplets are indicated by a bracket with a number.  There should be no
+bracket if there is one beam that matches  the length of the tuplet.
+The bracket does not interfere with the stafflines, and the number is
+centered in the gap in the bracket.
+
+\mudelafile{tup.ly}
+
+\section{Multiple notes}
+
+Rests should not collide with beams, stems and noteheads.  Rests may
+be under beams.  Rests should be move by integral number of spaces
+inside the staff, and by half spaces outside.  Notice that the half
+and whole rests just outside the staff get ledger lines in different
+cases.
+
+
+\mudelafile{rest-collision.ly}
+
+Normal collisions. We have limited support for four voice polyphony,
+where the middle voices are horizontally shifted, sometimes.
+
+\mudelafile{collisions.ly}
+
+The number of stafflines of a staff can be set with the property
+numberOfStaffLines.  Ledger lines both on note heads and rests are adjusted.
+
+\mudelafile{number-staff-lines.fly}
+
+\section{Global stuff}
+
+Markings that are attached to (invisible) barlines are quite
+delicate: the are attached to the rest of the score without the score
+knowing it.  Consequently, they fall over quite often.
+
+\mudelafile{bar-scripts.ly}
+
+
+\end{document}
diff --git a/Documentation/tex/mudela-book-doc.doc b/Documentation/tex/mudela-book-doc.doc
index 386417f39d..6c5d7bb113 100644
--- a/Documentation/tex/mudela-book-doc.doc
+++ b/Documentation/tex/mudela-book-doc.doc
@@ -128,6 +128,11 @@ To avoid that \LaTeX~places the music on a line of its one, there should
 be no empty lines between the normal text and the mudela
 environment. 
 
+You can also use \verb|mudelafile| (on a separate line, FIXME), to
+include another file.
+
+\mudelafile{testje.fly}
+
 \section{Fontsize options}
 You can use all lilypond fontsizes in mudela-book. 
 % LONG line just to test multiple \mudela on one line
@@ -347,8 +352,7 @@ Verbatim environments will also ignore the page margins. That is
 a feature of \LaTeX. (But you usually put things inside a verbatim
 environment when you don't want \LaTeX~to do any linebreaking)
 
-\end{document}
 
-\begin{verbatim}
 
-\end{verbatim}
+
+\end{document}
diff --git a/Documentation/tex/testje.fly b/Documentation/tex/testje.fly
new file mode 100644
index 0000000000..f114e445eb
--- /dev/null
+++ b/Documentation/tex/testje.fly
@@ -0,0 +1,2 @@
+
+c''4^"This! Is! A! Test!" d e 
diff --git a/NEWS b/NEWS
index 2b3e0b41cc..1306606e52 100644
--- a/NEWS
+++ b/NEWS
@@ -1,17 +1,41 @@
---- ../lilypond-1.1.38/NEWS	Tue Apr  6 10:26:06 1999
-++ b/NEWS	Thu Apr  8 18:12:05 1999
-@@ -1,3 +1,8 @@
+pl 39
+	- \property textstyle -> textStyle
+
 pl 38.tca1
 	- added scm/accordion-script.scm and update ly/accordion-defs.ly
 	- renamed some accordion symbols to make them more english and less
 	  norwenglish. 
 	- removed dot from \accBayanbase
- pl 37.script2
- 	- bf: AFM for BlueSky AFM files.
- 	- \penalty = 4278 -> \penalty 4278pl 38.uu1
+
+pl 37.script4
+	- bf: molecule
+	- bf: tuplet spanner appearance.
+	- bf: less spacing after clef.  Invisible bar has no dims. 
+	- included AIMS.  The why of Lily.
+	- warning if duplicate engraver.
+	- warning if no ties could be created.
+	- bf: \time1/4; .. beams ..
+	- bf: staff switching beams / slurs.
+	- tuplets on multiple beams.
+	- Documentation/tex/lilypond-regtest.doc
+	- bf: nested tuplets
+	- slur cleanups.
+	- bf: multi_measure_rest_engraver in Score_context.
+
+pl 38.uu1
 	- bf: clef_8
 	- bf: barnumbers.
 
+pl 37.script3
+	- fixes for spring_spacer, introduced
+Spacing_engraver
+	- cleanup for rest-collisions. 
+	- hacks for GUILE gc
+	- mudela-book \mudelafile
+	- Documentation/tex/lilypond-regtest.doc
+	- MF rest fixes
+
+
 ********
 pl 38 (april 6)
 pl 37.script2
diff --git a/NEWS-1.0 b/NEWS-1.0
index c50fbdf8a7..5cff9ea377 100644
--- a/NEWS-1.0
+++ b/NEWS-1.0
@@ -1,4 +1,3 @@
-
 pl 17
 	- fixed RPM building.
 
diff --git a/TODO b/TODO
index 9b607355e4..0b9d13db4d 100644
--- a/TODO
+++ b/TODO
@@ -69,6 +69,10 @@ otherwise 2). say preMudelaExample[eps]{}, and change it in document body someti
 . * We need feta-din*.mf files for more sizes than 10.
 . * latex bla.tex broken (titles / \lilyfooter stuff?
 . * fix dynamics decently, ie. use kerning & ligatures.  
+. * dots & rest collisions?
+. * mudela-book.py
+.  * \mudelafile{} to have decent functionality
+.  * use less RE's
 . * support_l_arr_ empty in staff-margin's G_staff_side_item
 . * slurs colllide with lyrics.
 . * minVerticalAlign for StaffGroups.
@@ -81,6 +85,13 @@ present, they're not properly distinguished) but no distinct way to
 specify the third.  Should there be?
 . * spacing of mmrests.
 . * mem leak: redo p-score object deletion.
+. * rest collision minimum dist.
+. * Matanya's tips: 
+.  * spacing for prefatory matter
+.  * accidentals closer to note head
+.  * ledger line for rest dim less
+.  * heavier beams?
+
 
 .* Cleanups needed
 . * Beam
@@ -151,18 +162,7 @@ compilation.
 .  * --prefix option?
 .  * -I option per filetype?
 .  * kpathsea?
-
 . * ly2dvi/lilypond logfile.
-. * How can I specify a chord whose duration is longer than a whole note?
- \type ChordNames { \chord{ A1*2-min } }
-
-gives me a parse error.  And \times doesn't work either.  I can't use
-a spacer note.  So it seems to be impossible to have long chords of
-general length.  Of course, in the example above I can use \breve.
-But what if I want a chord that lasts for 3 whole notes?  Or what
-about 2.5 whole notes?  Is there a mechanism for getting this kind of
-length?  
-
 . * fractional chord durs.
 . * hang Item on Spanner
 . * do --safe for PS output?
@@ -572,6 +572,8 @@ hesitate to ask.
 
 .* SMALLISH PROJECTS
 
+. * Faulenzer sign (% repeat)
+
 . * fix confusing naming in Engraver vs Engraver_group_engraver (context)
 
 . * progress when creating MIDI elts.
diff --git a/VERSION b/VERSION
index 339e1058e0..9d08f1f68b 100644
--- a/VERSION
+++ b/VERSION
@@ -1,8 +1,8 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=1
-PATCH_LEVEL=38
-MY_PATCH_LEVEL=tca1
+PATCH_LEVEL=39
+MY_PATCH_LEVEL=
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
diff --git a/buildscripts/mutopia-index.py b/buildscripts/mutopia-index.py
index b72042cadf..fbc74976f1 100644
--- a/buildscripts/mutopia-index.py
+++ b/buildscripts/mutopia-index.py
@@ -78,15 +78,17 @@ def gen_list(inputs, subdir, filename):
 	list.write ('</ul>')
 
     list.write('<h2>Contents of this directory</h2>\n');
-    list.write (
-    'These example files are taken from the LilyPond distribution. '
-    'LilyPond currently only outputs TeX and MIDI.  The pictures and '
-    'PostScript files were generated using TeX, Ghostscript and some '
-    'graphics tools.  The papersize used for these examples is A4. '
-    'As you know, <a href="http://www.gnu.org/philosophy/gif.html">no gifs due to patent problems</a>, '
-    'but the png images should be viewable with any current browser '
-    '(jpeg is inappropriate for music images).'
-    '\n');
+    list.write ("""
+These example files are taken from the LilyPond distribution. 
+LilyPond currently only outputs TeX and MIDI.  The pictures and 
+PostScript files were generated using TeX, Ghostscript and some 
+graphics tools.  The papersize used for these examples is A4. 
+As you know, <a href="http://www.gnu.org/philosophy/gif.html">no gifs due to patent problems</a>, 
+but the PNG images should be viewable with any current browser
+<p>
+If you want an accurate impression of the output quality please <em>print
+out</em> the samples first.
+    """);
 
 
     for ex in inputs:
diff --git a/buildscripts/profile-conf.sh b/buildscripts/profile-conf.sh
index 79dbd73463..1445c2434c 100644
--- a/buildscripts/profile-conf.sh
+++ b/buildscripts/profile-conf.sh
@@ -1,2 +1,2 @@
 
-configure --prefix=~ --enable-profiling --enable-config=optprof --enable-optimise --disable-checking
+configure --prefix=$HOME/usr --enable-profiling --enable-config=optprof --enable-optimise --disable-checking --enable-debugging
diff --git a/buildscripts/ps-to-pfa.py b/buildscripts/ps-to-pfa.py
index 2bbd2813da..cf4e374b10 100644
--- a/buildscripts/ps-to-pfa.py
+++ b/buildscripts/ps-to-pfa.py
@@ -6,10 +6,11 @@
 # 
 # (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
 
+#TODO.  This could be more efficient.
+
 name = 'ps-to-pfa'
-version = '0.2'
+version = '0.3'
 
-outdir = 'out/'
 datadir = ''
 
 import os
@@ -17,8 +18,10 @@ import sys
 
 import getopt
 from string import *
-import regex
 import regsub
+
+# todo, port: see http://starship.skyport.net/crew/amk/regex/regex-to-re.html
+import re
 import time
 
 def program_id ():
@@ -33,13 +36,16 @@ def help ():
                       + "Options:\n"
                       + "  -d, --datadir=DIR      use DIR for ps header/footer\n"
                       + "  -h, --help             print this help\n"
+		      + "  -o, --output=FILE      set output file to FILE.\n"
                       % (program_name)
 		      )
     sys.exit (0)
 
+output_name = ''
+
 identify ()
 (options, files) = getopt.getopt (
-    sys.argv[1:], 'd:', ['help', 'package'])
+    sys.argv[1:], 'o:d:', ['help', 'package', 'output='])
 for opt in options:
     o = opt[0]
     a = opt[1]
@@ -47,6 +53,8 @@ for opt in options:
 	help ()
     elif o == '-d' or o == '--datadir':
 	datadir = a
+    elif o == '-o' or o =='--output':
+	output_name = a
     else:
 	print o
 	raise getopt.error
@@ -69,12 +77,17 @@ def gulp_file (f):
 	return s
 
 mf = files[0]
-# urg ?
-font = os.path.basename (os.path.splitext (mf)[0])
-sys.stderr.write ('Font: %s\n'% font)
+
+input_name = mf
+font_name = os.path.basename (os.path.splitext (mf)[0])
+if not output_name:
+    output_name  = font_name + '.pfa'
+
+
+sys.stderr.write ('Font: %s\n'% font_name)
 
 def header (f):
-	f.write ('%!PS-AdobeFont-3.0: ' + font + '\n')
+	f.write ('%!PS-AdobeFont-3.0: ' + font_name + '\n')
 	f.write ('%%%%Creator: %s-%s\n' % (name, version))
 	f.write ('\n')
 	f.write ('/setgray { 1 add } bind def\n'
@@ -91,7 +104,7 @@ def header (f):
 '%%/FontBBox [-30 -30 30 30] def\n'
 '\n'
 '/Encoding 256 array def                     %% Trivial encoding vector\n'
-'0 1 255 {Encoding exch /.notdef put} for\n' % (font))
+'0 1 255 {Encoding exch /.notdef put} for\n' % (font_name))
 
 def footer (f):
 	f.write ('\n'
@@ -120,7 +133,7 @@ def footer (f):
 'currentdict\n'
 'end                                         % of font dictionary\n')
 	f.write ('\n')
-	f.write ('/%s\n' % font)
+	f.write ('/%s\n' % font_name)
 	f.write (''
 'exch definefont pop                         % Define the font\n')
 
@@ -129,7 +142,7 @@ def characters (f):
 	# chars = os.listdir ()
 	# chars.sort ()
 	sys.stderr.write ('[')
-	pipe = os.popen ('/bin/ls -1 ' + font + '.[0-9] ' + font + '.[0-9][0-9] ' + font + '.[0-9][0-9][0-9] 2> /dev/null')
+	pipe = os.popen ('/bin/ls -1 ' + font_name + '.[0-9] ' + font_name + '.[0-9][0-9] ' + font_name + '.[0-9][0-9][0-9] 2> /dev/null')
 	chars = []
 	i = pipe.readline ()
 	while i:
@@ -146,8 +159,8 @@ def characters (f):
 		s = regsub.gsub ('^showpage\n', '', s)
 		s = regsub.gsub ('^', '    ', s)
 		n = atoi (regsub.gsub ('.*\.', '', i))
-		s = '\n  /%s-%d{\n%s} bind def\n' % (font, n, s)
-		encoding = encoding + 'Encoding %d /%s-%d put\n' % (n, font, n)
+		s = '\n  /%s-%d{\n%s} bind def\n' % (font_name, n, s)
+		encoding = encoding + 'Encoding %d /%s-%d put\n' % (n, font_name, n)
 		charprocs = charprocs + s
 	f.write (charprocs)
 	f.write ('\n')
@@ -156,12 +169,12 @@ def characters (f):
 	f.write ('\n')
 	sys.stderr.write (']')
 
-ps = outdir + font + '.pfa'
-ps_file = open (ps, 'w')
+
+ps_file = open (output_name, 'w')
 header (ps_file)
 characters (ps_file)
 footer (ps_file)
 sys.stderr.write ('\n')
 ps_file.close ()
-sys.stderr.write ('Wrote PostScript font: %s\n'% ps)
+sys.stderr.write ('Wrote PostScript font: %s\n'% output_name)
 
diff --git a/flower/include/cons.hh b/flower/include/cons.hh
index 1d59e98ec0..6e62c4c865 100644
--- a/flower/include/cons.hh
+++ b/flower/include/cons.hh
@@ -10,28 +10,26 @@
 #ifndef CONS_HH
 #define CONS_HH
 
-#include <assert.h>
-#define TAIL
 
 template<class T>
 class Cons
 {
 public:
-  T * car_p_;
-  Cons * next_cons_p_;
+  T * car_;
+  Cons * next_;
   Cons ()
     {
-      car_p_=0;
-      next_cons_p_ =0;
+      car_=0;
+      next_ =0;
     }
   Cons (T*t, Cons<T>*c)
     {
-      car_p_ = t;
-      next_cons_p_ = c;
+      car_ = t;
+      next_ = c;
     }
  virtual ~Cons ()
     {
-      delete next_cons_p_;
+      delete next_;
     }
 };
 
@@ -49,146 +47,55 @@ public:
 
 /// remove the link pointed to by *p.
 template<class T>
-Cons<T> *remove_cons_p (Cons<T> **pp)
+Cons<T> *remove_cons (Cons<T> **pp)
 {
   Cons<T> *knip = *pp;
-  *pp = (*pp)->next_cons_p_;
-  knip->next_cons_p_ = 0;
+  *pp = (*pp)->next_;
+  knip->next_ = 0;
   return knip;
 }
 
-
-template<class T> int cons_list_size_i (Cons<T> *l)
-{
-  int i=0;
-  while  (l)
-    {
-      l = l->next_cons_p_;
-	i++;
-    }
-  return i;
-}
-
 /**
 
    Invariants:
 
-   (*loose_cons_p_p_) is either the head_cons_p_ pointer, or a next_cons_p_ pointer from the list.
+   (*tail_) is either the head_ pointer, or a next_ pointer from the list.
    
-   **loose_cons_p_p_ == NULL
+   **tail_ == NULL
  */
 
 template<class T>
 class Cons_list
 {
-#ifdef TAIL
-private:
-  // find tail helper; is this handy?
-  Cons<T> * tail_cons_l_;
-#endif
-  
 public:
-  // make these private?
-  Cons<T> * head_cons_p_;
-  Cons<T> ** loose_cons_p_p_;
-
-
-  Cons_list ()
-    {
-      init ();
-    }
-  void init ()
-    {
-      head_cons_p_ = 0;
-      loose_cons_p_p_ = &head_cons_p_;
-#ifdef TAIL
-      tail_cons_l_ = 0;
-#endif
-    }
+  Cons<T> * head_;
+  Cons<T> ** tail_;
+  Cons_list () { init_list (); }
+  void init_list () {head_ =0; tail_ = &head_; }
   void append (Cons<T> *c)
     {
-      assert (!c->next_cons_p_);
-#ifndef TAIL
-      *loose_cons_p_p_ = c;
-      while (*loose_cons_p_p_)
-	loose_cons_p_p_ = &(*loose_cons_p_p_)->next_cons_p_;
-#else
-      *loose_cons_p_p_ = c;
-      tail_cons_l_ = *loose_cons_p_p_;
-      while (tail_cons_l_->next_cons_p_)
-	tail_cons_l_ = tail_cons_l_->next_cons_p_;
-      loose_cons_p_p_ = &tail_cons_l_->next_cons_p_;
-#endif
-    }
-  Cons<T>* tail_cons_l ()
-    {
-      assert (!empty_b ());
-#ifndef TAIL
-      Cons<T>* tail_cons_l = head_cons_p_;
-      while (tail_cons_l->next_cons_p_)
-	tail_cons_l = tail_cons_l->next_cons_p_;
-      return tail_cons_l;
-#else
-      return tail_cons_l_;
-#endif
+      assert (!c->next_);
+      *tail_ = c;
+      while (*tail_)
+	tail_ = &(*tail_)->next_;
     }
   /**
-     PRE: *pp should either be the head_cons_p_ pointer,
-     or the next_cons_p_ pointer from a list cell.
+     PRE: *pp should either be the head_ pointer, or the next_ pointer
+     from a list cell.
   */
-  Cons<T> *remove_cons_p (Cons<T> **pp)
+  Cons<T> *remove_cons (Cons<T> **pp)
     {
-#ifndef TAIL
-      if (&(*pp)->next_cons_p_ == loose_cons_p_p_)
-	loose_cons_p_p_ = pp;
-#else
-      if (*pp == tail_cons_l_)
-	{
-	  //either here
-	  tail_cons_l_ = tail_cons_l ();
-	  loose_cons_p_p_ = pp;
-	}
-#endif
-
-      return ::remove_cons_p (pp);
-    }
-  bool empty_b ()
-    {
-      return !head_cons_p_;
-    }
-  int size_i ()
-    {
-      return cons_list_size_i (head_cons_p_);
-    }
-  T* head_car_l ()
-    {
-      assert (!empty_b ());
-      return head_cons_p_->car_p_;
-    }
-  T* car_l ()
-    {
-      assert (!empty_b ());
-      return head_cons_p_->car_p_;
-    }
-  T* tail_car_l ()
-    {
-      assert (!empty_b ());
-      // or here?
-#ifndef TAIL
-      return tail_cons_l ()->car_p_;
-#else
-      return tail_cons_l_->car_p_;
-#endif
+      if (&(*pp)->next_ == tail_)
+	tail_ = pp;
+
+      return ::remove_cons (pp);
     }
   void junk ()
     {
-      delete head_cons_p_;
-      init ();
-    }
-  ~Cons_list ()
-    {
-      junk ();
+      delete head_;
+      head_ =0;
     }
+  ~Cons_list () { junk (); }
 };
 
 
@@ -198,6 +105,19 @@ template<class T>
 void
 clone_killing_cons_list (Cons_list<T>&, Cons<T> *src);
 
+template<class T> int cons_list_size_i (Cons<T> *l)
+{
+  int i=0;
+  while  (l)
+    {
+      l = l->next_;
+	i++;
+    }
+  return i;
+}
+
+
+
 
 #endif /* CONS_HH */
 
diff --git a/flower/include/interval.hh b/flower/include/interval.hh
index 5f43a3c0e0..e02a7495a8 100644
--- a/flower/include/interval.hh
+++ b/flower/include/interval.hh
@@ -24,10 +24,6 @@ struct Interval_t : public Drul_array<T> {
     
   static T infinity() ;
   static String T_to_str (T arg);
-    
-  /*
-    ugh, egcs 1.02 ices on this
-  */
   T center() { return (elem (LEFT) + elem (RIGHT)) / T(2);}
   void translate (T t)
     {
@@ -35,13 +31,6 @@ struct Interval_t : public Drul_array<T> {
       elem (RIGHT) += t;
     }
   
-  /*
-    junk us
-   */
-  T &max() { return elem (RIGHT);}
-  T max() const { return elem (RIGHT);}
-  T min() const{ return elem (LEFT); }
-  T &min(){ return elem (LEFT); }
   /**
     PRE
     *this and h are comparable
@@ -91,11 +80,19 @@ struct Interval_t : public Drul_array<T> {
 
 
 /**
-  inclusion ordering. Crash if not comparable.
+  inclusion ordering. Crash if not  comparable.
   */
 template<class T>
 int Interval__compare (const Interval_t<T>&,Interval_t<T> const&);
 
+/**
+   Inclusion ordering.  return -2 if not comparable
+ */
+template<class T>
+int
+_Interval__compare (const Interval_t<T>&a,Interval_t<T> const&b);
+
+
 /*
   INLINE
  */
diff --git a/flower/include/killing-cons.tcc b/flower/include/killing-cons.tcc
index 8c6c04e998..f6fcff7bd1 100644
--- a/flower/include/killing-cons.tcc
+++ b/flower/include/killing-cons.tcc
@@ -15,16 +15,16 @@
 template<class T>
 Killing_cons<T>::~Killing_cons ()
 {
-  delete car_p_;
+  delete car_;
 }
 
 template<class T>
 void 
 copy_killing_cons_list (Cons_list<T> &dest, Cons<T> *src) 
 {
-  for (; src; src  = src->next_cons_p_)
+  for (; src; src  = src->next_)
     {
-      T *t = new T(*src->car_p_);
+      T *t = new T(*src->car_);
       dest.append ( new Killing_cons<T> (t, 0));
     }
 }
@@ -33,9 +33,9 @@ template<class T>
 void
 clone_killing_cons_list (Cons_list<T> & dest, Cons<T> *src)
 {
-  for (; src; src  = src->next_cons_p_)
+  for (; src; src  = src->next_)
     {
-      T *t = src->car_p_->clone ();
+      T *t = src->car_->clone ();
       dest.append (new Killing_cons<T> (t, 0));      
     }
 }
diff --git a/flower/include/scalar.hh b/flower/include/scalar.hh
index 6d4f107cc9..e2750c9e1a 100644
--- a/flower/include/scalar.hh
+++ b/flower/include/scalar.hh
@@ -18,6 +18,7 @@ struct Scalar : public String
 {
   Scalar (Real r) { *this = to_str (r); }
   Scalar (int i) { *this = to_str (i); }
+  Scalar (long l) { *this = to_str (l); }
   Scalar (char c) { *this = to_str (c); }
   Scalar (char const *c) : String (c) {}    
   Scalar (String s) : String (s) {}
diff --git a/flower/include/string-convert.hh b/flower/include/string-convert.hh
index 3feba87bf2..aa61b9c4de 100644
--- a/flower/include/string-convert.hh
+++ b/flower/include/string-convert.hh
@@ -15,34 +15,35 @@
 /** The functor String_convert handles all conversions to/from String
 	(some time, anyway).  The class is quite empty from data view.  */
 class String_convert {
-    static int hex2bin_i (String hex_str, String& bin_str_r);
-    static int hex2nibble_i (Byte byte);
-    static Byte nibble2hex_byte (Byte byte);
+  static int hex2bin_i (String hex_str, String& bin_str_r);
+  static int hex2nibble_i (Byte byte);
+  static Byte nibble2hex_byte (Byte byte);
 public:
-    static String bool_str (bool b);
-    static String bin2dec_str (String bin_str);
-    static String bin2hex_str (String bin_str);
-    static String dec2bin_str (String str);
-    static int bin2_i (String bin_str);
-    static unsigned bin2_u (String bin_str);
-    static String char_str (char c, int n);
-    static int dec2_i (String dec_str);
-    static double dec2_f (String dec_str);
-    static String double_str (double f, char const* fmt=0);
-    static String form_str (char const* format, ...);
-    static String vform_str (char const* format, va_list args);
-    static int hex2_i (String str);
-    static unsigned hex2_u (String str);
-    static String hex2bin_str (String str);
-    static String int_str (int i, char const *fmt=0 );
-    static String i2hex_str (int i, int length_i, char ch);
-    static String u2hex_str (unsigned u, int length_i, char ch);
-    static String i2dec_str (int i, int length_i, char ch);
-    static String rational_str (Rational);
-    static String pointer_str (void const *);
-    static String precision_str (double x, int n);
-    static Array<String> split_arr (String str, char c);
-    static String i64_str (I64, char const * fmt = 0);
+  static String bool_str (bool b);
+  static String bin2dec_str (String bin_str);
+  static String bin2hex_str (String bin_str);
+  static String dec2bin_str (String str);
+  static int bin2_i (String bin_str);
+  static unsigned bin2_u (String bin_str);
+  static String char_str (char c, int n);
+  static int dec2_i (String dec_str);
+  static double dec2_f (String dec_str);
+  static String double_str (double f, char const* fmt=0);
+  static String form_str (char const* format, ...);
+  static String vform_str (char const* format, va_list args);
+  static int hex2_i (String str);
+  static unsigned hex2_u (String str);
+  static String hex2bin_str (String str);
+  static String int_str (int i, char const *fmt=0 );
+  static String long_str (long);
+  static String i2hex_str (int i, int length_i, char ch);
+  static String u2hex_str (unsigned u, int length_i, char ch);
+  static String i2dec_str (int i, int length_i, char ch);
+  static String rational_str (Rational);
+  static String pointer_str (void const *);
+  static String precision_str (double x, int n);
+  static Array<String> split_arr (String str, char c);
+  static String i64_str (I64, char const * fmt = 0);
 };
 
 #endif // __STRING_CONVERT_HH //
diff --git a/flower/include/string.hh b/flower/include/string.hh
index fb8dec55e6..e9d7cd10e7 100644
--- a/flower/include/string.hh
+++ b/flower/include/string.hh
@@ -181,6 +181,7 @@ inline String to_str (String s) { return s; }
 String to_str (char c, int n = 1);
 String to_str (int i, char const* format = 0);
 String to_str (double f , char const* format = 0);
+String to_str (long  b);
 String to_str (bool b);
 String to_str (char const* format, ... );
 
diff --git a/flower/string-convert.cc b/flower/string-convert.cc
index bb293f062d..cb92d22678 100644
--- a/flower/string-convert.cc
+++ b/flower/string-convert.cc
@@ -336,3 +336,11 @@ String_convert::split_arr (String str, char c)
   return a;
 }
 
+
+String
+String_convert::long_str (long l)
+{
+  char s[STRING_BUFFER_LEN];
+  sprintf (s,"%ld", l);
+  return s;
+}
diff --git a/flower/string.cc b/flower/string.cc
index 4ddfcec9c5..f0cfb0824d 100644
--- a/flower/string.cc
+++ b/flower/string.cc
@@ -100,6 +100,11 @@ to_str (bool b)
 {
   return String_convert::bool_str (b);
 }
+String
+to_str (long b)
+{
+  return String_convert::long_str (b);
+}
 
 String 
 to_str (char const* format, ... )
diff --git a/input/bugs/auto-beam.ly b/input/bugs/auto-beam.ly
deleted file mode 100644
index ee339e34cb..0000000000
--- a/input/bugs/auto-beam.ly
+++ /dev/null
@@ -1,21 +0,0 @@
-\score{
-    \notes \relative c''{
-    	\time 2/4;
-	c8
-	\repeat 2 {  % \bar "|:" iknoort-i ook...
-	c8 c8
-	}
-	c8
-    }
-    \paper{
-      	\translator{
-	    \VoiceContext
-	    % add experimental auto-beaming
-	    \consists Auto_beam_engraver;
-	    beamAuto = 1.;
-	    beamAutoEnd_8 = "1/4";
-	    beamAutoEnd_16 = "1/4";
-	    beamAutoEnd_32 = "1/4";
-	}
-    }
-}
diff --git a/input/bugs/auto-grace.ly b/input/bugs/auto-grace.ly
deleted file mode 100644
index b8d0152360..0000000000
--- a/input/bugs/auto-grace.ly
+++ /dev/null
@@ -1,6 +0,0 @@
-\score{
-	\notes \type Voice {
-		\times 2/3  {[c16 c16 c16]}
-	}
-}
-
diff --git a/input/bugs/beam-translator.ly b/input/bugs/beam-translator.ly
deleted file mode 100644
index 42802aa556..0000000000
--- a/input/bugs/beam-translator.ly
+++ /dev/null
@@ -1,25 +0,0 @@
-\score{
-	\type GrandStaff <
-	\type Staff=one \notes\relative c'{
-		s1
-	}
-	\type Staff=two \notes\relative c'{
-		\clef bass;
-		s2
-		\translator Staff=one \stemup [c8 c c c ] 
-		% the translator switch below, intended for the next beam,
-		% affects (and breaks) the beam above
-		\translator Staff=two
-	}
-	>
-	\paper{
-		% no slur damping
-		slur_slope_damping = 10.0;
-		\translator{
-			\GrandStaffContext
-			minVerticalAlign = 3.0*\staffheight;
-			maxVerticalAlign = 3.0*\staffheight;
-		}
-		linewidth=-1.;
-	}
-}
diff --git a/input/bugs/biem.ly b/input/bugs/biem.ly
deleted file mode 100644
index 36a6cba0c4..0000000000
--- a/input/bugs/biem.ly
+++ /dev/null
@@ -1,32 +0,0 @@
-basloopje = \notes\relative c{
-  [d,8 a' d f] [a\translator Staff=treble d f d] \translator Staff=bass 
-}
-
-
-
-lower = \type Voice=two \notes \relative c{
-  <  \basloopje  >
-}
-\score {
-    \type PianoStaff < 
-\notes      \type Staff = treble { c1  }
-
-      \type Staff = bass <
-	\clef bass;
-        \lower
-      >
-    >
-
-  \paper {
-    gourlay_maxmeasures = 4.;
-    indent = 8.\mm;
-    textheight = 295.\mm;
-
-    % no slur damping
-    slur_slope_damping = 100.0;
-  }
-  \midi {
-    \tempo 4 = 54;
-  }
-}
-
diff --git a/input/bugs/core.ly b/input/bugs/core.ly
deleted file mode 100644
index 514dec8d5c..0000000000
--- a/input/bugs/core.ly
+++ /dev/null
@@ -1,95 +0,0 @@
-%
-% This file prints lots of warning messages about scripts-dportato
-%
-
-\header{
-filename =	 "scales.ly";
-enteredby =	 "HWN";
-copyright =	 "public domain";
-}
-
-%{
- Tested Features: scripts, beams, transposition, 
-%}
-
-%
-% scales with accents.
-%
-
-\version "1.0.14";
-blah = 	\notes {
-		\time 6/8;	
-\transpose c {
-		\clef "bass";
-			c4. d
-}
-			c d 
-		\clef "violin" ;
-\transpose c'' {
-		\transpose  d { e f }  }
-\transpose c''' {
-		c4. d 
-	%ugr
-		 |\times 6/9 { a8 \< a a a a a a  \! a a \ff \> ] } | }
-		 \transpose c'' {
-		     \times 6/9 { a  a a a a a a a \! a ] } | }
-		 \transpose c''' {
-		 \times 6/9 { c,->-.-\fermata \< g,->-.-\fermata 
-			d->-.-\fermata a->-.-\fermata
-			e'->-.-\fermata b'-. f''-. c'''->-.-\fermata 
-			\! g'''->-.-\fermata \> ] }
-
-		\times 6/9 { g'''->-.-\fermata c'''->-.-\fermata
-			f''->-.-\fermata b'->-.-\fermata e'->-.-\fermata 
-			a->-.-\fermata d->-.-\fermata g,->-.-\fermata \! 
-			c,->-.-\fermata ] }
-			
-		\times 6/9 { c,->-.-\fermata \< g,->-.-\fermata d->-.-\fermata 
-		a->-.-\fermata
-			e'->-.-\fermata b'-. f''-. 
-			c'''->-.-\fermata \! g'''->-.-\fermata \> ] }
-		 \times 6/9 { g'''->-.-\fermata c'''->-.-\fermata
-			f''->-.-\fermata b'->-.-\fermata e'->-.-\fermata 
-			a->-.-\fermata d->-.-\fermata 
-			g,->-.-\fermata \! c,->-.-\fermata ] }
-		}
-		\transpose c'' {
-		 \times 2/3 { c g d' ] } 
-		 \times 2/3 { d' g c ] }  
-		 \times 2/3 { f c' g' ] } 
-		 \times 2/3 { g' c' f ] }
-		 }
-		 \transpose c' {
-		 \times 2/3 { c g d' ] } 
-		 \times 2/3 { d' g c ] }  
-		 \times 2/3 { f c' g' ] } 
-		 \times 2/3 { g' c' f ] } 
-		 \times 2/3 { g' c' f ] } 
-  \time 4/4;
-
-c1}
-
-		r8-"text" r8^. r8_. r8 r8 r8 r8 r8
-	[c-> d-> e-> f->][g-> a-> b-> c'->] % 1
-\transpose c'' {	[c'-^ b-^ a-^ g-^][f-^ e-^ d-^ c-^]}
-	[c'-^ b-^ a-^ g-^][f-^ e-^ d-^ c-^]
-	[c-. d-. e-. f-.][g-. a-. b-. c'-.]
-	[c'-- b-- a-- g][f-- e-- d c--] % 5
-	[c-\portato d-\portato e-\portato f-\portato]
-		[g-\portato a-\portato b-\portato c'-\portato]
-	[c'-\upbow b-\upbow a-\downbow g-\downbow]
-		[f-\downbow e-\downbow d-\upbow c-\upbow]
-	[c-| d-| e-| f-|][g-| a-| b-| c'-|]
-	[c' b a g][f e d c]
-	[c d e f][g a b c'] % 10 
-	|[c' b a g][f e d c]
-			
-	}
-
-
-\score{
-	\notes {\blah}
-	\paper{
-	 castingalgorithm = \Wordwrap;
-	}
-}
diff --git a/input/bugs/ctie-bug.fly b/input/bugs/ctie-bug.fly
deleted file mode 100644
index 0899018b88..0000000000
--- a/input/bugs/ctie-bug.fly
+++ /dev/null
@@ -1 +0,0 @@
-a'' <c ~ e g> c
diff --git a/input/bugs/mats.ly b/input/bugs/mats.ly
deleted file mode 100644
index 6409937008..0000000000
--- a/input/bugs/mats.ly
+++ /dev/null
@@ -1,78 +0,0 @@
-
-corI=\notes\relative c'' {
-\key c;
-
-[g8. \f ( a16 ] ) g2 |
-[g8.  ( a16 ] ) g2_"dim." |
-c2. \p ( |
-) g2 g4 ( |
-) c2. ( |
-) g4 [g8. ( a16 ] ) g4 |
-c2. \p ( |
-) g2 g4 |
-c2 \< ( ~ [ \! c8 \> \! ) g ] |
-g2 \p r4 |
-g \mf ( d' c~ |
-c ) b r |
-R2. |
-}
-
-corII=\notes\relative c'' {
-\key c;
-\time 3/4;
-
-R2.*19 |
-r4 r [g8^"solo" \p (\< \! ) e'] |
-g2 \> ( [e8. ) \! c16 ] | % grace note e8 () g2
-g2 r 4 |
-r r \times 2/3 {[e'8 \p ( g, ) g' ]} |
-g4 \> () \! e r |
-r r \times 2/3 {[g8 \p ( e ) g ]} |
-d4 \> () \! g r |
-r r [g,16 ( \p d' e d ] |
-) g,4 r r |
-R2. |
-r4 r c \p ( |
-) g r r |
-g [g8. ( a16 ] ) g4 |
-R2. |
-r4 r [g8^""^"solo" \mf \< () \! e' ] |
-g2 \> [ \! e8. ( c16 ] |
-) g2 r4 |
-R2. |
-r4 r \times 2/3 {[e'8 \f ( g, ) g'] } |
-g4 () e r |
-r r \times 2/3 {[g8 \f ( e ) g] } 
-d4 () g r |
-r r [d16 \f ( g, e' d ] |
-[g, d' e ) d ] g,4 r |
-r d'2 \f \> ( | % grace note g8 d2
-[g,8. a16 g8. a16 \! g8. ) a16 ] |
-g4 r r |
-}
-
-trpI=\notes\relative c'' {
-\key c;
-\time 3/4;
-
-R2.*30 |
-}
-
-\score{ <
-  \type StaffGroup = brass <
-    \type Staff = cor <
-      \type Voice = corI { \stemup \corI }
-      \type Voice = corII { \stemdown \corII }
-    >
-    \type Staff = trp <
-      \type Voice = trpI { \stemup \trpI }
-    >
-  >
->
- \paper {
-    \translator {\OrchestralScoreContext
-	% The following line causes a SIGSEGV
-	\consists "Multi_measure_rest_engraver"; 
-    }
-  }
-}
diff --git a/input/bugs/time-grouping.ly b/input/bugs/time-grouping.ly
deleted file mode 100644
index b0cc682d91..0000000000
--- a/input/bugs/time-grouping.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-%{
-  wierd grouping bug
-%}
-
-\score{
-    \notes \relative c''{
-    	% be sure it's not related to auto-beamer
-    	\property Voice.beamAuto = "0"
-    	\time 1/2;
-    	[ c8 c c c ]
-    	\time 1/4;
-    	[ c8 c ]
-    }
-    \paper{
-    }
-}
diff --git a/input/praeludium-fuga-E.ly b/input/praeludium-fuga-E.ly
index 3c7cd3a03f..f02724fd86 100644
--- a/input/praeludium-fuga-E.ly
+++ b/input/praeludium-fuga-E.ly
@@ -70,7 +70,8 @@ praeludium_left = \notes \relative c {
 
   % 13
   \type Staff <
-    \type VoiceOne { \stemup r4 dis' cis cis ~ |
+    \type VoiceTwo { r4 }
+    \type VoiceOne { \stemup s4 dis' cis cis ~ |
       [cis8 a d cis] [bis gis] cis4 |
       dis2 cis4 r8 cis }
     \type VoiceOne { \stemup bis2 }
@@ -108,8 +109,8 @@ fugaII_right = \notes   \relative c''   {
 
   %15
   \type Staff <
-    { \stemup [b8 fis8] b4 }
-    { \stemdown fis2 }
+    \type Voice = VA { \stemup [b8 fis8] b4 }
+    \type Voice = VB {  \stemdown fis2 }
   >
    %{ this chord is usually set like this:
         |
@@ -217,7 +218,8 @@ breakmusic = \notes {
      \accepts VoiceThree;
      \accepts VoiceTwo;
      \accepts VoiceOne;
-   } 
+   }
+%   \translator { \OrchestralScoreContext }
   }
 
   \midi {
diff --git a/input/test/beam-interstaff.ly b/input/test/beam-interstaff.ly
index 69cc8dde4e..37a6368ab6 100644
--- a/input/test/beam-interstaff.ly
+++ b/input/test/beam-interstaff.ly
@@ -2,7 +2,7 @@
 	\type GrandStaff <
 	\type Staff=one \notes\relative c'{
 		\stemup [c8 c \translator Staff=two \stemup c c]
-		r2
+		[c c c c]
 		\translator Staff=one
 		\stemdown [c8 c \translator Staff=two \stemup c c]
 		r2
diff --git a/input/test/beam-repeat.ly b/input/test/beam-repeat.ly
new file mode 100644
index 0000000000..e1c5bf37da
--- /dev/null
+++ b/input/test/beam-repeat.ly
@@ -0,0 +1,10 @@
+\score{
+    \notes \relative c''{
+    	\time 2/4;
+	c8
+	\repeat 2 {  % \bar "|:" iknoort-i ook...
+	c8 c8
+	}
+	c8
+    }
+}
diff --git a/input/test/collisions.ly b/input/test/collisions.ly
index 79614c6614..1077b3d852 100644
--- a/input/test/collisions.ly
+++ b/input/test/collisions.ly
@@ -24,43 +24,11 @@ threevoice = \type Staff \notes <
 	\type Voice=iii { \stemdown c4 d e d c d es }
 >
 
-
-rests = \type Staff \notes <
-	\type Voice=i { \stemup | r8 r r r  r r r r [c' b a g] [f e d c] } 
-	\type Voice = ii { \stemdown [c8 d e f] [g a b c'] r r r r r r r r }
->
-
-restsII = \type Staff \notes {
-	\type Voice=i
-	< 
-		{ \stemup  g' f' e' d' c' b a g f e d c }
-		\type Voice = ii { \stemdown r  r  r  r  r  r r r r r r r }
-	>
-	<
-		{ \stemup  r r r r r r r r  r  r  r  r }
-		\type Voice = ii { \stemdown c d e f g a b c' d' e' f' g' }
-	>
-	r8 r4
-	<  r8 r8 >
-	<  r8 r8 r8 >
-	<  r8 r8 r8 r8 >
-	<  r r >
-	<  r r r >
-	\stemup
-	[c''8 r8 c''8 c''8]
-	[c8 r8 c8 c8]
-	\stemdown
-	[c8 r8 c8 c8]
-	[c''8 r8 c''8 c''8]
-}
-
 \score{
 	\notes \transpose c'' {  \twovoice  
 	\twovoicesteminvert 
 	\threevoice  
-	\rests 
-	% UGH ! bug!
-	\restsII 
+
 	}
 	
 
diff --git a/input/test/rest-collision.ly b/input/test/rest-collision.ly
new file mode 100644
index 0000000000..d34df43f90
--- /dev/null
+++ b/input/test/rest-collision.ly
@@ -0,0 +1,35 @@
+
+scale = \notes \relative c' {
+  c8 d e f g a b c c d e f g a b c
+
+}
+rests = \notes             {
+  r r r  r r r r r r r r r r r r r
+} 
+
+scales = \type Staff \notes <
+	\type Voice=i { \stemup r1 r2 r2   \scale    c''1 c'2 a'2 \rests  }
+	\type Voice = ii { \stemdown a'1 a'2 d'2 \rests r1 r2 r2  \scale }
+>
+
+restsII = \type Staff \notes {
+	r4 r8
+	\type Staff < { \stemup r8 } { \stemdown r8} >
+	\type Staff < {\stemup r8} r8 { \stemdown r8} >
+	\type Staff < {\stemup r8} r8 r8 { \stemdown r8} >
+	\type Staff < {\stemup r} { \stemdown r} >
+	\type Staff < {\stemup r} r { \stemdown r} >
+	\stemup
+	\transpose c'' { [c''8 r8 c''8 c''8]
+	[c8 r8 c8 c8]
+	\stemdown
+	[c8 r8 c8 c8]
+	[c''8 r8 c''8 c''8] }
+}
+
+\score{
+	\notes { 
+		\scales 
+		\restsII 
+	}
+}	
diff --git a/input/test/rest.fly b/input/test/rest.fly
new file mode 100644
index 0000000000..a6e4e16d8e
--- /dev/null
+++ b/input/test/rest.fly
@@ -0,0 +1,5 @@
+\time 4/4;
+r \longa * 1/4  r\breve * 1/2 
+r1 r2 r4 r8 r16 r32 r64 r128 r128
+\time 6/4;
+r1. r2. r4. r8. r16. r32. r64. r128. r128.
diff --git a/input/test/slur-interstaff.ly b/input/test/slur-interstaff.ly
index ebf5b9c0a1..87c0df5374 100644
--- a/input/test/slur-interstaff.ly
+++ b/input/test/slur-interstaff.ly
@@ -1,17 +1,19 @@
 \score{
 	\type GrandStaff <
 	\type Staff=one \notes\relative c'{
-		\stemup c4( c \translator Staff=two c )c
+		\stemup c4( c \translator Staff=two c )c |
 		\translator Staff=one
-		\stemup c4( c \translator Staff=two c )c
-		\stemup c4( c \translator Staff=one c )c
+		\stemup c4( c \translator Staff=two c )c |
+		\stemup c4( c \translator Staff=one c )c |
 		\translator Staff=two
-		\stemup c4( c \translator Staff=one c )c
+		\stemup c4( c \translator Staff=one c )c |
 		\translator Staff=two
-		\stemup c4( \translator Staff=one c c )c
+		\stemup c4( \translator Staff=one c c )c |
 		r2
 		\translator Staff=two
-		\stemup c4( \translator Staff=one c \break c )c
+		\stemup c4( \translator Staff=one c
+		   \break
+		c )c
 		r2
 %		\stemdown c4( \translator Staff=two c c \translator Staff=one )c
 		\stemdown d4( \translator Staff=two c c \translator Staff=one )d
diff --git a/input/test/tup.ly b/input/test/tup.ly
index f89d517603..f9dd57debb 100644
--- a/input/test/tup.ly
+++ b/input/test/tup.ly
@@ -1,3 +1,9 @@
 \score{
-	\notes \type Voice \times 2/3 { \times 2/3 { a8 b c}  c }
+	\notes \type Voice {
+		 \times 2/3 { \times 2/3 { a8 b c}  c }
+		 \times 3/4 { c4 c4 c4 c4 }
+		 \time 6/8;
+		 \times 6/9 { c8 c c c c c c c c }
+
+		 }
 }
diff --git a/lib/source-file.cc b/lib/source-file.cc
index 46d1f14238..4a1a9a1c30 100644
--- a/lib/source-file.cc
+++ b/lib/source-file.cc
@@ -118,7 +118,7 @@ Source_file::line_str (char const* pos_ch_C) const
 
   Slice line = line_slice (pos_ch_C);
   char const* data_ch_C = ch_C ();
-  return String ((Byte const*)data_ch_C + line.min (), line.length ());
+  return String ((Byte const*)data_ch_C + line[LEFT], line.length ());
 }
 
 int
@@ -128,7 +128,7 @@ Source_file::char_i (char const* pos_ch_C) const
     return 0;
 
   char const* data_ch_C = ch_C ();
-  return pos_ch_C - (line_slice (pos_ch_C).min () + data_ch_C);
+  return pos_ch_C - (line_slice (pos_ch_C)[SMALLER] + data_ch_C);
 }
 
 int
diff --git a/lib/source.cc b/lib/source.cc
index 850b32ec0b..66372945de 100644
--- a/lib/source.cc
+++ b/lib/source.cc
@@ -73,9 +73,9 @@ Source_file*
 Sources::sourcefile_l (char const* ch_C)
 {
 
-  for (Cons<Source_file> *i = sourcefile_p_list_; i; i = i->next_cons_p_)
-    if (i->car_p_->in_b (ch_C))	
-      return i->car_p_;
+  for (Cons<Source_file> *i = sourcefile_p_list_; i; i = i->next_)
+    if (i->car_->in_b (ch_C))	
+      return i->car_;
   return 0;
 }
 
diff --git a/lily/abbrev.cc b/lily/abbrev.cc
index 58f2fbe86a..dd17851d1e 100644
--- a/lily/abbrev.cc
+++ b/lily/abbrev.cc
@@ -39,7 +39,7 @@ Abbreviation::do_brew_molecule_p () const
     }
   
   Real interbeam_f = paper_l ()->interbeam_f (mult);
-  Real w = 1.5 * lookup_l ()->notehead (2, "").dim_.x ().length ();
+  Real w = 1.5 * lookup_l ()->notehead (2, "").dim_[X_AXIS].length ();
   Real space = stem_l_->staff_line_leading_f ();
   Real internote_f = space/2;
   
diff --git a/lily/bar.cc b/lily/bar.cc
index eee1ce0dae..1d81947156 100644
--- a/lily/bar.cc
+++ b/lily/bar.cc
@@ -75,12 +75,16 @@ Bar::do_pre_processing ()
       if (bar_breaks[i][1] == type_str_)
 	{
 	  type_str_ = bar_breaks[i][break_status_dir ()+1];
-	  if (remove_elt_property (at_line_start_scm_sym)!= SCM_BOOL_F
-	      && (break_status_dir () == RIGHT) && (type_str_ == ""))
-	    {
-	      type_str_ = "|";
-	    }
+	  break;
 	}
     }
+  if (remove_elt_property (at_line_start_scm_sym)!= SCM_BOOL_F
+      && (break_status_dir () == RIGHT) && (type_str_ == ""))
+    {
+      type_str_ = "|";
+    }
+
+  if (type_str_ =="")
+    dim_cache_[X_AXIS].set_empty (true);
 }
   
diff --git a/lily/beam.cc b/lily/beam.cc
index 53a5eb34e9..3f96a5996e 100644
--- a/lily/beam.cc
+++ b/lily/beam.cc
@@ -55,6 +55,8 @@ Beam::add_stem (Stem*s)
 #endif
   stems_.push (s);
   s->add_dependency (this);
+
+  assert (!s->beam_l_);
   s->beam_l_ = this;
 
   if (!spanned_drul_[LEFT])
@@ -99,12 +101,6 @@ Beam::do_brew_molecule_p () const
   mol_p->translate_axis (x0 
     - spanned_drul_[LEFT]->absolute_coordinate (X_AXIS), X_AXIS);
 
-  // correct if last note (and therefore reference point of beam)
-  // is on different staff
-  Stem_info si = sinfo_.top ();
-  mol_p->translate_axis (-si.interstaff_f_ * si.stem_l_->staff_line_leading_f ()/2,
-			 Y_AXIS);
-
   return mol_p;
 }
 
@@ -122,7 +118,10 @@ void
 Beam::do_pre_processing ()
 {
   if (!dir_)
-    set_default_dir ();
+    dir_ = get_default_dir ();
+  
+  
+  set_direction (dir_);
 }
 
 void
@@ -162,15 +161,16 @@ Beam::do_width () const
 		   stems_.top ()->hpos_f ());
 }
 
-void
-Beam::set_default_dir ()
+Direction
+Beam::get_default_dir () const
 {
   Drul_array<int> total;
   total[UP]  = total[DOWN] = 0;
   Drul_array<int> count; 
   count[UP]  = count[DOWN] = 0;
   Direction d = DOWN;
-  
+
+  Direction beamdir;
   for (int i=0; i <stems_.size (); i++)
     do {
       Stem *s = stems_[i];
@@ -200,32 +200,38 @@ Beam::set_default_dir ()
   switch (a)
     {
     case MAJORITY:
-      dir_ = (count[UP] > count[DOWN]) ? UP : DOWN;
+      beamdir = (count[UP] > count[DOWN]) ? UP : DOWN;
       break;
     case MEAN:
       // mean centre distance
-      dir_ = (total[UP] > total[DOWN]) ? UP : DOWN;
+      beamdir = (total[UP] > total[DOWN]) ? UP : DOWN;
       break;
     default:
     case MEDIAN:
       // median centre distance
       if (!count[UP])
-	dir_ = DOWN;
+	beamdir = DOWN;
       else if (!count[DOWN])
-	dir_ = UP;
+	beamdir = UP;
       else
-	dir_ = (total[UP] / count[UP] > total[DOWN] / count[DOWN]) ? UP : DOWN;
+	beamdir = (total[UP] / count[UP] > total[DOWN] / count[DOWN]) ? UP : DOWN;
       break;
     }
+  return beamdir;
+}
 
+void
+Beam::set_direction (Direction d)
+{
+  dir_ = d;
   for (int i=0; i <stems_.size (); i++)
     {
       Stem *s = stems_[i];
-      s->set_elt_property (beam_dir_scm_sym, gh_int2scm (dir_));
+      s->set_elt_property (beam_dir_scm_sym, gh_int2scm (d));
 
       SCM force = s->remove_elt_property (dir_forced_scm_sym);
       if (force == SCM_BOOL_F)
-	s->dir_ = dir_;
+	s->dir_ = d;
     }
 }
 
@@ -247,6 +253,10 @@ Beam::solve_slope ()
   l.minimise (slope_f_, left_y_);
 }
 
+/*
+  ugh. Naming: this doesn't check, but sets as well.
+ */
+  
 Real
 Beam::check_stemlengths_f (bool set_b)
 {
@@ -431,9 +441,9 @@ Beam::quantise_dy ()
 
 
   Interval iv = quantise_iv (allowed_fraction, interline_f, dy_f);
-  quanty_f = (dy_f - iv.min () <= iv.max () - dy_f)
-    ? iv.min ()
-    : iv.max ();
+  quanty_f = (dy_f - iv[SMALLER] <= iv[BIGGER] - dy_f)
+    ? iv[SMALLER]
+    : iv[BIGGER];
 
 
   slope_f_ = (quanty_f / dx_f) / internote_f * sign (slope_f_);
@@ -548,9 +558,9 @@ Beam::quantise_left_y (bool extend_b)
 
   Interval iv = quantise_iv (allowed_position, space, dy_f);
 
-  Real quanty_f = dy_f - iv.min () <= iv.max () - dy_f ? iv.min () : iv.max ();
+  Real quanty_f = dy_f - iv[SMALLER] <= iv[BIGGER] - dy_f ? iv[SMALLER] : iv[BIGGER];
   if (extend_b)
-    quanty_f = iv.max ();
+    quanty_f = iv[BIGGER];
 
   // dim(left_y_) = internote
   left_y_ = dir_ * quanty_f / internote_f;
@@ -563,7 +573,6 @@ Beam::set_stemlens ()
   // enge floots
   Real epsilon_f = staffline_f / 8;
 
-  DOUT << "Beam::set_stemlens: \n";
   Real dy_f = check_stemlengths_f (false);
   for (int i = 0; i < 2; i++)
     { 
@@ -572,7 +581,6 @@ Beam::set_stemlens ()
       dy_f = check_stemlengths_f (true);
       if (abs (dy_f) <= epsilon_f)
         {
-	  DOUT << "Beam::set_stemlens: " << i << " iterations\n";
 	  break;
 	}
     }
diff --git a/lily/bezier.cc b/lily/bezier.cc
index 69c172200a..2ebf23c2ea 100644
--- a/lily/bezier.cc
+++ b/lily/bezier.cc
@@ -35,9 +35,9 @@ Curve::largest_disturbing ()
   int j = 0;
   for (int i = 1; i < size (); i++)
     {
-      if ((*this)[i].y () > 0)
+      if ((*this)[i][Y_AXIS] > 0)
         {
-	  Real phi = (*this)[i].y () / (*this)[i].x ();
+	  Real phi = (*this)[i][Y_AXIS] / (*this)[i][X_AXIS];
 	  if (phi > alpha)
 	    {
 	      alpha = phi;
@@ -117,14 +117,14 @@ Bezier::y (Real x)
   // bounds func should be templatised to take array of offsets too?
   Array<Real> positions;
   for (int i = 0; i < curve_.size (); i++)
-    positions.push (curve_[i].x ());
+    positions.push (curve_[i][X_AXIS]);
 
   Slice slice = get_bounds_slice (positions, x);
   // ugh
-  Offset z1 = curve_[0 >? slice.max () - 1];
-  Offset z2 = curve_[1 >? slice.max ()];
-  Real multiplier = (x - z2.x ()) / (z1.x () - z2.x ());
-  Real y = z1.y () * multiplier + (1.0 - multiplier) * z2.y();
+  Offset z1 = curve_[0 >? slice[BIGGER] - 1];
+  Offset z2 = curve_[1 >? slice[BIGGER]];
+  Real multiplier = (x - z2[X_AXIS]) / (z1[X_AXIS] - z2[X_AXIS]);
+  Real y = z1[Y_AXIS] * multiplier + (1.0 - multiplier) * z2[Y_AXIS];
 
   return y;
 }
@@ -146,10 +146,10 @@ Bezier_bow::blow_fit ()
   // be careful not to take too big step
   Real f = 0.3;
   Real h1 = dy1 * f;
-  control_[1].y () += h1; 
-  control_[2].y () += h1; 
-  return_[1].y () += h1; 
-  return_[2].y () += h1; 
+  control_[1][Y_AXIS] += h1; 
+  control_[2][Y_AXIS] += h1; 
+  return_[1][Y_AXIS] += h1; 
+  return_[2][Y_AXIS] += h1; 
 
   calc_bezier ();
   Real dy2 = check_fit_f ();
@@ -192,17 +192,17 @@ Bezier_bow::blow_fit ()
   if (sign (h) != sign (h1))
     return;
 
-  control_[1].y () += -h1 +h; 
-  control_[2].y () += -h1 +h; 
-  return_[1].y () += -h1 +h;
-  return_[2].y () += -h1 +h; 
+  control_[1][Y_AXIS] += -h1 +h; 
+  control_[2][Y_AXIS] += -h1 +h; 
+  return_[1][Y_AXIS] += -h1 +h;
+  return_[2][Y_AXIS] += -h1 +h; 
 }
 
 void
 Bezier_bow::calc_bezier ()
 {
-  Real s = sqrt (control_[3].x () * control_[3].x () 
-    + control_[1].y () * control_[2].y ());
+  Real s = sqrt (control_[3][X_AXIS] * control_[3][X_AXIS] 
+    + control_[1][Y_AXIS] * control_[2][Y_AXIS]);
 #ifndef STANDALONE
   Real internote = paper_l_->get_realvar (interline_scm_sym)/2.0;
 #else
@@ -304,10 +304,10 @@ Bezier_bow::calc_clipping ()
   Real clip_angle = 100;
 #endif
 
-  Real b = control_[3].x () - control_[0].x ();
+  Real b = control_[3][X_AXIS] - control_[0][X_AXIS];
   Real clip_h = clip_ratio * b <? clip_height;
-  Real begin_h = control_[1].y () - control_[0].y ();
-  Real end_h = control_[2].y () - control_[3].y ();
+  Real begin_h = control_[1][Y_AXIS] - control_[0][Y_AXIS];
+  Real end_h = control_[2][Y_AXIS] - control_[3][Y_AXIS];
   Real begin_dy = 0 >? begin_h - clip_h;
   Real end_dy = 0 >? end_h - clip_h;
   
@@ -328,8 +328,8 @@ Bezier_bow::calc_clipping ()
     {
       Real dy = (begin_dy + end_dy) / 4;
       dy *= cos (alpha_);
-      encompass_[0].y () += dir_ * dy;
-      encompass_[encompass_.size () - 1].y () += dir_ * dy;
+      encompass_[0][Y_AXIS] += dir_ * dy;
+      encompass_[encompass_.size () - 1][Y_AXIS] += dir_ * dy;
     }
   else
     {
@@ -340,8 +340,8 @@ Bezier_bow::calc_clipping ()
       if (end_alpha >= max_alpha)
 	end_dy = 0 >? c * end_alpha / max_alpha * end_h;
 
-      encompass_[0].y () += dir_ * begin_dy;
-      encompass_[encompass_.size () - 1].y () += dir_ * end_dy;
+      encompass_[0][Y_AXIS] += dir_ * begin_dy;
+      encompass_[encompass_.size () - 1][Y_AXIS] += dir_ * end_dy;
 
       Offset delta = encompass_[encompass_.size () - 1] - encompass_[0];
       alpha_ = delta.arg ();
@@ -399,15 +399,15 @@ Bezier_bow::calc_return (Real begin_alpha, Real end_alpha)
 void
 Bezier_bow::calc_tangent_controls ()
 {
-  Offset ijk_p (control_[3].x () / 2, control_[1].y ());
-  BEZIER_BOW_DOUT << "ijk: " << ijk_p.x () << ", " << ijk_p.y () << endl;
+  Offset ijk_p (control_[3][X_AXIS] / 2, control_[1][Y_AXIS]);
+  BEZIER_BOW_DOUT << "ijk: " << ijk_p[X_AXIS] << ", " << ijk_p[Y_AXIS] << endl;
 
-  Real default_rc = ijk_p.y () / ijk_p.x ();
+  Real default_rc = ijk_p[Y_AXIS] / ijk_p[X_AXIS];
 
   int begin_disturb = encompass_.largest_disturbing ();
-  Offset begin_p = begin_disturb ? Offset (encompass_[begin_disturb].x (), 
-    encompass_[begin_disturb].y ()) : ijk_p;
-  Real begin_rc = begin_p.y () / begin_p.x ();
+  Offset begin_p = begin_disturb ? Offset (encompass_[begin_disturb][X_AXIS], 
+    encompass_[begin_disturb][Y_AXIS]) : ijk_p;
+  Real begin_rc = begin_p[Y_AXIS] / begin_p[X_AXIS];
   if (default_rc > begin_rc)
     {
       begin_p = ijk_p;
@@ -416,32 +416,32 @@ Bezier_bow::calc_tangent_controls ()
 
   Curve reversed;
   reversed.set_size (encompass_.size ());
-  Real b = control_[3].x ();
+  Real b = control_[3][X_AXIS];
   for (int i = 0; i < encompass_.size (); i++ )
     {
       //       b     1  0
       // r  =     -        *  c 
       //       0     0 -1   
-      reversed[i].x () = b - encompass_[encompass_.size () - i - 1].x ();
-      reversed[i].y () = encompass_[encompass_.size () - i - 1].y ();
+      reversed[i][X_AXIS] = b - encompass_[encompass_.size () - i - 1][X_AXIS];
+      reversed[i][Y_AXIS] = encompass_[encompass_.size () - i - 1][Y_AXIS];
     }
 
   int end_disturb = reversed.largest_disturbing ();
   end_disturb = end_disturb ? encompass_.size () - end_disturb - 1 : 0;
-  Offset end_p = end_disturb ? Offset (encompass_[end_disturb].x (), 
-    encompass_[end_disturb].y ()) : ijk_p;
-  Real end_rc = end_p.y () / (control_[3].x () - end_p.x ());
+  Offset end_p = end_disturb ? Offset (encompass_[end_disturb][X_AXIS], 
+    encompass_[end_disturb][Y_AXIS]) : ijk_p;
+  Real end_rc = end_p[Y_AXIS] / (control_[3][X_AXIS] - end_p[X_AXIS]);
   if (default_rc > end_rc)
     {
       end_p = ijk_p;
       end_rc = default_rc;
     }
-  BEZIER_BOW_DOUT << "begin " << begin_p.x () << ", " << begin_p.y () << endl;
-  BEZIER_BOW_DOUT << "end " << end_p.x () << ", " << end_p.y () << endl;
+  BEZIER_BOW_DOUT << "begin " << begin_p[X_AXIS] << ", " << begin_p[Y_AXIS] << endl;
+  BEZIER_BOW_DOUT << "end " << end_p[X_AXIS] << ", " << end_p[Y_AXIS] << endl;
 
-  Real height =control_[1].y (); 
+  Real height =control_[1][Y_AXIS]; 
   for (int i = 0; i < encompass_.size (); i++ )
-    height = height >? encompass_[i].y ();
+    height = height >? encompass_[i][Y_AXIS];
 
   // emperic computer science:
   //   * tangents somewhat steeper than minimal line
@@ -465,29 +465,29 @@ Bezier_bow::calc_tangent_controls ()
   Real epsilon = internote / 5;
 
   // if we have two disturbing points, have height line through those...
-  if (!((abs (begin_p.x () - end_p.x ()) < epsilon)
-    && (abs (begin_p.y () - end_p.y ()) < epsilon)))
-      theta = atan (end_p.y () - begin_p.y ()) / (end_p.x () - begin_p.x ());
+  if (!((abs (begin_p[X_AXIS] - end_p[X_AXIS]) < epsilon)
+    && (abs (begin_p[Y_AXIS] - end_p[Y_AXIS]) < epsilon)))
+      theta = atan (end_p[Y_AXIS] - begin_p[Y_AXIS]) / (end_p[X_AXIS] - begin_p[X_AXIS]);
 
   Real rc3 = tan (theta);
   // ugh: be less steep
   rc3 /= 2*rc_correct;
 
-  Real c2 = -rc2 * control_[3].x ();
-  Real c3 = begin_p.y () > end_p.y () ? begin_p.y () 
-    - rc3 * begin_p.x () : end_p.y () - rc3 * end_p.x ();
+  Real c2 = -rc2 * control_[3][X_AXIS];
+  Real c3 = begin_p[Y_AXIS] > end_p[Y_AXIS] ? begin_p[Y_AXIS] 
+    - rc3 * begin_p[X_AXIS] : end_p[Y_AXIS] - rc3 * end_p[X_AXIS];
 
   BEZIER_BOW_DOUT << "y1 = " << rc1 << " x + 0" << endl;
   BEZIER_BOW_DOUT << "y2 = " << rc2 << " x + " << c2 << endl;
   BEZIER_BOW_DOUT << "y3 = " << rc3 << " x + " << c3 << endl;
-  control_[1].x () = c3 / (rc1 - rc3);
-  control_[1].y () = rc1 * control_[1].x ();
-  control_[2].x () = (c3 - c2) / (rc2 - rc3);
-  BEZIER_BOW_DOUT << "c2.x () = " << control_[2].x () << endl;
+  control_[1][X_AXIS] = c3 / (rc1 - rc3);
+  control_[1][Y_AXIS] = rc1 * control_[1][X_AXIS];
+  control_[2][X_AXIS] = (c3 - c2) / (rc2 - rc3);
+  BEZIER_BOW_DOUT << "c2[X_AXIS] = " << control_[2][X_AXIS] << endl;
   BEZIER_BOW_DOUT << "(c3 - c2) = " << (c3 - c2) << endl;
   BEZIER_BOW_DOUT << "(rc2 - rc3) = " << (rc2 - rc3) << endl;
-  control_[2].y () = rc2 * control_[2].x () + c2;
-  BEZIER_BOW_DOUT << "c2.y ()" << control_[2].y () << endl;
+  control_[2][Y_AXIS] = rc2 * control_[2][X_AXIS] + c2;
+  BEZIER_BOW_DOUT << "c2[Y_AXIS]" << control_[2][Y_AXIS] << endl;
 
   calc_return (begin_alpha, end_alpha);
 }
@@ -496,9 +496,9 @@ bool
 Bezier_bow::check_fit_bo ()
 {
   for (int i = 1; i < encompass_.size () - 1; i++)
-    if ((encompass_[i].x () > encompass_[0].x ())
-      && (encompass_[i].x () < encompass_[encompass_.size () -1].x ()))
-      if (encompass_[i].y () > y (encompass_[i].x ()))
+    if ((encompass_[i][X_AXIS] > encompass_[0][X_AXIS])
+      && (encompass_[i][X_AXIS] < encompass_[encompass_.size () -1][X_AXIS]))
+      if (encompass_[i][Y_AXIS] > y (encompass_[i][X_AXIS]))
 	return false;
   return true;
 }
@@ -508,9 +508,9 @@ Bezier_bow::check_fit_f ()
 {
   Real dy = 0;
   for (int i = 1; i < encompass_.size () - 1; i++)
-    if ((encompass_[i].x () > encompass_[0].x ())
-      && (encompass_[i].x () < encompass_[encompass_.size () -1].x ()))
-      dy = dy >? (encompass_[i].y () - y (encompass_[i].x ()));
+    if ((encompass_[i][X_AXIS] > encompass_[0][X_AXIS])
+      && (encompass_[i][X_AXIS] < encompass_[encompass_.size () -1][X_AXIS]))
+      dy = dy >? (encompass_[i][Y_AXIS] - y (encompass_[i][X_AXIS]));
   return dy;
 }
 
@@ -591,8 +591,8 @@ Bezier_bow::calc_default (Real h)
   Real alpha = height_limit * 2.0 / pi;
   Real beta = pi * ratio / (2.0 * height_limit);
 
-  Offset delta (encompass_[encompass_.size () - 1].x () 
-    - encompass_[0].x (), 0);
+  Offset delta (encompass_[encompass_.size () - 1][X_AXIS] 
+    - encompass_[0][X_AXIS], 0);
   Real b = delta.length ();
   Real indent = alpha * atan (beta * b);
   Real height = indent + h;
diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc
index 794ac1b3f0..dbebdf6e08 100644
--- a/lily/chord-name-engraver.cc
+++ b/lily/chord-name-engraver.cc
@@ -83,7 +83,7 @@ Chord_name_engraver::do_process_requests ()
 
   item_p->text_str_ = chord.banter_str (inversion);
   
-  Scalar style = get_property ("textstyle", 0);
+  Scalar style = get_property ("textStyle", 0);
   if (style.length_i ())
     item_p->style_str_ = style;
   
diff --git a/lily/collision.cc b/lily/collision.cc
index 56676c1d99..7df44b3523 100644
--- a/lily/collision.cc
+++ b/lily/collision.cc
@@ -79,7 +79,7 @@ Collision::do_pre_processing()
 	  return;
 	}
     }
-  int d = 1;
+  Direction d = UP;
   do
     {
       if (!clash_group_arr_a[idx (d, false)].size())
@@ -88,7 +88,7 @@ Collision::do_pre_processing()
 	  clash_group_arr_a[idx (d, true)].clear();
 	}
     }
-  while ((d *= -1) != 1);
+  while (flip (&d) != UP);
 
 
   Interval_t<int> y_extent[4];
@@ -115,14 +115,14 @@ Collision::do_pre_processing()
     {
       x_off[idx (d, true)] = d*0.5;
     }
-  while ((d *= -1) != 1);
+  while (flip (&d) != UP);
 
 
   // y_extent: smallest y-pos noteball interval containing all balls
   // 4 (0..3) groups: stem up/down; shift on/off;
-  Interval_t<int> middle (y_extent[idx (-1,0)].max(),
-			  y_extent[idx (1,0)].min());
-  Interval_t<int> open_middle (y_extent[idx (-1,0)].max()+1, y_extent[idx (1,0)].min ()-1);
+  Interval_t<int> middle (y_extent[idx (-1,0)][BIGGER],
+			  y_extent[idx (1,0)][SMALLER]);
+  Interval_t<int> open_middle (y_extent[idx (-1,0)][BIGGER]+1, y_extent[idx (1,0)][SMALLER]-1);
   do
     {
       if (!open_middle.contains_b (y_extent[idx (d,true)]))
@@ -131,20 +131,22 @@ Collision::do_pre_processing()
 
 
   if (!middle.empty_b()
-      && middle.length() < 2 && col_l_a[idx (1,0)] && col_l_a[idx (-1,0)]) {
-    // reproduction of bugfix at 3am ?
-    Note_head * nu_l= col_l_a[idx (1,0)]->head_l_arr_[0];
-    Note_head * nd_l = col_l_a[idx (-1,0)]->head_l_arr_.top();
-    if (! (nu_l->balltype_i_ == nd_l->balltype_i_
-	   && nu_l->dots_i_ == nd_l->dots_i_  && middle.length() == 0))
-      {
-	x_off[idx (1,0)] -= 0.5;
-	x_off[idx (1,1)] -= 0.5;
-	x_off[idx (-1,1)] += 0.5;
-	x_off[idx (-1,0)] += 0.5;
-      }
-
-  }
+      && middle.length() < 2 && col_l_a[idx (1,0)] && col_l_a[idx (-1,0)])
+    {
+      // reproduction of bugfix at 3am ?
+      Note_head * nu_l= col_l_a[idx (1,0)]->head_l_arr_[0];
+      Note_head * nd_l = col_l_a[idx (-1,0)]->head_l_arr_.top();
+      if (! (nu_l->balltype_i_ == nd_l->balltype_i_
+	     && nu_l->dots_i_ == nd_l->dots_i_  && middle.length() == 0))
+	{
+	  do
+	    {
+	      x_off[idx (d, false)] -= d*0.5;
+	      x_off[idx (d, true)] -= d*0.5;
+	    }
+	  while (flip (&d) != UP);
+	}
+    }
 
   Real wid_f = paper_l ()->note_width ();
   for (int j=0; j < 4; j++)
diff --git a/lily/compressed-music.cc b/lily/compressed-music.cc
deleted file mode 100644
index 940bee5352..0000000000
--- a/lily/compressed-music.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/*   
-  compressed-music.cc --  implement Compressed_music
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#include "compressed-music.hh"
-
-
-Compressed_music::Compressed_music (int n, int d,Music *mp)
-  : Music_wrapper (mp)
-{
-  num_i_ = n;
-  den_i_ = d;
-  element_l ()->compress (Moment (num_i_,den_i_));
-}
-
-
-
-
diff --git a/lily/directional-spanner.cc b/lily/directional-spanner.cc
index 2be0a8c774..e6e4f55947 100644
--- a/lily/directional-spanner.cc
+++ b/lily/directional-spanner.cc
@@ -1,16 +1,16 @@
 #include "directional-spanner.hh"
 
-void
-Directional_spanner::set_default_dir()
+Direction
+Directional_spanner::get_default_dir() const
 {
-  dir_ = DOWN;
+  return DOWN;
 }
 
 void
 Directional_spanner::do_pre_processing()
 {
   if (!dir_)
-    set_default_dir();
+    dir_ = get_default_dir();
 }
 
 Directional_spanner::Directional_spanner()
diff --git a/lily/encompass-info.cc b/lily/encompass-info.cc
index 452d825aa6..06b738e16a 100644
--- a/lily/encompass-info.cc
+++ b/lily/encompass-info.cc
@@ -34,13 +34,20 @@ Encompass_info::Encompass_info (Note_column const* note, Direction dir, Slur con
   
 
   Stem* stem_l = note->stem_l_;
+  if (!stem_l)
+    {
+      warning ("Slur over rest?");
+      o_[X_AXIS] = note->hpos_f ();
+      return; 
+    }
+  
   Real internote = stem_l-> staff_line_leading_f ()/2.;
 
   /* 
-    set o_.x () to middle of notehead or on the exact position of stem,
+    set o_[X_AXIS] to middle of notehead or on the exact position of stem,
     according to slur direction
    */
-  o_.x () = stem_l->hpos_f ();
+  o_[X_AXIS] = stem_l->hpos_f ();
 
   /*
      stem_l->dir == dir
@@ -52,19 +59,19 @@ Encompass_info::Encompass_info (Note_column const* note, Direction dir, Slur con
    */
 
   if (stem_l->dir_ != dir)
-    o_.x () -= 0.5 * notewidth * stem_l->dir_;
+    o_[X_AXIS] -= 0.5 * notewidth * stem_l->dir_;
 
-  o_.y () = stem_l->extent (Y_AXIS)[dir];
+  o_[Y_AXIS] = stem_l->extent (Y_AXIS)[dir];
   /*
    leave a gap: slur mustn't touch head/stem
    */
-  o_.y () += 2.5 * internote * dir;
+  o_[Y_AXIS] += 2.5 * internote * dir;
 
   if (stem_l->dir_ != dir)
-    o_.y () += 1.0 * internote * dir;
+    o_[Y_AXIS] += 1.0 * internote * dir;
 
 
-  Dimension_cache *common = note->common_group (slur_l, Y_AXIS);
+  Dimension_cache *common = stem_l->common_group (slur_l, Y_AXIS);
   Align_element * align = dynamic_cast<Align_element*> (common->element_l ());
   if (align && align->axis() == Y_AXIS)
     {
@@ -91,9 +98,9 @@ Encompass_info::Encompass_info (Note_column const* note, Direction dir, Slur con
       /*
 	our staff is lower -> interstaff_f_ *= -1
        */
-      // ? Is this OK?
+
       if (slur_prio < stem_prio)
 	interstaff_f_ *= -1;
-      o_.y () += interstaff_f_;
+      o_[Y_AXIS] += interstaff_f_;
     }
 }
diff --git a/lily/font-size-engraver.cc b/lily/font-size-engraver.cc
index cc4da24fec..9730f30dd4 100644
--- a/lily/font-size-engraver.cc
+++ b/lily/font-size-engraver.cc
@@ -30,8 +30,9 @@ Font_size_engraver::do_process_requests ()
 void
 Font_size_engraver::acknowledge_element (Score_element_info e)
 {
-  e.elem_l_->set_elt_property (fontsize_scm_sym,
-			       gh_int2scm (size_i_));
+  if (size_i_)
+    e.elem_l_->set_elt_property (fontsize_scm_sym,
+				 gh_int2scm (size_i_));
 }
 
 ADD_THIS_TRANSLATOR (Font_size_engraver);
diff --git a/lily/gourlay-breaking.cc b/lily/gourlay-breaking.cc
index c8dbf35e49..01f2860d4d 100644
--- a/lily/gourlay-breaking.cc
+++ b/lily/gourlay-breaking.cc
@@ -82,9 +82,9 @@ Gourlay_breaking::do_solve () const
 	    continue;
 	    
 	  Line_of_cols line = all.slice (breaks[start_idx], breaks[break_idx]+1);
-
-	  line[0] = line[0]->postbreak_l ();
-	  line.top () = line.top ()->prebreak_l ();
+  
+	  line[0] = dynamic_cast<Paper_column*>(line[0]->find_prebroken_piece (RIGHT));
+	  line.top () =  dynamic_cast<Paper_column*>(line.top ()->find_prebroken_piece (LEFT));
 	    
 	  if (!feasible (line))
 	    break;
diff --git a/lily/include/auto-beam-engraver.hh b/lily/include/auto-beam-engraver.hh
index f56c7059fc..6f3eefff8c 100644
--- a/lily/include/auto-beam-engraver.hh
+++ b/lily/include/auto-beam-engraver.hh
@@ -39,6 +39,8 @@ private:
   Array<Stem*>* stem_l_arr_p_;
   Moment last_add_mom_;
   Moment extend_mom_;
+  
+  // We act as if beam were created, and start a grouping anyway.
   Rhythmic_grouping*grouping_p_;
   Rhythmic_grouping*finished_grouping_p_;
 };
diff --git a/lily/include/beam.hh b/lily/include/beam.hh
index fcf477430e..1fdb8362a6 100644
--- a/lily/include/beam.hh
+++ b/lily/include/beam.hh
@@ -37,8 +37,6 @@ public:
   Link_array<Stem> stems_;
   /// the slope of the beam in posns / point (dimension)   
   Real slope_f_;
-  /// the slope as solved; not quantised or damped
-  Real solved_slope_f_;
 
   /// position of leftmost end of beam  
   Real left_y_;
@@ -64,8 +62,10 @@ public:
 protected:
   virtual Interval do_width () const;    
   Offset center () const;
-  void set_default_dir ();
+  Direction get_default_dir () const;
+  void set_direction (Direction);
   void set_steminfo ();
+  
   virtual void do_pre_processing ();
   virtual void do_post_processing ();
   virtual void do_substitute_element_pointer (Score_element*, Score_element*);
diff --git a/lily/include/directional-spanner.hh b/lily/include/directional-spanner.hh
index c96676cbc7..199669e99a 100644
--- a/lily/include/directional-spanner.hh
+++ b/lily/include/directional-spanner.hh
@@ -22,7 +22,7 @@ public:
     
   /// offset of "center" relative to left-column/0-pos of staff
   virtual Offset center() const;
-  virtual void set_default_dir();
+  virtual Direction get_default_dir() const;
 protected:
   virtual void do_pre_processing();
 };
diff --git a/lily/include/encompass-info.hh b/lily/include/encompass-info.hh
index 91aab59569..04caf77102 100644
--- a/lily/include/encompass-info.hh
+++ b/lily/include/encompass-info.hh
@@ -20,6 +20,7 @@ struct Encompass_info
   Encompass_info (Note_column const*, Direction, Slur const *);
 
   Offset o_;
+  // junkme
   Real interstaff_f_;
 };
 
diff --git a/lily/include/lily-guile.hh b/lily/include/lily-guile.hh
index 5620719042..ec45c65d02 100644
--- a/lily/include/lily-guile.hh
+++ b/lily/include/lily-guile.hh
@@ -34,4 +34,12 @@ void read_lily_scm_file (String);
 void init_symbols ();
 #include "ly-symbols.hh"
 
+/*
+  DIY gc protection.
+ */
+SCM ly_protect_scm (SCM s);
+SCM ly_unprotect_scm (SCM s);
+void init_ly_protection ();
+
+
 #endif // LILY_GUILE_HH
diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh
index 68667ae067..cbc8a7a021 100644
--- a/lily/include/lily-proto.hh
+++ b/lily/include/lily-proto.hh
@@ -65,8 +65,8 @@ struct Command_req;
 struct Command_script_req;
 struct Command_tie_engraver;
 struct Command_tie_req;
-struct Compressed_music;
-struct Compressed_music_iterator;
+struct Time_scaled_music;
+struct Time_scaled_music_iterator;
 struct Cresc_req;
 struct Crescendo ;
 struct Decresc_req;
diff --git a/lily/include/molecule.hh b/lily/include/molecule.hh
index 5727661321..90102b6242 100644
--- a/lily/include/molecule.hh
+++ b/lily/include/molecule.hh
@@ -12,13 +12,20 @@
 #include "box.hh"
 #include "axes.hh"
 #include "direction.hh"
-#include "protected-scm.hh"
 #include "cons.hh"
 
 //#define ATOM_SMOB
 
 /** a group of individually translated symbols. You can add molecules
-    to the top, to the right, etc.  */
+    to the top, to the right, etc.
+
+    Dimension behavior:
+
+    Empty molecules have empty dimensions.  If add_at_edge is used to
+    init the molecule, we assume that
+    DIMENSIONS = (Interval(0,0),Interval(0,0)
+
+*/
 class Molecule {
 #ifdef ATOM_SMOB
   SCM atom_list_;
@@ -27,20 +34,34 @@ class Molecule {
   Cons<Atom> *atom_list_;
 #endif
   friend class Paper_outputter;
+
 public:
   Box dim_;
 
   Molecule();
   ~Molecule();
 
-  void add_at_edge (Axis a, Direction d, const Molecule &m, Real padding);
+  /**
+     Set dimensions to empty, or to (Interval(0,0),Interval(0,0) */
+  void set_empty (bool);
   
+  void add_at_edge (Axis a, Direction d, const Molecule &m, Real padding);
+  void add_atom (Atom const *a);    
   void add_molecule (Molecule const &m);
   void translate (Offset);
-  void do_center (Axis);
+  
+  /**
+     align D direction in axis A.
+
+     If D == CENTER, then move the dimension(A).center() to (0,0)
+
+     Else, move so dimension(A)[D] == 0.0
+     
+   */
+  void align_to (Axis a, Direction d);
   void translate_axis (Real,Axis);
+
   
-  void add_atom (Atom const *a);
   /// how big is #this#? 
   Box extent() const;
   Interval extent (Axis) const;
diff --git a/lily/include/music-wrapper.hh b/lily/include/music-wrapper.hh
index e3f799c6c6..f01a39ff9a 100644
--- a/lily/include/music-wrapper.hh
+++ b/lily/include/music-wrapper.hh
@@ -33,7 +33,7 @@ public:
   virtual Moment length_mom () const;
   virtual ~Music_wrapper ();
   virtual Musical_pitch to_relative_octave (Musical_pitch);
-  
+  virtual void compress (Moment);
 };
 
 
diff --git a/lily/include/note-column.hh b/lily/include/note-column.hh
index db18a621c9..b8d17a5708 100644
--- a/lily/include/note-column.hh
+++ b/lily/include/note-column.hh
@@ -17,22 +17,21 @@
   (chord) and scripts) as a single entity.  */
 class Note_column : public Axis_group_item {
 protected:
-
+  virtual void do_post_processing () ;
   virtual void do_print () const;
   virtual void do_substitute_element_pointer (Score_element*,Score_element*);
 public:
   /** The relative position of the "voice" containing this
     chord. Normally this would be the same as the stem direction,
-    but rests do not have stems.
 
-    JUNKME.v
+    JUNKME.
     */
   Direction dir () const;
   Stem* stem_l_;
 
   Link_array<Note_head> head_l_arr_;
   Link_array<Rest> rest_l_arr_;
-    
+
   Interval_t<int> head_positions_interval() const;
   //  Interval width () const;
 
diff --git a/lily/include/p-col.hh b/lily/include/p-col.hh
index fd379a3347..82be4547bc 100644
--- a/lily/include/p-col.hh
+++ b/lily/include/p-col.hh
@@ -35,15 +35,6 @@ public:
   void preprocess ();
   /// set a minimum distance
   void add_rod (Paper_column * to, Real distance);
-  
-  /** prebreak is put before end of line.
-    if broken here, then (*this) column is discarded, and prebreak
-    is put at end of line, owned by Col
-    */
-  Paper_column *prebreak_l() const;
-
-  /// postbreak at beginning of the new line
-  Paper_column *postbreak_l() const;
 
   virtual Paper_column * column_l () const;
   /// if lines are broken then this column is in #line#
@@ -59,13 +50,6 @@ public:
 
   Paper_column();
 
-  /**
-    which col comes first?.
-    signed compare on columns.
-
-    @return < 0 if c1 < c2.
-    */
-  static int compare (const Paper_column &c1, const Paper_column &c2);
   void set_rank (int);
 
   void OK() const;
@@ -81,8 +65,8 @@ private:
 };
 
 
-#include "compare.hh"
-INSTANTIATE_COMPARE(Paper_column &, Paper_column::compare);
+// #include "compare.hh"
+// INSTANTIATE_COMPARE(Paper_column &, Paper_column::compare);
      
 #endif // P_COL_HH
 
diff --git a/lily/include/protected-scm.hh b/lily/include/protected-scm.hh
index 57e3644a27..4574b212fc 100644
--- a/lily/include/protected-scm.hh
+++ b/lily/include/protected-scm.hh
@@ -23,7 +23,8 @@ public:
   Protected_scm (SCM);
   Protected_scm (Protected_scm const &);
   ~Protected_scm ();
-  Protected_scm &operator = (Protected_scm const &);
+  Protected_scm &operator = (SCM);
+  Protected_scm &operator =( Protected_scm const&);
   operator SCM () const;
   SCM to_SCM () const;
 };
diff --git a/lily/include/rest-collision.hh b/lily/include/rest-collision.hh
index 2ddb2da351..2e1150d651 100644
--- a/lily/include/rest-collision.hh
+++ b/lily/include/rest-collision.hh
@@ -21,7 +21,6 @@ public:
     
     Rest_collision();
 protected:
-    virtual void do_post_processing();
     virtual void do_pre_processing();
     virtual void do_print() const;
     virtual void do_substitute_element_pointer (Score_element*,Score_element*);
diff --git a/lily/include/rod.hh b/lily/include/rod.hh
index 0b246e75c4..2d8b9b4e53 100644
--- a/lily/include/rod.hh
+++ b/lily/include/rod.hh
@@ -28,7 +28,6 @@ struct Rod
   Real distance_f_;
   void add_to_cols ();
 
-  Rod (Single_malt_grouping_item*,Single_malt_grouping_item*);
   Rod ();
 };
 
diff --git a/lily/include/score-column.hh b/lily/include/score-column.hh
index 1ff7e38f04..56dcf59d92 100644
--- a/lily/include/score-column.hh
+++ b/lily/include/score-column.hh
@@ -21,7 +21,7 @@
   The columns which contain data have a rhythmical
   position. Score_column is the type with a rhythmical time attached
   to it. The calculation of idealspacing is done with data in these
-  columns. (notably: the #durations# field)
+  columns.
 
   */
 
@@ -29,23 +29,20 @@ class Score_column : public Paper_column {
   friend class Score;
   friend class Score_engraver;
 
-  bool musical_b_;
   int break_penalty_i_;
   Moment when_;
-
 public:
+  Moment shortest_playing_mom_;
+  Moment shortest_starter_mom_;
+
   int break_penalty_i () { return break_penalty_i_; }
   
   VIRTUAL_COPY_CONS(Score_element);
-  /// length of notes/rests in this column
-  Array<Moment> durations;
-    
-
-  Moment when() {  return when_; }
-  Score_column (Moment when, bool musical_b=false);
-  void add_duration (Moment);
-  void preprocess();
-  bool musical_b() { return musical_b_; }
+
+  Moment when_mom() { return when_; }
+  Score_column (Moment when);
+
+  bool musical_b() const;
   void do_print() const;
 };
 
diff --git a/lily/include/slur.hh b/lily/include/slur.hh
index 0afce1377b..5f634e700c 100644
--- a/lily/include/slur.hh
+++ b/lily/include/slur.hh
@@ -15,6 +15,10 @@
  */
 class Slur : public Bow
 {
+  bool broken_edge_b ( Direction dir) const;
+  bool normal_edge_b ( Direction dir) const;
+  Drul_array<Note_column*> extrema () const; 
+
 public:
   Slur ();
   VIRTUAL_COPY_CONS(Score_element);
@@ -26,7 +30,7 @@ public:
 protected:
   virtual Array<Offset> get_encompass_offset_arr () const;
 
-  virtual void set_default_dir ();
+  virtual Direction get_default_dir () const;
   virtual void do_post_processing ();
   virtual void do_add_processing ();
   virtual void do_pre_processing ();
diff --git a/lily/include/spring-spacer.hh b/lily/include/spring-spacer.hh
index 3c1ff174cf..49e9501841 100644
--- a/lily/include/spring-spacer.hh
+++ b/lily/include/spring-spacer.hh
@@ -64,7 +64,7 @@ class Spring_spacer : public Line_spacer {
 
   /// make the energy function
   void make_matrices (Matrix &quad, Vector &lin,Real&) const;
-  void get_ruling_durations(Array<Moment>&, Array<Moment>&);
+  void get_ruling_durations(Array<Moment>&);
 
   /// generate the LP constraints
   void make_constraints (Mixed_qp& lp) const;
diff --git a/lily/include/stem.hh b/lily/include/stem.hh
index 4f3e219178..f0e759afac 100644
--- a/lily/include/stem.hh
+++ b/lily/include/stem.hh
@@ -84,7 +84,7 @@ public:
   Direction get_dir () const;
 
   int get_center_distance(Direction) const;
-  void set_default_dir();
+
   void set_default_stemlen();
   void set_default_extents();
   void set_noteheads();
diff --git a/lily/include/tie.hh b/lily/include/tie.hh
index 31f54643f4..f8ac1a31f9 100644
--- a/lily/include/tie.hh
+++ b/lily/include/tie.hh
@@ -29,7 +29,7 @@ public:
 protected:
   virtual void do_add_processing ();
   virtual void do_post_processing ();
-  virtual void set_default_dir();
+  virtual Direction get_default_dir() const;
   virtual void do_substitute_element_pointer (Score_element*,Score_element*);
   virtual Array<Rod> get_rods () const;
 
diff --git a/lily/include/compressed-music-iterator.hh b/lily/include/time-scaled-music-iterator.hh
similarity index 50%
rename from lily/include/compressed-music-iterator.hh
rename to lily/include/time-scaled-music-iterator.hh
index 0a16f50e50..192efc9935 100644
--- a/lily/include/compressed-music-iterator.hh
+++ b/lily/include/time-scaled-music-iterator.hh
@@ -1,5 +1,5 @@
 /*   
-  compressed-music-iterator.hh -- declare Compressed_music_iterator
+  compressed-music-iterator.hh -- declare Time_scaled_music_iterator
   
   source file of the GNU LilyPond music typesetter
   
@@ -7,12 +7,12 @@
   
  */
 
-#ifndef COMPRESSED_MUSIC_ITERATOR_HH
-#define COMPRESSED_MUSIC_ITERATOR_HH
+#ifndef Time_scaled_music_ITERATOR_HH
+#define Time_scaled_music_ITERATOR_HH
 
 #include "music-wrapper-iterator.hh"
 
-class Compressed_music_iterator : public Music_wrapper_iterator
+class Time_scaled_music_iterator : public Music_wrapper_iterator
 {
 public:  
   // construction
@@ -21,5 +21,5 @@ protected:
 };
 
 
-#endif /* COMPRESSED_MUSIC_ITERATOR_HH */
+#endif /* Time_scaled_music_ITERATOR_HH */
 
diff --git a/lily/include/compressed-music.hh b/lily/include/time-scaled-music.hh
similarity index 53%
rename from lily/include/compressed-music.hh
rename to lily/include/time-scaled-music.hh
index 484efdd174..98fb5286ce 100644
--- a/lily/include/compressed-music.hh
+++ b/lily/include/time-scaled-music.hh
@@ -1,5 +1,5 @@
 /*   
-  compressed-music.hh -- declare Compressed_music
+  compressed-music.hh -- declare Time_scaled_music
   
   source file of the GNU LilyPond music typesetter
   
@@ -7,23 +7,23 @@
   
  */
 
-#ifndef COMPRESSED_MUSIC_HH
-#define COMPRESSED_MUSIC_HH
+#ifndef Time_scaled_music_HH
+#define Time_scaled_music_HH
 
 #include "music-wrapper.hh"
 /**
    Tempo expansion or compression.
  */
-class Compressed_music : public Music_wrapper
+class Time_scaled_music : public Music_wrapper
 {
 public:
   int num_i_;
   int den_i_;
 
-  Compressed_music (int, int, Music *);
+  Time_scaled_music (int, int, Music *);
   
   VIRTUAL_COPY_CONS(Music);
 };
 
-#endif /* COMPRESSED_MUSIC_HH */
+#endif /* Time_scaled_music_HH */
 
diff --git a/lily/include/tuplet-engraver.hh b/lily/include/tuplet-engraver.hh
index 727b701791..b78c6f300c 100644
--- a/lily/include/tuplet-engraver.hh
+++ b/lily/include/tuplet-engraver.hh
@@ -20,7 +20,7 @@ public:
 
 
 protected:
-  Link_array<Compressed_music> compressed_music_arr_;
+  Link_array<Time_scaled_music> time_scaled_music_arr_;
   Array<Moment> stop_moments_;
   Link_array<Tuplet_spanner> started_span_p_arr_;
 
diff --git a/lily/include/tuplet-spanner.hh b/lily/include/tuplet-spanner.hh
index afb2d22627..c66009c7cf 100644
--- a/lily/include/tuplet-spanner.hh
+++ b/lily/include/tuplet-spanner.hh
@@ -10,18 +10,24 @@
 #include "pointer.hh"
 #include "directional-spanner.hh"
 
-/** supportable plet: triplets, eentweetjes, ottava, etc.  */
+/** supportable plet: triplets, eentweetjes, ottava, etc.
 
+    TODO: quantise, we don't want to collide with staff lines.
+    (or should we be above staff?)
+
+  todo: handle breaking elegantly.
+*/
 class Tuplet_spanner : public Directional_spanner
 {
 public:
   Tuplet_spanner ();
  
   void add_column (Note_column*);
-  void set_beam (Beam*);
+  void add_beam (Beam*);
   
 
   String  number_str_;
+
   /*
     junk us.
    */
@@ -29,15 +35,14 @@ public:
   bool num_visibility_b_;
   
 protected:
-  Beam *beam_l_;
+  Link_array<Beam> beam_l_arr_;
   Link_array<Note_column> column_arr_;
 
   virtual Molecule* do_brew_molecule_p () const;
   VIRTUAL_COPY_CONS(Score_element);
-
   virtual void do_add_processing ();
   virtual void do_post_processing ();
-  virtual void set_default_dir ();
+  virtual Direction get_default_dir () const;
   virtual void do_substitute_element_pointer (Score_element*,Score_element*);
 };
 
diff --git a/lily/key-item.cc b/lily/key-item.cc
index 7fc7f2accf..a3b646b0e5 100644
--- a/lily/key-item.cc
+++ b/lily/key-item.cc
@@ -125,6 +125,7 @@ Key_item::do_brew_molecule_p() const
       m.translate_axis (calculate_position(pitch_arr_[i], acc_arr_[i]) * inter, Y_AXIS);
       output->add_at_edge (X_AXIS, RIGHT, m, 0);
     }
+
   if (pitch_arr_.size()) 
     {
       Molecule m (lookup_l ()->fill (Box (
diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc
index 22c271c892..31b9f497be 100644
--- a/lily/lily-guile.cc
+++ b/lily/lily-guile.cc
@@ -99,3 +99,197 @@ ly_scm2string (SCM s)
   delete p;
   return r;
 }
+
+/*
+  Layout of nodes:
+
+  (key . (left_child . right_child))
+
+  SCM_EOL is the nil-pointer (should use SCM_NIMP() ?)
+ */
+
+#define left_child(s) SCM_CADR((s))
+#define right_child(s) SCM_CDDR((s))
+#define key(s) SCM_CAR((s))
+
+/*
+  Garble pointers, to prevent unbalanced tree due to ordered inserts.
+ */
+
+unsigned int
+munge (SCM s) 
+{
+  const int SHIFT = 18;
+  return (unsigned int)(s << (32-SHIFT) | s >> SHIFT );
+}
+
+SCM
+ly_new_bintree_node (SCM val)
+{
+  return gh_cons (val, gh_cons (SCM_EOL, SCM_EOL));
+}
+
+
+/*
+  add VAL to TREE. TREE must be non-nil
+ */
+void
+ly_addto_bintree (SCM *tree, SCM val)
+{
+  while(*tree != SCM_EOL)
+    {
+      if (munge (val) <= munge (key (*tree)))
+	tree = &left_child (*tree);
+      else
+	tree = &right_child (*tree);
+    }
+
+  *tree = ly_new_bintree_node (val);
+}
+
+
+/*
+  find the address of a node in the tree represented by *NODE with key VAL
+ */
+SCM  *
+ly_find_in_bintree (SCM *node, SCM val)
+{
+  while (*node != SCM_EOL)
+    {
+      if (munge (val) < munge (key(*node) ))
+	node = &left_child(*node);
+      else if (munge (val) > munge (key (*node)))
+	node = &right_child (*node);
+      else
+	return node;
+    }
+  return node;
+}
+
+void
+ly_remove_from_bintree (SCM *node)
+{
+  SCM r = right_child  (*node);
+  SCM l = left_child (*node);
+  
+  if (r == SCM_EOL)
+    {
+      *node = l;
+    }
+  else if (l == SCM_EOL)
+    {
+      *node = r;
+    }
+  else
+    {
+      /*deleting from binary trees.  See Knuth's TAOCP.
+       */
+      SCM *t = node;
+      SCM *left_t = &left_child (*t);
+
+      /*
+	INV:  LEFT_T  is the left child of T
+       */
+      while (*left_t != SCM_EOL)
+	{
+	  t = left_t;
+	  left_t = &left_child (*t);
+	}
+
+      /*
+	POST: T is the leftmost right child of NODE which has no left child,
+
+	leftchild (LASTT) == T
+       */
+      key(*node) = key(*t);
+      *left_t = right_child (*t);
+    }
+}
+
+
+static SCM protect_tree_root;
+
+SCM
+ly_protect_scm (SCM s)
+{
+  ly_addto_bintree (&protect_tree_root, s);
+  return s;
+}
+
+SCM
+ly_unprotect_scm (SCM s)
+{
+  SCM *to_remove = ly_find_in_bintree (&protect_tree_root, s);
+
+  /*
+    this shouldn't happen, according to me. But it does.
+   */
+  if (*to_remove != SCM_EOL)
+    ly_remove_from_bintree (to_remove);
+  return s;
+}
+
+void
+ly_init_protection ()
+{
+  protect_tree_root = scm_protect_object (ly_new_bintree_node(SCM_EOL));
+  key (protect_tree_root) = protect_tree_root;
+}
+
+
+int
+ly_count_elements (SCM tree)
+{
+  if (tree == SCM_EOL)
+    return 0;
+  else
+    return 1 + ly_count_elements (left_child (tree)) + ly_count_elements (right_child( tree));
+}
+
+int
+ly_tree_depth (SCM tree)
+{
+  if (tree == SCM_EOL)
+    return 0;
+  else
+    return 1 + (ly_tree_depth (left_child (tree)) >? ly_tree_depth (right_child(tree)));
+}
+
+void
+ly_print_bintree (SCM node)
+{
+#ifndef NPRINT
+  if (node == SCM_EOL)
+    return;
+  DOUT << "{val = " << key(node) << " \nleft = ";
+  ly_print_bintree (left_child (node));
+  DOUT << "\n right =";
+  ly_print_bintree (right_child (node));
+  DOUT << "}";
+#endif
+}
+
+
+struct Imbalance { int imbalance; int total; };
+
+Imbalance
+ly_calc_imbalance (SCM node)
+{
+  Imbalance t;
+  if (node == SCM_EOL)
+    {
+      t.imbalance = 0;
+      t.total = 0;
+      return t;
+    }
+
+  Imbalance l = ly_calc_imbalance (left_child (node));
+  Imbalance r = ly_calc_imbalance (right_child (node));
+
+  t.total = l.total + r.total + 1;
+  int dif = l.total - r.total;
+  if (dif < 0)
+     dif = -dif;
+  t.imbalance = l.imbalance + r.imbalance + dif;
+  return t;
+}
diff --git a/lily/lookup.cc b/lily/lookup.cc
index d588febb05..42b78d69af 100644
--- a/lily/lookup.cc
+++ b/lily/lookup.cc
@@ -9,6 +9,8 @@
 
   TODO
       Glissando
+
+      merge rulesym and filledbox.
 */
 
 #include <ctype.h>
@@ -108,8 +110,14 @@ Lookup::afm_find (String s, bool warn) const
   Adobe_font_char_metric cm = afm_l_->find_char (s, warn);
   Molecule m;
   if (cm.code () < 0)
-    return m;
-    
+    {
+      /*
+	don't want people relying on this kind of dimension. 
+       */
+      m.set_empty (false);
+      return m;
+    }
+  
   Atom at (gh_list (char_scm_sym,
 		    gh_int2scm (cm.code ()),
 		    SCM_UNDEFINED));
@@ -270,11 +278,11 @@ Lookup::dashed_slur (Array<Offset> controls, Real thick, Real dash) const
     }
 
   Atom at
-     (gh_list (ly_symbol ("dashed-slur"),
-				gh_double2scm (thick), 
-				gh_double2scm (dash),
-				ly_quote_scm (array_to_list (sc, 4)),
-				SCM_UNDEFINED));
+    (gh_list (ly_symbol ("dashed-slur"),
+	      gh_double2scm (thick), 
+	      gh_double2scm (dash),
+	      ly_quote_scm (array_to_list (sc, 4)),
+	      SCM_UNDEFINED));
   
   
   m.add_atom (&at);
@@ -314,9 +322,9 @@ Molecule
 Lookup::rule_symbol (Real height, Real width) const
 {
   Atom at  (gh_list (rulesym_scm_sym,
-					 gh_double2scm (height),
-					 gh_double2scm (width),
-					 SCM_UNDEFINED));
+		     gh_double2scm (height),
+		     gh_double2scm (width),
+		     SCM_UNDEFINED));
 
   Molecule m;
   m.dim_.x () = Interval (0, width);
@@ -352,11 +360,11 @@ Lookup::filledbox (Box b ) const
   Molecule m;
   
   Atom at  (gh_list (filledbox_scm_sym,
-					 gh_double2scm (-b[X_AXIS][LEFT]),
-					 gh_double2scm (b[X_AXIS][RIGHT]),		       
-					 gh_double2scm (-b[Y_AXIS][DOWN]),
-					 gh_double2scm (b[Y_AXIS][UP]),		       
-					 SCM_UNDEFINED));
+		     gh_double2scm (-b[X_AXIS][LEFT]),
+		     gh_double2scm (b[X_AXIS][RIGHT]),		       
+		     gh_double2scm (-b[Y_AXIS][DOWN]),
+		     gh_double2scm (b[Y_AXIS][UP]),		       
+		     SCM_UNDEFINED));
 
   m.dim_ = b;
   m.add_atom (&at);
@@ -407,7 +415,7 @@ Lookup::text (String style, String text) const
 
   /*
     UGH.
-   */
+  */
   SCM l = gh_eval_str (("(style-to-cmr \"" + style + "\")").ch_C());
   if (l != SCM_BOOL_F)
     {
@@ -457,16 +465,14 @@ Lookup::text (String style, String text) const
 }
   
 
-/*
- */
 Molecule
 Lookup::time_signature (int num, int den) const
 {
   String sty = "number";
   Molecule n (text (sty, to_str (num)));
   Molecule d (text (sty, to_str (den)));
-  n.do_center (X_AXIS);
-  d.do_center (X_AXIS);
+  n.align_to (X_AXIS, CENTER);
+  d.align_to (X_AXIS, CENTER);
   Molecule m;
   if (den)
     {
@@ -476,7 +482,7 @@ Lookup::time_signature (int num, int den) const
   else
     {
       m = n;
-      m.do_center (Y_AXIS);
+      m.align_to (Y_AXIS, CENTER);
     }
   return m;
 }
@@ -487,9 +493,9 @@ Lookup::staff_brace (Real y) const
   Molecule m;
   
   Atom at  (gh_list (pianobrace_scm_sym,
-		       gh_double2scm (y),
-		       SCM_UNDEFINED
-		       ));
+		     gh_double2scm (y),
+		     SCM_UNDEFINED
+		     ));
   
   m.dim_[Y_AXIS] = Interval (-y/2,y/2);
   m.dim_[X_AXIS] = Interval (0,0);
@@ -505,10 +511,10 @@ Lookup::hairpin (Real width, bool decresc, bool continued) const
 
   String hairpin = String (decresc ? "de" : "") + "crescendo";
   Atom at  (gh_list (ly_symbol (hairpin),
-		       gh_double2scm (width),
-		       gh_double2scm (height),
-		       gh_double2scm (continued ? height/2 : 0.0),
-		       SCM_UNDEFINED));
+		     gh_double2scm (width),
+		     gh_double2scm (height),
+		     gh_double2scm (continued ? height/2 : 0.0),
+		     SCM_UNDEFINED));
   m.dim_.x () = Interval (0, width);
   m.dim_.y () = Interval (-2*height, 2*height);
 
@@ -526,14 +532,16 @@ Lookup::plet (Real dy , Real dx, Direction dir) const
     {
       t = paper_l_->get_realvar (thick);
     }
-  
+
+  Real interline_f = paper_l_->get_realvar (interline_scm_sym);
   Atom at  (gh_list(tuplet_scm_sym,
-		      gh_double2scm (dx),
-		      gh_double2scm (dy),
-		      gh_double2scm (t),
-		      gh_int2scm (dir),
-		      SCM_UNDEFINED));
-m.add_atom (&at);
+		    gh_double2scm (interline_f), 
+		    gh_double2scm (dx),
+		    gh_double2scm (dy),
+		    gh_double2scm (t),
+		    gh_int2scm (dir),
+		    SCM_UNDEFINED));
+  m.add_atom (&at);
 
   return m;
 }
@@ -555,8 +563,8 @@ Lookup::slur (Array<Offset> controls) const
 
 
   Atom at  (gh_list (ly_symbol ("bezier-sandwich"),
-		      ly_quote_scm (array_to_list (scontrols, 8)),
-		      SCM_UNDEFINED));
+		     ly_quote_scm (array_to_list (scontrols, 8)),
+		     SCM_UNDEFINED));
 
   m.dim_[X_AXIS] = Interval (0, delta_off[X_AXIS]);
   m.dim_[Y_AXIS] = Interval (0 <? delta_off[Y_AXIS], 0 >? delta_off[Y_AXIS]);
@@ -569,8 +577,8 @@ Lookup::staff_bracket (Real y) const
 {
   Molecule m; 
   Atom at  ( gh_list (bracket_scm_sym,
-			gh_double2scm (y),
-			SCM_UNDEFINED));
+		      gh_double2scm (y),
+		      SCM_UNDEFINED));
   m.add_atom (&at);				 
   m.dim_[Y_AXIS] = Interval (-y/2,y/2);
   m.dim_[X_AXIS] = Interval (0,4 PT);
@@ -590,10 +598,10 @@ Lookup::volta (Real w, bool last_b) const
       t = paper_l_->get_realvar (thick);
     }
   Atom at  (gh_list (volta_scm_sym,
-		       gh_double2scm (w),
-		       gh_double2scm (t),
-		       gh_int2scm (last_b),
-		       SCM_UNDEFINED));
+		     gh_double2scm (w),
+		     gh_double2scm (t),
+		     gh_int2scm (last_b),
+		     SCM_UNDEFINED));
 
   Real interline_f = paper_l_->get_realvar (interline_scm_sym);
 
diff --git a/lily/lyric-engraver.cc b/lily/lyric-engraver.cc
index fa5c1035d1..f5807666da 100644
--- a/lily/lyric-engraver.cc
+++ b/lily/lyric-engraver.cc
@@ -43,7 +43,7 @@ Lyric_engraver::do_process_requests()
       text_p_=  new G_text_item;
       text_p_->text_str_ = req_l_->text_str_;
 
-      Scalar style = get_property ("textstyle", 0);
+      Scalar style = get_property ("textStyle", 0);
       if (style.length_i ())
 	text_p_->style_str_ = style;
       
diff --git a/lily/main.cc b/lily/main.cc
index 80dddad0d7..74de864a09 100644
--- a/lily/main.cc
+++ b/lily/main.cc
@@ -251,6 +251,8 @@ main_prog (int argc, char **argv)
   /*
     need to do this first. Engravers use lily.scm contents.
    */
+  extern void ly_init_protection();
+  ly_init_protection();  
   init_symbols ();
   read_lily_scm_file ( "lily.scm");
   cout << endl;
diff --git a/lily/midi-item.cc b/lily/midi-item.cc
index e52027345c..ccb0a5ae90 100644
--- a/lily/midi-item.cc
+++ b/lily/midi-item.cc
@@ -552,9 +552,9 @@ Midi_track::data_str () const
   String str = Midi_chunk::data_str ();
   if (check_debug && !monitor->silent_b ("Midistrings"))
     str += "\n";
-  for (Cons<Midi_event>* i = event_p_list_.head_cons_p_; i; i = i->next_cons_p_) 
+  for (Cons<Midi_event> *i=event_p_list_.head_; i; i = i->next_) 
     {
-      str += i->car_p_->str ();
+      str += i->car_->str ();
       if (check_debug && !monitor->silent_b ("Midistrings"))
         str += "\n";
     }
diff --git a/lily/misc.cc b/lily/misc.cc
index e63ac8cab1..ae015bdbc1 100644
--- a/lily/misc.cc
+++ b/lily/misc.cc
@@ -80,7 +80,7 @@ Interval
 get_bounds_iv (Array<Real> const& positions, Real x)
 {
   Slice slice = get_bounds_slice (positions, x);
-  return Interval (positions[slice.min ()], positions[slice.max ()]);
+  return Interval (positions[slice[SMALLER]], positions[slice[BIGGER]]);
 }
 
 // silly name
@@ -104,14 +104,14 @@ quantise_iv (Array<Real> const& positions, Real period, Real x)
     }
 
   Slice slice = get_bounds_slice (positions, frac);
-  Interval iv(positions[slice.min ()], positions[slice.max ()]);
+  Interval iv(positions[slice[SMALLER]], positions[slice[BIGGER]]);
 
-  if (slice.min () == slice.max ())
+  if (slice[SMALLER] == slice[BIGGER])
     {
-      if (slice.min () == 0)
-	iv.min () = - period + positions.top ();
+      if (slice[SMALLER] == 0)
+	iv[SMALLER] = - period + positions.top ();
       else
-	iv.max () = period + positions[0];
+	iv[BIGGER] = period + positions[0];
     }
 
   iv += period * n;
diff --git a/lily/molecule.cc b/lily/molecule.cc
index f874394880..6e979b68b9 100644
--- a/lily/molecule.cc
+++ b/lily/molecule.cc
@@ -24,10 +24,10 @@
 #define UNBOX_PTR(a) SCM_CAR(a)
 #else
 #define MOL_EOL 0
-#define NEXT_CELL(a) ptr->next_cons_p_
+#define NEXT_CELL(a) ptr->next_
 #define CELLTYPE Cons<Atom>*
 #define UNBOX_ATOM(a) a
-#define UNBOX_PTR(a) a->car_p_
+#define UNBOX_PTR(a) a->car_
 #define BOX_ATOM(a) a
 #define NEWCELL(a,b) new Killing_cons<Atom>(a,b)
 #endif
@@ -51,7 +51,8 @@ Molecule::translate (Offset o)
     {
       UNBOX_ATOM(UNBOX_PTR(ptr))->off_ += o;
     }
-  dim_.translate (o);
+  if (!empty_b ())
+    dim_.translate (o);
 }
 
 void
@@ -60,7 +61,8 @@ Molecule::translate_axis (Real x,Axis a)
   for (CELLTYPE  ptr = atom_list_; ptr != MOL_EOL; ptr = NEXT_CELL(ptr))
     UNBOX_ATOM (UNBOX_PTR(ptr))->off_[a] += x;
 
-  dim_[a] += x;
+  if (!empty_b ())
+    dim_[a] += x;
 }
 
 void
@@ -80,16 +82,10 @@ Molecule::add_atom (Atom const *al)
   atom_list_ = NEWCELL(BOX_ATOM(a), atom_list_);
 }
 
-
-
-
 void
 Molecule::operator=(Molecule const & src)
 {
-  if (&src == this)
-  return;
-
-
+  if (&src == this) return;
 
 #ifndef ATOM_SMOB
   delete atom_list_;
@@ -100,9 +96,25 @@ Molecule::operator=(Molecule const & src)
   add_molecule (src);
 }
 
+void
+Molecule::set_empty (bool e)
+{
+  if (e)
+    {
+      dim_[X_AXIS].set_empty ();
+      dim_[Y_AXIS].set_empty ();
+    }
+  else
+    {
+      dim_[X_AXIS] = Interval(0,0);
+      dim_[Y_AXIS] = Interval (0,0);
+    }
+}
+
 Molecule::Molecule (Molecule const &s)
 {
   atom_list_ = MOL_EOL;
+  set_empty (true);
   add_molecule (s);
 }
 
@@ -126,15 +138,23 @@ Molecule::print() const
 }
 
 void
-Molecule::do_center (Axis a)
+Molecule::align_to (Axis a, Direction d)
 {
-  Interval i (extent (a));
-  translate_axis (-i.center (), a);
+  if (d == CENTER)
+    {
+      Interval i (extent (a));
+      translate_axis (-i.center (), a);
+    }
+  else
+    {
+      translate_axis (-extent (a)[d], a);
+    }
 }
 
 Molecule::Molecule ()
 {
-  dim_ = Box (Interval(0,0),Interval( 0,0  ));
+  dim_[X_AXIS].set_empty ();
+  dim_[Y_AXIS].set_empty ();
   atom_list_ = MOL_EOL;
 }
 
@@ -142,16 +162,20 @@ Molecule::Molecule ()
 void
 Molecule::add_at_edge (Axis a, Direction d, Molecule const &m, Real padding)
 {
-  Real my_extent= dim_[a][d];
+  Real my_extent= empty_b () ? 0.0 : dim_[a][d];
+  Interval i (m.extent ()[a]);
+  if (i.empty_b ())
+    warning ("Molecule::add_at_edge: adding empty molecule. [PROGRAMMING ERROR]");
   
-  Real offset = my_extent -  m.extent ()[a][-d];
+  Real his_extent = i[-d];
+  Real offset = my_extent -  his_extent;
   Molecule toadd (m);
   toadd.translate_axis (offset + d * padding, a);
   add_molecule (toadd);
 }
 
 bool
-Molecule::empty_b() const
+Molecule::empty_b () const
 {
   return atom_list_ == MOL_EOL;
 }
diff --git a/lily/music-iterator.cc b/lily/music-iterator.cc
index 511c014330..3741d74f08 100644
--- a/lily/music-iterator.cc
+++ b/lily/music-iterator.cc
@@ -18,8 +18,8 @@
 #include "change-translator.hh"
 #include "music-wrapper.hh"
 #include "music-wrapper-iterator.hh"
-#include "compressed-music-iterator.hh"
-#include "compressed-music.hh"
+#include "time-scaled-music-iterator.hh"
+#include "time-scaled-music.hh"
 #include "repeated-music.hh"
 #include "repeated-music-iterator.hh"
 
@@ -119,8 +119,8 @@ Music_iterator::static_get_iterator_p (Music const *m, Translator_group *report_
     p = new Property_iterator;
   else if (dynamic_cast<Change_translator  const *> (m))
     p = new Change_iterator;
-  else if (dynamic_cast<Compressed_music  const *> (m))
-    p = new Compressed_music_iterator;
+  else if (dynamic_cast<Time_scaled_music  const *> (m))
+    p = new Time_scaled_music_iterator;
   else if (dynamic_cast<Music_wrapper  const *> (m))
     p = new Music_wrapper_iterator;
   else if (dynamic_cast<Repeated_music const *> (m))
diff --git a/lily/music-list.cc b/lily/music-list.cc
index a17fad69cf..01ccd5be0f 100644
--- a/lily/music-list.cc
+++ b/lily/music-list.cc
@@ -17,8 +17,8 @@ Moment
 Simultaneous_music::length_mom () const
 {
   Moment dur = 0;
-  for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i;  i = i->next_cons_p_)
-    dur = dur >? i->car_p_->length_mom ();
+  for (Cons<Music> *i = music_p_list_p_->head_; i;  i = i->next_)
+    dur = dur >? i->car_->length_mom ();
 
   return dur;
 }
@@ -26,9 +26,8 @@ Simultaneous_music::length_mom () const
 void
 Music_sequence::compress (Moment m)
 {
-  
-  for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i;  i = i->next_cons_p_)
-    i->car_p_->compress (m);
+  for (Cons<Music> *i = music_p_list_p_->head_; i;  i = i->next_)
+    i->car_->compress (m);
 }
 
 Simultaneous_music::Simultaneous_music(Music_list *p)
@@ -46,9 +45,9 @@ Moment
 Sequential_music::length_mom () const
 {
   Moment last=0;
-  for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i;  i = i->next_cons_p_)
+  for (Cons<Music> *i = music_p_list_p_->head_; i;  i = i->next_)
     {
-      last += i->car_p_->length_mom ();
+      last += i->car_->length_mom ();
     }
   return  last;
 }
@@ -76,9 +75,9 @@ Music_list::do_relative_octave (Musical_pitch last, bool ret_first)
 {
   Musical_pitch retval;
   int count=0;
-  for (Cons<Music> *i = head_cons_p_; i ; i = i->next_cons_p_)
+  for (Cons<Music> *i = head_; i ; i = i->next_)
     {
-      last = i->car_p_->to_relative_octave (last);
+      last = i->car_->to_relative_octave (last);
       if (!count ++ )
 	retval = last;
     }
@@ -93,8 +92,8 @@ Music_list::do_relative_octave (Musical_pitch last, bool ret_first)
 Music_list::Music_list (Music_list const &s)
   : Cons_list<Music> (s)
 {
-  init ();
-  clone_killing_cons_list (*this, s.head_cons_p_);
+  init_list ();
+  clone_killing_cons_list (*this, s.head_);
 }
 
 
@@ -116,9 +115,9 @@ Request_chord::Request_chord()
 Musical_pitch
 Request_chord::to_relative_octave (Musical_pitch last)
 {
-  for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i ; i = i->next_cons_p_)
+  for (Cons<Music> *i = music_p_list_p_->head_; i ; i = i->next_)
     {
-      if (Melodic_req *m= dynamic_cast <Melodic_req *> (i->car_p_))
+      if (Melodic_req *m= dynamic_cast <Melodic_req *> (i->car_))
 	{
 	  Musical_pitch &pit = m->pitch_;
 	  pit.to_relative_octave (last);
diff --git a/lily/music-output-def.cc b/lily/music-output-def.cc
index 86050545ba..62de2935b4 100644
--- a/lily/music-output-def.cc
+++ b/lily/music-output-def.cc
@@ -102,12 +102,9 @@ Music_output_def::print () const
 String
 Music_output_def::get_default_output () const
 {
-  static SCM output_sym;
-  if (!output_sym)
-    output_sym = scm_protect_object (output_scm_sym);
-  if (safe_global_b || !scope_p_->elem_b (output_sym))
+  if (safe_global_b || !scope_p_->elem_b (output_scm_sym))
     return "";
-  Identifier * id = scope_p_->elem (output_sym);
+  Identifier * id = scope_p_->elem (output_scm_sym);
 
   String *p = id->access_content_String (false);
   return p ? *p : String ("");
diff --git a/lily/music-sequence.cc b/lily/music-sequence.cc
index 52ed3fecce..6f50bd56b7 100644
--- a/lily/music-sequence.cc
+++ b/lily/music-sequence.cc
@@ -26,16 +26,16 @@ Music_sequence::Music_sequence(Music_list *mlist_p)
 void
 Music_sequence::transpose (Musical_pitch rq)
 {
-  for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i;  i = i->next_cons_p_)
-    i->car_p_->transpose (rq);    
+  for (Cons<Music> *i = music_p_list_p_->head_; i;  i = i->next_)
+    i->car_->transpose (rq);    
 }
 
 void
 Music_sequence::do_print() const
 {
 #ifndef NPRINT
-  for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i;  i = i->next_cons_p_)  
-    i->car_p_->print();
+  for (Cons<Music> *i = music_p_list_p_->head_; i;  i = i->next_)  
+    i->car_->print();
 #endif 
 }
 
diff --git a/lily/music-wrapper.cc b/lily/music-wrapper.cc
index 97598e87af..17c0fefa7b 100644
--- a/lily/music-wrapper.cc
+++ b/lily/music-wrapper.cc
@@ -62,3 +62,9 @@ Music_wrapper::element_l () const
 {
   return element_p_;
 }
+
+void
+Music_wrapper::compress (Moment m)
+{
+  element_l ()->compress (m);
+}
diff --git a/lily/note-column.cc b/lily/note-column.cc
index 81fb1ea5ca..26a33eb5cd 100644
--- a/lily/note-column.cc
+++ b/lily/note-column.cc
@@ -7,11 +7,12 @@
 */
 #include "dot-column.hh"
 #include "note-column.hh"
-
+#include "beam.hh"
 #include "note-head.hh"
 #include "stem.hh"
 #include "rest.hh"
 #include "debug.hh"
+#include "paper-def.hh"
 
 bool
 Note_column::rest_b () const
@@ -127,3 +128,49 @@ Note_column::set_dotcol (Dot_column *d)
 {
   add_element (d);
 }
+
+  /*
+    [TODO]
+    handle rest under beam (do_post: beams are calculated now)
+    what about combination of collisions and rest under beam.
+
+    Should lookup
+    
+      rest -> stem -> beam -> interpolate_y_position ()
+    
+   */
+
+void
+Note_column::do_post_processing ()
+{
+  if (!stem_l_ || !rest_b ())
+    return;
+
+  Beam * b = stem_l_->beam_l_;
+  if (!b)
+    return;
+      
+      /* ugh. Should be done by beam. */
+  Real x = stem_l_->hpos_f ();
+  Direction d = stem_l_->get_dir ();
+  Real beamy = x * b->slope_f_ + b->left_y_;
+  Interval restdim = extent (Y_AXIS);
+
+  Real staff_space = rest_l_arr_[0]->staff_line_leading_f ();      
+  Real internote_f = staff_space/2;
+  Real minimum_dist
+    = paper_l ()->get_var ("restcollision_minimum_beamdist") * internote_f;
+  Real dist =
+    minimum_dist +  -d  * (beamy - restdim[d]) >? 0;
+
+  int stafflines = rest_l_arr_[0]->lines_i ();
+      
+  // move discretely by half spaces.
+  int discrete_dist = int (ceil (dist / (0.5 *staff_space)));
+
+  // move by whole spaces inside the staff.
+  if (discrete_dist < stafflines+1)
+    discrete_dist = int (ceil (discrete_dist / 2.0)* 2.0);
+
+  translate_rests (-d *  discrete_dist);
+}
diff --git a/lily/p-col.cc b/lily/p-col.cc
index 98891d885d..19f82c1b1f 100644
--- a/lily/p-col.cc
+++ b/lily/p-col.cc
@@ -14,6 +14,13 @@ void
 Paper_column::add_rod (Paper_column * p, Real d)
 {
   Direction dir =  Direction (sign (p->rank_i ()  - rank_i ()));
+  
+  if (!dir)
+    {
+      warning ("Must set minimum distance between differing columns. [PROGRAMMING ERROR]");
+      return;
+    }
+  
   for (int i=0; i < minimal_dists_arr_drul_[dir].size (); i++)
     {
       Column_rod &rod = minimal_dists_arr_drul_[dir][i];
@@ -26,10 +33,9 @@ Paper_column::add_rod (Paper_column * p, Real d)
 
   Column_rod cr;
   cr.distance_f_ = d;
-	cr.other_l_ = p;
+  cr.other_l_ = p;
 
   minimal_dists_arr_drul_[dir].push (cr);
-      
 }
 
 int
@@ -49,23 +55,6 @@ Paper_column::do_print() const
 {
 #ifndef NPRINT
   DOUT << "rank: " << rank_i_ << '\n';
-  if (prebreak_l())
-    {
-      DOUT << "\npre: ";
-      prebreak_l()->print();
-    }
-  if (postbreak_l()) 
-    {
-      DOUT << "post: ";
-      postbreak_l()->print();
-    } 
-  if (break_status_dir ())
-    {
-      DOUT << '\n' << ((break_status_dir () == LEFT) ? "prebreak" : "postbreak");
-      DOUT << '\n';
-    }
-
-  DOUT << "Left: ";
   for (int i=0; i < minimal_dists_arr_drul_[LEFT].size (); i++)
     {
       minimal_dists_arr_drul_[LEFT][i].print ();
@@ -75,27 +64,10 @@ Paper_column::do_print() const
     {
       minimal_dists_arr_drul_[RIGHT][i].print ();
     }
+  Item::do_print ();
 #endif 
 }
 
-int
-Paper_column::compare (Paper_column const &c1, Paper_column const &c2)
-{
-  return c1.rank_i() - c2.rank_i ();
-}
-
-Paper_column*
-Paper_column::prebreak_l() const
-{
-  return dynamic_cast<Paper_column*>(find_prebroken_piece (LEFT));
-}
-
-Paper_column*
-Paper_column::postbreak_l() const
-{
-  return dynamic_cast<Paper_column*>( find_prebroken_piece (RIGHT));
-}
-
 bool
 Paper_column::breakpoint_b() const
 {
diff --git a/lily/paper-def.cc b/lily/paper-def.cc
index 1b6c36fecd..e420ed6a47 100644
--- a/lily/paper-def.cc
+++ b/lily/paper-def.cc
@@ -193,15 +193,15 @@ Paper_def::interbeam_f (int multiplicity_i) const
 {
   if (multiplicity_i <= 3)
     return get_realvar (interbeam_scm_sym);
-      else
-	return get_realvar (interbeam4_scm_sym);
-      }
+  else
+    return get_realvar (interbeam4_scm_sym);
+}
 
 Real
 Paper_def::note_width () const
 {
   return get_realvar (notewidth_scm_sym);
-    }
+}
 
 void
 Paper_def::print () const
diff --git a/lily/paper-outputter.cc b/lily/paper-outputter.cc
index 5a46415e69..308c07734d 100644
--- a/lily/paper-outputter.cc
+++ b/lily/paper-outputter.cc
@@ -99,9 +99,9 @@ Paper_outputter::output_molecule (Molecule const*m, Offset o, char const *nm)
     {
       Atom *i = Atom::atom_l (SCM_CAR(ptr));
 #else
-  for (Cons<Atom> *ptr = m->atom_list_; ptr; ptr = ptr->next_cons_p_)
+  for (Cons<Atom> *ptr = m->atom_list_; ptr; ptr = ptr->next_)
     {
-      Atom * i = ptr->car_p_;
+      Atom * i = ptr->car_;
 #endif
       Offset a_off = i->off_;
       a_off += o;
diff --git a/lily/parser.yy b/lily/parser.yy
index 6ad7ffdb16..300834a248 100644
--- a/lily/parser.yy
+++ b/lily/parser.yy
@@ -40,7 +40,7 @@
 #include "scope.hh"
 #include "relative-music.hh"
 #include "transposed-music.hh"
-#include "compressed-music.hh"
+#include "time-scaled-music.hh"
 #include "repeated-music.hh"
 
 // mmm
@@ -707,7 +707,13 @@ Music:
 	;
 
 Alternative_music:
-	ALTERNATIVE Simultaneous_music {
+	/* empty */ {
+
+		/* UGH*/
+               Music_list* m = new Music_list;
+               $$ = new Sequential_music (m);
+	}
+	| ALTERNATIVE Simultaneous_music {
 		$$ = $2;
 	}
 	| ALTERNATIVE Sequential_music {
@@ -739,10 +745,10 @@ Simple_music:
 	| translator_change
 	| Simple_music '*' unsigned '/' unsigned 	{
 		/* urg */
-		$$ = new Compressed_music ($3, $5, $1);
+		$$ = new Time_scaled_music ($3, $5, $1);
 	}
 	| Simple_music '*' unsigned		 {
-		$$ = new Compressed_music ($3, 1, $1);
+		$$ = new Time_scaled_music ($3, 1, $1);
 	}
 	;
 
@@ -767,7 +773,7 @@ Composite_music:
 		unsigned '/' unsigned Music 	
 
 	{
-		$$ = new Compressed_music ($3, $5, $6);
+		$$ = new Time_scaled_music ($3, $5, $6);
 		$$->set_spot (THIS->pop_spot ());
 	}
 	| Repeated_music		{ $$ = $1; }
@@ -1308,8 +1314,8 @@ simple_element:
 		delete $1;
 		n->duration_ = *$4;
 		delete $4;
-		n->forceacc_b_ = $2 % 2;
 		n->cautionary_b_ = $3 % 2;
+		n->forceacc_b_ = $2 % 2 || n->cautionary_b_;
 
 		Simultaneous_music*v = new Request_chord;
 		v->set_spot (THIS->here_input ());
diff --git a/lily/performance.cc b/lily/performance.cc
index c9b1909b25..f25b63eea1 100644
--- a/lily/performance.cc
+++ b/lily/performance.cc
@@ -125,8 +125,8 @@ Performance::print() const
 #ifndef NPRINT
   DOUT << "Performance { ";
   DOUT << "Items: ";
-  for (Cons<Audio_element>* i =audio_elem_p_list_; i; i = i->next_cons_p_)
-    i->car_p_->print ();
+  for (Cons<Audio_element>* i =audio_elem_p_list_; i; i = i->next_)
+    i->car_->print ();
   DOUT << "}";
 #endif
 }
diff --git a/lily/protected-scm.cc b/lily/protected-scm.cc
index 356bbf2121..cf06c84a5d 100644
--- a/lily/protected-scm.cc
+++ b/lily/protected-scm.cc
@@ -7,11 +7,16 @@
   
  */
 #include "protected-scm.hh"
-extern "C"
-{
-#include <libguile/gc.h>
-};
+#include "lily-guile.hh"
+#include "main.hh"
 
+#ifdef LYPROT
+#define PROTECT   ly_protect_scm
+#define UNPROTECT ly_unprotect_scm
+#else
+#define PROTECT   scm_protect_object 
+#define UNPROTECT scm_unprotect_object
+#endif
 
 Protected_scm::Protected_scm ()
 {
@@ -20,31 +25,38 @@ Protected_scm::Protected_scm ()
 
 Protected_scm::Protected_scm (SCM s)
 {
-  object_ = s  ? scm_protect_object (s): 0;
+  object_ = s  ? PROTECT (s): 0;
 }
 
 Protected_scm::Protected_scm (Protected_scm const &s)
 {
-  object_ = s.object_ ? scm_protect_object (s.object_) : 0;
+  object_ = s.object_ ? PROTECT (s.object_) : 0;
 }
 
 Protected_scm & 
-Protected_scm::operator =(Protected_scm const &s)
+Protected_scm::operator =(SCM s)
 {
-  if (this == &s)
+  if (object_ == s)
     return *this;
   if (object_)
-    scm_unprotect_object(object_);
+    UNPROTECT(object_);
 
-  object_ = (s.object_) ? scm_protect_object (s.object_): 0;
+  object_ =  s ? PROTECT (s): 0;
   return *this;
 }
 
+Protected_scm&
+Protected_scm::operator = (Protected_scm const &s)
+{
+  return operator= (s.object_);
+}
+
+
 Protected_scm::~Protected_scm ()
 {
   if  (object_)
     {
-      scm_unprotect_object (object_);
+      UNPROTECT (object_);
       object_ =0L;		// be nice to conservative GC
     }
 }
diff --git a/lily/repeat-engraver.cc b/lily/repeat-engraver.cc
index 06a033696c..8a3cbdf597 100644
--- a/lily/repeat-engraver.cc
+++ b/lily/repeat-engraver.cc
@@ -45,9 +45,9 @@ Repeat_engraver::do_try_music (Music* m)
       Moment alt_mom = now_mom () + repeat_length_mom;
       if (repeat_length_mom)
 	{
-	  for (Cons<Music> *i (alt->music_p_list_p_->head_cons_p_); i && i->next_cons_p_; i = i->next_cons_p_)
+	  for (Cons<Music> *i (alt->music_p_list_p_->head_); i && i->next_; i = i->next_)
 	    {
-	      stop_mom += i->car_p_->length_mom ();
+	      stop_mom += i->car_->length_mom ();
 	      if (dynamic_cast<Simultaneous_music *> (alt))
 		break;
 	    }
@@ -71,23 +71,23 @@ Repeat_engraver::do_try_music (Music* m)
       if (prop.length_i ())
 	span_mom = prop.to_rat ();
 
-      int alt_i = r->repeats_i_ + 1 - cons_list_size_i (alt->music_p_list_p_->head_cons_p_ ) >? 1;
-      for (Cons<Music> *i = alt->music_p_list_p_->head_cons_p_; i ; i = i->next_cons_p_)
+      int alt_i = r->repeats_i_ + 1 - cons_list_size_i (alt->music_p_list_p_->head_ ) >? 1;
+      for (Cons<Music> *i = alt->music_p_list_p_->head_; i ; i = i->next_)
         {
-	  alternative_music_arr_.push (i->car_p_);
+	  alternative_music_arr_.push (i->car_);
 	  alternative_start_mom_arr_.push (alt_mom);
 	  if (span_mom)
 	    alternative_stop_mom_arr_.push (alt_mom + span_mom);
 	  else
-	    alternative_stop_mom_arr_.push (alt_mom + i->car_p_->length_mom ());
+	    alternative_stop_mom_arr_.push (alt_mom + i->car_->length_mom ());
 	  String str;
-	  if ((alt_i != 1) && (alt_i != r->repeats_i_) && (i == alt->music_p_list_p_->head_cons_p_))
+	  if ((alt_i != 1) && (alt_i != r->repeats_i_) && (i == alt->music_p_list_p_->head_))
 	    str = "1.-";
 	  str += to_str (alt_i) + ".";
 	  alt_i++;
 	  alternative_str_arr_.push (str);
 	  if (!dynamic_cast<Simultaneous_music *> (alt))
-	    alt_mom += i->car_p_->length_mom ();
+	    alt_mom += i->car_->length_mom ();
 	}
       return true;
     }
diff --git a/lily/request-iterator.cc b/lily/request-iterator.cc
index 0aacb6ce04..ca103ee062 100644
--- a/lily/request-iterator.cc
+++ b/lily/request-iterator.cc
@@ -63,17 +63,17 @@ Request_chord_iterator::do_process_and_next (Moment mom)
 {
   if (first_b_)
     {
-      for (Cons<Music> *i = elt_l ()->music_p_list_p_->head_cons_p_; i; i = i->next_cons_p_)
+      for (Cons<Music> *i = elt_l ()->music_p_list_p_->head_; i; i = i->next_)
 	{
-	  if (Request * req_l = dynamic_cast<Request*> (i->car_p_))
+	  if (Request * req_l = dynamic_cast<Request*> (i->car_))
 	    {
 	      bool gotcha = report_to_l()->try_music (req_l);
 	      if (!gotcha)
 		req_l->warning (_f ("junking request: `%s\'", classname( req_l)));
 	    }
 	  else
-	    i->car_p_->warning (_f ("Huh? Not a Request: `%s\'",
-				   classname (i->car_p_)));
+	    i->car_->warning (_f ("Huh? Not a Request: `%s\'",
+				   classname (i->car_)));
 	}
       first_b_ = false;
     }
diff --git a/lily/rest-collision-engraver.cc b/lily/rest-collision-engraver.cc
index 59bddd1975..756bb50bee 100644
--- a/lily/rest-collision-engraver.cc
+++ b/lily/rest-collision-engraver.cc
@@ -24,7 +24,7 @@ Rest_collision_engraver::Rest_collision_engraver()
 void
 Rest_collision_engraver::process_acknowledged ()
 {
-  if (rest_collision_p_ ||   note_column_l_arr_.size () < 2)
+  if (rest_collision_p_ || note_column_l_arr_.size () < 2)
     return;
 
   rest_collision_p_ = new Rest_collision;
diff --git a/lily/rest-collision.cc b/lily/rest-collision.cc
index 77eecea668..0103302408 100644
--- a/lily/rest-collision.cc
+++ b/lily/rest-collision.cc
@@ -5,7 +5,7 @@
 
   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
-
+#include "beam.hh"
 #include "debug.hh"
 #include "rest-collision.hh"
 #include "note-column.hh"
@@ -13,6 +13,7 @@
 #include "note-head.hh"
 #include "collision.hh"
 #include "paper-def.hh"
+#include "rest.hh"
 
 void
 Rest_collision::add_column (Note_column *nc_l)
@@ -24,16 +25,6 @@ Rest_collision::add_column (Note_column *nc_l)
     ncol_l_arr_.push (nc_l);
 }
 
-void
-Rest_collision::do_post_processing()
-{
-  /*
-    [TODO]
-    handle rest under beam (do_post: beams are calculated now)
-    what about combination of collisions and rest under beam
-   */
-}
-
 void
 Rest_collision::do_pre_processing()
 {
@@ -41,7 +32,9 @@ Rest_collision::do_pre_processing()
      handle rest-rest and rest-note collisions
 
      [todo]
-     decide not to print rest if too crowded?
+     * decide not to print rest if too crowded?
+
+     * ignore rests under beams.
    */
 
   // no rests to collide
@@ -55,41 +48,70 @@ Rest_collision::do_pre_processing()
   // meisjes met meisjes
   if (!ncol_l_arr_.size()) 
     {
+      /*
+	UGH.  Should get dims from table.  Should have minimum dist.
+       */
       int dy = rest_l_arr_.size() > 2 ? 6 : 4;
 	
       rest_l_arr_[0]->translate_rests (rest_l_arr_[0]->dir () *dy);	
-      // top is last element...
-      rest_l_arr_.top()->translate_rests (rest_l_arr_.top ()->dir ()* dy);	
+      rest_l_arr_.top()->translate_rests (rest_l_arr_.top ()->dir ()* dy);
     }
   // meisjes met jongetjes
   else 
     {
-      // int dir_i = - ncol_l_arr_[0]->dir_;
-      Direction dir = rest_l_arr_[0]->dir ();
-	
-      // minimum move
-      int minpos = 4;
-	
-      // quart rest height
-      // UGH Should get dims from table!
-      int size_i = 6;
-	
+      if (rest_l_arr_.size () > 1)
+	{
+	  warning (_("Too many colliding rests."));
+	}
+      if (ncol_l_arr_.size () > 1)
+	{
+	  warning (_("Too many notes for rest collision."));
+	}
+      Note_column * rcol = rest_l_arr_[0];
 
+      // try to be opposite of noteheads. 
+      Direction dir = - ncol_l_arr_[0]->dir();
+
+      Interval restdim;
+      for (int i=0; i < rcol->rest_l_arr_.size(); i++)
+	restdim.unite (rcol->rest_l_arr_[i]->extent (Y_AXIS));
+
+      if (restdim.empty_b ())
+	return;
+      
       // staff ref'd?
-      Real internote_f = paper_l ()->get_realvar (interline_scm_sym)/2.0;
-      int sep_i = 3 + size_i / 2;
+      Real staff_space = rcol->rest_l_arr_[0]->staff_line_leading_f ();      
+      Real internote_f = staff_space/2;
+      Real minimum_dist = paper_l ()->get_var ("restcollision_minimum_dist")
+	* internote_f;
+      
+      /*
+	assumption: ref points are the same. 
+       */
+      Interval notedim;
       for (int i = 0; i < ncol_l_arr_.size(); i++) 
 	{
-	  // how to know whether to sort?
-	  ncol_l_arr_[i]->sort();
-	  for (int j = 0; j < ncol_l_arr_[i]->head_l_arr_.size(); j++)
-	    {
-	      int stem = (int)((ncol_l_arr_[i]->stem_l_->extent
-			       (Y_AXIS)[dir]) / internote_f);
-	      minpos = minpos >? (dir * stem + sep_i);
-	    }
+	  notedim.unite (ncol_l_arr_[i]->extent (Y_AXIS));
 	}
-      rest_l_arr_[0]->translate_rests (dir * minpos);	
+
+      Interval inter (notedim);
+      inter.intersect (restdim);
+
+      Real dist =
+	minimum_dist +  dir * (notedim[dir] - restdim[-dir]) >? 0;
+
+
+      int stafflines = rcol->rest_l_arr_[0]->lines_i ();
+
+      
+      // move discretely by half spaces.
+      int discrete_dist = int (ceil (dist / (0.5 *staff_space)));
+
+      // move by whole spaces inside the staff.
+      if (discrete_dist < stafflines+1)
+	discrete_dist = int (ceil (discrete_dist / 2.0)* 2.0);
+      
+      rcol->translate_rests (dir * discrete_dist);
     }
 }
 
diff --git a/lily/rest.cc b/lily/rest.cc
index b737dea036..2c9c91eff5 100644
--- a/lily/rest.cc
+++ b/lily/rest.cc
@@ -17,15 +17,15 @@
 void
 Rest::do_add_processing ()
 {
-  if (balltype_i_ > 1)
-    position_i_ -= 4;
-  else if (balltype_i_ == 0)
+  if (balltype_i_ == 0)
     position_i_ += 2;
 
   Rhythmic_head::do_add_processing ();
-  if (dots_l_ && balltype_i_ > 1)
+  if (dots_l_ && balltype_i_ > 4)
     {
-      dots_l_->position_i_ = position_i_ + 4;
+      dots_l_->position_i_ = position_i_ + 3;
+      if (balltype_i_ == 7)
+	dots_l_->position_i_++;
     }
 }
 
@@ -37,8 +37,12 @@ Rest::Rest ()
 Molecule *
 Rest::do_brew_molecule_p () const
 {
-  bool streepjes_b = abs(position_i_) > lines_i () / 2 &&  
-    (balltype_i_ == 0 || balltype_i_ == 1);
+  bool ledger_b =false;
+
+  if (balltype_i_ == 0 || balltype_i_ == 1)
+    ledger_b = abs(position_i_  - (2* balltype_i_ - 1)) > lines_i (); 
+      
+
   
   String style; 
   SCM style_sym =get_elt_property (style_scm_sym);
@@ -47,7 +51,7 @@ Rest::do_brew_molecule_p () const
       style = ly_scm2string (SCM_CDR(style_sym));
     }
   
-  Molecule s(lookup_l ()->rest (balltype_i_, streepjes_b, style));
+  Molecule s(lookup_l ()->rest (balltype_i_, ledger_b, style));
   Molecule * m = new Molecule ( Molecule (s));
   m->translate_axis (position_i_ *  staff_line_leading_f ()/2.0, Y_AXIS);
   return m;
diff --git a/lily/rod.cc b/lily/rod.cc
index 6fd1a0822f..8f3cdc9260 100644
--- a/lily/rod.cc
+++ b/lily/rod.cc
@@ -13,19 +13,6 @@
 #include "single-malt-grouping-item.hh"
 
 
-Rod::Rod (Single_malt_grouping_item *l, Single_malt_grouping_item *r)
-{
-  item_l_drul_[LEFT] =l;
-  item_l_drul_[RIGHT]=r;
-
-  Interval li (l->my_width ());
-  Interval ri (r->my_width ());
-  if (li.empty_b () || ri.empty_b ())
-    distance_f_ = 0;
-  else
-    distance_f_ = li[RIGHT] - ri[LEFT] + 1.5 PT; // ugh
-}
-	  
 Rod::Rod ()
 {
   distance_f_ = 0.0;
diff --git a/lily/score-column.cc b/lily/score-column.cc
index 05280c5cb1..9744e3106a 100644
--- a/lily/score-column.cc
+++ b/lily/score-column.cc
@@ -11,58 +11,28 @@
 #include "score-column.hh"
 #include "command-request.hh"
 
-Score_column::Score_column (Moment w, bool musical_b)
+Score_column::Score_column (Moment w)
 {
   break_penalty_i_ = 0;
   when_ = w;
-  musical_b_ = musical_b;
 }
 
 void
 Score_column::do_print() const
 {
 #ifndef NPRINT
-  DOUT << "mus "<< musical_b_ << " at " <<  when_ << '\n';
+  DOUT << " at " <<  when_ << '\n';
   if (break_penalty_i_ >= Break_req::FORCE)
     DOUT << "Break forced";
-      
-  DOUT << "durations: [";
-  for (int i=0; i < durations.size(); i++)
-    DOUT << durations[i] << " ";
-  DOUT << "]\n";
+
+  DOUT << "Shortest playing: " <<  shortest_playing_mom_ << " shortest starter: " << shortest_starter_mom_;
   Paper_column::do_print();
 #endif
 }
 
-int
-Moment_compare (Moment const &m1, Moment const &m2)
-{
-  return sign (m1-m2);
-}
-
-void
-Score_column::preprocess()
-{
-  Paper_column ::preprocess ();
-  durations.sort (Moment_compare);
-}
 
-void
-Score_column::add_duration (Moment d)
+bool
+Score_column::musical_b () const
 {
-  if (!d)
-    {
-      warning (_f ("ignoring zero duration added to column at %s",
-	       when_.str ()));
-      return;
-    }
-  
-  for (int i = 0; i< durations.size(); i++) 
-    {
-      if (d == durations[i])
-	return ;
-    }
-  durations.push (d);
+  return shortest_starter_mom_ != Moment(0);
 }
-
-
diff --git a/lily/score-element.cc b/lily/score-element.cc
index 992d2eee1d..3b11a3e51b 100644
--- a/lily/score-element.cc
+++ b/lily/score-element.cc
@@ -61,7 +61,6 @@ Score_element::Score_element (Score_element const&s)
 
 Score_element::~Score_element()
 {
-  element_property_alist_ = SCM_EOL; // try to be nice to GC.
   delete output_p_; 
   assert (status_i_ >=0);
   status_i_  = -1;
@@ -79,8 +78,6 @@ Score_element::dependency_size () const
   return dependency_arr_.size ();
 }
 
-
-
 SCM
 Score_element::get_elt_property (SCM sym) const
 {
@@ -149,14 +146,12 @@ Score_element::print() const
 #endif
 }
 
-
 Paper_def*
 Score_element::paper_l ()  const
 {
  return pscore_l_->paper_l_;
 }
 
-
 Lookup const *
 Score_element::lookup_l () const
 {
@@ -183,7 +178,6 @@ Score_element::add_processing()
   do_add_processing();
 }
 
-
 void
 Score_element::calculate_dependencies (int final, int busy,
 				    Score_element_method_pointer funcptr)
@@ -227,14 +221,11 @@ Score_element::output_processing ()
   pscore_l_->schedule_for_delete (this);
 }
 
-
-
 /*
   
   VIRTUAL STUBS
 
  */
-
 void
 Score_element::do_break_processing()
 {
diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc
index 5aef404467..f2db1d0f1e 100644
--- a/lily/score-engraver.cc
+++ b/lily/score-engraver.cc
@@ -85,32 +85,16 @@ Score_engraver::announce_element (Score_element_info info)
   info.origin_grav_l_arr_.push (this);
 }
 
+/* All elements are propagated to the top upon announcement. If
+   something was created during one run of
+   Engraver_group_engraver::do_announces, then
+   announce_info_arr_.size() will be nonzero again
+*/
 void
 Score_engraver::do_announces()
 {
-  /* All elements are propagated to the top upon announcement. If
-     something was created during one run of
-     Engraver_group_engraver::do_announces, then
-     announce_info_arr_.size() will be nonzero again
-
-     */
   while (announce_info_arr_.size()) 
-    {
-      for (int i=0; i < announce_info_arr_.size(); i++)
-	/*
-	  TODO
-
-	  More subtle spacing
-	  */
-	if (announce_info_arr_[i].req_l_) 
-	  {
-	    if (Rhythmic_req *rq = dynamic_cast <Rhythmic_req *> (announce_info_arr_[i].req_l_))
-	      {
-		musical_column_l_->add_duration (rq->length_mom ());
-	      }
-	  }
-      Engraver_group_engraver::do_announces();
-    }
+    Engraver_group_engraver::do_announces();
 }
 
 
@@ -194,10 +178,8 @@ Score_engraver::set_columns (Score_column *new_command_l,
       command_column_l_ =0;
     }
   if (new_command_l) 
-    {
-      command_column_l_ = new_command_l;
-      command_column_l_->musical_b_ = false;
-    }
+    command_column_l_ = new_command_l;
+
   if (musical_column_l_ && musical_column_l_->linked_b()) 
     {
       pscore_p_->add_column (musical_column_l_);
@@ -212,7 +194,6 @@ Score_engraver::set_columns (Score_column *new_command_l,
   if (new_musical_l) 
     {
       musical_column_l_ = new_musical_l;
-      musical_column_l_->musical_b_ = true;
     }
 }
 
diff --git a/lily/separating-group-spanner.cc b/lily/separating-group-spanner.cc
index ccd114f55f..2db95f52f4 100644
--- a/lily/separating-group-spanner.cc
+++ b/lily/separating-group-spanner.cc
@@ -11,6 +11,26 @@
 #include "single-malt-grouping-item.hh"
 #include "p-col.hh"
 #include "paper-def.hh"
+#include "dimensions.hh"
+
+static Rod
+make_rod (Single_malt_grouping_item *l, Single_malt_grouping_item *r)
+{
+  Rod rod;
+  rod.item_l_drul_[LEFT] =l;
+  rod.item_l_drul_[RIGHT]=r;
+
+  Interval li (l->my_width ());
+  Interval ri (r->my_width ());
+  
+  if (li.empty_b () || ri.empty_b ())
+    rod.distance_f_ = 0;
+  else
+    rod.distance_f_ = li[RIGHT] - ri[LEFT];
+
+  return rod;
+}
+  
 
 Array<Rod>
 Separating_group_spanner::get_rods () const
@@ -26,22 +46,22 @@ Separating_group_spanner::get_rods () const
       Single_malt_grouping_item *rb
 	= dynamic_cast<Single_malt_grouping_item*>(r->find_prebroken_piece (LEFT));
       
-      a.push (Rod (spacing_unit_l_arr_[i], spacing_unit_l_arr_[i+1]));
+      a.push (make_rod(spacing_unit_l_arr_[i], spacing_unit_l_arr_[i+1]));
       if (lb)
 	{
-	  Rod rod(lb, r);
+	  Rod rod(make_rod (lb, r));
 	  rod.distance_f_ += padding_f_;
 	  a.push (rod);
 	}
       
       if (rb)
 	{
-	  a.push (Rod (l, rb));
+	  a.push (make_rod (l, rb));
 	}
       
       if (lb && rb)
 	{
-	  Rod rod(lb, rb);
+	  Rod rod(make_rod (lb, rb));
 	  rod.distance_f_ += padding_f_;
 	  a.push (rod);
 	}
@@ -58,7 +78,8 @@ Separating_group_spanner::add_spacing_unit (Single_malt_grouping_item*i)
 }
 
 void
-Separating_group_spanner::do_substitute_element_pointer (Score_element*o, Score_element*n)
+Separating_group_spanner::do_substitute_element_pointer (Score_element*o,
+							 Score_element*n)
 {
   if (dynamic_cast<Single_malt_grouping_item *> (o))
     {
diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc
index be02dcf102..f60ccd5730 100644
--- a/lily/separating-line-group-engraver.cc
+++ b/lily/separating-line-group-engraver.cc
@@ -38,7 +38,7 @@ Separating_line_group_engraver::do_removal_processing ()
     }
   else
     {
-      sep_span_p_->padding_f_ = 1.5 * paper_l ()->get_realvar (interline_scm_sym);
+      sep_span_p_->padding_f_ = paper_l ()->get_realvar (ly_symbol ("postBreakPadding"));
     }
 
   sep_span_p_->set_bounds (RIGHT, get_staff_info ().command_pcol_l ());
diff --git a/lily/sequential-music-iterator.cc b/lily/sequential-music-iterator.cc
index 3a32f9b0a6..b1a9ab6198 100644
--- a/lily/sequential-music-iterator.cc
+++ b/lily/sequential-music-iterator.cc
@@ -28,7 +28,7 @@ Sequential_music_iterator::Sequential_music_iterator ()
 void
 Sequential_music_iterator::construct_children()
 {
-  cursor_ = dynamic_cast<Sequential_music const*> (music_l_)->music_p_list_p_->head_cons_p_;
+  cursor_ = dynamic_cast<Sequential_music const*> (music_l_)->music_p_list_p_->head_;
   
   while (cursor_)
     {
@@ -50,16 +50,16 @@ Sequential_music_iterator::leave_element()
 {
   delete iter_p_;
   iter_p_ =0;
-  Moment elt_time = cursor_->car_p_->length_mom ();
+  Moment elt_time = cursor_->car_->length_mom ();
   here_mom_ += elt_time;
-  cursor_ =cursor_->next_cons_p_;
+  cursor_ =cursor_->next_;
 }
 
 void
 Sequential_music_iterator::start_next_element()
 {
   assert (!iter_p_);
-  iter_p_ = get_iterator_p (cursor_->car_p_);
+  iter_p_ = get_iterator_p (cursor_->car_);
 }
 
 void
diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc
index 8872bd1ebe..b83e5eaee8 100644
--- a/lily/simultaneous-music-iterator.cc
+++ b/lily/simultaneous-music-iterator.cc
@@ -27,9 +27,9 @@ Simultaneous_music_iterator::construct_children()
   int j = 0;
   Simultaneous_music const *sim = dynamic_cast<Simultaneous_music const*> (music_l_);
 
-  for (Cons<Music> *i = sim->music_p_list_p_->head_cons_p_; i;  i = i->next_cons_p_, j++)
+  for (Cons<Music> *i = sim->music_p_list_p_->head_; i;  i = i->next_, j++)
     {
-      Music_iterator * mi = get_iterator_p (i->car_p_);
+      Music_iterator * mi = get_iterator_p (i->car_);
       if (mi->ok()) 
 	{
 	  if  (sim->translator_type_str_.empty_b ())
@@ -46,25 +46,25 @@ void
 Simultaneous_music_iterator::do_print() const
 {
 #ifndef NPRINT
-  for (Cons<Music_iterator> *p = children_p_list_.head_cons_p_; p; p = p->next_cons_p_)
-    p->car_p_->print();
+  for (Cons<Music_iterator> *p = children_p_list_.head_; p; p = p->next_)
+    p->car_->print();
 #endif
 }
 
 void
 Simultaneous_music_iterator::do_process_and_next (Moment until)
 {
-  for (Cons<Music_iterator> **pp = &children_p_list_.head_cons_p_; *pp; )
+  for (Cons<Music_iterator> **pp = &children_p_list_.head_; *pp; )
     {
-      Music_iterator * i = (*pp)->car_p_;
+      Music_iterator * i = (*pp)->car_;
       if  (i->next_moment() == until) 
 	{
 	  i->process_and_next (until);
 	}
       if (!i->ok())
-	delete children_p_list_.remove_cons_p (pp);
+	delete children_p_list_.remove_cons (pp);
       else
-	pp = &(*pp)->next_cons_p_;
+	pp = &(*pp)->next_;
     }
   Music_iterator::do_process_and_next (until);
 }
@@ -78,8 +78,8 @@ Simultaneous_music_iterator::next_moment() const
   Moment next;
   next.set_infinite (1);
   
-  for (Cons<Music_iterator> *p = children_p_list_.head_cons_p_; p; p = p->next_cons_p_)
-    next = next <? p->car_p_->next_moment() ;
+  for (Cons<Music_iterator> *p = children_p_list_.head_; p; p = p->next_)
+    next = next <? p->car_->next_moment() ;
   return next;
 }
 
@@ -88,6 +88,6 @@ Simultaneous_music_iterator::next_moment() const
 bool
 Simultaneous_music_iterator::ok() const
 {
-  return children_p_list_.head_cons_p_;
+  return children_p_list_.head_;
 }
 
diff --git a/lily/single-malt-grouping-item.cc b/lily/single-malt-grouping-item.cc
index b11993efff..025d7f99f0 100644
--- a/lily/single-malt-grouping-item.cc
+++ b/lily/single-malt-grouping-item.cc
@@ -42,7 +42,13 @@ Single_malt_grouping_item::my_width () const
 	  warning (_("Single_malt_grouping_item: I've been drinking too much (fixme)"));
 	  continue;		/*UGH UGH*/ 
 	}
-      w.unite  (il->extent (X_AXIS) + il->relative_coordinate (&pc->dim_cache_[X_AXIS], X_AXIS));
+
+      Interval iv (il->extent (X_AXIS));
+      if (!iv.empty_b ())
+	{
+	  Real off = il->relative_coordinate (&pc->dim_cache_[X_AXIS], X_AXIS);
+	  w.unite  (iv + off);
+	}
     }
 
   return w;
@@ -52,7 +58,8 @@ Single_malt_grouping_item::my_width () const
 
 
 void
-Single_malt_grouping_item::do_substitute_element_pointer (Score_element*o, Score_element*n)
+Single_malt_grouping_item::do_substitute_element_pointer (Score_element*o,
+							  Score_element*n)
 {
   if (dynamic_cast <Item *> (o))
     {
diff --git a/lily/slur.cc b/lily/slur.cc
index ff5c720762..789f0aac8c 100644
--- a/lily/slur.cc
+++ b/lily/slur.cc
@@ -44,18 +44,19 @@ Slur::add_column (Note_column*n)
   add_dependency (n);
 }
 
-void
-Slur::set_default_dir ()
+Direction
+Slur::get_default_dir () const
 {
-  dir_ = DOWN;
+  Direction d = DOWN;
   for (int i=0; i < encompass_arr_.size (); i ++) 
     {
       if (encompass_arr_[i]->dir () < 0) 
 	{
-	  dir_ = UP;
+	  d = UP;
 	  break;
 	}
     }
+  return d;
 }
 
 void
@@ -91,28 +92,42 @@ Note_column_compare (Note_column *const&n1 , Note_column* const&n2)
   return Item::left_right_compare (n1, n2);
 }
 
-static bool
-broken_edge_b (Slur*s, Drul_array<Note_column*>& extrema, Direction dir)
+bool
+Slur::broken_edge_b ( Direction dir) const
 {
-  return extrema[dir] != s->spanned_drul_[dir];
+  return extrema ()[dir] != spanned_drul_[dir];
 }
 
-static bool
-normal_edge_b (Slur*s, Drul_array<Note_column*>& extrema, Direction dir)
+bool
+Slur::normal_edge_b ( Direction dir) const
 {
-  Note_column *n = extrema[dir];
-  return !broken_edge_b (s, extrema, dir)
+  Note_column *n = extrema ()[dir];
+  return !broken_edge_b ( dir)
     && n->stem_l_
     && n->stem_l_->get_elt_property (transparent_scm_sym) == SCM_BOOL_F
     && n->head_l_arr_.size ();
 }
 
+Drul_array<Note_column*>
+Slur::extrema ()const
+{
+  Drul_array<Note_column*> extrema;
+  extrema[LEFT] = encompass_arr_[0];
+  extrema[RIGHT] = encompass_arr_.top ();
+  return extrema;
+}
+
+/*
+  TODO.
+
+  Unhair this.
+ */
 void
 Slur::do_post_processing ()
 {
   encompass_arr_.sort (Note_column_compare);
   if (!dir_)
-    set_default_dir ();
+    dir_ = get_default_dir ();
 
   Real interline_f = paper_l ()->get_realvar (interline_scm_sym);
   Real internote_f = interline_f / 2;
@@ -132,15 +147,12 @@ Slur::do_post_processing ()
   
   Real gap_f = paper_l ()->get_var ("slur_x_gap");
 
-  Drul_array<Note_column*> extrema;
-  extrema[LEFT] = encompass_arr_[0];
-  extrema[RIGHT] = encompass_arr_.top ();
 
   Direction d=LEFT;
  
   do 
     {
-      if (broken_edge_b (this, extrema, d))
+      if (broken_edge_b (d))
 	{
 	  // ugh -- check if needed
 	  dx_f_drul_[d] = -d 
@@ -159,28 +171,28 @@ Slur::do_post_processing ()
       /*
         normal slur
        */
-      else if (normal_edge_b (this, extrema, d))
+      else if (normal_edge_b (d))
         {
-	  Real notewidth_f = extrema[d]->extent (X_AXIS).length ();
-	  dy_f_drul_[d] = (int)rint (extrema[d]->stem_l_-> extent (Y_AXIS)[dir_]);
+	  Real notewidth_f = extrema ()[d]->extent (X_AXIS).length ();
+	  dy_f_drul_[d] = (int)rint (extrema ()[d]->stem_l_-> extent (Y_AXIS)[dir_]);
 	  dx_f_drul_[d] += 0.5 * notewidth_f - d * gap_f;
-	  if (dir_ == extrema[d]->stem_l_->dir_)
+	  if (dir_ == extrema ()[d]->stem_l_->dir_)
 	    {
 	      if (dir_ == d)
-		dx_f_drul_[d] += 0.5 * (dir_ * d) * d * notewidth_f;
+		dx_f_drul_[d] += 0.5 * dir_ * notewidth_f;
 	      else
-		dx_f_drul_[d] += 0.25 * (dir_ * d) * d * notewidth_f;
+		dx_f_drul_[d] += 0.25 * dir_ * notewidth_f;
 	    }
 	}
 	else 
 	  {
-	    Real notewidth_f = extrema[d]->extent (X_AXIS).length ();
-	    dy_f_drul_[d] = (int)rint (extrema[d]->head_positions_interval ()
+	    Real notewidth_f = extrema ()[d]->extent (X_AXIS).length ();
+	    dy_f_drul_[d] = (int)rint (extrema ()[d]->head_positions_interval ()
 				       [dir_]) * internote_f;
 	    dx_f_drul_[d] += 0.5 * notewidth_f - d * gap_f;
 	}
 	dy_f_drul_[d] += dir_ * interline_f;
-	if (extrema[d]->stem_l_ && (dir_ == extrema[d]->stem_l_->dir_))
+	if (extrema ()[d]->stem_l_ && (dir_ == extrema ()[d]->stem_l_->dir_))
 	  dy_f_drul_[d] -= dir_ * internote_f;
       }
   while (flip(&d) != LEFT);
@@ -188,7 +200,7 @@ Slur::do_post_processing ()
   // now that both are set, do dependent
   do 
     {
-      if (broken_edge_b (this, extrema, d))
+      if (broken_edge_b (d))
         {
 	  Direction u = d;
 	  flip(&u);
@@ -205,12 +217,12 @@ Slur::do_post_processing ()
   /*
     Slur should follow line of music
    */
-  if (normal_edge_b (this, extrema, LEFT)
-      && normal_edge_b (this, extrema, RIGHT)
-      && (extrema[LEFT]->stem_l_ != extrema[RIGHT]->stem_l_))
+  if (normal_edge_b (LEFT)
+      && normal_edge_b (RIGHT)
+      && (extrema ()[LEFT]->stem_l_ != extrema ()[RIGHT]->stem_l_))
     {
-      Real note_dy = extrema[RIGHT]->stem_l_->head_positions ()[dir_]
-	- extrema[LEFT]->stem_l_->head_positions ()[dir_];
+      Real note_dy = extrema ()[RIGHT]->stem_l_->head_positions ()[dir_]
+	- extrema ()[LEFT]->stem_l_->head_positions ()[dir_];
       Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
       /*
 	Should we always follow note-heads, (like a tie)?
@@ -227,14 +239,14 @@ Slur::do_post_processing ()
 	  /*
 	    adjust only if no beam gets in the way
 	   */
-	  if (!extrema[adjust_dir]->stem_l_->beam_l_
-	      || (adjust_dir == extrema[adjust_dir]->stem_l_->dir_)
-	      || (extrema[adjust_dir]->stem_l_->beams_i_drul_[-adjust_dir] < 1))
+	  if (!extrema ()[adjust_dir]->stem_l_->beam_l_
+	      || (adjust_dir == extrema ()[adjust_dir]->stem_l_->dir_)
+	      || (extrema ()[adjust_dir]->stem_l_->beams_i_drul_[-adjust_dir] < 1))
 	    {
 	      dy_f_drul_[adjust_dir] = dy_f_drul_[-adjust_dir]
 		+ 2 * adjust_dir * realdy;
 	      Real dx = notewidth_f / 2;
-	      if (adjust_dir != extrema[adjust_dir]->stem_l_->dir_)
+	      if (adjust_dir != extrema ()[adjust_dir]->stem_l_->dir_)
 		dx /= 2;
 	      dx_f_drul_[adjust_dir] -= adjust_dir * dx;
 	    }
@@ -261,8 +273,17 @@ Slur::get_encompass_offset_arr () const
   Real notewidth = paper_l ()->note_width () * 0.8;
   Real gap = paper_l ()->get_var ("slur_x_gap");
 
+  /*
+  urg.  Calcs done wrt the leftmost note.  Fixme.
+
+  Calcs ignore possibility of pre/postbreak.
+
+
+  */
+
   Offset left = Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]);
   left[X_AXIS] += encompass_arr_[0]->stem_l_->hpos_f ();
+
   Real internote = encompass_arr_[0]->stem_l_->staff_line_leading_f ()/2.0;
 
   /*
@@ -296,35 +317,29 @@ Slur::get_encompass_offset_arr () const
   int last = encompass_arr_.size () - 1;
 
   // prebreak
-  if (encompass_arr_.top () != spanned_drul_[RIGHT])
+  if (broken_edge_b (RIGHT))
     last++;
 
   // postbreak
-  if (encompass_arr_[0] != spanned_drul_[LEFT])
+  if (broken_edge_b (LEFT))
     first--;
 
   Array<Offset> notes;
   notes.push (Offset (0,0));
 
-  for (int i = first; i < last; i++)
+  Real dy =0.0;
+  for (int i = 0; i < last; i++)
     {
       Encompass_info info (encompass_arr_[i], dir_, this);
-      notes.push (info.o_ - left);
-    }
-  Encompass_info info (encompass_arr_.top (), dir_, this);
-  Real inter_staff = info.interstaff_f_;
-  
-  d[Y_AXIS] += inter_staff;
-
-  // prebreak
-  if (inter_staff && (encompass_arr_.top () != spanned_drul_[RIGHT]))
-    {
-      Encompass_info info (encompass_arr_[encompass_arr_.size () - 1], dir_, this);
-      d[Y_AXIS] -= info.o_[Y_AXIS] - inter_staff;
+      if (i >= first)
+	notes.push (info.o_ - left);
+      else
+	dy = info.interstaff_f_;
     }
 
+  notes[0][Y_AXIS] += dy;
   notes.push (d);
-
+  
   return notes;
 }
 
diff --git a/lily/spacing-engraver.cc b/lily/spacing-engraver.cc
new file mode 100644
index 0000000000..525e7f9adc
--- /dev/null
+++ b/lily/spacing-engraver.cc
@@ -0,0 +1,120 @@
+/*   
+  spacing-engraver.cc --  implement Spacing_engraver
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#include "engraver.hh"
+#include "pqueue.hh"
+#include "musical-request.hh"
+#include "score-column.hh"
+
+struct Rhythmic_tuple
+{
+  Score_element_info info_;
+  Moment end_;
+  
+  Rhythmic_tuple ()
+    {
+    }
+  Rhythmic_tuple (Score_element_info i, Moment m )
+    {
+      info_ = i;
+      end_ = m;
+    }
+  static int time_compare (Rhythmic_tuple const &, Rhythmic_tuple const &);  
+};
+
+inline int
+compare (Rhythmic_tuple const &a, Rhythmic_tuple const &b)
+{
+  return Rhythmic_tuple::time_compare (a,b);
+}
+
+int
+Rhythmic_tuple::time_compare (Rhythmic_tuple const&h1,
+			      Rhythmic_tuple const &h2)
+{
+  return (h1.end_ - h2.end_ ).sign ();
+}
+
+/**
+   Acknowledge rhythmic elements, for initializing spacing fields in
+   the columns.  */
+class Spacing_engraver : public Engraver
+{
+  PQueue<Rhythmic_tuple> playing_durations_;
+  Array<Rhythmic_tuple> now_durations_;
+  Array<Rhythmic_tuple> stopped_durations_;
+
+protected:
+  VIRTUAL_COPY_CONS(Translator);
+  virtual void acknowledge_element (Score_element_info);
+  virtual void do_post_move_processing ();
+  virtual void do_pre_move_processing ();
+
+public:
+
+};
+
+
+void
+Spacing_engraver::acknowledge_element (Score_element_info i)
+{
+  if (Rhythmic_req * r = dynamic_cast<Rhythmic_req*>(i.req_l_))
+    {
+      Rhythmic_tuple t(i, now_mom () + r->length_mom ());
+      now_durations_.push (t);
+    }
+}
+
+void
+Spacing_engraver::do_pre_move_processing ()
+{
+  Moment shortest_playing;
+  shortest_playing.set_infinite (1);
+  for (int i=0; i < playing_durations_.size (); i++)
+    {
+      Moment m = (playing_durations_[i].info_.req_l_)->length_mom ();
+      if (m)
+	shortest_playing = shortest_playing <? m;
+    }
+
+  Moment starter;
+  starter.set_infinite (1);
+  for (int i=0; i < now_durations_.size (); i++)
+    {
+      Moment m = now_durations_[i].info_.req_l_->length_mom ();
+      if (m)
+	starter = starter <? m;
+
+      playing_durations_.insert (now_durations_[i]);
+    }
+  now_durations_.clear ();
+  
+  shortest_playing = shortest_playing <? starter;
+  
+  Score_column * sc
+    = dynamic_cast<Score_column*> (get_staff_info ().musical_pcol_l ());
+
+  sc->shortest_playing_mom_ = shortest_playing;
+  sc->shortest_starter_mom_ = starter;
+}
+
+
+void
+Spacing_engraver::do_post_move_processing ()
+{
+  Moment now = now_mom ();
+  stopped_durations_.clear ();
+  while (playing_durations_.size () && playing_durations_.front ().end_ < now)
+    playing_durations_.delmin ();
+  while (playing_durations_.size () && playing_durations_.front ().end_ == now)
+    stopped_durations_.push (playing_durations_.get ());
+}
+
+ADD_THIS_TRANSLATOR(Spacing_engraver);
+
diff --git a/lily/spring-spacer.cc b/lily/spring-spacer.cc
index 4b7c39b5b5..055ab3c6dd 100644
--- a/lily/spring-spacer.cc
+++ b/lily/spring-spacer.cc
@@ -68,9 +68,9 @@ Spring_spacer::handle_loose_cols()
   Union_find connected (cols_.size());
   Array<int> fixed;
   
-  for (Cons<Idealspacing> *i  = ideal_p_list_; i; i = i->next_cons_p_)
+  for (Cons<Idealspacing> *i  = ideal_p_list_; i; i = i->next_)
     {
-      connected.connect (i->car_p_->cols_drul_[LEFT],i->car_p_->cols_drul_[RIGHT]);
+      connected.connect (i->car_->cols_drul_[LEFT],i->car_->cols_drul_[RIGHT]);
     }
   for (int i = 0; i < cols_.size(); i++)
     if (cols_[i].fixed_b())
@@ -178,7 +178,8 @@ Spring_spacer::check_constraints (Vector v) const
   return true;
 }
 
-/** try to generate a solution which obeys the min distances and fixed positions
+/** try to generate a solution which obeys the min
+    distances and fixed positions
  */
 Vector
 Spring_spacer::try_initial_solution() const
@@ -240,9 +241,9 @@ Spring_spacer::make_matrices (Matrix &quad, Vector &lin, Real &c) const
   lin.fill (0);
   c = 0;
 
-  for (Cons<Idealspacing> *p =ideal_p_list_; p; p = p->next_cons_p_)
+  for (Cons<Idealspacing> *p =ideal_p_list_; p; p = p->next_)
     {
-      Idealspacing *i = p->car_p_;
+      Idealspacing *i = p->car_;
       int l = i->cols_drul_[LEFT];
       int r = i->cols_drul_[RIGHT];
 
@@ -296,9 +297,9 @@ Real
 Spring_spacer::calculate_energy_f (Vector solution) const
 {
   Real e = 0.0;
-  for (Cons<Idealspacing>*p =ideal_p_list_; p; p = p->next_cons_p_)
+  for (Cons<Idealspacing>*p =ideal_p_list_; p; p = p->next_)
     {
-      Idealspacing * i = p->car_p_;
+      Idealspacing * i = p->car_;
       e += i->energy_f(solution(i->cols_drul_[RIGHT]) - solution(i->cols_drul_[LEFT]));
     }
 
@@ -421,14 +422,14 @@ Spring_spacer::loosen_column (int idx)
 
   while (*pp)
     {
-      Idealspacing *j = (*pp)->car_p_;
+      Idealspacing *j = (*pp)->car_;
       if (j->cols_drul_[LEFT] == idx|| j->cols_drul_[RIGHT] == idx)
 	{
-	  delete remove_cons_p (pp);
+	  delete remove_cons (pp);
 	}
       else
 	{
-	  pp = &(*pp)->next_cons_p_;
+	  pp = &(*pp)->next_;
 	}
     }
   c.ugh_b_ = true;
@@ -453,9 +454,9 @@ Spring_spacer::print() const
       cols_[i].print();
     }
 
-  for (Cons<Idealspacing> *p =ideal_p_list_; p; p = p->next_cons_p_)
+  for (Cons<Idealspacing> *p =ideal_p_list_; p; p = p->next_)
     {
-      p->car_p_->print();
+      p->car_->print();
     }
 #endif
 }
@@ -477,9 +478,6 @@ Spring_spacer::connect (int i, int j, Real d, Real h)
   ideal_p_list_ = new Killing_cons<Idealspacing> (s, ideal_p_list_);
 }
 
-
-
-
 void
 Spring_spacer::prepare()
 {
@@ -501,8 +499,7 @@ Spring_spacer::constructor()
 /**
   get the shortest_playing running note at a time. */
 void
-Spring_spacer::get_ruling_durations(Array<Moment> &shortest_playing_arr,
-				    Array<Moment> &context_shortest_arr)
+Spring_spacer::get_ruling_durations(Array<Moment> &context_shortest_arr)
 {
   for (int i=0; i < cols_.size(); i++)
     {
@@ -517,44 +514,22 @@ Spring_spacer::get_ruling_durations(Array<Moment> &shortest_playing_arr,
   for (int i=0; i < cols_.size(); i++)
     {
       Score_column * sc = scol_l(i);
-      Moment now = scol_l (i)->when();
-      Moment shortest_playing;
-      shortest_playing.set_infinite (1);
 
-      if (!sc->musical_b ())
+      if (sc->breakable_b () || sc->break_status_dir ())
 	{
 	  for (int ji=i; ji >= start_context_i; ji--)
 	    context_shortest_arr[ji] = context_shortest;
 	  start_context_i = i;
 	  context_shortest.set_infinite (1);
 	}
-      if (sc->durations.size())
-	{
-	  context_shortest = context_shortest <? sc->durations[0];
-	}
-      
-      // ji was j, but triggered ICE
-      for (int ji=i+1; ji --;)
-	{
-	  if (scol_l(ji)->durations.size() &&
-	      now - scol_l(ji)->when() >= shortest_playing)
-	    break;
-
-	  for (int k =  scol_l (ji)->durations.size();
-	       k-- && scol_l(ji)->durations[k] + scol_l(ji)->when() > now;
-	       )
-	    {
-	      shortest_playing = shortest_playing <? scol_l(ji)->durations[k];
-	    }
-	}
-      shortest_playing_arr.push(shortest_playing);
+      else if (sc->musical_b ())
+	context_shortest = context_shortest <? sc->shortest_starter_mom_;
     }
 
 #ifndef NPRINT
-  DOUT << "shortest_playing/:[ ";
-  for (int i=0; i < shortest_playing_arr.size(); i++)
+  DOUT << "context shortest :[ ";
+  for (int i=0; i < context_shortest_arr.size(); i++)
     {
-      DOUT << shortest_playing_arr[i] << " ";
       DOUT << context_shortest_arr[i] << ", ";
     }
   DOUT << "]\n";
@@ -570,10 +545,9 @@ Spring_spacer::get_ruling_durations(Array<Moment> &shortest_playing_arr,
 
   TODO: This needs rethinking....... 
 
-  *  Spacing should take optical
-  effects into account
+  * Spacing should take optical effects into account
 
-  *  Should be decentralised
+  * Should be decentralised
   
   The algorithm is taken from :
 
@@ -585,9 +559,8 @@ Spring_spacer::get_ruling_durations(Array<Moment> &shortest_playing_arr,
 void
 Spring_spacer::calc_idealspacing()
 {
-  Array<Moment> shortest_playing_arr;
   Array<Moment> context_shortest_arr;
-  get_ruling_durations(shortest_playing_arr, context_shortest_arr);
+  get_ruling_durations(context_shortest_arr);
 
   Real interline_f = paper_l ()->get_realvar (interline_scm_sym);
 
@@ -607,7 +580,7 @@ Spring_spacer::calc_idealspacing()
 	{
 	  Real symbol_distance =cols_[i].width_[RIGHT] + 2 PT;
 	  Real durational_distance = 0;
-	  Moment delta_t =  scol_l (i+1)->when() - scol_l (i)->when () ;
+	  Moment delta_t =  scol_l (i+1)->when_mom () - scol_l (i)->when_mom () ;
 
 	  /*
 	    ugh should use shortest_playing distance
@@ -632,21 +605,21 @@ Spring_spacer::calc_idealspacing()
     {
       if (scol_l (i)->musical_b())
 	{
-	  Moment shortest_playing_len = shortest_playing_arr[i];
+	  Moment shortest_playing_len = scol_l(i)->shortest_playing_mom_;
 	  Moment context_shortest = context_shortest_arr[i];
 	  if (! shortest_playing_len)
 	    {
 	      warning (_f ("can't find a ruling note at %s", 
-	        scol_l (i)->when().str ()));
+	        scol_l (i)->when_mom ().str ()));
 	      shortest_playing_len = 1;
 	    }
 	  if (! context_shortest)
 	    {
 	      warning (_f ("no minimum in measure at %s", 
-		      scol_l (i)->when().str ()));
+		      scol_l (i)->when_mom ().str ()));
 	      context_shortest = 1;
 	    }
-	  Moment delta_t = scol_l (i+1)->when() - scol_l (i)->when ();
+	  Moment delta_t = scol_l (i+1)->when_mom () - scol_l (i)->when_mom ();
 	  Real k=  paper_l()->arithmetic_constant(context_shortest);
 	  Real dist = paper_l()->length_mom_to_dist (shortest_playing_len, k);
 	  dist *= (double)(delta_t / shortest_playing_len);
diff --git a/lily/stem-engraver.cc b/lily/stem-engraver.cc
index 44e991908a..f39bf56d2e 100644
--- a/lily/stem-engraver.cc
+++ b/lily/stem-engraver.cc
@@ -37,15 +37,14 @@ Stem_engraver::do_creation_processing ()
 void
 Stem_engraver::acknowledge_element(Score_element_info i)
 {
-  if (dynamic_cast<Rhythmic_head *> (i.elem_l_))
+  if (Rhythmic_head * h = dynamic_cast<Rhythmic_head *> (i.elem_l_))
     {
-      Rhythmic_head *h  = dynamic_cast<Rhythmic_head *> (i.elem_l_);
+      Rhythmic_req * r = dynamic_cast <Rhythmic_req *> (i.req_l_);
+      int duration_log = r->duration_.durlog_i_;      
       if (!stem_p_) 
 	{
-	  Rhythmic_req * r = dynamic_cast <Rhythmic_req *> (i.req_l_);
 	  stem_p_ = new Stem;
-	  int durlog_i = r->duration_.durlog_i_;
-	  stem_p_->flag_i_ = durlog_i;
+	  stem_p_->flag_i_ = duration_log;
 
 	  if (abbrev_req_l_)
 	    {
@@ -64,13 +63,19 @@ Stem_engraver::acknowledge_element(Score_element_info i)
 		{
 		  abbrev_p_ = new Abbreviation;
 		  announce_element (Score_element_info (abbrev_p_, abbrev_req_l_));
-		  abbrev_p_->abbrev_flags_i_ =intlog2 (t) - (durlog_i>? 2);
+		  abbrev_p_->abbrev_flags_i_ =intlog2 (t) - (duration_log>? 2);
 		}
 	    }
 
 	  // must give the request, to preserve the rhythmic info.
 	  announce_element (Score_element_info (stem_p_, r));
 	}
+
+      if (stem_p_->flag_i_ != duration_log)
+	{
+	  r->warning (_f("Adding note head to incompatible stem (type = %d)", 1 <<  stem_p_->flag_i_));
+	}
+      
       stem_p_->add_head (h);
     }
 }
diff --git a/lily/stem-info.cc b/lily/stem-info.cc
index 708c6b4f45..94877eb9fa 100644
--- a/lily/stem-info.cc
+++ b/lily/stem-info.cc
@@ -22,6 +22,9 @@
 Stem_info::Stem_info ()
 {
 }
+/*
+  FIXME: y dims should not be in internote.
+ */
 
 Stem_info::Stem_info (Stem*s, int mult)
 {
@@ -30,6 +33,7 @@ Stem_info::Stem_info (Stem*s, int mult)
   x_ = stem_l_->hpos_f ();
   dir_ = stem_l_->dir_;
   SCM bd = stem_l_->remove_elt_property (beam_dir_scm_sym);
+  
   beam_dir_ = gh_scm2int (SCM_CDR(bd));
   interstaff_f_ = 0;
 
@@ -107,6 +111,7 @@ Stem_info::Stem_info (Stem*s, int mult)
 
   // interstaff beam
   Beam* beam_l = stem_l_->beam_l_;
+  
   Dimension_cache *common = stem_l_->common_group (beam_l, Y_AXIS);
   Align_element * align = dynamic_cast<Align_element*> (common->element_l ());
   if (align && align->axis() == Y_AXIS)
diff --git a/lily/stem.cc b/lily/stem.cc
index 9a9452175a..55b2036269 100644
--- a/lily/stem.cc
+++ b/lily/stem.cc
@@ -160,11 +160,6 @@ Stem::get_dir () const
   return dir_;
 }
 
-void
-Stem::set_default_dir ()
-{
-  dir_ = get_default_dir ();
-}
 
 void
 Stem::set_default_stemlen ()
@@ -174,7 +169,8 @@ Stem::set_default_stemlen ()
   Real shorten_f = paper_l ()->get_var ("forced_stem_shorten0") / internote_f;
 
   if (!dir_)
-    set_default_dir ();
+    dir_ = get_default_dir ();
+
   /* 
     stems in unnatural (forced) direction should be shortened, 
     according to [Roush & Gourlay]
@@ -242,7 +238,7 @@ Stem::do_pre_processing ()
   if (yextent_drul_[DOWN]== yextent_drul_[UP])
     set_default_extents ();
   set_noteheads ();
-  flag_i_ = flag_i_;
+
   if (invisible_b ())
     {
       set_elt_property (transparent_scm_sym, SCM_BOOL_T);
diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc
index 177566d034..f726aaebf1 100644
--- a/lily/tie-engraver.cc
+++ b/lily/tie-engraver.cc
@@ -129,6 +129,12 @@ Tie_engraver::process_acknowledged ()
 
 		}
 	    }
+
+	  if (!tie_p_arr_.size ())
+	    {
+	      req_l_->warning (_("No ties were created!"));
+	    }
+	  
 	}
     }
 }
diff --git a/lily/tie.cc b/lily/tie.cc
index df313208cc..26ea948b44 100644
--- a/lily/tie.cc
+++ b/lily/tie.cc
@@ -35,12 +35,12 @@ Tie::Tie()
 /*
   ugh: direction of the Tie is more complicated.  See [Ross] p136 and further
  */
-void
-Tie::set_default_dir()
+Direction
+Tie::get_default_dir() const
 {
   int m= (head_l_drul_[LEFT]->position_i_ 
 	  + head_l_drul_[RIGHT]->position_i_) /2;
-  dir_ =  (m < 0)? DOWN : UP;
+  return(m < 0)? DOWN : UP;
 }
 
 void
diff --git a/lily/compressed-music-iterator.cc b/lily/time-scaled-music-iterator.cc
similarity index 56%
rename from lily/compressed-music-iterator.cc
rename to lily/time-scaled-music-iterator.cc
index b4794e40d2..c6a086419e 100644
--- a/lily/compressed-music-iterator.cc
+++ b/lily/time-scaled-music-iterator.cc
@@ -1,5 +1,5 @@
 /*   
-  compressed-music-iterator.cc --  implement Compressed_music_iterator
+  time-scaled-music-iterator.cc --  implement Time_scaled_music_iterator
   
   source file of the GNU LilyPond music typesetter
   
@@ -7,8 +7,8 @@
   
  */
 
-#include "compressed-music-iterator.hh"
-#include "compressed-music.hh"
+#include "time-scaled-music-iterator.hh"
+#include "time-scaled-music.hh"
 #include "musical-request.hh"
 #include "translator-group.hh"
 #include "command-request.hh"
@@ -16,11 +16,11 @@
 
 
 void
-Compressed_music_iterator::do_process_and_next (Moment m)
+Time_scaled_music_iterator::do_process_and_next (Moment m)
 {
   if (first_b_)
     {
-      bool success = report_to_l ()->try_music (dynamic_cast<Compressed_music const*> (music_l_));
+      bool success = report_to_l ()->try_music (dynamic_cast<Time_scaled_music const*> (music_l_));
       if (!success)
 	music_l_->warning ( _("No one to print a tuplet start bracket"));
     }
diff --git a/lily/time-scaled-music.cc b/lily/time-scaled-music.cc
new file mode 100644
index 0000000000..16c38b34d5
--- /dev/null
+++ b/lily/time-scaled-music.cc
@@ -0,0 +1,23 @@
+/*   
+  time-scaled-music.cc --  implement Time_scaled_music
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#include "time-scaled-music.hh"
+
+
+Time_scaled_music::Time_scaled_music (int n, int d,Music *mp)
+  : Music_wrapper (mp)
+{
+  num_i_ = n;
+  den_i_ = d;
+  compress (Moment (num_i_,den_i_));
+}
+
+
+
+
diff --git a/lily/timing-translator.cc b/lily/timing-translator.cc
index fa974f7bfa..1c00d0b597 100644
--- a/lily/timing-translator.cc
+++ b/lily/timing-translator.cc
@@ -68,8 +68,10 @@ Timing_translator::do_process_requests()
 	  else
 	    {
 	      time_.set_time_signature (b_i, o_i);
+
 	      default_grouping_ =
-		Rhythmic_grouping (MInterval (0,Moment (b_i, o_i)), b_i);
+		Rhythmic_grouping (MInterval (0,Moment (b_i, o_i)),
+				   b_i == 1 ? 2 : b_i);
 	    }
 	}
       else if (Partial_measure_req *pm = dynamic_cast <Partial_measure_req *> (tr_l))
diff --git a/lily/translator-group.cc b/lily/translator-group.cc
index fcb11f859b..009f7b9e95 100644
--- a/lily/translator-group.cc
+++ b/lily/translator-group.cc
@@ -81,7 +81,13 @@ Translator_group::set_element (String s, bool add)
     error ("Program has no such type");
 
   if (add)
-    consists_str_arr_.push (s);
+    {
+      for (int i=consists_str_arr_.size (); i--; )
+	if (consists_str_arr_[i] == s)
+	  warning (_f("Already contains a `%s\'", s));
+      
+      consists_str_arr_.push (s);
+    }
   else
     for (int i=consists_str_arr_.size (); i--; )
       if (consists_str_arr_[i] == s)
@@ -91,9 +97,9 @@ Translator_group::set_element (String s, bool add)
 bool
 Translator_group::removable_b() const
 {
-  for (Cons<Translator> *p = trans_p_list_.head_cons_p_; p; p = p->next_cons_p_)
+  for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
     {
-      if (dynamic_cast <Translator_group *> (p->car_p_))
+      if (dynamic_cast <Translator_group *> (p->car_))
 	return false;
     }
 
@@ -224,10 +230,10 @@ Link_array<Translator_group>
 Translator_group::group_l_arr () const
 {
   Link_array<Translator_group> groups;
-  for (Cons<Translator> *p = trans_p_list_.head_cons_p_; p; p = p->next_cons_p_)
+  for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
     {
-      if (dynamic_cast <Translator_group *> (p->car_p_))
-	groups.push (dynamic_cast <Translator_group *> (p->car_p_));
+      if (dynamic_cast <Translator_group *> (p->car_))
+	groups.push (dynamic_cast <Translator_group *> (p->car_));
     }
   return groups;
 }
@@ -236,10 +242,10 @@ Link_array<Translator>
 Translator_group::nongroup_l_arr () const
 {
   Link_array<Translator> groups;
-  for (Cons<Translator> *p = trans_p_list_.head_cons_p_; p; p = p->next_cons_p_)
+  for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
     {
-      if (!dynamic_cast <Translator_group *> (p->car_p_))
-	groups.push (p->car_p_);
+      if (!dynamic_cast <Translator_group *> (p->car_))
+	groups.push (p->car_);
     }
   return groups;
 }
@@ -266,11 +272,11 @@ Translator_group::remove_translator_p (Translator*trans_l)
 {
   assert (trans_l);
   
-  for (Cons<Translator> **pp = &trans_p_list_.head_cons_p_; *pp; pp = &(*pp)->next_cons_p_)
-    if ((*pp)->car_p_ == trans_l)
+  for (Cons<Translator> **pp = &trans_p_list_.head_; *pp; pp = &(*pp)->next_)
+    if ((*pp)->car_ == trans_l)
       {
-	Cons<Translator> *r = trans_p_list_.remove_cons_p (pp);
-	r->car_p_ =0;
+	Cons<Translator> *r = trans_p_list_.remove_cons (pp);
+	r->car_ =0;
 	trans_l->daddy_trans_l_ =0;
 	delete r;
 	return trans_l;
@@ -328,16 +334,16 @@ Translator_group::get_default_interpreter()
 void
 Translator_group::each (Method_pointer method)
 {
-  for (Cons<Translator> *p = trans_p_list_.head_cons_p_; p; p = p->next_cons_p_)
-    (p->car_p_->*method) ();
+  for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
+    (p->car_->*method) ();
 }
 
 
 void
 Translator_group::each (Const_method_pointer method) const
 {
-  for (Cons<Translator> *p = trans_p_list_.head_cons_p_; p; p = p->next_cons_p_)
-    (p->car_p_->*method) ();
+  for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
+    (p->car_->*method) ();
 }
 
 void
diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc
index ebbbad4a3a..51832adf9d 100644
--- a/lily/tuplet-engraver.cc
+++ b/lily/tuplet-engraver.cc
@@ -11,20 +11,19 @@
 #include "command-request.hh"
 #include "tuplet-spanner.hh"
 #include "note-column.hh"
-#include "compressed-music.hh"
-
+#include "time-scaled-music.hh"
 #include "beam.hh"
 #include "music-list.hh"
 
 bool
 Tuplet_engraver::do_try_music (Music *r)
 {
-  if (Compressed_music * c = dynamic_cast<Compressed_music *> (r))
+  if (Time_scaled_music * c = dynamic_cast<Time_scaled_music *> (r))
     {
       Music *el = c->element_l ();
       if (!dynamic_cast<Request_chord*> (el))
 	{
-	  compressed_music_arr_.push (c);
+	  time_scaled_music_arr_.push (c);
 	  stop_moments_.push (now_mom () + c->length_mom ());
 	}
       return true;
@@ -36,12 +35,12 @@ void
 Tuplet_engraver::do_process_requests ()
 {
   for (int i= started_span_p_arr_.size ();
-       i < compressed_music_arr_.size (); i++)
+       i < time_scaled_music_arr_.size (); i++)
     {
       Tuplet_spanner* glep = new Tuplet_spanner;
       started_span_p_arr_.push (glep);
-      glep->number_str_ = to_str (compressed_music_arr_[i]->den_i_);
-      announce_element (Score_element_info (glep, compressed_music_arr_ [i]));
+      glep->number_str_ = to_str (time_scaled_music_arr_[i]->den_i_);
+      announce_element (Score_element_info (glep, time_scaled_music_arr_ [i]));
     }
 }
 
@@ -56,7 +55,7 @@ Tuplet_engraver::acknowledge_element (Score_element_info i)
   else if (Beam *b = dynamic_cast<Beam *> (i.elem_l_))
     {
       for (int j = 0; j < started_span_p_arr_.size (); j++)
-	started_span_p_arr_[j]->set_beam (b);
+	started_span_p_arr_[j]->add_beam (b);
     }
 }
 
@@ -71,7 +70,7 @@ Tuplet_engraver::do_post_move_processing ()
 	  typeset_element (started_span_p_arr_[i]);
 	  started_span_p_arr_.del (i);
 	  stop_moments_.del(i);
-	  compressed_music_arr_.del(i);
+	  time_scaled_music_arr_.del(i);
 	}
     }
 }
diff --git a/lily/tuplet-spanner.cc b/lily/tuplet-spanner.cc
index a2068ecf25..adcb935f25 100644
--- a/lily/tuplet-spanner.cc
+++ b/lily/tuplet-spanner.cc
@@ -5,11 +5,8 @@
 
   (c)  1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
 */
-/*
-  todo: handle breaking elegantly.
- */
-#include "beam.hh"
 
+#include "beam.hh"
 #include "box.hh"
 #include "debug.hh"
 #include "lookup.hh"
@@ -18,16 +15,17 @@
 #include "paper-def.hh"
 #include "tuplet-spanner.hh"
 #include "stem.hh"
-
 #include "note-column.hh"
 
 Tuplet_spanner::Tuplet_spanner ()
 {
-  beam_l_ =0;
   bracket_visibility_b_ = true;
   num_visibility_b_ = true;
 }
 
+/*
+  TODO.  We should control the gap for lookup from here.
+ */
 Molecule*
 Tuplet_spanner::do_brew_molecule_p () const
 {
@@ -37,10 +35,13 @@ Tuplet_spanner::do_brew_molecule_p () const
     Real ncw = column_arr_.top ()->extent (X_AXIS).length ();
     Molecule num (lookup_l ()->text ("italic",
 				     number_str_));
+    num.align_to (X_AXIS, CENTER);
+    num.translate_axis (dir_ * paper_l ()->get_realvar (interline_scm_sym),  Y_AXIS);
 
-    if (beam_l_ && !bracket_visibility_b_)
+    if (beam_l_arr_.size () == 1 && !bracket_visibility_b_)
       {
-	Directional_spanner* ds = dynamic_cast<Directional_spanner*>(beam_l_);
+	Beam *beam_l = beam_l_arr_[0];
+	Directional_spanner* ds = dynamic_cast<Directional_spanner*>(beam_l);
 	num.translate (ds->center ());
 	num.translate_axis (ncw, X_AXIS);
       }
@@ -50,13 +51,15 @@ Tuplet_spanner::do_brew_molecule_p () const
 	Real dy = column_arr_.top ()->extent (Y_AXIS) [dir_]
 	  - column_arr_[0]->extent (Y_AXIS) [dir_];
 	Real w = extent (X_AXIS).length () + ncw;
-
+	//	num.align_to (Y_AXIS, CENTER);
 	num.translate (Offset (w/2, dy/2));
 	mol_p->add_molecule (lookup_l ()->plet (dy, w, dir_));
       }
 
     if (num_visibility_b_)
-      mol_p->add_molecule (num);
+      {
+	mol_p->add_molecule (num);
+      }
   }
   return mol_p;
 }
@@ -77,10 +80,14 @@ Tuplet_spanner::do_post_processing ()
   if (column_arr_.size())
     translate_axis (column_arr_[0]->extent (Y_AXIS)[dir_], Y_AXIS);
 
-  if (!broken_b () && beam_l_
-      && spanned_drul_[LEFT]->column_l () == beam_l_->spanned_drul_[LEFT]->column_l ()
-      && spanned_drul_[RIGHT]->column_l () == beam_l_->spanned_drul_[RIGHT]->column_l ())
-    bracket_visibility_b_ = false;
+  if (beam_l_arr_.size () == 1)
+    {
+      Beam * beam_l = beam_l_arr_[0];
+      if (!broken_b () 
+	  && spanned_drul_[LEFT]->column_l () == beam_l->spanned_drul_[LEFT]->column_l ()
+	  && spanned_drul_[RIGHT]->column_l () == beam_l->spanned_drul_[RIGHT]->column_l ())
+	bracket_visibility_b_ = false;
+    }
 
   if (column_arr_.size () == 1)
     bracket_visibility_b_ = false;
@@ -91,32 +98,32 @@ Tuplet_spanner::do_substitute_element_pointer (Score_element* o, Score_element*
 {
   if (Note_column *onc = dynamic_cast <Note_column *> (o))
     column_arr_.substitute (onc, dynamic_cast<Note_column*> (n));
-  else if (o == beam_l_)
+  else if (Beam * b = dynamic_cast<Beam* > (o))
     {
-      beam_l_ = dynamic_cast<Beam*> (n);
+      beam_l_arr_.substitute (b,  dynamic_cast<Beam*> (n));
     }
 }
 
-void
-Tuplet_spanner::set_default_dir ()
+Direction
+Tuplet_spanner::get_default_dir () const
 {
-  dir_ = UP;
+  Direction d = UP;
   for (int i=0; i < column_arr_.size (); i ++) 
     {
       if (column_arr_[i]->dir () < 0) 
 	{
-	  dir_ = DOWN;
+	  d = DOWN;
 	  break;
 	}
     }
+  return d;
 }
 
 void
-Tuplet_spanner::set_beam (Beam *b)
+Tuplet_spanner::add_beam (Beam *b)
 {
-  assert(!beam_l_);
-  beam_l_ = b;
   add_dependency (b);
+  beam_l_arr_.push (b);
 }
 
 void
diff --git a/lily/volta-spanner.cc b/lily/volta-spanner.cc
index 431d2aed37..39d220d442 100644
--- a/lily/volta-spanner.cc
+++ b/lily/volta-spanner.cc
@@ -47,11 +47,8 @@ Volta_spanner::do_brew_molecule_p () const
      column_arr_[0]->extent (Y_AXIS) [UP];
   dy += 2 * h;
 
-  /*
-    UGH.  Must use extent  ()[dir_]
-   */
   for (int i = 0; i < note_column_arr_.size (); i++)
-    dy = dy >? note_column_arr_[i]->extent (Y_AXIS).max ();
+    dy = dy >? note_column_arr_[i]->extent (Y_AXIS)[BIGGER];
   dy -= h;
 
   Molecule two (lookup_l ()->text ("number", "2"));
diff --git a/lily/word-wrap.cc b/lily/word-wrap.cc
index 9976e1bf13..49eeb41efd 100644
--- a/lily/word-wrap.cc
+++ b/lily/word-wrap.cc
@@ -20,22 +20,24 @@
    A Dynamic Programming type of algorithm
    similar to TeX's is in Gourlay_breaking
 
+
+   UGH.  Should think about pre/post break columns.
    */
 Array<Column_x_positions>
-Word_wrap::do_solve() const
+Word_wrap::do_solve () const
 {
-  problem_OK();
+  problem_OK ();
 
   Line_of_cols &allcols (pscore_l_->col_l_arr_);
   int curcol_idx = 0;
   
   Array<Column_x_positions> breaking;
-  Line_of_cols breakpoints (find_breaks());
-  assert (breakpoints.size()>=2);
+  Line_of_cols breakpoints (find_breaks ());
+  assert (breakpoints.size ()>=2);
 
   int break_idx=0;
   int line_no = 0;
-  while (break_idx < breakpoints.size() -1)
+  while (break_idx < breakpoints.size () -1)
     {
       Column_x_positions minimum;
       Column_x_positions current;
@@ -43,13 +45,15 @@ Word_wrap::do_solve() const
 
       // do  another line
       line_no ++;
-      Paper_column *post = breakpoints[break_idx]->postbreak_l();
+      Item *post = breakpoints[break_idx]->find_prebroken_piece (RIGHT);
+      Paper_column *postcol =dynamic_cast<Paper_column*>(post);
+      
       int start_break_idx = break_idx;
-      current.add_paper_column (post);
+      current.add_paper_column (postcol);
       curcol_idx++;		// skip the breakable.
       break_idx++;
 
-      while (break_idx < breakpoints.size())
+      while (break_idx < breakpoints.size ())
 	{
 	  // add another measure.
 	  while (breakpoints[break_idx] != allcols[curcol_idx])
@@ -57,8 +61,10 @@ Word_wrap::do_solve() const
 	      current.add_paper_column (allcols[curcol_idx]);
 	      curcol_idx++;
 	    }
-	  
-	  current.add_paper_column (breakpoints[break_idx]->prebreak_l());
+
+	  Item * pre = breakpoints[break_idx]->find_prebroken_piece (LEFT);
+	  Paper_column* precol = dynamic_cast<Paper_column*>(pre);
+	  current.add_paper_column (precol);
 
 	  current.spacer_l_ = generate_spacing_problem (current.cols, 
 	    pscore_l_->paper_l_->line_dimensions_int (line_no));
@@ -66,12 +72,12 @@ Word_wrap::do_solve() const
 	  // try to solve
 	  if (!feasible (current.cols))
 	    {
-	      if (!minimum.cols.size())
+	      if (!minimum.cols.size ())
 		{
 		  warning (_ ("ugh, this measure is too long") 
 		    + ", " + _f ("breakpoint: %d", break_idx) 
 		    + "(" + _ ("generating stupido solution") + ")");
-		  current.stupid_solution();
+		  current.stupid_solution ();
 		  current.energy_f_ = - 1; // make sure we break out.
 		}
 	      else
@@ -79,8 +85,8 @@ Word_wrap::do_solve() const
 	    }
 	  else
 	    {
-	      current.solve_line();
-	      current.print();
+	      current.solve_line ();
+	      current.print ();
 	    }
 
 	  delete current.spacer_l_;
@@ -106,7 +112,7 @@ Word_wrap::do_solve() const
 
 
 	  // add nobreak version of breakable column
-	  current.cols.top()=breakpoints[break_idx];
+	  current.cols.top ()=breakpoints[break_idx];
 	  curcol_idx ++;
 	  break_idx++;
 	}
@@ -117,7 +123,7 @@ Word_wrap::do_solve() const
   return breaking;
 }
 
-Word_wrap::Word_wrap()
+Word_wrap::Word_wrap ()
 {
   get_line_spacer = Spring_spacer::constructor;
 }
diff --git a/ly/engraver.ly b/ly/engraver.ly
index 6f31075489..6bfa8744e7 100644
--- a/ly/engraver.ly
+++ b/ly/engraver.ly
@@ -260,6 +260,7 @@ ScoreContext = \translator {
 
 	\consists "Span_score_bar_engraver";
 	\consists "Score_priority_engraver";
+	\consists "Spacing_engraver";
 	\consists "Vertical_align_engraver";
 	alignmentReference = \down;
 	defaultClef = treble;
diff --git a/ly/params.ly b/ly/params.ly
index 5dc91bbb19..6d50217687 100644
--- a/ly/params.ly
+++ b/ly/params.ly
@@ -13,7 +13,7 @@ interline = \staffheight / 4.0;
 staffline = \interline / 10.0;
 
 beam_thickness = 0.52 * (\interline - \staffline);
-interbeam = (2.0 * \interline - \beam_thickness) / 2.0;
+interbeam = (2.0 * \interline + \staffline - \beam_thickness) / 2.0;
 interbeam4 = (3.0 * \interline - \beam_thickness) / 3.0;
 
 % stems and beams
@@ -136,6 +136,12 @@ extender_height = 0.8*\staffline;
 % Multi-measure rests
 mmrest_x_minimum = 2.0*\staffheight;
 
+% in internote.
+restcollision_minimum_dist = 3.0;
+restcollision_minimum_beamdist = 1.5;
+
+postBreakPadding = 1.0*\interline;
+
 \include "engraver.ly";
 
 
diff --git a/ly/property.ly b/ly/property.ly
index 61b3333070..9e088a7325 100644
--- a/ly/property.ly
+++ b/ly/property.ly
@@ -146,9 +146,9 @@ voicefour = {
 	\shifton
 }
 
-onestaff = { 	
+onestaff = 
 	\translator Staff=one
-}
+
 
 staffone = { 	
 	\translator Staff=one
@@ -181,39 +181,38 @@ normal=1
 traditional=2
 infinity=10000
 
-beamslopeproportional = {
+beamslopeproportional = 
 	\property Score.beamslopedamping = \none
-}
 
-beamslopedamped = {
+beamslopedamped = 
 	\property Score.beamslopedamping = \normal
-}
 
-beamslopezero = {
+
+beamslopezero = 
 	\property Score.beamslopedamping = \infinity
-}
+
 
 % this sucks, you'd want to pass an array, at least
 % (or embedded code: you still can't dictate the slope / stemlength)
-beamposfree = {
+beamposfree = 
 	\property Score.beamquantisation = \none
-}
 
-beamposnormal = {
+
+beamposnormal = 
 	\property Score.beamquantisation = \normal
-}
 
-beampostraditional = {
+
+beampostraditional = 
 	\property Score.beamquantisation = \traditional
-}
 
-slurnormal = {
-	\property Voice.slurdash = 0
-}
 
-slurdotted = {
+slurnormal = 
+	\property Voice.slurdash = ""
+
+
+slurdotted = 
 	\property Voice.slurdash = 1
-}
+
 
 %{
  for grace note hack, see input/test/grace.ly
diff --git a/make/mudela-rules.make b/make/mudela-rules.make
index 14244c63dd..478f2da9fb 100644
--- a/make/mudela-rules.make
+++ b/make/mudela-rules.make
@@ -5,5 +5,5 @@
 
 
 $(outdir)/%.latex: %.doc
-	$(PYTHON) $(depth)/scripts/mudela-book.py --outdir=$(outdir)/ --outname=$(notdir $(basename $@)) $<
+	$(PYTHON) $(depth)/scripts/mudela-book.py -I $(depth)/input/test/ --outdir=$(outdir)/ --dependencies --outname=$(notdir $(basename $@)) $<
 
diff --git a/make/out/lelievijver.lsm b/make/out/lelievijver.lsm
index 766bd0a70e..b7a9ab240a 100644
--- a/make/out/lelievijver.lsm
+++ b/make/out/lelievijver.lsm
@@ -1,15 +1,15 @@
 Begin3
 Titel: LilyPond
-Versie: 1.1.38
-Inschrijf datum: 06APR99
+Versie: 1.1.39
+Inschrijf datum: 12APR99
 Beschrijving: @FLAPTEKST@
 Trefwoorden: muziek typezetten midi notatie
 Auteur: hanwen@stack.nl (Han-Wen Nienhuys)
 	janneke@gnu.org (Jan Nieuwenhuizen)
 Onderhouden door: hanwen@cs.ruu.nl (Han-Wen Nienhuys)
 Voornaamste plek: sunsite.unc.edu /pub/Linux/apps
-	770k lilypond-1.1.38.tar.gz 
+	770k lilypond-1.1.39.tar.gz 
 Oorspronkelijke plek: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
-	770k lilypond-1.1.38.tar.gz 
+	770k lilypond-1.1.39.tar.gz 
 Copi-eer voorwaarden: GPL
 End
diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm
index 69c23f891d..95bca37319 100644
--- a/make/out/lilypond.lsm
+++ b/make/out/lilypond.lsm
@@ -1,7 +1,7 @@
 Begin3
 Title: LilyPond
-Version: 1.1.38
-Entered-date: 06APR99
+Version: 1.1.39
+Entered-date: 12APR99
 Description: 
 LilyPond is the GNU Project music typesetter.  This program can print
 beautiful sheet music from a music definition file.  It can also play
@@ -14,8 +14,8 @@ Author: hanwen@cs.ruu.nl (Han-Wen Nienhuys)
 	janneke@gnu.org (Jan Nieuwenhuizen)
 Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
 Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert
-	770k lilypond-1.1.38.tar.gz 
+	770k lilypond-1.1.39.tar.gz 
 Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
-	770k lilypond-1.1.38.tar.gz 
+	770k lilypond-1.1.39.tar.gz 
 Copying-policy: GPL
 End
diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec
index b184c2ffa1..51d117cb06 100644
--- a/make/out/lilypond.spec
+++ b/make/out/lilypond.spec
@@ -1,9 +1,9 @@
 Name: lilypond
-Version: 1.1.38
+Version: 1.1.39
 Release: 1
 Copyright: GPL
 Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.38.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.39.tar.gz
 Summary: A program for printing sheet music.
 URL: http://www.cs.uu.nl/~hanwen/lilypond
 Packager: Han-Wen Nienhuys <hanwen@cs.uu.nl>
diff --git a/make/toplevel.make.in b/make/toplevel.make.in
index cd3d50d71d..aea7644563 100644
--- a/make/toplevel.make.in
+++ b/make/toplevel.make.in
@@ -15,7 +15,7 @@ SUBDIRS = scripts buildscripts  flower lib lily mf mi2mu po debian \
 
 SCRIPTS = configure aclocal.m4
 README_FILES = BUGS DEDICATION ANNOUNCE-0.1 ANNOUNCEMENT-1.0 \
- COPYING NEWS-0.1 NEWS-1.0 NEWS-0.0 NEWS  TODO
+ COPYING NEWS-0.1 NEWS-1.0 NEWS-0.0 NEWS  TODO AIMS
 README_TXT_FILES = README.txt AUTHORS.txt INSTALL.txt PATCHES.txt
 IN_FILES := $(wildcard *.in)
 EXTRA_DIST_FILES = dstreamrc mudela-mode.el vimrc VERSION $(README_FILES)  $(SCRIPTS) $(IN_FILES)
diff --git a/mf/feta-bolletjes.mf b/mf/feta-bolletjes.mf
index 018069ed0c..9e15f6fed1 100644
--- a/mf/feta-bolletjes.mf
+++ b/mf/feta-bolletjes.mf
@@ -78,7 +78,7 @@ fet_beginchar("Ledger ending", "ledgerending", "ledgerending")
 set_char_box (5/2 ledgerlinethickness#, 5/2 ledgerlinethickness#,
   		ledgerlinethickness#/2,ledgerlinethickness#/2);
         pickup pencircle scaled ledgerlinethickness;
-	lft x1 = -b;
+	lft x1 = -b ;
 	rt x2 = w;
 	y1 =0; y2 =0;
 	draw z1 .. z2;
diff --git a/mf/feta-eindelijk.mf b/mf/feta-eindelijk.mf
index 8ec1e82a2e..578e4cbf03 100644
--- a/mf/feta-eindelijk.mf
+++ b/mf/feta-eindelijk.mf
@@ -1,4 +1,4 @@
-% feta-eindelijk.mf -- implement rest symbols
+% feta-eindelijk.mf -- implement rest symbols -*-Fundamental-*-
 %
 % part of LilyPond's pretty-but-neat music font
 %
@@ -119,9 +119,20 @@ fet_beginchar("multi rest", "-4", "multirest");
 fet_endchar;
 
 fet_beginchar("Quarter rest","2","quartrest");
-	save alpha;
+%	draw_staff (-2, 2, 0.0);	
+	save alpha, yshift, height;
 	alpha:=-50;
+	yshift# = -1.25 interline#;
+	height# = 2.8125 interline#;
+	define_pixels (yshift, height);
+
+	
+	set_char_box(0, 27/25interline#,
+	  -yshift#,
+	  yshift# + height#);
+	
 	save ne,nw,se,sw; pair ne,nw,se,sw;
+	
 	se=dir alpha; nw=dir (alpha+180);
 	ne=dir (alpha+90); sw=dir (alpha-90);
 	penpos1(rthin,alpha+90);
@@ -140,18 +151,26 @@ fet_beginchar("Quarter rest","2","quartrest");
 %	z13=z2r+1/2rthin*ne;
 	z13=z2r+1/2rthin*ne+1/2rthin*nw;
 
-	y1l=7/2interline; x1l=1/3interline;
+	y1r = h;
+	x1l=1/3interline;
 	z2r=z1+interline*se;
 	z3=1/2[z2,z4];
-	x4=3/8interline; y4=2interline;
+	x4=3/8interline;
+	y4= 0;
 	z5=z4l+1.3interline*se;
-	x6l=x4l; y6l=y4r;
-	x7=2/5interline; y7=3/4interline;
+	x6l=x4l;
+	y6l=y4r;
+	x7=2/5interline;
+	y7= -d;
+	
 	fill z1l{se}..{se}z10..z3l..z11{se}..{se}z5l..z5r{nw}..{nw}z12..z3r..z13{nw}..{nw}z1r.. cycle;
 	fill z5r{nw}..tension1.4..z6l..tension1.4..{se}z7l..z7r{nw}..tension1.4..z6r..tension1.4..{se}z5l..cycle;
 	penlabels(1,2,3,4,5,6,7);
 	penlabels(10,11,12,13);
-	set_char_box(0, 27/25interline#, -3/4 interline#, 18/5interline#);
+	
+%	  3/4 interline# + yshift#,
+%	  18/5interline# + yshift#)
+
 	fet_endchar;
 
 def rest_crook(expr a, w) =
@@ -159,31 +178,55 @@ def rest_crook(expr a, w) =
 enddef;
 
 fet_beginchar("8th rest","3","eighthrest");
-	set_char_box(0, 4/3interline#,-interline#, 8/3interline#+7/4stafflinethickness#);
-	save x,y, ht;
-	ht = h + d;
-	x1=w-stem/6; y1=ht-flare/4;
+%	draw_staff (-2, 2, 0.0);
+	save yshift, ballcorrection;
+	ballcorrection = 0.005 interline;
+
+	yshift# := -1.0 interline#;
+	define_pixels(yshift);
+
+
+	set_char_box(0, 4/3interline#, -yshift#, yshift# +
+			5/3interline#+7/4stafflinethickness#);
+
+	%
+	% The curve is like a valley causing less space between
+	% the curve and the lower staff line. Correct for this.
+	% 
+	save x,y;
+
+	x1=w-stem/6;
+
+	y1 = yshift + 1.5 interline + flare/4 + ballcorrection; 
 	rest_crook (z1,w-stem/6);
 	z2-z1=whatever*dir70;
-	y2=stem/2;
+	y2= yshift + stem/2;
 	brush(z1,2/3stem,z2,stem);
-	% ugh
-	currentpicture:=currentpicture shifted (0,interline);
+
 	fet_endchar;
 
 fet_beginchar("16th rest","4","sixteenthrest");
-	save alpha,cw,h,w;
+%	draw_staff (-2, 2, 0.0);
+	save yshift, ballcorrection;
+	ballcorrection = 0.005 interline;
+
+	yshift# := - 2 interline#;
+	define_pixels(yshift);
+
+	save alpha,cw,h,w, height;
 	alpha=74;
 	cw#=7/6interline#;
-%	h#=5/3interline#+interline#+2stafflinethickness#;
-	h#=5/3interline#+interline#+7/4stafflinethickness#;
-	w#=cw#+(h#-3/2interline#)/tand(alpha);
-	set_char_box(0,w#,0,h#);
+	height# =  5/3interline#+interline#+7/4stafflinethickness#;
+	set_char_box(0, cw#+(height#-3/2interline#)/tand(alpha),
+		-yshift#, height# + yshift#);
+
 	define_pixels(cw);
 	save x,y;
-	x1=w-stem/6; y1=h-flare/4;
+	x1=w-stem/6;
+	y1 = yshift + 2.5 interline + flare/4 + ballcorrection;
+
 	z2-z1=whatever*dir alpha;
-	y2=stem/2;
+	y2= yshift + stem/2;
 	brush(z1,2/3stem,z2,stem);
 	rest_crook (z1,cw);
 	z3-z1=whatever*dir alpha;
@@ -193,17 +236,27 @@ fet_beginchar("16th rest","4","sixteenthrest");
 	fet_endchar;
 
 fet_beginchar("32th rest","5","thirtysecondrest");
-	save alpha,cw,h,w;
+%	draw_staff (-2, 2, 0.0);
+	save yshift, ballcorrection;
+	ballcorrection = 0.005 interline;
+
+	yshift# := -2 interline#;
+	define_pixels(yshift);
+
+	save alpha,cw,h;
 	alpha=76;
 	cw#=7/6interline#;
 	h#=5/3interline#+2interline#+7/4stafflinethickness#;
-	w#=cw#+(h#-3/2interline#)/tand(alpha);
-	set_char_box(0,w#,0,h#);
+
+	set_char_box(0,	cw#+(h#-3/2interline#)/tand(alpha),
+		-yshift#,yshift# +h#);
 	define_pixels(cw);
 	save x,y;
-	x1=w-stem/6; y1=h-flare/4;
+	x1=w-stem/6;
+	y1 = yshift + 3.5 interline + flare/4 + ballcorrection;
+
 	z2-z1=whatever*dir alpha;
-	y2=stem/2;
+	y2=stem/2 + yshift;
 	brush(z1,2/3stem,z2,stem);
 	rest_crook (z1,cw);
 	z3-z1=whatever*dir alpha;
@@ -215,17 +268,28 @@ fet_beginchar("32th rest","5","thirtysecondrest");
 	fet_endchar;
 
 fet_beginchar("64th rest","6","sixtyfourthrest");
+%	draw_staff (-2, 2, 0.0);
+	save yshift, ballcorrection;
+	ballcorrection = 0.005 interline;
+
+	yshift# := -3 interline#;
+	define_pixels(yshift);
+
 	save alpha,cw,h,w;
 	alpha=78;
 	cw#=7/6interline#;
 	h#=5/3interline#+3interline#+7/4stafflinethickness#;
 	w#=cw#+(h#-3/2interline#)/tand(alpha);
-	set_char_box(0,w#,0,h#);
+	set_char_box(0,w#,-yshift# ,yshift# + h#);
+
 	define_pixels(cw);
 	save x,y;
-	x1=w-stem/6; y1=h-flare/4;
+	x1=w-stem/6;
+
+	y1 = yshift + 4.5 interline + flare/4 + ballcorrection;
+
 	z2-z1=whatever*dir alpha;
-	y2=stem/2;
+	y2=stem/2 + yshift;
 	brush (z1,2/3stem,z2,stem);
 	rest_crook (z1,cw);
 	z3-z1=whatever*dir alpha;
@@ -237,22 +301,29 @@ fet_beginchar("64th rest","6","sixtyfourthrest");
 	z5-z1=whatever*dir alpha;
 	y5=y1-3interline;
 	rest_crook (z5,cw);
-	% ugh
-	currentpicture:=currentpicture shifted (0,-interline);
+
 	fet_endchar;
 
 fet_beginchar("128th rest","7","hundredtwentyeighthrest"); 
+%	draw_staff (-2, 2, 0.0);
+	save yshift, ballcorrection;
+	ballcorrection = 0.005 interline;
+
+	yshift# := -3 interline#;
+	define_pixels(yshift);
 	save alpha,cw,h,w;
 	alpha=78;
 	cw#=7/6interline#;
 	h#=5/3interline#+4interline#+7/4stafflinethickness#;
 	w#=cw#+(h#-3/2interline#)/tand(alpha);
-	set_char_box(0,w#,0,h#);
+	set_char_box(0,w#, -yshift#,yshift#  + h#);
 	define_pixels(cw);
 	save x,y;
-	x1=w-stem/6; y1=h-flare/4;
+	x1=w-stem/6;
+	y1 = yshift + 5.5 interline + flare/4 + ballcorrection;
+
 	z2-z1=whatever*dir alpha;
-	y2=stem/2;
+	y2=stem/2 + yshift;
 	brush (z1,2/3stem,z2,stem);
 	rest_crook (z1,cw);
 	z3-z1=whatever*dir alpha;
@@ -267,8 +338,7 @@ fet_beginchar("128th rest","7","hundredtwentyeighthrest");
 	z6-z1=whatever*dir alpha;
 	y6=y1-4interline;
 	rest_crook (z6,cw);
-	% ugh
-	currentpicture:=currentpicture shifted (0,-interline);
+	
 	fet_endchar;
 
 endgroup;
diff --git a/mf/feta-generic.mf b/mf/feta-generic.mf
index b902151162..58be0e4576 100644
--- a/mf/feta-generic.mf
+++ b/mf/feta-generic.mf
@@ -1,6 +1,7 @@
-i% 
-% feta-generic.mf --  implement 
 % 
+% feta-generic.mf --  implement generic stuff: include lots of files, but don't
+%  set dims.
+%
 % source file of the Feta (defintively not an abbreviation for Font-En-Tja)
 % music font
 % 
diff --git a/mf/feta-klef.mf b/mf/feta-klef.mf
index db42af1a36..6a3f659785 100644
--- a/mf/feta-klef.mf
+++ b/mf/feta-klef.mf
@@ -1,4 +1,4 @@
-% feta-klef.mf --  implement Clefs
+% feta-klef.mf --  implement Clefs -*-Fundamental-*-
 % 
 % part of LilyPond's pretty-but-neat music font
 %
@@ -19,12 +19,6 @@ def set_horizontal_spacing =
 	right_space# = reduced_il#;
 enddef;
 
-def draw_staff(expr first, last)=
-	pickup pencircle scaled stafflinethickness;
-	for i:= first step 1 until last:
-		draw (- interline, i* interline) .. (4 interline, i* interline);
-	endfor
-	enddef;
 
 % [Wanske] says the bulbs should be positioned about 1/4 right of the
 % "arrow"
diff --git a/mf/feta-macros.mf b/mf/feta-macros.mf
index 5a322a75e2..e0b10ca447 100644
--- a/mf/feta-macros.mf
+++ b/mf/feta-macros.mf
@@ -17,6 +17,14 @@ def treq =
 enddef;
 
 
+def draw_staff(expr first, last, offset)=
+	pickup pencircle scaled stafflinethickness;
+	for i:= first step 1 until last:
+		draw (- interline, (i + offset) * interline) .. (4 interline,( i+ offset)* interline);
+	endfor
+	enddef;
+
+
 %
 % Transforms
 %
@@ -161,7 +169,9 @@ def brush(expr a,w,b,v) =
 enddef;
 
 %
-%
+% Draw a (rest) crook, starting at thickness STEM in point A,
+% ending a ball W to the left, diameter BALLDIAM
+% ypart of the center of the ball is BALLDIAM/4 lower than ypart A
 %
 def balled_crook(expr a, w, balldiam, stem) =
 begingroup;
diff --git a/mi2mu/include/midi-track-parser.hh b/mi2mu/include/midi-track-parser.hh
index d873e198df..3679ef6007 100644
--- a/mi2mu/include/midi-track-parser.hh
+++ b/mi2mu/include/midi-track-parser.hh
@@ -11,7 +11,7 @@
 #define MIDI_TRACK_PARSER_HH
 
 #include "proto.hh"
-#include "cons.hh"
+#include "plist.hh"
 #include "moment.hh"
 #include "mi2mu-proto.hh"
 #include "midi-parser.hh"
@@ -36,7 +36,7 @@ private:
 
   Moment at_mom_;
   Byte running_byte_;
-  Cons_list<Mudela_note> open_note_l_list_;
+  Link_list<Mudela_note*> open_note_l_list_;
   Mudela_staff* mudela_staff_p_;
   Midi_parser_info* track_info_p_;
 };
diff --git a/mi2mu/include/mudela-column.hh b/mi2mu/include/mudela-column.hh
index a09cebb469..b1ab97c24b 100644
--- a/mi2mu/include/mudela-column.hh
+++ b/mi2mu/include/mudela-column.hh
@@ -9,7 +9,7 @@
 #include "proto.hh"
 #include "mi2mu-proto.hh"
 #include "moment.hh"
-#include "cons.hh"
+#include "plist.hh"
 
 /// (mudela_column)
 class Mudela_column 
@@ -18,9 +18,9 @@ public:
     Mudela_column (Mudela_score* mudela_score_l, Moment mom);
 
     void add_item (Mudela_item* mudela_item_l);
-    Moment at_mom ();
+    Moment at_mom();
 
-    Cons_list<Mudela_item> mudela_item_l_list_;
+    Link_list<Mudela_item*> mudela_item_l_list_;
     Moment at_mom_;
     Mudela_score* mudela_score_l_;
 };
diff --git a/mi2mu/include/mudela-item.hh b/mi2mu/include/mudela-item.hh
index e1b52b7368..6dce94333d 100644
--- a/mi2mu/include/mudela-item.hh
+++ b/mi2mu/include/mudela-item.hh
@@ -21,109 +21,109 @@
 class Mudela_item 
 {
 public:
-  Mudela_item (Mudela_column* mudela_column_l);
-  virtual ~Mudela_item ();
+    Mudela_item (Mudela_column* mudela_column_l);
+    virtual ~Mudela_item ();
     
-  virtual Moment at_mom ();
-  virtual Moment duration_mom ();
-  void output (Mudela_stream& mudela_stream_r);
-  virtual String str () = 0;
+    virtual Moment at_mom();
+    virtual Moment duration_mom();
+    void output (Mudela_stream& mudela_stream_r);
+    virtual String str() = 0;
 
-  Mudela_column* mudela_column_l_;
+    Mudela_column* mudela_column_l_;
 };
 
 class Mudela_key : public Mudela_item 
 {
 public:
-  Mudela_key (int accidentals_i, int minor_i);
+    Mudela_key (int accidentals_i, int minor_i);
 
-  String notename_str (int pitch_i);
-  virtual String str ();
+    String notename_str (int pitch_i);
+    virtual String str();
 
-  //private:
-  int accidentals_i_;
-  int minor_i_;
+//private:
+    int accidentals_i_;
+    int minor_i_;
 };
 
 class Mudela_time_signature : public Mudela_item 
 {
 public:
-  Mudela_time_signature (int num_i, int den_i, int division_4_i, int count_32_i);
+    Mudela_time_signature (int num_i, int den_i, int division_4_i, int count_32_i);
 
-  Duration i2_dur (int time_i, int division_1_i);
-  int clocks_1_i ();
-  int den_i ();
-  int num_i ();
-  virtual String str ();
-  Moment bar_mom ();
+    Duration i2_dur (int time_i, int division_1_i);
+    int clocks_1_i();
+    int den_i();
+    int num_i();
+    virtual String str();
+    Moment bar_mom();
 
 private:
-  Real sync_f_;
-  Duration sync_dur_;
-  int clocks_1_i_;
-  int num_i_;
-  int den_i_;
+    Real sync_f_;
+    Duration sync_dur_;
+    int clocks_1_i_;
+    int num_i_;
+    int den_i_;
 };
 
 class Mudela_note : public Mudela_item 
 {
 public:
-  Mudela_note (Mudela_column* mudela_column_l, int channel_i, int pitch_i, int dyn_i);
+    Mudela_note (Mudela_column* mudela_column_l, int channel_i, int pitch_i, int dyn_i);
 
-  Duration duration ();
-  virtual Moment duration_mom ();
-  virtual String str ();
+    Duration duration();
+    virtual Moment duration_mom();
+    virtual String str();
     
-  //    int const c0_pitch_i_c_ = 60; // huh?
-  static int const c0_pitch_i_c_ = 48;
+//    int const c0_pitch_i_c_ = 60; // huh?
+    static int const c0_pitch_i_c_ = 48;
 
-  static bool const simple_plet_b_s = false;
-  int channel_i_;
-  int pitch_i_;
-  Mudela_column* end_column_l_;
+    static bool const simple_plet_b_s = false;
+    int channel_i_;
+    int pitch_i_;
+    Mudela_column* end_column_l_;
 };
 
 class Mudela_skip : public Mudela_item 
 {
 public:
-  Mudela_skip (Mudela_column* mudela_column_l, Moment skip_mom);
+    Mudela_skip (Mudela_column* mudela_column_l, Moment skip_mom);
 
-  Duration duration ();
-  virtual Moment duration_mom ();
-  virtual String str ();
+    Duration duration();
+    virtual Moment duration_mom();
+    virtual String str();
 
 private:
-  Moment mom_;
+    Moment mom_;
 };
 
 
 class Mudela_tempo : public Mudela_item 
 {
 public:
-  Mudela_tempo (int useconds_per_4_i);
+    Mudela_tempo (int useconds_per_4_i);
 
-  int get_tempo_i (Moment moment);
-  virtual String str ();
-  int useconds_per_4_i ();
+    int get_tempo_i (Moment moment);
+    virtual String str();
+    int useconds_per_4_i();
 
 private:
-  int useconds_per_4_i_;
-  Moment seconds_per_1_mom_;
+    int useconds_per_4_i_;
+    Moment seconds_per_1_mom_;
 };
 
 class Mudela_text : public Mudela_item 
 {
 public:
-  enum Type { 
-    TEXT = 1, COPYRIGHT, TRACK_NAME, INSTRUMENT_NAME, LYRIC, 
-    MARKER, CUE_POINT
-  };
-  Mudela_text (Mudela_text::Type type,  String str);
-  virtual String str ();
-
-  //private:
-  Type type_;
-  String text_str_;
+    enum Type { 
+	TEXT = 1, COPYRIGHT, TRACK_NAME, INSTRUMENT_NAME, LYRIC, 
+	MARKER, CUE_POINT
+    };
+    Mudela_text (Mudela_text::Type type,  String str);
+    virtual String str();
+
+//private:
+    Type type_;
+    String text_str_;
 };
 
 #endif // MUDELA_ITEM_HH
diff --git a/mi2mu/include/mudela-score.hh b/mi2mu/include/mudela-score.hh
index 87e901b709..4d0992b35c 100644
--- a/mi2mu/include/mudela-score.hh
+++ b/mi2mu/include/mudela-score.hh
@@ -8,43 +8,45 @@
 
 #include "mi2mu-proto.hh"
 #include "proto.hh"
-#include "cons.hh"
+#include "plist.hh"
 #include "parray.hh"
 
 /// (mudela_score)
 class Mudela_score {
 public:
-  Mudela_score (int format_i, int tracks_i, int tempo_i);
-  ~Mudela_score ();
+    Mudela_score (int format_i, int tracks_i, int tempo_i);
+    ~Mudela_score();
 
-  void add_item (Mudela_item* mudela_item_p);
-  void add_staff (Mudela_staff* mudela_staff_p);
+    void add_item (Mudela_item* mudela_item_p);
+    void add_staff (Mudela_staff* mudela_staff_p);
 
-  Mudela_column* find_column_l (Moment mom);
-  Mudela_column* get_column_l (Moment mom);
+    Mudela_column* find_column_l (Moment mom);
+    Mudela_column* get_column_l (Moment mom);
 
-  void output (String filename_str);
-  void process ();
+    void output (String filename_str);
+    void process();
 
-  // ugh
-  Mudela_key* mudela_key_l_;
-  Mudela_time_signature* mudela_time_signature_l_;
-  Mudela_tempo* mudela_tempo_l_;
+    // ugh
+    Mudela_key* mudela_key_l_;
+    Mudela_time_signature* mudela_time_signature_l_;
+    Mudela_tempo* mudela_tempo_l_;
 
 private:
-  void filter_tempo ();
-  void quantify_columns ();
-  void quantify_durations ();
-  void settle_columns ();
+    void filter_tempo();
+    void quantify_columns();
+    void quantify_durations();
+    void settle_columns();
 
-  Cons_list<Mudela_staff> mudela_staff_p_list_;
-  Link_array<Mudela_column> column_l_array_;
+    Pointer_list<Mudela_staff*> mudela_staff_p_list_;
+   // wants Pointer_array!
+//    Pointer_list<Mudela_column*> mudela_column_p_list_;
+    Link_array<Mudela_column> column_l_array_;
 
-  // ugh, ugh, ugh
+// ugh, ugh, ugh
 public:
-  int format_i_;
-  int tracks_i_;
-  int tempo_i_;
+    int format_i_;
+    int tracks_i_;
+    int tempo_i_;
 };
 
 #endif // MUDELA_SCORE_HH
diff --git a/mi2mu/include/mudela-staff.hh b/mi2mu/include/mudela-staff.hh
index 8c0afa044a..4b4fd75c60 100644
--- a/mi2mu/include/mudela-staff.hh
+++ b/mi2mu/include/mudela-staff.hh
@@ -8,21 +8,20 @@
 
 #include "mi2mu-proto.hh"
 #include "proto.hh"
-#include "cons.hh"
+#include "plist.hh"
 #include "string.hh"
 
 /// (mudela_staff)
-class Mudela_staff
-{
+class Mudela_staff {
 public:
   Mudela_staff (int number_i, String copyright_str, String track_name_str, String instrument_str);
 
   void add_item (Mudela_item* mudela_item_p);
-  void eat_voice (Cons_list<Mudela_item>& items);
-  String id_str ();
-  String name_str ();
+  void eat_voice (Link_list<Mudela_item*>& items);
+  String id_str();
+  String name_str();
   void output (Mudela_stream& mudela_stream_r);
-  void process ();
+  void process();
 
   String copyright_str_;
   String instrument_str_;
@@ -35,8 +34,8 @@ public:
 private:
   void output_mudela_begin_bar (Mudela_stream& mudela_stream_r, Moment now_mom, int bar_i);
 
-  Cons_list<Mudela_voice> mudela_voice_p_list_;
-  Cons_list<Mudela_item> mudela_item_p_list_;
+  Pointer_list<Mudela_voice*> mudela_voice_p_list_;
+  Pointer_list<Mudela_item*> mudela_item_p_list_;
 };
 
 #endif // MUDELA_STAFF_HH
diff --git a/mi2mu/include/mudela-voice.hh b/mi2mu/include/mudela-voice.hh
index a861201368..28b4efcdb9 100644
--- a/mi2mu/include/mudela-voice.hh
+++ b/mi2mu/include/mudela-voice.hh
@@ -7,23 +7,22 @@
 #define MUDELA_VOICE_HH
 
 #include "mi2mu-proto.hh"
-#include "cons.hh"
+#include "plist.hh"
 
 /// (mudela_voice)
-class Mudela_voice
-{
+class Mudela_voice {
 public:
-  Mudela_voice (Mudela_staff* mudela_staff_l);
+    Mudela_voice (Mudela_staff* mudela_staff_l);
 
-  void add_item (Mudela_item* mudela_item_l);
-  Moment begin_mom ();
-  Moment end_mom ();
+    void add_item (Mudela_item* mudela_item_l);
+    Moment begin_mom();
+    Moment end_mom();
 
-  void output (Mudela_stream& mudela_stream_r);
+    void output (Mudela_stream& mudela_stream_r);
 
 private:
-  Mudela_staff* mudela_staff_l_;
-  Cons_list<Mudela_item> mudela_item_l_list_;
+    Mudela_staff* mudela_staff_l_;
+    Link_list<Mudela_item*> mudela_item_l_list_;
 };
 
 #endif // MUDELA_VOICE_HH
diff --git a/mi2mu/midi-track-parser.cc b/mi2mu/midi-track-parser.cc
index 2b34868c47..ff7d4453d4 100644
--- a/mi2mu/midi-track-parser.cc
+++ b/mi2mu/midi-track-parser.cc
@@ -53,17 +53,19 @@ Midi_track_parser::note_end (Mudela_column* col_l, int channel_i, int pitch_i, i
 
   assert (col_l);
 
-  for (Cons<Mudela_note>** pp = &open_note_l_list_.head_cons_p_; *pp;)
+  for (PCursor<Mudela_note*> i (open_note_l_list_.top ()); i.ok (); )
     {
-      Cons<Mudela_note>* i = *pp;
-      if ((i->car_p_->pitch_i_ == pitch_i) && (i->car_p_->channel_i_ == channel_i))
+      if ((i->pitch_i_ == pitch_i) && (i->channel_i_ == channel_i))
 	{
-	  i->car_p_->end_column_l_ = col_l;
-	  delete open_note_l_list_.remove_cons_p (pp);
+	  i->end_column_l_ = col_l;
+	  // LOGOUT(DEBUG_ver) << "Note: " << pitch_i;
+	  // LOGOUT(DEBUG_ver) << "; " << i->mudela_column_l_->at_mom_;
+	  // LOGOUT(DEBUG_ver) << ", " << i->end_column_l_->at_mom_ << '\n';
+	  i.remove_p();
 	  return;
 	}
       else
-	pp = &i->next_cons_p_;
+	i++;
     }
   warning (_f ("junking note-end event: channel = %d, pitch = %d", 
 	       channel_i, pitch_i));
@@ -74,11 +76,11 @@ Midi_track_parser::note_end_all (Mudela_column* col_l)
 {
   // find
   assert (col_l);
-  for (Cons<Mudela_note>* i = open_note_l_list_.head_cons_p_; i; i = i->next_cons_p_)
+  for (PCursor<Mudela_note*> i (open_note_l_list_.top ()); i.ok (); )
     {
-      i->car_p_->end_column_l_ = col_l;
+      i->end_column_l_ = col_l;
+      i.remove_p ();
     }
-  open_note_l_list_.init ();
 }
 
 Mudela_staff*
@@ -167,14 +169,13 @@ Midi_track_parser::parse_event (Mudela_column* col_l)
 	{
 	  Mudela_note* p = new Mudela_note (col_l, channel_i, pitch_i, dyn_i);
 	  item_p = p;
-	  open_note_l_list_.append (new Cons<Mudela_note> (p, 0));
+	  open_note_l_list_.bottom ().add (p);
 	}
       else
 	{
 	  note_end (col_l, channel_i, pitch_i, dyn_i);
 	}
     }
-    
   // POLYPHONIC_AFTERTOUCH	[\xa0-\xaf]
   else if ((byte >= 0xa0) && (byte <= 0xaf))
     {
diff --git a/mi2mu/mudela-column.cc b/mi2mu/mudela-column.cc
index 833b351f81..5a00e88310 100644
--- a/mi2mu/mudela-column.cc
+++ b/mi2mu/mudela-column.cc
@@ -14,7 +14,7 @@ Mudela_column::Mudela_column (Mudela_score* mudela_score_l, Moment mom)
 void 
 Mudela_column::add_item (Mudela_item* mudela_item_l)
 {
-   mudela_item_l_list_.append (new Cons<Mudela_item> (mudela_item_l, 0));
+  mudela_item_l_list_.bottom().add (mudela_item_l);
 }
 
 Moment
diff --git a/mi2mu/mudela-score.cc b/mi2mu/mudela-score.cc
index 9ec6f46dc8..4380edfcb2 100644
--- a/mi2mu/mudela-score.cc
+++ b/mi2mu/mudela-score.cc
@@ -14,7 +14,9 @@
 #include "mudela-staff.hh"
 #include "mudela-stream.hh"
 
-#include "killing-cons.tcc"
+// ugh, cygnus' b19 gcc
+#include "list.tcc"
+#include "cursor.tcc"
 
 //static Mudela_key key_c (0, 0);
 static Mudela_time_signature time_sig_4 (4, 2, 24, 8);
@@ -33,25 +35,32 @@ Mudela_score::Mudela_score (int format_i, int tracks_i, int tempo_i)
   mudela_tempo_l_ = &tempo_60;
 }
 
-Mudela_score::~Mudela_score ()
+Mudela_score::~Mudela_score()
 {
 }
 
 void
 Mudela_score::add_item (Mudela_item* mudela_item_p)
 {
-  mudela_staff_p_list_.tail_car_l ()->add_item (mudela_item_p);
+  mudela_staff_p_list_.bottom()->add_item (mudela_item_p);
 }
 
 void
 Mudela_score::add_staff (Mudela_staff* mudela_staff_p)
 {
-  mudela_staff_p_list_.append (new Killing_cons<Mudela_staff> (mudela_staff_p, 0));
+  mudela_staff_p_list_.bottom().add (mudela_staff_p);
 }
 
 Mudela_column*
 Mudela_score::find_column_l (Moment mom)
 {
+#if 0
+  // should do binary search
+  for (int i = 0; i < column_l_array_.size (); i++ )
+    if ( column_l_array_[i]->at_mom () == mom )
+      return column_l_array_[i];
+  return 0;
+#else
   int upper_i = max (0, column_l_array_.size () - 1);
   int lower_i = 0;
   int i = 0; //upper_i;
@@ -64,7 +73,7 @@ Mudela_score::find_column_l (Moment mom)
 	upper_i = i;
       else
 	lower_i = i;
-      if ( (upper_i == lower_i) || (i == column_l_array_.size () - 1))
+      if ((upper_i == lower_i) || (i == column_l_array_.size () - 1))
 	{
 	  // we don't do inserts
 	  assert (0);
@@ -76,6 +85,7 @@ Mudela_score::find_column_l (Moment mom)
     }
   assert (0);
   return 0;
+#endif
 }
 
 Mudela_column*
@@ -83,7 +93,7 @@ Mudela_score::get_column_l (Moment mom)
 {
   int i;
   Mudela_column *c=0;
-  for (i=column_l_array_.size () - 1; !c && i >=0; i--)
+  for (i=column_l_array_.size() - 1; !c && i >=0; i--)
     {
       if (column_l_array_ [i]->at_mom () == mom )
 	c = column_l_array_[i];
@@ -104,97 +114,100 @@ Mudela_score::get_column_l (Moment mom)
 void
 Mudela_score::output (String filename_str)
 {
-  LOGOUT (NORMAL_ver) << _f ("Lily output to %s...", filename_str) << endl;
+  LOGOUT(NORMAL_ver) << _f ("Lily output to %s...", filename_str) << endl;
 
   // ugh, ugly midi type 1 fix
-  if ( (mudela_staff_p_list_.size_i () == 1)
-       && !mudela_staff_p_list_.car_l ()->number_i_)
-    mudela_staff_p_list_.car_l ()->number_i_ = 1;
+  if  ( (mudela_staff_p_list_.size() == 1) && !mudela_staff_p_list_.top()->number_i_)
+    mudela_staff_p_list_.top()->number_i_ = 1;
 
   int track_i = 0;
   Mudela_stream mudela_stream (filename_str);
-  for (Cons<Mudela_staff>* i = mudela_staff_p_list_.head_cons_p_; i; i = i->next_cons_p_)
+  for  (PCursor<Mudela_staff*> i (mudela_staff_p_list_); i.ok(); i++)
     {
-      LOGOUT (NORMAL_ver) << _ ("track ") << track_i++ << ": " << flush;
-      i->car_p_->output (mudela_stream);
+      LOGOUT(NORMAL_ver) << _ ("track ") << track_i++ << ": " << flush;
+      i->output (mudela_stream);
       mudela_stream << '\n';
-      LOGOUT (NORMAL_ver) << endl;
+      LOGOUT(NORMAL_ver) << endl;
     }
 
   mudela_stream << "\\score{\n";
-  if (mudela_staff_p_list_.size_i () > 1)
+  if  (mudela_staff_p_list_.size() > 1)
     mudela_stream << "< \n";
-  for (Cons<Mudela_staff>* i = mudela_staff_p_list_.head_cons_p_; i; i = i->next_cons_p_)
+  for  (PCursor<Mudela_staff*> i (mudela_staff_p_list_); i.ok(); i++)
     {
-      if ( (mudela_staff_p_list_.size_i () != 1)
-	    && (i->car_p_ == mudela_staff_p_list_.car_l ()))
+      if  ( (mudela_staff_p_list_.size() != 1)
+	    &&  (i == mudela_staff_p_list_.top()))
 	continue;
-      mudela_stream << "\\type Staff = \"" << i->car_p_->id_str () << "\" ";
-      mudela_stream << String ("\\" +  i->car_p_->id_str ()) << "\n";
+      mudela_stream << "\\type Staff = \"" << i->id_str() << "\" ";
+      mudela_stream << String ("\\" +  i->id_str ()) << "\n";
     }
-  if (mudela_staff_p_list_.size_i () > 1)
+  if  (mudela_staff_p_list_.size() > 1)
     mudela_stream << ">\n";
 
+
   mudela_stream << "\\paper{}\n";
 
   mudela_stream << "\\midi{\n";
   // let's not use silly 0 track
-  mudela_staff_p_list_.tail_car_l ()->mudela_tempo_l_->output (mudela_stream);
+  mudela_staff_p_list_.bottom()->mudela_tempo_l_->output (mudela_stream);
   mudela_stream << "}\n";
 
   mudela_stream << "}\n";
 }
 
 void
-Mudela_score::process ()
+Mudela_score::process()
 {
-  LOGOUT (NORMAL_ver) << '\n' << _ ("Processing...") << endl;
+  LOGOUT(NORMAL_ver) << '\n' << _ ("Processing...") << endl;
 
-  LOGOUT (DEBUG_ver) << "columns\n";
+  LOGOUT(DEBUG_ver) << "columns\n";
+  //  for  (PCursor<Mudela_column*> i (mudela_column_p_list_); i.ok(); i++)
+  //	LOGOUT(DEBUG_ver) << "At: " << i->at_mom() << '\n';
 
-  settle_columns ();
-  filter_tempo ();
-  quantify_columns ();
-  quantify_durations ();
+  settle_columns();
+  filter_tempo();
+  quantify_columns();
+  quantify_durations();
 
-  LOGOUT (NORMAL_ver) << '\n' << _ ("Creating voices...") << endl;
+  LOGOUT(NORMAL_ver) << '\n' << _ ("Creating voices...") << endl;
   int track_i = 0;
-  for (Cons<Mudela_staff>* i = mudela_staff_p_list_.head_cons_p_; i; i = i->next_cons_p_)
+  for  (PCursor<Mudela_staff*> i (mudela_staff_p_list_); i.ok(); i++)
     {
-      LOGOUT (NORMAL_ver) << _ ("track ") << track_i++ << ": " << flush;
-      i->car_p_->process ();
-      LOGOUT (NORMAL_ver) << endl;
+      LOGOUT(NORMAL_ver) << _ ("track ") << track_i++ << ": " << flush;
+      i->process();
+      LOGOUT(NORMAL_ver) << endl;
     }
 }
 
 void
-Mudela_score::filter_tempo ()
+Mudela_score::filter_tempo()
 {
-  LOGOUT (NORMAL_ver) << '\n' << _ ("NOT Filtering tempo...") << endl;
+  LOGOUT(NORMAL_ver) << '\n' << _ ("NOT Filtering tempo...") << endl;
 }
 
 void
-Mudela_score::quantify_columns ()
+Mudela_score::quantify_columns()
 {
   // ugh
-  if (Duration_convert::no_quantify_b_s)
+  if  (Duration_convert::no_quantify_b_s)
     {
-      LOGOUT (NORMAL_ver) << '\n' << _ ("NOT Quantifying columns...") << endl;
+      LOGOUT(NORMAL_ver) << '\n' << _("NOT Quantifying columns...") << endl;
       return;
     }
 
-  LOGOUT (NORMAL_ver) << '\n' << _ ("Quantifying columns...") << endl;
+  LOGOUT(NORMAL_ver) << '\n' << _("Quantifying columns...") << endl;
 
   int current_bar_i = 0;
-  Moment bar_mom = mudela_time_signature_l_->bar_mom ();
+  Moment bar_mom = mudela_time_signature_l_->bar_mom();
 
   int n = 5 >? Duration_convert::no_smaller_than_i_s;
   n = Duration_convert::type2_i (n);
   Moment s = Moment (1, n);
-  for (int i = 0; i < column_l_array_.size (); i++)
+  Moment sh = Moment (1, 2 * n);
+  for  (int i = 0; i < column_l_array_.size(); i++)
     {
       column_l_array_ [i]->at_mom_ =
-      	s * Moment ( (int) ( (column_l_array_ [i]->at_mom ()) / s));
+      	s * Moment( (int) ( (column_l_array_ [i]->at_mom()) / s));
 
       int bar_i = (int) (column_l_array_ [i]->at_mom () / bar_mom) + 1;
       if (bar_i > current_bar_i)
@@ -203,21 +216,32 @@ Mudela_score::quantify_columns ()
 	  current_bar_i = bar_i;
 	}
     }
-  LOGOUT (NORMAL_ver) << endl;
+  LOGOUT(NORMAL_ver) << endl;
 }
 
 void
-Mudela_score::quantify_durations ()
+Mudela_score::quantify_durations()
 {
-  //    LOGOUT (NORMAL_ver) << '\n' << "Quantifying durations..." << endl;
+  //    LOGOUT(NORMAL_ver) << '\n' << "Quantifying durations..." << endl;
 }
 
 void
-Mudela_score::settle_columns ()
+Mudela_score::settle_columns()
 {
-  LOGOUT (NORMAL_ver) << '\n' << _ ("Settling columns...") << endl;
+  //    LOGOUT(NORMAL_ver) << '\n' << "NOT Settling columns..." << endl;
+  //    return;
+  LOGOUT(NORMAL_ver) << '\n' << _("Settling columns...") << endl;
+
+#if 0
+  assert (!column_l_array_.size());
+  int n = mudela_column_p_list_.size();
+  // huh?
+  //    column_l_array_.set_size (n);
+  for  (PCursor<Mudela_column*> i (mudela_column_p_list_); i.ok(); i++)
+    column_l_array_.push (*i);
+#endif
 
-  int n = column_l_array_.size ();
+  int n = column_l_array_.size();
 
   int start_i = 0;
   int end_i = 0;
@@ -226,22 +250,22 @@ Mudela_score::settle_columns ()
   smallest_dur.durlog_i_ =  6;
   Moment const noise_mom = Duration_convert::dur2_mom (smallest_dur)
     / Moment (2);
-  for (int i = 0; i < n; i++)
+  for  (int i = 0; i < n; i++)
     {
-      if (!start_i)
+      if  (!start_i)
 	{
 	  start_i = end_i = i;
-	  start_mom = column_l_array_ [i]->at_mom ();
+	  start_mom = column_l_array_ [i]->at_mom();
 	  continue;
 	}
 
       // find all columns within noise's distance
-      while ( (i < n)
-	       && (column_l_array_ [i]->at_mom () - start_mom < noise_mom))
+      while  ( (i < n)
+	       &&  (column_l_array_ [i]->at_mom() - start_mom < noise_mom))
 	end_i = ++i;
 
       // bluntly set all to time of first in group
-      for (int j = start_i; j < end_i; j++)
+      for  (int j = start_i; j < end_i; j++)
 	column_l_array_ [j]->at_mom_ = start_mom;
 
       start_i = end_i = 0;
diff --git a/mi2mu/mudela-staff.cc b/mi2mu/mudela-staff.cc
index 4f9964250d..3c92577895 100644
--- a/mi2mu/mudela-staff.cc
+++ b/mi2mu/mudela-staff.cc
@@ -17,8 +17,6 @@
 #include "mudela-voice.hh"
 #include "mudela-score.hh"
 
-#include "killing-cons.tcc"
-
 extern Mudela_score* mudela_score_l_g;
 
 Mudela_staff::Mudela_staff (int number_i, String copyright_str, String track_name_str, String instrument_str)
@@ -35,53 +33,51 @@ Mudela_staff::Mudela_staff (int number_i, String copyright_str, String track_nam
 void
 Mudela_staff::add_item (Mudela_item* mudela_item_p)
 {
-  mudela_item_p_list_.append (new Killing_cons <Mudela_item> (mudela_item_p, 0));
-  if (mudela_item_p->mudela_column_l_)
+  mudela_item_p_list_.bottom().add (mudela_item_p);
+  if  (mudela_item_p->mudela_column_l_)
     mudela_item_p->mudela_column_l_->add_item (mudela_item_p);
 }
 
 void
-Mudela_staff::eat_voice (Cons_list<Mudela_item>& items)
+Mudela_staff::eat_voice (Link_list<Mudela_item*>& items)
 {
   Mudela_voice* voice_p = new Mudela_voice (this);
-  mudela_voice_p_list_.append (new Killing_cons<Mudela_voice> (voice_p, 0));
+  mudela_voice_p_list_.bottom().add (voice_p);
 
-  //    Moment mom = items.top ()->at_mom ();
+  //    Moment mom = items.top()->at_mom();
   Moment mom = 0;
 
-  for (Cons<Mudela_item>** pp = &items.head_cons_p_; *pp;)
+  for  (PCursor<Mudela_item*> i (items); i.ok();)
     {
-      Cons<Mudela_item>* i = *pp;
-      LOGOUT (DEBUG_ver) << "At: " << i->car_p_->at_mom ().str () << "; ";
-      LOGOUT (DEBUG_ver) << "dur: " << i->car_p_->duration_mom ().str () << "; ";
-      LOGOUT (DEBUG_ver) << "mom: " << mom.str () << " -> ";
-      if (i->car_p_->at_mom () > mom)
+      LOGOUT(DEBUG_ver) << "At: " << i->at_mom ().str () << "; ";
+      LOGOUT(DEBUG_ver) << "dur: " << i->duration_mom ().str () << "; ";
+      LOGOUT(DEBUG_ver) << "mom: " << mom.str () << " -> ";
+      if  (i->at_mom() > mom)
 	{
-	  Moment dur = i->car_p_->at_mom () - mom;
+	  Moment dur = i->at_mom() - mom;
 	  // ugh, need score
 	  Mudela_column* start = mudela_score_l_g->find_column_l (mom);
 	  voice_p->add_item (new Mudela_skip (start, dur));
-	  mom = i->car_p_->at_mom ();
+	  mom = i->at_mom();
 	}
-      if (i->car_p_->at_mom () == mom)
+      if  (i->at_mom() == mom)
 	{
-	  mom = i->car_p_->at_mom () + i->car_p_->duration_mom ();
-	  Cons<Mudela_item>* c = items.remove_cons_p (pp);
-	  voice_p->add_item (c->car_p_);
-	  delete c;
+	  mom = i->at_mom() + i->duration_mom();
+	  voice_p->add_item (i.remove_p());
+	  // ugh
 	}
-      else if (*pp)
-	pp = &i->next_cons_p_;
-      LOGOUT (DEBUG_ver) << "mom: " << mom.str () << '\n';
+      else if  (i.ok())
+	i++;
+      LOGOUT(DEBUG_ver) << "mom: " << mom.str () << '\n';
     }
 }
 
 String
-Mudela_staff::id_str ()
+Mudela_staff::id_str()
 {
   String id (name_str ());
   char *cp = id.ch_l ();
-  char *end = cp + id.length_i ();
+  char *end = cp + id.length_i();
   for (;cp < end; cp++)
     {
       if (!isalpha (*cp))
@@ -93,9 +89,9 @@ Mudela_staff::id_str ()
 }
 
 String
-Mudela_staff::name_str ()
+Mudela_staff::name_str()
 {
-  if (name_str_.length_i ())
+  if  (name_str_.length_i())
     return name_str_;
   return String ("track") + to_str (char ('A' - 1 + number_i_));
 }
@@ -105,40 +101,40 @@ Mudela_staff::name_str ()
 void
 Mudela_staff::output (Mudela_stream& mudela_stream_r)
 {
-  mudela_stream_r << id_str () << " = \\notes";
-  mudela_stream_r << (mudela_voice_p_list_.size_i () > 1 ? "<" : "{");
+  mudela_stream_r << id_str() << " = \\notes";
+  mudela_stream_r <<  (mudela_voice_p_list_.size() > 1 ? "<" : "{");
   mudela_stream_r << '\n';
   mudela_stream_r << _ ("% midi copyright:") << copyright_str_ << '\n';
   mudela_stream_r << _ ("% instrument:") << instrument_str_ << '\n';
 
   // don't use last duration mode
   //  mudela_stream_r << "\\duration 4;\n";
-  if (mudela_voice_p_list_.size_i () == 1)
-    mudela_voice_p_list_.car_l ()->output (mudela_stream_r);
+  if  (mudela_voice_p_list_.size() == 1)
+    mudela_voice_p_list_.top()->output (mudela_stream_r);
   else
-      for (Cons<Mudela_voice>* i = mudela_voice_p_list_.head_cons_p_; i; i = i->next_cons_p_)
+    for  (PCursor<Mudela_voice*> i (mudela_voice_p_list_); i.ok(); i++)
       {
 	mudela_stream_r << "{ ";
-	i->car_p_->output (mudela_stream_r);
+	i->output (mudela_stream_r);
 	mudela_stream_r << "} ";
       }
 
-  mudela_stream_r << (mudela_voice_p_list_.size_i () > 1 ? "\n>" : "\n}");
-  mudela_stream_r << " % " << name_str () << '\n';
+  mudela_stream_r <<  (mudela_voice_p_list_.size() > 1 ? "\n>" : "\n}");
+  mudela_stream_r << " % " << name_str() << '\n';
 }
 
 void
 Mudela_staff::output_mudela_begin_bar (Mudela_stream& mudela_stream_r, Moment now_mom, int bar_i)
 {
-  Moment bar_mom = mudela_time_signature_l_->bar_mom ();
+  Moment bar_mom = mudela_time_signature_l_->bar_mom();
   Moment into_bar_mom = now_mom - Moment (bar_i - 1) * bar_mom;
-  if (bar_i > 1)
+  if  (bar_i > 1)
     {
-      if (!into_bar_mom)
+      if  (!into_bar_mom)
 	mudela_stream_r << "|\n";
     }
   mudela_stream_r << "% " << String_convert::i2dec_str (bar_i, 0, ' ');
-  if (into_bar_mom)
+  if  (into_bar_mom)
     mudela_stream_r << ":" << Duration_convert::dur2_str (Duration_convert::mom2_dur (into_bar_mom));
   mudela_stream_r << '\n';
 }
@@ -148,13 +144,13 @@ Mudela_staff::output_mudela_begin_bar (Mudela_stream& mudela_stream_r, Moment no
 void
 Mudela_staff::output_mudela_rest (Mudela_stream& mudela_stream_r, Moment begin_mom, Moment end_mom)
 {
-  Moment bar_mom = mudela_time_signature_l_->bar_mom ();
+  Moment bar_mom = mudela_time_signature_l_->bar_mom();
   Moment now_mom = begin_mom;
 
   int begin_bar_i = (int) (now_mom / bar_mom) + 1;
   int end_bar_i = (int) (end_mom / bar_mom) + 1;
 
-  if (end_bar_i == begin_bar_i)
+  if  (end_bar_i == begin_bar_i)
     {
       output_mudela_rest_remain (mudela_stream_r, end_mom - begin_mom);
       return;
@@ -165,14 +161,14 @@ Mudela_staff::output_mudela_rest (Mudela_stream& mudela_stream_r, Moment begin_m
 
   //fill current bar
   Moment begin_bar_mom = Moment (begin_bar_i - 1) * bar_mom;
-  if (now_mom > begin_bar_mom)
+  if  (now_mom > begin_bar_mom)
     {
       int next_bar_i = (int) (now_mom / bar_mom) + 2;
       Moment next_bar_mom = Moment (next_bar_i - 1) * bar_mom;
       assert (next_bar_mom <= end_mom);
 
       Moment remain_mom = next_bar_mom - now_mom;
-      if (remain_mom > Moment (0))
+      if  (remain_mom > Moment (0))
 	{
 	  output_mudela_rest_remain (mudela_stream_r, remain_mom);
 	  now_mom += remain_mom;
@@ -183,28 +179,28 @@ Mudela_staff::output_mudela_rest (Mudela_stream& mudela_stream_r, Moment begin_m
 
   // fill whole bars
   int count_i = end_bar_i - bar_i;
-  for (int i = 0; i < count_i; i++)
+  for  (int i = 0; i < count_i; i++)
     {
       int begin_bar_i = check_begin_bar_i (now_mom, bar_i);
-      if (begin_bar_i)
+      if  (begin_bar_i)
 	output_mudela_begin_bar (mudela_stream_r, now_mom, begin_bar_i);
       mudela_stream_r << "r1 ";
       //	*mudela_stream_r.os_p_ << flush;
-      if (begin_bar_i)
-	LOGOUT (NORMAL_ver) << begin_bar_i << flush;
+      if  (begin_bar_i)
+	LOGOUT(NORMAL_ver) << begin_bar_i << flush;
       bar_i = check_end_bar_i (now_mom, bar_i);
       now_mom += bar_mom;
     }
 
   // use "int i" here, and gcc 2.7.2 hits internal compiler error
   int ii = check_begin_bar_i (now_mom, bar_i);
-  if (ii)
+  if  (ii)
     output_mudela_begin_bar (mudela_stream_r, now_mom, ii);
 
   //    bar_i = check_end_bar_i (now_mom, bar_i);
 
   Moment remain_mom = end_mom - Moment (end_bar_i - 1) * bar_mom;
-  if (remain_mom > Moment (0))
+  if  (remain_mom > Moment (0))
     {
       output_mudela_rest_remain (mudela_stream_r, remain_mom);
       now_mom += remain_mom;
@@ -215,24 +211,24 @@ Mudela_staff::output_mudela_rest (Mudela_stream& mudela_stream_r, Moment begin_m
 void
 Mudela_staff::output_mudela_rest_remain (Mudela_stream& mudela_stream_r, Moment mom)
 {
-  if (Duration_convert::no_quantify_b_s)
+  if  (Duration_convert::no_quantify_b_s)
     {
       Duration dur = Duration_convert::mom2_dur (mom);
-      mudela_stream_r << "r" << dur.str () << " ";
-      //	assert (mom == dur.mom ());
-      assert (mom == dur.length ());
+      mudela_stream_r << "r" << dur.str() << " ";
+      //	assert (mom == dur.mom());
+      assert (mom == dur.length());
       return;
     }
 
   Duration dur = Duration_convert::mom2standardised_dur (mom);
-  if (dur.type_i_>-10)
-    mudela_stream_r << "r" << dur.str () << " ";
+  if  (dur.type_i_>-10)
+    mudela_stream_r << "r" << dur.str() << " ";
 }
 #endif
 
 
 void
-Mudela_staff::process ()
+Mudela_staff::process()
 {
   /*
      group items into voices
@@ -243,11 +239,10 @@ Mudela_staff::process ()
   mudela_time_signature_l_ = mudela_score_l_g->mudela_time_signature_l_;
   mudela_tempo_l_ = mudela_score_l_g->mudela_tempo_l_;
 
-  Cons_list<Mudela_item> items;
-  for (Cons<Mudela_item>* i = mudela_item_p_list_.head_cons_p_; i; i = i->next_cons_p_)
-    //items.bottom ().add (*i);
-    items.append (new Cons<Mudela_item> (i->car_p_, 0));
+  Link_list<Mudela_item*> items;
+  for  (PCursor<Mudela_item*> i (mudela_item_p_list_); i.ok(); i++)
+    items.bottom().add (*i);
 
-  while (!items.empty_b ())
+  while  (items.size())
     eat_voice (items);
 }
diff --git a/mi2mu/mudela-voice.cc b/mi2mu/mudela-voice.cc
index 92c9b2ef3e..6f92d03f22 100644
--- a/mi2mu/mudela-voice.cc
+++ b/mi2mu/mudela-voice.cc
@@ -19,21 +19,21 @@ Mudela_voice::Mudela_voice (Mudela_staff* mudela_staff_l)
 void
 Mudela_voice::add_item (Mudela_item* mudela_item_l)
 {
-  mudela_item_l_list_.append (new Cons<Mudela_item> (mudela_item_l, 0));
+  mudela_item_l_list_.bottom().add (mudela_item_l);
 }
 
 Moment 
-Mudela_voice::begin_mom ()
+Mudela_voice::begin_mom()
 {
-  return !mudela_item_l_list_.empty_b () ? 
-    mudela_item_l_list_.car_l ()->at_mom () : Moment (0);
+  return mudela_item_l_list_.size() ? 
+    mudela_item_l_list_.top()->at_mom() : Moment (0);
 }
 
 Moment 
-Mudela_voice::end_mom ()
+Mudela_voice::end_mom()
 {
-  return !mudela_item_l_list_.empty_b () ? 
-    mudela_item_l_list_.tail_car_l ()->at_mom () : Moment (0);
+  return mudela_item_l_list_.size() ? 
+    mudela_item_l_list_.bottom()->at_mom() : Moment (0);
 }
 
 static int const FAIRLY_LONG_VOICE_i = 6;
@@ -41,37 +41,37 @@ static int const FAIRLY_LONG_VOICE_i = 6;
 void
 Mudela_voice::output (Mudela_stream& mudela_stream_r)
 {
-  if (mudela_item_l_list_.empty_b ())
+  if  (!mudela_item_l_list_.size())
     return;
   
-  if (mudela_item_l_list_.size_i () > FAIRLY_LONG_VOICE_i)
+  if  (mudela_item_l_list_.size() > FAIRLY_LONG_VOICE_i)
     mudela_stream_r << '\n';
 
   int current_bar_i = 0;
-  Moment bar_mom = mudela_staff_l_->mudela_time_signature_l_->bar_mom ();
+  Moment bar_mom = mudela_staff_l_->mudela_time_signature_l_->bar_mom();
 
-  for (Cons<Mudela_item>* i = mudela_item_l_list_.head_cons_p_; i; i = i->next_cons_p_)
+  for  (PCursor<Mudela_item*> i (mudela_item_l_list_); i.ok(); i++) 
     {
-      Moment at_mom = i->car_p_->mudela_column_l_->at_mom ();
+      Moment at_mom = i->mudela_column_l_->at_mom();
       int bar_i = (int) (at_mom / bar_mom) + 1;
-      if (bar_i > current_bar_i) 
+      if  (bar_i > current_bar_i) 
 	{
-	  if (current_bar_i) 
+	  if  (current_bar_i) 
 	    {
-	      if (at_mom == Moment (bar_i - 1) * bar_mom)
+	      if  (at_mom == Moment (bar_i - 1) * bar_mom)
 		mudela_stream_r << "|";
 	      mudela_stream_r << "\n% ";
 	      mudela_stream_r << String_convert::i2dec_str (bar_i, 0, ' ');
 	      mudela_stream_r << '\n';
 	    }
-	  LOGOUT (NORMAL_ver) << "[" << bar_i << "]" << flush; 
+	  LOGOUT(NORMAL_ver) << "[" << bar_i << "]" << flush; 
 	  current_bar_i = bar_i;
 	}
 
-      mudela_stream_r << *i->car_p_;
+      mudela_stream_r << **i;
     }
 
-  if (mudela_item_l_list_.size_i () > FAIRLY_LONG_VOICE_i)
+  if  (mudela_item_l_list_.size() > FAIRLY_LONG_VOICE_i)
     mudela_stream_r << '\n';
 }
 
diff --git a/mi2mu/template9.cc b/mi2mu/template9.cc
index e69de29bb2..7d99a4b920 100644
--- a/mi2mu/template9.cc
+++ b/mi2mu/template9.cc
@@ -0,0 +1,32 @@
+//
+// template.cc -- implementemplate
+// ugh: must have unique name for Cygnus' gcc:
+// liblily.a(template.o): In function `GLOBAL_$I$template.cc':
+// template.cc:28: multiple definition of `global constructors keyed to template.cc'
+//
+// copyright 1997 Jan Nieuwenhuizen <janneke@gnu.org>
+
+#include "proto.hh"
+#include "list.hh"
+#include "list.tcc"
+#include "cursor.tcc"
+
+class istream;
+class ostream;
+
+#include "mudela-item.hh"
+#include "mudela-column.hh"
+#include "mudela-staff.hh"
+#include "mudela-voice.hh"
+#include "mudela-staff.hh"
+#include "mudela-score.hh"
+#include "pcursor.hh"
+#include "plist.hh"
+#include "pcursor.tcc"
+#include "plist.tcc"
+
+POINTERLIST_INSTANTIATE(Mudela_item);
+POINTERLIST_INSTANTIATE(Mudela_staff);
+POINTERLIST_INSTANTIATE(Mudela_voice);
+POINTERLIST_INSTANTIATE(Mudela_column);
+POINTERLIST_INSTANTIATE(Mudela_score);
diff --git a/ps/lily.ps b/ps/lily.ps
index 87a5895d90..cd020ac71b 100644
--- a/ps/lily.ps
+++ b/ps/lily.ps
@@ -61,7 +61,7 @@
 	1 copy mul exch 1 copy mul add sqrt
 } bind def
 
-/draw_tuplet % dx dy thick dir
+/draw_tuplet % height dx dy thick dir
 {
 % urg: the only Level-2 PS, check effect in print
 %	true setstrokeadjust
@@ -71,9 +71,10 @@
 	1 setlinejoin
 	/tuplet_dy exch def
 	/tuplet_dx exch def
+	/tuplet_h exch def
 	staffheight 2 div /tuplet_gapx exch def
 	tuplet_dy tuplet_dx div tuplet_gapx mul /tuplet_gapy exch def
-	staffheight 4 div dir mul /tuplet_h exch def
+
 
 	0 0 moveto
 	0 tuplet_h lineto 
diff --git a/ps/lilyponddefs.ps b/ps/lilyponddefs.ps
index 4aa7edbdc2..9a369e9d51 100644
--- a/ps/lilyponddefs.ps
+++ b/ps/lilyponddefs.ps
@@ -56,19 +56,27 @@
 
 /vrule % width depth height
 {
-	gsave
-	3 -1 roll setlinewidth
-	%neg 0 exch moveto
-	0 exch moveto
-	neg 0 exch lineto stroke
-	grestore
 } bind def
 
-/draw_stem % breapth width depth height
+
+%
+% FIXME.  translate to middle of box.
+%
+
+/draw_box % breapth width depth height
 {
 	gsave
-	4 -1 roll neg 0 translate
-	vrule
+	4 -1 roll
+	dup
+	neg 0 translate
+	4 -1 roll
+	add
+
+	setlinewidth
+
+	0 exch moveto
+	neg 0 exch lineto stroke
+
 	grestore
 } bind def
 
diff --git a/scm/lily.scm b/scm/lily.scm
index 9c57c962c9..0e30e6190c 100644
--- a/scm/lily.scm
+++ b/scm/lily.scm
@@ -13,10 +13,18 @@
   (string-append 
    (map (lambda (n) (string-append (number->string n ) " ")) l)))
 
+(define (reduce operator list)
+      (if (null? (cdr list)) (car list)
+	  (operator (car list) (reduce operator (cdr list)))
+	  )
+      )
+
+
+(define (glue-2-strings a b) (string-append a " " b))
+
 (define
   (numbers->string l)
-  (apply string-append 
-	 (map (lambda (n) (string-append (number->string n) " ")) l)))
+  (reduce glue-2-strings (map number->string l)))
 
 (define (chop-decimal x) (if (< (abs x) 0.001) 0.0 x))
 
@@ -208,7 +216,7 @@
 
   (define (number->dim x)
     (string-append 
-     (number->string  (chop-decimal x)) "pt "))
+     (number->string  (chop-decimal x)) " pt "))
 
   (define (placebox x y s) 
     (string-append 
@@ -258,8 +266,8 @@
   (define (text s)
     (string-append "\\hbox{" (output-tex-string s) "}"))
   
-  (define (tuplet dx dy thick dir)
-    (embedded-ps ((ps-scm 'tuplet) dx dy thick dir)))
+  (define (tuplet ht dx dy thick dir)
+    (embedded-ps ((ps-scm 'tuplet) ht dx dy thick dir)))
 
   (define (volta w thick last)
     (embedded-ps ((ps-scm 'volta) w thick last)))
@@ -341,7 +349,7 @@
   
   (define (cached-fontname i)
     (string-append
-     "lilyfont"
+     " lilyfont"
      (make-string 1 (integer->char (+ 65 i)))))
 
   (define (select-font font-name)
@@ -368,15 +376,15 @@
      (numbers->string (list width slope thick)) " draw_beam " ))
 
   (define (bracket h)
-    (invoke-dim1 "draw_bracket" h))
+    (invoke-dim1 " draw_bracket" h))
 
   (define (char i)
-    (invoke-char "show" i))
+    (invoke-char " show" i))
 
   (define (crescendo w h cont)
     (string-append 
      (numbers->string (list w h (inexact->exact cont)))
-     "draw_crescendo"))
+     " draw_crescendo"))
 
   (define (dashed-slur thick dash l)
     (string-append 
@@ -390,7 +398,7 @@
   (define (decrescendo w h cont)
     (string-append 
      (numbers->string (list w h (inexact->exact cont)))
-     "draw_decrescendo"))
+     " draw_decrescendo"))
 
 
   (define (end-output)
@@ -400,7 +408,7 @@
   
   (define (filledbox breapth width depth height) 
     (string-append (numbers->string (list breapth width depth height))
-		   "draw_stem" ))
+		   " draw_box" ))
 
   ;; obsolete?
   (define (font-def i s)
@@ -444,21 +452,21 @@
     (string-append 
      (number->string x) " "
      (number->string y) " "
-     "rulesym"))
+     " rulesym"))
 
   (define (bezier-sandwich l)
     (string-append 
      (apply string-append (map control->string l)) 
      " draw_bezier_sandwich"))
 
-  (define (start-line)
+  (define (start-line height)
     (begin
       (clear-fontcache)
       "\nstart_line {\n"))
   
   (define (stem breapth width depth height) 
     (string-append (numbers->string (list breapth width depth height))
-		   "draw_stem" ))
+		   " draw_box" ))
 
   (define (stop-line)
       "}\nstop_line\n")
@@ -470,12 +478,12 @@
   (define (volta w thick last)
     (string-append 
      (numbers->string (list w thick (inexact->exact last)))
-     "draw_volta"))
+     " draw_volta"))
 
-  (define (tuplet dx dy thick dir)
+  (define (tuplet ht dx dy thick dir)
     (string-append 
-     (numbers->string (list dx dy thick (inexact->exact dir)))
-     "draw_tuplet"))
+     (numbers->string (list ht dx dy thick (inexact->exact dir)))
+     " draw_tuplet"))
 
 
   (define (unknown) 
diff --git a/scripts/mudela-book.py b/scripts/mudela-book.py
index 52d2ff8491..13598b96b5 100644
--- a/scripts/mudela-book.py
+++ b/scripts/mudela-book.py
@@ -8,6 +8,7 @@
 #
 # All non-english comments are NOT in swedish, they are norwegian!
 #  TODO:
+# * output various stuff either via sys.stderr or sys.stdout, not using print.
 # * center option (??)
 # * make mudela-book understand usepackage{geometry}
 # * check that linewidth set in \paper is not wider than actual linewidth?
@@ -67,6 +68,7 @@ import sys
 outdir = 'out'
 initfile = ''
 program_version = '0.5.3'
+include_path = ['.']
 
 out_files = []
 
@@ -89,6 +91,7 @@ begin_document_re = re.compile ('^ *\\\\begin{document}')
 documentclass_re = re.compile('\\\\documentclass')
 twocolumn_re = re.compile('\\\\twocolumn')
 onecolumn_re = re.compile('\\\\onecolumn')
+mudela_file_re = re.compile('\\\\mudelafile{([^}]+)}')
 preMudelaExample_re = re.compile('\\\\def\\\\preMudelaExample')
 postMudelaExample_re = re.compile('\\\\def\\\\postMudelaExample')
 boundingBox_re = re.compile('%%BoundingBox: ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)')
@@ -113,6 +116,17 @@ def ps_dimention(fname):
             int(s.groups()[3])-int(s.groups()[1]))
 
 
+def find_file (name):
+    for a in include_path:
+	try:
+	    nm = os.path.join (a, name)
+	    f = open (nm)
+	    return nm
+	except IOError:
+	    pass
+    return ''
+
+
 class CompileStatus:
     pass
 class SomethingIsSeriouslyBroken:
@@ -291,8 +305,12 @@ class Mudela_output:
             status = os.system ('diff -q %s %s' % (self.temp_filename, inf))
         if status:
             os.rename (self.temp_filename, inf)
-        if need_recompile_b(inf, outf):
+
+	recompile_b =  need_recompile_b(inf, outf)
+	if recompile_b:
             out_files.append((self.graphic_type, inf))
+	return recompile_b
+
     def insert_me_string(self):
         "Returns a string that can be used directly in latex."
         if self.graphic_type == 'tex':
@@ -386,6 +404,7 @@ class Tex_input:
             except:
                 continue
         raise IOError
+
     def get_lines (self):
         lines = self.infile.readlines ()
         (retlines, retdeps) = ([],[self.filename])
@@ -429,6 +448,7 @@ class Tex_input:
                 # This code should be rewritten, it looks terrible
                 r_mud = defined_mudela_cmd_re.search(line)
                 if r_mud:
+		    # TODO document this
                     ss = "\\\\verb(?P<xx>[^a-zA-Z])\s*\\\\%s\s*(?P=xx)" \
                          % re.escape(r_mud.group()[1:])
                     # just append the line if the command is inside \verb|..|
@@ -531,6 +551,30 @@ class Main_tex_input(Tex_input):
                     self.mudtex.write ('\\def\\preMudelaExample{}\n')
                 if not postMudelaDef:
                     self.mudtex.write ('\\def\\postMudelaExample{}\n')
+
+            elif mudela_file_re.search(line):
+		r = mudela_file_re.search(line)
+
+		self.mudela = Mudela_output(self.gen_basename())
+		fn = r.groups ()[0]
+		full_path = find_file (fn)
+		if not full_path:
+		    print 'error: can\'t find file `%s\'.' % fn
+		    sys.exit (1)
+		
+		f = open (full_path, 'r')
+		lines =f.readlines ()
+		for x in lines:
+		    self.mudela.write (x)
+		stat =self.mudela.close ()
+		if stat:
+			print "(File %s needs recompiling)\n" % full_path
+                self.mudtex.write (self.mudela.insert_me_string())
+		self.deps.append (full_path)
+		del self.mudela
+                self.mudela = None
+                self.fine_count = self.fine_count + 1
+		continue
             elif begin_mudela_re.search (line) and not latex_verbatim:
                 Props.clear_for_new_block()
                 if __debug__:
@@ -578,6 +622,7 @@ class Main_tex_input(Tex_input):
                 self.mode = 'latex'
                 continue
 
+
             if self.mode == 'mudela':
                 self.mudela.write (line)
                 if self.verbatim:
@@ -601,6 +646,7 @@ Options:\n
   --force-mudela-fontsize=??pt   force fontsize for all inline mudela
   --force-verbatim               make all mudela verbatim\n
   --dependencies                 write dependencies
+  --include                      include path
   --init                         mudela-book initfile
   """
 		     )
@@ -608,11 +654,13 @@ Options:\n
 
 
 def write_deps (fn, out,  deps):
-	out_fn = outdir + '/' + fn
-	print '`writing `%s\'\n\'' % out_fn
+	out_fn = os.path.join (outdir, fn)
+	
+	print 'writing `%s\'\n' % out_fn
 	
 	f = open (out_fn, 'w')
-	f.write ('%s: %s\n'% (outdir + '/' + out + '.dvi',
+	target = re.sub (os.sep + os.sep, os.sep, os.path.join (outdir, out + '.latex'))
+	f.write ('%s: %s\n'% (target,
 			      reduce (lambda x,y: x + ' '+ y, deps)))
 	f.close ()
 
@@ -624,10 +672,10 @@ def main():
     outname = ''
     try:
         (options, files) = getopt.getopt(
-            sys.argv[1:], 'hd:o:', ['outdir=', 'outname=',
+            sys.argv[1:], 'hd:o:I:', ['outdir=', 'outname=',
                                     'default-mudela-fontsize=',
                                     'force-mudela-fontsize=',
-                                    'help', 'dependencies',
+                                    'help', 'dependencies', 'include=',
                                     'force-verbatim', 'init='])
     except getopt.error, msg:
         print "error:", msg
@@ -637,37 +685,40 @@ def main():
     for opt in options:    
 	o = opt[0]
 	a = opt[1]
-	if o == '--outname' or o == '-o':
+	if o == '--include' or o == '-I':
+	    include_path.append (a)
+	elif o == '--outname' or o == '-o':
             if len(files) > 1:
                 #HACK
                 print "Mudela-book is confused by --outname on multiple files"
                 sys.exit(1)
             outname = a
-        if o == '--outdir' or o == '-d':
+        elif o == '--outdir' or o == '-d':
             outdir = a
-        if o == '--help' or o == '-h':
+        elif o == '--help' or o == '-h':
             help ()
-	if o == '--dependencies':
+	elif o == '--dependencies':
             do_deps = 1
-        if o == '--default-mudela-fontsize':
+        elif o == '--default-mudela-fontsize':
             if not fontsize_pt2i.has_key(a):
                 print "Error: illegal fontsize:", a
                 print " accepted fontsizes are: 11pt, 13pt, 16pt, 20pt, 26pt"
                 sys.exit()
             Props.setMudelaFontsize(fontsize_pt2i[a], 'init')
-	if o == '--force-mudela-fontsize':
+	elif o == '--force-mudela-fontsize':
             if not fontsize_pt2i.has_key(a):
                 print "Error: illegal fontsize:", a
                 print " accepted fontsizes are: 11pt, 13pt, 16pt, 20pt, 26pt"
                 sys.exit()
             Props.force_mudela_fontsize = fontsize_pt2i[a]
-        if o == '--force-verbatim':
+        elif o == '--force-verbatim':
             Props.force_verbatim_b = 1
-        if o == '--init':
+        elif o == '--init':
             initfile =  a
     if outdir[-1:] != '/':
         outdir = outdir + '/'
 
+    # r""" ... """ means: leave escape seqs alone.
     defined_mudela_cmd = {'mudela': r"""
 \begin{mudela}[eps \fontoptions]
   \type Staff <
@@ -685,9 +736,9 @@ def main():
         for i in d.keys():
             defined_mudela_cmd[i] = d[i]
         del d
-    c = defined_mudela_cmd.keys()[0]
-    for x in defined_mudela_cmd.keys()[1:]:
-        c = c + '|'+x
+
+    c = string.join (defined_mudela_cmd.keys(), '|')
+
     defined_mudela_cmd_re = re.compile("\\\\(%s)(\[(\d*pt)\])*{([^}]*)}" %c)
 
     if not os.path.isdir(outdir):
@@ -702,7 +753,6 @@ def main():
         my_depname = my_outname + '.dep'        
         inp = Main_tex_input (input_filename, my_outname)
         inp.do_it ()
-#        os.system('latex %s/%s.latex' % (outdir, my_outname))
         if do_deps:
             write_deps (my_depname, my_outname, inp.deps)
 
diff --git a/scripts/mup-to-ly.py b/scripts/mup-to-ly.py
index 1a32f66882..0b5875526e 100644
--- a/scripts/mup-to-ly.py
+++ b/scripts/mup-to-ly.py
@@ -7,6 +7,8 @@
 # 
 # (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
 
+# TODO: regex -> re.
+
 name = 'mup-to-ly'
 version = '0.1'
 
diff --git a/stepmake/stepmake/metapost-rules.make b/stepmake/stepmake/metapost-rules.make
index cddbaf88c5..525777d6f9 100644
--- a/stepmake/stepmake/metapost-rules.make
+++ b/stepmake/stepmake/metapost-rules.make
@@ -1,13 +1,16 @@
 
-$(outdir)/%.pfa: %.mf
 # urg
 # i've got no idea what this scaling could be for, on both sides...
 # it seems that 'low_res', which should be all we ever need according
 # to the metapost mfplain guru, really does 200dpi, iso 600dpi (minimun)
 #	-$(METAPOST) "&mfmp \mode=ljfour; \mag=100.0; batchmode; input $<"
 #	-$(METAPOST) "&mfplain \mode=lowres; \mag=100.0; batchmode; input $<"
+
+$(outdir)/%.0: %.mf
 	-$(METAPOST) "&mfplain \mode=lowres; \mag=30.0; batchmode; input $<"
-	$(PYTHON) $(depth)/buildscripts/ps-to-pfa.py $<
+
+$(outdir)/%.pfa: $(outdir)/%.0
+	$(PYTHON) $(depth)/buildscripts/ps-to-pfa.py --output $(basename $<).pfa $<
 	rm -f $(basename $(@F)).[0-9]*
 	rm -f $(basename $<).log $(basename $<).tfm
 
-- 
2.39.5