From 4995fea559cd5399b4f462de546a15195d76f4c3 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Fri, 29 Jun 2001 01:06:14 +0200 Subject: [PATCH] release: 1.5.0 ===== * experimental grace notes: - add grace timing to Moment - hack to Sequential_music_iterator to use the correct timing for the note before a grace - change the implementation of \grace construct - property set/unset (eg. font size) is done through startGraceMusic and stopGraceMusic - various engraver fixes to deal with the fact that the main-time-moment may remain the same during several steps. - Change column creation logic in score-engraver. * Bugfix: don't crash when \name not set in \translator block. * rename ly/*.ly to ly/*-init.ly (except language files) to avoid name clashes * deprecate Property_engraver, add Font_size_engraver to Staff, Voice and Thread. * Change mailing list address: *gnu-music*@gnu.org becomes *lilypond*@gnu.org * Put span-bar lines only between the other barlines, not on top of them (thanks to Juergen Reuter) 1.4.4.j --- CHANGES | 195 +++--------------- DEDICATION | 8 +- Documentation/misc/CHANGES-1.3 | 4 +- Documentation/misc/CHANGES-1.4 | 157 ++++++++++++++ Documentation/regression-test.tely | 2 + Documentation/topdocs/FAQ.texi | 2 +- Documentation/topdocs/INSTALL.texi | 7 +- Documentation/topdocs/README.texi | 19 +- Documentation/user/bugs.itexi | 2 +- Documentation/user/convert-ly.itexi | 2 +- Documentation/user/converters.itely | 14 +- Documentation/user/ly2dvi.itexi | 2 +- Documentation/user/refman.itely | 2 + Documentation/windows/compiling.texi | 8 + Documentation/windows/installing.texi | 3 +- FAQ.txt | 4 +- INSTALL.txt | 7 +- README.txt | 25 +-- VERSION | 4 +- buildscripts/lilypond-login.sh | 13 +- flower/include/rational.hh | 3 +- input/bugs/beam.ly | 15 ++ input/bugs/newgrace.ly | 8 + input/regression/grace-bar-line.ly | 13 ++ input/regression/grace-start.ly | 9 + input/regression/grace-sync.ly | 15 ++ input/regression/span-bar.ly | 37 ++++ input/test/trills.ly | 42 ++++ lily/auto-beam-engraver.cc | 10 +- lily/auto-change-iterator.cc | 2 +- lily/bar-engraver.cc | 4 +- lily/beam-engraver.cc | 10 +- lily/beam.cc | 41 ++-- lily/beaming-info.cc | 4 +- lily/change-iterator.cc | 10 +- lily/chord-tremolo-iterator.cc | 6 +- lily/clef-engraver.cc | 7 +- lily/duration.cc | 8 +- lily/folded-repeat-iterator.cc | 10 +- lily/font-size-engraver.cc | 42 ++++ lily/global-translator.cc | 4 +- lily/grace-iterator.cc | 2 +- lily/grace-position-performer.cc | 4 +- lily/include/duration.hh | 2 +- lily/include/grace-music.hh | 11 + lily/include/moment.hh | 44 ++-- lily/include/music-iterator.hh | 8 +- lily/include/music-list.hh | 6 +- lily/include/music-sequence.hh | 3 + lily/include/music-wrapper.hh | 1 + lily/include/music.hh | 2 +- lily/include/new-grace-iterator.hh | 30 +++ lily/include/new-grace-music.hh | 28 +++ lily/include/score-engraver.hh | 2 +- lily/include/sequential-music-iterator.hh | 11 + lily/include/spaceable-element.hh | 27 +-- lily/include/spaceable-grob.hh | 28 +++ lily/include/timing-translator.hh | 3 +- lily/lyric-combine-music-iterator.cc | 2 +- lily/main.cc | 3 +- lily/midi-item.cc | 8 +- lily/molecule.cc | 2 +- lily/moment.cc | 106 ++++++++++ lily/music-iterator.cc | 19 +- lily/music-list.cc | 103 --------- lily/music-output-def.cc | 11 +- lily/music-sequence.cc | 54 ++++- lily/music-wrapper-iterator.cc | 2 +- lily/music-wrapper.cc | 6 + lily/music.cc | 7 + lily/musical-request.cc | 2 +- lily/my-lily-lexer.cc | 1 + lily/new-grace-iterator.cc | 52 +++++ lily/new-grace-music.cc | 48 +++++ lily/output-property-music-iterator.cc | 6 +- lily/paper-column.cc | 2 +- lily/parser.yy | 40 +++- lily/part-combine-music-iterator.cc | 8 +- lily/percent-repeat-engraver.cc | 2 +- lily/percent-repeat-iterator.cc | 6 +- lily/property-iterator.cc | 18 +- lily/request-chord-iterator.cc | 6 +- lily/request-chord.cc | 48 +++++ lily/rod.cc | 2 +- lily/scm-option.cc | 13 +- lily/score-engraver.cc | 53 ++--- lily/sequential-music-iterator.cc | 105 +++++++++- lily/sequential-music.cc | 30 +++ lily/simple-music-iterator.cc | 6 +- lily/simple-spacer.cc | 4 +- lily/simultaneous-music-iterator.cc | 3 +- lily/simultaneous-music.cc | 41 ++++ ...spaceable-element.cc => spaceable-grob.cc} | 13 +- lily/spacing-engraver.cc | 2 +- lily/spacing-spanner.cc | 27 ++- lily/span-bar-engraver.cc | 2 - lily/span-bar.cc | 73 ++++++- lily/spring.cc | 2 +- lily/stem.cc | 6 +- lily/tie-engraver.cc | 2 +- lily/tie-performer.cc | 2 +- lily/time-scaled-music-iterator.cc | 4 +- lily/timing-engraver.cc | 35 +++- lily/timing-translator.cc | 26 +-- lily/translator-group.cc | 1 - lily/unfolded-repeat-iterator.cc | 4 +- ly/{a4.ly => a4-init.ly} | 0 ...cordion-defs.ly => accordion-defs-init.ly} | 0 ly/{book-init.ly => book-init-init.ly} | 4 +- ly/{center.ly => center-init.ly} | 4 +- ...d-modifiers.ly => chord-modifiers-init.ly} | 0 ly/{declarations.ly => declarations-init.ly} | 23 ++- ly/{drumpitch.ly => drumpitch-init.ly} | 0 ...mic-scripts.ly => dynamic-scripts-init.ly} | 0 ly/{engraver.ly => engraver-init.ly} | 70 +------ ...-doc.ly => generate-interface-doc-init.ly} | 0 ...generic-paper.ly => generic-paper-init.ly} | 0 ...german-chords.ly => german-chords-init.ly} | 0 ly/grace-init.ly | 58 ++++++ ly/init.fly | 14 -- ly/init.ly | 2 +- ly/init.sly | 17 -- ly/{ledger.ly => ledger-init.ly} | 0 ly/{legal.ly => legal-init.ly} | 2 +- ly/{letter.ly => letter-init.ly} | 2 +- ly/{midi.ly => midi-init.ly} | 2 +- ly/{paper-as5.ly => paper-as5-init.ly} | 4 +- ly/{paper-as9.ly => paper-as9-init.ly} | 4 +- ly/{paper.ly => paper-init.ly} | 2 +- ly/{paper11.ly => paper11-init.ly} | 4 +- ly/{paper13.ly => paper13-init.ly} | 4 +- ly/paper16-init.ly | 12 ++ ly/paper16.ly | 12 +- ly/{paper20.ly => paper20-init.ly} | 4 +- ly/{paper23.ly => paper23-init.ly} | 4 +- ly/paper26-init.ly | 12 ++ ly/paper26.ly | 12 +- ly/{params-as.ly => params-as-init.ly} | 2 +- ly/{params.ly => params-init.ly} | 8 +- ly/{part-paper.ly => part-paper-init.ly} | 2 +- ly/{performer.ly => performer-init.ly} | 0 ly/{property.ly => property-init.ly} | 2 +- ...finitions.ly => scale-definitions-init.ly} | 0 ly/{script.ly => script-init.ly} | 0 ly/{spanners.ly => spanners-init.ly} | 0 make/out/lilypond.lsm | 8 +- make/out/lilypond.redhat.spec | 4 +- make/out/lilypond.suse.spec | 4 +- midi2ly/duration.cc | 4 +- ps/lilyponddefs.ps | 23 --- ps/music-drawing-routines.ps | 90 ++++++-- scm/grob-description.scm | 4 +- scm/lily.scm | 2 +- scm/ps.scm | 8 +- scm/tex.scm | 10 +- scm/translator-property-description.scm | 4 + 156 files changed, 1692 insertions(+), 765 deletions(-) create mode 100644 Documentation/misc/CHANGES-1.4 create mode 100644 input/bugs/beam.ly create mode 100644 input/bugs/newgrace.ly create mode 100644 input/regression/grace-bar-line.ly create mode 100644 input/regression/grace-start.ly create mode 100644 input/regression/grace-sync.ly create mode 100644 input/regression/span-bar.ly create mode 100644 input/test/trills.ly create mode 100644 lily/font-size-engraver.cc create mode 100644 lily/include/new-grace-iterator.hh create mode 100644 lily/include/new-grace-music.hh create mode 100644 lily/include/spaceable-grob.hh create mode 100644 lily/new-grace-iterator.cc create mode 100644 lily/new-grace-music.cc create mode 100644 lily/request-chord.cc create mode 100644 lily/sequential-music.cc create mode 100644 lily/simultaneous-music.cc rename lily/{spaceable-element.cc => spaceable-grob.cc} (83%) rename ly/{a4.ly => a4-init.ly} (100%) rename ly/{accordion-defs.ly => accordion-defs-init.ly} (100%) rename ly/{book-init.ly => book-init-init.ly} (61%) rename ly/{center.ly => center-init.ly} (70%) rename ly/{chord-modifiers.ly => chord-modifiers-init.ly} (100%) rename ly/{declarations.ly => declarations-init.ly} (62%) rename ly/{drumpitch.ly => drumpitch-init.ly} (100%) rename ly/{dynamic-scripts.ly => dynamic-scripts-init.ly} (100%) rename ly/{engraver.ly => engraver-init.ly} (85%) rename ly/{generate-interface-doc.ly => generate-interface-doc-init.ly} (100%) rename ly/{generic-paper.ly => generic-paper-init.ly} (100%) rename ly/{german-chords.ly => german-chords-init.ly} (100%) create mode 100644 ly/grace-init.ly delete mode 100644 ly/init.fly delete mode 100644 ly/init.sly rename ly/{ledger.ly => ledger-init.ly} (100%) rename ly/{legal.ly => legal-init.ly} (76%) rename ly/{letter.ly => letter-init.ly} (76%) rename ly/{midi.ly => midi-init.ly} (69%) rename ly/{paper-as5.ly => paper-as5-init.ly} (83%) rename ly/{paper-as9.ly => paper-as9-init.ly} (79%) rename ly/{paper.ly => paper-init.ly} (95%) rename ly/{paper11.ly => paper11-init.ly} (75%) rename ly/{paper13.ly => paper13-init.ly} (76%) create mode 100644 ly/paper16-init.ly rename ly/{paper20.ly => paper20-init.ly} (75%) rename ly/{paper23.ly => paper23-init.ly} (76%) create mode 100644 ly/paper26-init.ly rename ly/{params-as.ly => params-as-init.ly} (97%) rename ly/{params.ly => params-init.ly} (89%) rename ly/{part-paper.ly => part-paper-init.ly} (86%) rename ly/{performer.ly => performer-init.ly} (100%) rename ly/{property.ly => property-init.ly} (99%) rename ly/{scale-definitions.ly => scale-definitions-init.ly} (100%) rename ly/{script.ly => script-init.ly} (100%) rename ly/{spanners.ly => spanners-init.ly} (100%) diff --git a/CHANGES b/CHANGES index 0ccd47a168..6fe737d185 100644 --- a/CHANGES +++ b/CHANGES @@ -1,176 +1,45 @@ - - -1.4.3.jcn2 -========== - -* Included documentatioon and post-flex lexer.cc patch for -Debian/unstable gcc-3.0. - -* Enhanced gcc autoconf and make messages. - -* Added -mieee to CFLAGS for alpha. - -* Fixed help and documentation of new LilyPond command line. - -* Redirected SuSE download to ftp.lilypond.org (where mirror script runs). - -1.4.3 -===== - -1.4.2.jcn4 -========== - -* Windows: bugfix for tex-wrappers, added tex wrapper for dvips. -LilyPond (read: ly2dvi) should now work right out of the box. - -Amazing; it seems that ly2dvi won't generate PK files without this -dvips wrapper. We had over 200 downloads of setup.exe, yet only one -`call for help'. Did all the others give up, or did none of them -bother to share their fix/file a bug report? Urg. - -* Included mktexnam.patch (again?). - -* Documentation fix (Mark Hindley). - -* Debian patch and bashism fix (Anthony). - -* Bugfix: local-install should depend on $(INSTALLATION_FILES). This fixes -./configure; make install in buildscripts/ (Michael Vanier). - -* Removed les-nereides from short-examples, as it is tweaked a lot, -contrary to what the webpage claims (didn't know that). - -1.4.2.mb1 -========== - -* ly2dvi, titledefs.tex: Typeset copyright notice at the bottom of the -first page. Make separate page styles for first and last page. - -* Bugfix: Default RehearsalMark font-family changed to roman (only -affects Scheme text markups). - -1.4.2.hwn1 -========== - -* Added support for Q: statement to abc2ly. (Laura Conrad) - -* Tie shape bugfix (Mark Hindley). - -* Bugfix: lilypond-book LatexPaper.__setattr__() - -* Bugfix: make Hyphen_spanner::brew_molecule() more robust. - -* Don't use stdin when no argument specified. - -* Naming smobs -> grobs - -* Bugfix: ledger lines on easy-notation note heads. - -1.4.2 +1.5.0 ===== -* Glossary fixes (Thanks Jean-Pierre Coulon). - -1.4.1.jcn3 -========== - -* Updated les-nereides. +* experimental grace notes: + - add grace timing to Moment + - hack to Sequential_music_iterator to use the correct timing for +the note before a grace + - change the implementation of \grace construct + - property set/unset (eg. font size) is done through startGraceMusic +and stopGraceMusic + - various engraver fixes to deal with the fact that the +main-time-moment may remain the same during several steps. + - Change column creation logic in score-engraver. -* Added \newpage command. +* Bugfix: don't crash when \name not set in \translator block. -* Doco fixes. +* rename ly/*.ly to ly/*-init.ly (except language files) to avoid +name clashes -* Debian make fix. +* deprecate Property_engraver, add Font_size_engraver to Staff, Voice +and Thread. -* Fix for index, small doco fixes. +* Change mailing list address: *gnu-music*@gnu.org becomes +*lilypond*@gnu.org -* Bugfix: use roman font (instead of feta) for unacorda pedal. +* Put span-bar lines only between the other barlines, not on top of +them (thanks to Juergen Reuter) -* Don't use cyclic symlinks for web doc. - -* Don't create `empty pngs' with touch, make symlinks instead. - -* Added extra header titling fields to ly2dvi too. - -1.4.1.mb2 -========= - -* documentation fixes - -* Add make rule to avoid problems building dvi documentation - -* Documentation fixes - -* Bugfix: tuplet-number-visibility - -1.4.1.hwn1 -========== - -* Do not lengthen the stem in case of a collision with the flag, but -move dots to the right. - -* Debian patches (Thanks, Anthony!) - -1.4.1 -===== - -1.4.0.jcn7 +1.4.4.jcn3 ========== + +TODO: look at other filledbox'es (stafflines and barlines don't match up). -* Added \tupletUp, \tupletDown, \tupletBoth. - -* Bugfix convert-ly: treCorde. - -* Slur attachment and extremity offsets taken relative to slur -direction; so that - - Slur \override #'attachment-offset = #'((0 . 1) . (0 . 1)) - -will always make the slur move away from the note head. - -* Bugfix: slurs on dotted or flagged notes. - -* Added @reng, @rgrob, and @rint macros for referencing engravers, -grobs and interfaces in documentation. - -* Bugfix for configure. - -* text2html: use python script, use
 instead of .
-
-* Fixed pa.ly.
-
-* Bugfix: lilypond mode: make view messages scroll by.
-
-* configure: check for splitting makeinfo; small fixes for
-non-splitting makeinfo doc.
-
-* Added some missing titling (dedication, translator) and fixed ps titling
-(Thanks David Arnold).
-
-* More doco fixes.  Added a small legend.
-
-* Bugfix: trend of broken slurs with user-overridden stem attachments.
-
-* Bugfix redhat.spec: use root attributes on files.
-
-* Bugfix: typo in update-lily, re-set download url to /development.
-
-* Removed some empty files.
-
-* Merged tutorials. Simplified the text.
-
-* Small doco fixes.
-
-1.4.0.uu1
-=========
-
-* Bugfix: percussion clef
-
-* Bugfix: multiple scripts.
+* Testing code off by default.  On: -e "(define ps-testing 1)" -fps
 
-* Bugfix: read TeX's afm files. Metrics are still messed up (too small), but no
-crash.
+* Output via TeX/dvips still gives problems.  Use direct postscript
+output for real testing.
 
-* Bugfix: fixed the problem where dots clash with other notes (Timothy S.
-Nelson)
+* Beam and stem fixes:
+ - Stems drawn in PostScript (should do all filledbox'es in PS?).
+ - Fixes for draw_box and draw_beam PostScript routines.
+ - Stems reach to top (or bottom) of beam.
+ - Beam uses correct stem thickness (only right beams, left TODO).
+ - testing code in effect: only outlines are drawn.
 
diff --git a/DEDICATION b/DEDICATION
index e29874c5e9..ad8fcd5309 100644
--- a/DEDICATION
+++ b/DEDICATION
@@ -5,10 +5,10 @@
 			 met through music. 
 
 
-	Those deserving special mentioning (in no particular order):
-Esther, Marijke, Heike, Inge, Judith, Hannah, Auke, Ilse, Evelyn,
-Maartje, Suzanne, Ilse (gee, again?), Marieke, Irene, Martine, and
-last (but certainly not least) Janneke!
+	Those deserving special mentioning (in no particular order): Esther,
+Marijke, Heike, Inge, Judith, Hannah, Auke, Ilse, Evelyn, Maartje, Suzanne,
+Ilse (gee, again?), Marieke, Irene, Martine, Idwine and last (but certainly not
+least) Janneke!
 
 	HWN
 
diff --git a/Documentation/misc/CHANGES-1.3 b/Documentation/misc/CHANGES-1.3
index 864e359b6d..476a69dc15 100644
--- a/Documentation/misc/CHANGES-1.3
+++ b/Documentation/misc/CHANGES-1.3
@@ -41,7 +41,7 @@ dvips are stored in outdir.
 * PO updates.
 
 * petite-ouverture-a-danser.ly bugfix, twinkle.ly bugfix
-V
+
 1.3.153
 =======
 
@@ -363,7 +363,7 @@ staff.
 
 * Add a check for regular identifiers to parser.
 
-1.3.145
+1.3.146
 =======
 
 * Make and ly2dvi fixes.
diff --git a/Documentation/misc/CHANGES-1.4 b/Documentation/misc/CHANGES-1.4
new file mode 100644
index 0000000000..af019b8376
--- /dev/null
+++ b/Documentation/misc/CHANGES-1.4
@@ -0,0 +1,157 @@
+1.4.2.jcn4
+==========
+
+* Windows: bugfix for tex-wrappers, added tex wrapper for dvips.
+LilyPond (read: ly2dvi) should now work right out of the box.
+
+Amazing; it seems that ly2dvi won't generate PK files without this
+dvips wrapper.  We had over 200 downloads of setup.exe, yet only one
+`call for help'.  Did all the others give up, or did none of them
+bother to share their fix/file a bug report?  Urg.
+
+* Included mktexnam.patch (again?).
+
+* Documentation fix (Mark Hindley).
+
+* Debian patch and bashism fix (Anthony).
+
+* Bugfix: local-install should depend on $(INSTALLATION_FILES).  This fixes
+./configure; make install in buildscripts/ (Michael Vanier).
+
+* Removed les-nereides from short-examples, as it is tweaked a lot,
+contrary to what the webpage claims (didn't know that).
+
+1.4.2.mb1
+==========
+
+* ly2dvi, titledefs.tex: Typeset copyright notice at the bottom of the
+first page. Make separate page styles for first and last page.
+
+* Bugfix: Default RehearsalMark font-family changed to roman (only
+affects Scheme text markups).
+
+1.4.2.hwn1
+==========
+
+* Added support for Q: statement to abc2ly. (Laura Conrad)
+
+* Tie shape bugfix (Mark Hindley).
+
+* Bugfix: lilypond-book LatexPaper.__setattr__()
+
+* Bugfix: make Hyphen_spanner::brew_molecule() more robust.
+
+* Don't use stdin when no argument specified.
+
+* Naming smobs -> grobs 
+
+* Bugfix: ledger lines on easy-notation note heads.
+
+1.4.2
+=====
+
+* Glossary fixes (Thanks Jean-Pierre Coulon).
+
+1.4.1.jcn3
+==========
+
+* Updated les-nereides.
+
+* Added \newpage command.
+
+* Doco fixes.
+
+* Debian make fix.
+
+* Fix for index, small doco fixes.
+
+* Bugfix: use roman font (instead of feta) for unacorda pedal.
+
+* Don't use cyclic symlinks for web doc.
+
+* Don't create `empty pngs' with touch, make symlinks instead.
+
+* Added extra header titling fields to ly2dvi too.
+
+1.4.1.mb2
+=========
+
+* documentation fixes
+
+* Add make rule to avoid problems building dvi documentation
+
+* Documentation fixes
+
+* Bugfix: tuplet-number-visibility
+
+1.4.1.hwn1
+==========
+
+* Do not lengthen the stem in case of a collision with the flag, but
+move dots to the right.
+
+* Debian patches (Thanks, Anthony!)
+
+1.4.1
+=====
+
+1.4.0.jcn7
+==========
+
+* Added \tupletUp, \tupletDown, \tupletBoth.
+
+* Bugfix convert-ly: treCorde.
+
+* Slur attachment and extremity offsets taken relative to slur
+direction; so that
+
+   Slur \override #'attachment-offset = #'((0 . 1) . (0 . 1))
+
+will always make the slur move away from the note head.
+
+* Bugfix: slurs on dotted or flagged notes.
+
+* Added @reng, @rgrob, and @rint macros for referencing engravers,
+grobs and interfaces in documentation.
+
+* Bugfix for configure.
+
+* text2html: use python script, use <pre> instead of <xmp>.
+
+* Fixed pa.ly.
+
+* Bugfix: lilypond mode: make view messages scroll by.
+
+* configure: check for splitting makeinfo; small fixes for
+non-splitting makeinfo doc.
+
+* Added some missing titling (dedication, translator) and fixed ps titling
+(Thanks David Arnold).
+
+* More doco fixes.  Added a small legend.
+
+* Bugfix: trend of broken slurs with user-overridden stem attachments.
+
+* Bugfix redhat.spec: use root attributes on files.
+
+* Bugfix: typo in update-lily, re-set download url to /development.
+
+* Removed some empty files.
+
+* Merged tutorials. Simplified the text.
+
+* Small doco fixes.
+
+1.4.0.uu1
+=========
+
+* Bugfix: percussion clef
+
+* Bugfix: multiple scripts.
+
+* Bugfix: read TeX's afm files. Metrics are still messed up (too small), but no
+crash.
+
+* Bugfix: fixed the problem where dots clash with other notes (Timothy S.
+Nelson)
+
diff --git a/Documentation/regression-test.tely b/Documentation/regression-test.tely
index 54d58e9fe8..e6114b6f1c 100644
--- a/Documentation/regression-test.tely
+++ b/Documentation/regression-test.tely
@@ -221,6 +221,8 @@ and documenting bugfixes.
 
 @lilypondfile[printfilename]{bar-number.ly}
 
+@lilypondfile[printfilename]{span-bar.ly}
+
 @lilypondfile[printfilename]{bar-scripts.ly}
 
 @lilypondfile[printfilename]{staff-margin.ly}
diff --git a/Documentation/topdocs/FAQ.texi b/Documentation/topdocs/FAQ.texi
index 257fccc37d..3612f583d0 100644
--- a/Documentation/topdocs/FAQ.texi
+++ b/Documentation/topdocs/FAQ.texi
@@ -19,7 +19,7 @@
 @subsection I'm stuck, HELP!
 
 Please read the
-@uref{http://appel.lilypond.org/wiki?LilyPondFaqs, full online
+@uref{http://lilypond.org/wiki?LilyPondFaqs, full online
 FAQs}.  Also, please look in the searchable mailinglist archives:
 
 @itemize @bullet
diff --git a/Documentation/topdocs/INSTALL.texi b/Documentation/topdocs/INSTALL.texi
index 8a0b07f13c..59f14e5688 100644
--- a/Documentation/topdocs/INSTALL.texi
+++ b/Documentation/topdocs/INSTALL.texi
@@ -489,10 +489,9 @@ interfere with your build, you may want to do this before the build too:
 
 @section Problems
 
-For help and questions use @email{help-gnu-music@@gnu.org} and
-@email{gnu-music-discuss@@gnu.org}.  Please consult the FAQ before
-mailing your problems.  If you find bugs, please send bug reports to
-@email{bug-gnu-music@@gnu.org}.
+For help and questions use @email{lilypond-user@@gnu.org}.  Please
+consult the FAQ before mailing your problems.  If you find bugs, please
+send bug reports to @email{bug-lilypond@@gnu.org}.
 
 Bugs that are not fault of LilyPond are documented here.
 
diff --git a/Documentation/topdocs/README.texi b/Documentation/topdocs/README.texi
index a9160cdb0d..421369f899 100644
--- a/Documentation/topdocs/README.texi
+++ b/Documentation/topdocs/README.texi
@@ -64,19 +64,20 @@ criticism, comments, bugreports, patches, etc., to the mailing list,
 We have the following mailing lists:
 
 @itemize @bullet
-@item @uref{http://mail.gnu.org/mailman/listinfo/info-gnu-music,info-gnu-music@@gnu.org}
+@item @uref{http://mail.gnu.org/mailman/listinfo/info-lilypond,info-lilypond@@gnu.org}
 is a low-volume list for information on the GNU Music project.
     This list is moderated; ask 
     @email{drl@@gnu.org, David R. Linn} or
     @email{hanwen@@cs.uu.nl, Han-Wen} to send announcements for this
 list.
 @item
-@uref{http://mail.gnu.org/mailman/listinfo/gnu-music-discuss,gnu-music-discuss@@gnu.org}
-  For general discussions concerning LilyPond.
+@uref{http://mail.gnu.org/mailman/listinfo/lilypond-devel,lilypond-devel@@gnu.org}
+  For discussions about developing lilypond, in particular the unstable series.
 
-@item @uref{http://mail.gnu.org/mailman/listinfo/help-gnu-music,help-gnu-music@@gnu.org}
-    For help with using LilyPond.
-@item @uref{http://mail.gnu.org/mailman/listinfo/bug-gnu-music,bug-gnu-music@@gnu.org}
+@item @uref{http://mail.gnu.org/mailman/listinfo/help-lilypond,help-lilypond@@gnu.org}
+  For discussions about using lilypond, in particular the stable series.
+
+@item @uref{http://mail.gnu.org/mailman/listinfo/bug-lilypond,bug-lilypond@@gnu.org}
 If you have bugreports, you should send them to this list.
 @end itemize
 
@@ -100,9 +101,9 @@ a script to do this for you is in @file{buildscripts/clean-fonts.sh}
 
 @section Bugs
 
-Send bug reports to @email{bug-gnu-music@@gnu.org}.  For help and
-questions use @email{help-gnu-music@@gnu.org} and
-@email{gnu-music-discuss@@gnu.org}.  Please consult the FAQ and
+Send bug reports to @email{bug-lilypond@@gnu.org}.  For help and
+questions use @email{help-lilypond@@gnu.org} and
+@email{lilypond-discuss@@gnu.org}.  Please consult the FAQ and
 installation instructions before mailing your problems.
 
 
diff --git a/Documentation/user/bugs.itexi b/Documentation/user/bugs.itexi
index fc51178df9..033837abff 100644
--- a/Documentation/user/bugs.itexi
+++ b/Documentation/user/bugs.itexi
@@ -27,7 +27,7 @@ system libraries, whether you downloaded a binary release)
 @end itemize
 
 
-You can send the report to @email{bug-gnu-music@@gnu.org}. This is a
+You can send the report to @email{bug-lilypondg@@gnu.org}. This is a
 mailinglist, but you don't have to be subscribed to it.  You may also
 enter the bug in the LilyPond wiki, at
 @uref{http://www.lilypond.org/wiki?LilyPondBugs}.
diff --git a/Documentation/user/convert-ly.itexi b/Documentation/user/convert-ly.itexi
index dc1590a6ed..f5bfe39042 100644
--- a/Documentation/user/convert-ly.itexi
+++ b/Documentation/user/convert-ly.itexi
@@ -53,6 +53,6 @@ work.
 
 @code{convert-ly} is written in @uref{http://www.python.org,Python}. It
 was written by @email{hanwen@@cs.uu.nl, Han-Wen Nienhuys}. Report bugs
-to @code{bug-gnu-music@@gnu.org}
+to @code{bug-lilypond@@gnu.org}
 
 
diff --git a/Documentation/user/converters.itely b/Documentation/user/converters.itely
index b6d09011ad..7609ed2ca2 100644
--- a/Documentation/user/converters.itely
+++ b/Documentation/user/converters.itely
@@ -75,7 +75,7 @@ robust midi2ly.
 @end table
 
 
-Report bugs to @email{bug-gnu-music@@gnu.org}.
+Report bugs to @email{bug-lilypond@@gnu.org}.
 
 
 Written by @email{Jan Nieuwenhuizen, janneke@@gnu.org}.
@@ -115,7 +115,7 @@ Known: articulation scripts are buggy.  Empty measures confuse etf2ly.
 
 Written by @email{Han-Wen Nienhuys,hanwen@@cs.uu.nl}.
 
-Report bugs to @email{bug-gnu-music@@gnu.org}.
+Report bugs to @email{bug-lilypond@@gnu.org}.
 
 @node abc2ly
 @section abc2ly
@@ -175,7 +175,7 @@ abc2ly ignores the ABC beaming.
 Written by @email{Han-Wen Nienhuys,hanwen@@cs.uu.nl}.
 @c How about Laura?   /MB
 
-Report bugs to @email{bug-gnu-music@@gnu.org}.
+Report bugs to @email{bug-lilypond@@gnu.org}.
 
 @node pmx2ly
 @section pmx2ly
@@ -183,7 +183,7 @@ Report bugs to @email{bug-gnu-music@@gnu.org}.
 PMX is a MusiXTeX preprocessor written by Don Simons, see
 @uref{http://icking-music-archive.sunsite.dk/Misc/Music/musixtex/software/pmx/}.
 
-Report bugs to @email{bug-gnu-music@@gnu.org}.
+Report bugs to @email{bug-lilypond@@gnu.org}.
 
 @subsection Invoking pmx2ly
 
@@ -204,7 +204,7 @@ set output filename to FILE
 version information
 @end table
 
-Report bugs to @email{bug-gnu-music@@gnu.org}.
+Report bugs to @email{bug-lilypond@@gnu.org}.
 
 Written by @email{Han-Wen Nienhuys,hanwen@@cs.uu.nl}.
 
@@ -242,7 +242,7 @@ version information
 @var{REFFILE}
 @end table
 
-Report bugs to @email{bug-gnu-music@@gnu.org}.
+Report bugs to @email{bug-lilypond@@gnu.org}.
 
 Written by @email{Han-Wen Nienhuys,hanwen@@cs.uu.nl}.
 
@@ -289,7 +289,7 @@ converted.
 
 Written by @email{Jan Nieuwenhuizen,janneke@@gnu.org}, based on pmx2ly.
 
-Report bugs to @email{bug-gnu-music@@gnu.org}.
+Report bugs to @email{bug-lilypond@@gnu.org}.
 
 
 
diff --git a/Documentation/user/ly2dvi.itexi b/Documentation/user/ly2dvi.itexi
index c1ee6242fa..5e4f97c6c2 100644
--- a/Documentation/user/ly2dvi.itexi
+++ b/Documentation/user/ly2dvi.itexi
@@ -150,7 +150,7 @@ selects the language for the warning messages of Ly2dvi and LilyPond.
 @unnumberedsubsec  Bugs
 
 Cannot generate @TeX{} or @code{PostScript} only.  Send bugreports to to
-@email{bug-gnu-music@@gnu.org}.
+@email{bug-lilypond@@gnu.org}.
 
 @unnumberedsubsec  Authors
 
diff --git a/Documentation/user/refman.itely b/Documentation/user/refman.itely
index ac17a848af..7a4bc4379b 100644
--- a/Documentation/user/refman.itely
+++ b/Documentation/user/refman.itely
@@ -544,6 +544,7 @@ Shortcut for
 @example
   \property Staff.clefGlyph = @var{glyph associated with clefname} 
   \property Staff.clefPosition = @var{clef Y-position for clefname}
+  \property Staff.centralCPosition = @var{position for central C} 
   \property Staff.clefOctavation = @var{extra transposition of clefname}
 @end example
 
@@ -3505,6 +3506,7 @@ pstops ...
 
 
 @refbugs
+
 There is no mechanism to select magnification of particular fonts,
 meaning that you don't have access to continuously scaled fonts.
 
diff --git a/Documentation/windows/compiling.texi b/Documentation/windows/compiling.texi
index 5110fb12e2..dc2b06439d 100644
--- a/Documentation/windows/compiling.texi
+++ b/Documentation/windows/compiling.texi
@@ -19,11 +19,19 @@ webpage}.  You may need the patch @file{guile-1.4-gnu-windows.patch}
 included in LilyPond's source distribution.
 @end table
 
+@subsection Cross compiling
+
 These binaries are cross compiled for Windows on a GNU/Linux box.  You
 may want to check out the
 @uref{http://www.lilypond.org/gnu-windows/cross.tar.gz,cross compilation
 scripts}.
 
+@subsection Compiling on Windows
+
+Compiling on Windows should be possible, but how should we now?  If you
+have any experiences you want to share, please do so at
+@uref{http://lilypond.org/wiki?CompilingOnWindows,Compiling on Windows}.
+Or write to one of the mailing lists.
 
 @section Windows installation specifics
 
diff --git a/Documentation/windows/installing.texi b/Documentation/windows/installing.texi
index 9f2fa8bf9b..a06bc0e476 100644
--- a/Documentation/windows/installing.texi
+++ b/Documentation/windows/installing.texi
@@ -90,7 +90,8 @@ and try again.
 @subsection Trouble
 
 For problems and solutions see
-@uref{Troubleshooting Windows,http://lilypond.org/TroubleshootingWindows}.
+@uref{http://lilypond.org/wiki?TroubleshootingWindows,Troubleshooting
+Windows}
 
 
 @subsection Additional software
diff --git a/FAQ.txt b/FAQ.txt
index 0db3958775..f4671b9707 100644
--- a/FAQ.txt
+++ b/FAQ.txt
@@ -8,8 +8,8 @@ I'm stuck, HELP!
 ----------------
 
    Please read the full online FAQs
-(http://appel.lilypond.org/wiki?LilyPondFaqs).  Also, please look in
-the searchable mailinglist archives:
+(http://lilypond.org/wiki?LilyPondFaqs).  Also, please look in the
+searchable mailinglist archives:
 
    * help-gnu-music (http://www.mail-archive.com/help-gnu-music@gnu.org)
 
diff --git a/INSTALL.txt b/INSTALL.txt
index eb9e403815..a9ed703b22 100644
--- a/INSTALL.txt
+++ b/INSTALL.txt
@@ -463,10 +463,9 @@ interfere with your build, you may want to do this before the build too:
 Problems
 ========
 
-   For help and questions use <help-gnu-music@gnu.org> and
-<gnu-music-discuss@gnu.org>.  Please consult the FAQ before mailing
-your problems.  If you find bugs, please send bug reports to
-<bug-gnu-music@gnu.org>.
+   For help and questions use <lilypond-user@gnu.org>.  Please consult
+the FAQ before mailing your problems.  If you find bugs, please send
+bug reports to <bug-lilypond@gnu.org>.
 
    Bugs that are not fault of LilyPond are documented here.
 
diff --git a/README.txt b/README.txt
index 9d530f818c..c5ea27a416 100644
--- a/README.txt
+++ b/README.txt
@@ -52,22 +52,23 @@ list, _not_ to us personally.
 
    We have the following mailing lists:
 
-   * info-gnu-music@gnu.org
-     (http://mail.gnu.org/mailman/listinfo/info-gnu-music) is a
+   * info-lilypond@gnu.org
+     (http://mail.gnu.org/mailman/listinfo/info-lilypond) is a
      low-volume list for information on the GNU Music project.
      This list is moderated; ask     David R. Linn <drl@gnu.org> or
      Han-Wen <hanwen@cs.uu.nl> to send announcements for this list.
 
-   * gnu-music-discuss@gnu.org
-     (http://mail.gnu.org/mailman/listinfo/gnu-music-discuss)   For
-     general discussions concerning LilyPond.
+   * lilypond-devel@gnu.org
+     (http://mail.gnu.org/mailman/listinfo/lilypond-devel)   For
+     discussions about developing lilypond, in particular the unstable
+     series.
 
-   * help-gnu-music@gnu.org
-     (http://mail.gnu.org/mailman/listinfo/help-gnu-music)     For help
-     with using LilyPond.
+   * help-lilypond@gnu.org
+     (http://mail.gnu.org/mailman/listinfo/help-lilypond)   For
+     discussions about using lilypond, in particular the stable series.
 
-   * bug-gnu-music@gnu.org
-     (http://mail.gnu.org/mailman/listinfo/bug-gnu-music) If you have
+   * bug-lilypond@gnu.org
+     (http://mail.gnu.org/mailman/listinfo/bug-lilypond) If you have
      bugreports, you should send them to this list.
 
 Windows 32
@@ -90,8 +91,8 @@ files, eg.,
 Bugs
 ====
 
-   Send bug reports to <bug-gnu-music@gnu.org>.  For help and questions
-use <help-gnu-music@gnu.org> and <gnu-music-discuss@gnu.org>.  Please
+   Send bug reports to <bug-lilypond@gnu.org>.  For help and questions
+use <help-lilypond@gnu.org> and <lilypond-discuss@gnu.org>.  Please
 consult the FAQ and installation instructions before mailing your
 problems.
 
diff --git a/VERSION b/VERSION
index 69c891282e..b76131dbcc 100644
--- a/VERSION
+++ b/VERSION
@@ -1,7 +1,7 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
-MINOR_VERSION=4
-PATCH_LEVEL=4
+MINOR_VERSION=5
+PATCH_LEVEL=0
 MY_PATCH_LEVEL=
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
diff --git a/buildscripts/lilypond-login.sh b/buildscripts/lilypond-login.sh
index ec2dac64df..e809b66224 100755
--- a/buildscripts/lilypond-login.sh
+++ b/buildscripts/lilypond-login.sh
@@ -7,8 +7,17 @@
 # strange shell, this C
 set datadir="@datadir@"
 
-setenv GS_FONTPATH "$datadir/afm:@datadir@/pfa:$GS_FONTPATH"
-setenv GS_LIB "$datadir/ps:$GS_LIB"
+if ( $?GS_FONTPATH ) then
+       setenv GS_FONTPATH "$datadir/afm:/usr/share/lilypond/pfa:$GS_FONTPATH"
+ else
+       setenv GS_FONTPATH "$datadir/afm:/usr/share/lilypond/pfa"
+ endif
+ if ( $?GS_LIB ) then
+       setenv GS_LIB "$datadir/ps:$GS_LIB"
+ else
+       setenv GS_LIB "$datadir/ps"
+ endif
+
 
 # setenv LILYPONDPREFIX "$datadir"
 
diff --git a/flower/include/rational.hh b/flower/include/rational.hh
index 0b1d5d972d..270ee56341 100644
--- a/flower/include/rational.hh
+++ b/flower/include/rational.hh
@@ -39,8 +39,7 @@ public:
   void invert ();
   int num () const { return sign_ * num_; }
   int den () const { return den_; }
-  int num_i () const { return sign_ * num_; }
-  int den_i () const { return den_; }
+
   Rational trunc_rat () const;
   Rational div_rat (Rational) const;
   Rational mod_rat (Rational) const;
diff --git a/input/bugs/beam.ly b/input/bugs/beam.ly
new file mode 100644
index 0000000000..44e7dfee39
--- /dev/null
+++ b/input/bugs/beam.ly
@@ -0,0 +1,15 @@
+\header {
+  texidoc="beam-stem attachment test"
+}
+	
+\score {
+  \context RhythmicStaff \notes {
+    \stemUp [c8 c]
+    \stemDown [c8 c]
+    \stemUp [c8. c16]
+  }
+  \paper {
+    linewidth = -1.0
+    magnification = 64
+  }
+}
\ No newline at end of file
diff --git a/input/bugs/newgrace.ly b/input/bugs/newgrace.ly
new file mode 100644
index 0000000000..9db2a2b46e
--- /dev/null
+++ b/input/bugs/newgrace.ly
@@ -0,0 +1,8 @@
+\score {  \notes {
+  \clef bass
+  <{ 
+    \grace { [c16  ] }
+    \relative b,  b2  
+   } >
+}
+}
diff --git a/input/regression/grace-bar-line.ly b/input/regression/grace-bar-line.ly
new file mode 100644
index 0000000000..69b0ceed92
--- /dev/null
+++ b/input/regression/grace-bar-line.ly
@@ -0,0 +1,13 @@
+\header {
+
+texidoc = "Bar line should come before the grace note.";
+}
+
+	
+
+
+
+\score  {\notes \relative c' \context Staff  { 
+ f1 \ngrace { [a'16 f]  } g1 }
+		\paper { linewidth = -1. }
+ } 
diff --git a/input/regression/grace-start.ly b/input/regression/grace-start.ly
new file mode 100644
index 0000000000..1094d3b5fd
--- /dev/null
+++ b/input/regression/grace-start.ly
@@ -0,0 +1,9 @@
+\header {
+texidoc = "Pieces may begin with grace notes."
+}
+\score  {\notes \relative c' \context Staff  { 
+ \grace { [a'16 f]  } g1
+ \grace { [a16 bes]  }  c1
+  }
+  \paper { linewidth = -1. }
+}
diff --git a/input/regression/grace-sync.ly b/input/regression/grace-sync.ly
new file mode 100644
index 0000000000..0ddcdf37f8
--- /dev/null
+++ b/input/regression/grace-sync.ly
@@ -0,0 +1,15 @@
+\header  {
+  texidoc = "grace notes in different voices/staffs are synchronized."
+}
+
+\score  {\notes < \context Staff  { c2
+ \ngrace  c8
+ c2 c4 }
+		\context Staff = SB { c2 \clef bass
+ %\ngrace { [dis8 ( d8] }
+
+  ) c2 c4 }
+		\context Staff = SC { c2 c2 c4 }
+		>
+		\paper { linewidth = -1. }
+ } 
diff --git a/input/regression/span-bar.ly b/input/regression/span-bar.ly
new file mode 100644
index 0000000000..9bebddd626
--- /dev/null
+++ b/input/regression/span-bar.ly
@@ -0,0 +1,37 @@
+\header {
+texidoc = "Span bars draw only in between staff bar lines, so setting those to transparent shows bar lines between systems only.
+"
+}
+
+\score {
+ \notes \relative c' \context StaffGroup = groupie <
+  \context Staff = SA { c1 c1 c1}
+  \context Lyrics = LA \lyrics <
+   { bla1 die bla }
+  >
+  \context Staff = SB { a1 a1 a1}
+  \context Lyrics = LB \lyrics <
+   { bla1 die bla }
+   { foo bar foo }
+  >
+  \context Staff = SC { f1 f1 f1}
+  \context Lyrics = LC \lyrics <
+   { bla1 die bla }
+   { foo bar foo }
+   { foo bar foo }
+  >
+  \context Staff = SD { d1 d1 d1}
+  \context Lyrics = LD \lyrics <
+   { bla1 die bla }
+   { foo bar foo }
+   { foo bar foo }
+   { foo bar foo }
+  >
+ >
+ \paper {
+  \translator {
+   \StaffContext
+   BarLine \override #'transparent = ##t
+  }
+ }
+}
diff --git a/input/test/trills.ly b/input/test/trills.ly
new file mode 100644
index 0000000000..ab7cc17555
--- /dev/null
+++ b/input/test/trills.ly
@@ -0,0 +1,42 @@
+\header {
+  texidoc="Document trills, pralls and turns"
+  title="Marques des agr\'ements et leur signification"
+  copyright="(1689)"
+}
+
+\score {
+  <
+    \property Score.TimeSignature = \turnOff
+    \context GrandStaff <
+      \context Staff=upper \notes\relative c'' {
+	\time 1/4
+	c4-\prallprall
+	\time 3/8
+	c4.^"TODO"
+	c4.-\downprall
+	c4.-\upprall
+	\time 5/8
+	c4-\turn c4.-\upprall
+      }
+      \context Lyrics=one \lyrics {
+	"Tremblement"4
+	"Tremblement"4.
+	"Cadence"
+	"autre"
+	"Double"4 "cadence"4.
+      }
+      \context Lyrics=two \lyrics {
+	"simple"4
+	"appuy\'e"4.
+      }
+      \context Staff=lower \notes\relative c'' {
+        % autobeamer has som problems here
+	[\repeat unfold 4 { d32 c }]
+	d8~[\repeat unfold 4 { d32 c }]
+	d32 c b c \repeat unfold 4 { d32 c }
+	b32 c d c \repeat unfold 4 { d32 c }
+	[c32( b a16 b )c] [b32 c d c \repeat unfold 4 { d32 c }]
+      }
+    >
+  >
+}
\ No newline at end of file
diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc
index b3353789cd..b4191f36bc 100644
--- a/lily/auto-beam-engraver.cc
+++ b/lily/auto-beam-engraver.cc
@@ -119,11 +119,11 @@ Auto_beam_engraver::test_moment (Direction dir, Moment test_mom)
 
   Moment one_beat = *unsmob_moment (get_property ("beatLength"));
   int num = *unsmob_moment (get_property ("measureLength")) / one_beat;
-  int den = one_beat.den_i ();
+  int den = one_beat.den ();
   SCM time = gh_list (gh_int2scm (num), gh_int2scm (den), SCM_UNDEFINED);
 
-  SCM type = gh_list (gh_int2scm (test_mom.num_i ()),
-		      gh_int2scm (test_mom.den_i ()), SCM_UNDEFINED);
+  SCM type = gh_list (gh_int2scm (test_mom.num ()),
+		      gh_int2scm (test_mom.den ()), SCM_UNDEFINED);
 
   SCM settings = get_property ("autoBeamSettings");
   
@@ -176,7 +176,7 @@ Auto_beam_engraver::test_moment (Direction dir, Moment test_mom)
 	  Moment length = * unsmob_moment (get_property ("measureLength"));
 	  pos = length - pos;
 	}
-      r = pos.mod_rat (moment);
+      r = pos.main_part_.mod_rat (moment.main_part_);
     }
   else
     {
@@ -440,7 +440,7 @@ Auto_beam_engraver::acknowledge_grob (Grob_info info)
 			     durlog - 2);
       stem_l_arr_p_->push (stem_l);
       last_add_mom_ = now;
-      extend_mom_ = extend_mom_ >? now + rhythmic_req->length_mom ();
+      extend_mom_ = (extend_mom_ >? now) + rhythmic_req->length_mom ();
     }
 }
 
diff --git a/lily/auto-change-iterator.cc b/lily/auto-change-iterator.cc
index d39c10d5d5..2f29c4be38 100644
--- a/lily/auto-change-iterator.cc
+++ b/lily/auto-change-iterator.cc
@@ -123,7 +123,7 @@ Auto_change_iterator::process (Moment m)
 	{
 	  where_dir_ = s;
 	  String to_id = (s >= 0) ?  "up" : "down";
-	  String wh = ly_scm2string (music_l_->get_mus_property ("what"));
+	  String wh = ly_scm2string (music_l ()->get_mus_property ("what"));
 	  change_to (child_iter_p_, wh, to_id);	  
 	}
     }
diff --git a/lily/bar-engraver.cc b/lily/bar-engraver.cc
index 23e22f0e16..0108cf961a 100644
--- a/lily/bar-engraver.cc
+++ b/lily/bar-engraver.cc
@@ -65,8 +65,8 @@ Bar_engraver::finalize ()
 }
 
 /*
-  Bar_engraver should come *after* any engravers that expect bars to
-  modify whichBar in  deprecated_process_music () be typeset
+  Bar_engraver should come *after* any engravers that  
+  modify whichBar
 */
 void
 Bar_engraver::create_grobs ()
diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc
index b5ebc0156f..e6f08096d6 100644
--- a/lily/beam-engraver.cc
+++ b/lily/beam-engraver.cc
@@ -220,14 +220,12 @@ Beam_engraver::finalize ()
   if (beam_p_)
     {
       prev_start_req_->origin ()->warning (_ ("unterminated beam"));
-#if 0
-      finished_beam_p_ = beam_p_;
-      finished_beam_info_p_ = beam_info_p_;
-      typeset_beam ();
-#else
+
+      /*
+	we don't typeset it, (we used to, but it was commented
+	out. Reason unknown) */
       beam_p_->suicide ();
       delete beam_info_p_;
-#endif
     }
 }
 
diff --git a/lily/beam.cc b/lily/beam.cc
index 77186ed8e2..2f314fa422 100644
--- a/lily/beam.cc
+++ b/lily/beam.cc
@@ -670,6 +670,9 @@ Beam::set_stem_lengths (Grob *me)
 
       Real stem_y = calc_stem_y_f (me, s, y, dy);
 
+      stem_y += Stem::get_direction (s)
+	* gh_scm2double (me->get_grob_property ("thickness")) / 2;
+
       /* caution: stem measures in staff-positions */
       Real id = me->relative_coordinate (common, Y_AXIS)
 	- stems[i]->relative_coordinate (common, Y_AXIS);
@@ -762,7 +765,6 @@ Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev,
  (prev && ! (prev->relative_coordinate (0, X_AXIS) < here->relative_coordinate (0, X_AXIS))))
       programming_error ("Beams are not left-to-right");
 
-  Real staffline_f = me->paper_l ()->get_var ("stafflinethickness");
   int multiplicity = get_multiplicity (me);
 
   SCM space_proc = me->get_grob_property ("space-function");
@@ -772,8 +774,7 @@ Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev,
   Real interbeam_f = gh_scm2double (space) ;
     
   Real bdy = interbeam_f;
-  Real stemdx = staffline_f;
-
+  
 #if 0
     // ugh -> use commonx
   Real dx = visible_stem_count (me) ?
@@ -811,12 +812,20 @@ Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev,
        Half beam should be one note-width, 
        but let's make sure two half-beams never touch
        */
-      Real w = here->relative_coordinate (0, X_AXIS) - prev->relative_coordinate (0, X_AXIS);
+
+      // FIXME: TODO (check) stem width / sloped beams
+      Real w = here->relative_coordinate (0, X_AXIS)
+	- prev->relative_coordinate (0, X_AXIS);
+      Real stem_w = gh_scm2double (prev->get_grob_property ("thickness"))
+	// URG
+	* me->paper_l ()->get_var ("stafflinethickness");
+
       w = w/2 <? nw_f;
       Molecule a;
       if (lhalfs)		// generates warnings if not
-	a =  Lookup::beam (dydx, w, thick);
+	a =  Lookup::beam (dydx, w + stem_w, thick);
       a.translate (Offset (-w, -w * dydx));
+      //a.translate_axis (stem_w/2, X_AXIS);
       for (int j = 0; j  < lhalfs; j++)
 	{
 	  Molecule b (a);
@@ -827,15 +836,23 @@ Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev,
 
   if (next)
     {
-      int rhalfs  = Stem::beam_count (here,RIGHT) - Stem::beam_count (next,LEFT);
-      int rwholebeams= Stem::beam_count (here,RIGHT) <? Stem::beam_count (next,LEFT) ;
+      int rhalfs  = Stem::beam_count (here,RIGHT)
+	- Stem::beam_count (next,LEFT);
+      int rwholebeams= Stem::beam_count (here,RIGHT)
+	<? Stem::beam_count (next,LEFT) ;
 
-      Real w = next->relative_coordinate (0, X_AXIS) - here->relative_coordinate (0, X_AXIS);
-      Molecule a = Lookup::beam (dydx, w + stemdx, thick);
-      a.translate_axis (- stemdx/2, X_AXIS);
+      Real w = next->relative_coordinate (0, X_AXIS)
+	- here->relative_coordinate (0, X_AXIS);
+
+      Real stem_w = gh_scm2double (next->get_grob_property ("thickness"))
+	// URG
+	* me->paper_l ()->get_var ("stafflinethickness");
+
+      Molecule a = Lookup::beam (dydx, w + stem_w, thick);
+      a.translate_axis (- stem_w/2, X_AXIS);
       int j = 0;
       Real gap_f = 0;
-
+      
       SCM gap = me->get_grob_property ("gap");
       if (gh_number_p (gap))
 	{
@@ -853,7 +870,7 @@ Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev,
 	  else
 	    gap_f = nw_f / 2;
 	  w -= 2 * gap_f;
-	  a = Lookup::beam (dydx, w + stemdx, thick);
+	  a = Lookup::beam (dydx, w + stem_w, thick);
 	}
 
       for (; j  < rwholebeams; j++)
diff --git a/lily/beaming-info.cc b/lily/beaming-info.cc
index fb828388de..97071ee65e 100644
--- a/lily/beaming-info.cc
+++ b/lily/beaming-info.cc
@@ -33,10 +33,10 @@ Beaming_info_list::min_denominator_index () const
 
   for (int i=1; i < infos_.size (); i++)
     {
-      if (infos_[i].start_mom_.den_i () < minden)
+      if (infos_[i].start_mom_.den () < minden)
 	{
 	  minidx = i;
-	  minden = infos_[i].start_mom_.den_i ();
+	  minden = infos_[i].start_mom_.den ();
 	}
     }
 
diff --git a/lily/change-iterator.cc b/lily/change-iterator.cc
index 96e7affd07..727cb9b681 100644
--- a/lily/change-iterator.cc
+++ b/lily/change-iterator.cc
@@ -15,8 +15,8 @@
 void
 Change_iterator::error (String reason)
 {
-  String to_type = ly_scm2string (music_l_->get_mus_property ("change-to-type"));
-  String to_id =  ly_scm2string (music_l_->get_mus_property ("change-to-id"));
+  String to_type = ly_scm2string (music_l ()->get_mus_property ("change-to-type"));
+  String to_id =  ly_scm2string (music_l ()->get_mus_property ("change-to-id"));
 
   String warn1 = _f ("can't change `%s' to `%s'", to_type, to_id) 
     + ": " + reason;
@@ -27,7 +27,7 @@ Change_iterator::error (String reason)
     + report_to_l ()->type_str_ + " = `"
     + report_to_l ()->id_str_ + "': ";
   warning (warn2);
-  music_l_->origin ()->warning (warn1);
+  music_l ()->origin ()->warning (warn1);
 }
 
 /*
@@ -39,8 +39,8 @@ Change_iterator::process (Moment m)
   Translator_group * current = report_to_l ();
   Translator_group * last = 0;
 
-  String to_type = ly_scm2string (music_l_->get_mus_property ("change-to-type"));
-  String to_id =  ly_scm2string (music_l_->get_mus_property ("change-to-id"));
+  String to_type = ly_scm2string (music_l ()->get_mus_property ("change-to-type"));
+  String to_id =  ly_scm2string (music_l ()->get_mus_property ("change-to-id"));
 
 
   /* find the type  of translator that we're changing.
diff --git a/lily/chord-tremolo-iterator.cc b/lily/chord-tremolo-iterator.cc
index 9c2aaf4a77..ea1d410b6b 100644
--- a/lily/chord-tremolo-iterator.cc
+++ b/lily/chord-tremolo-iterator.cc
@@ -19,7 +19,7 @@
 void
 Chord_tremolo_iterator::construct_children ()
 {
-  Repeated_music * rep = dynamic_cast<Repeated_music*> (music_l_);
+  Repeated_music * rep = dynamic_cast<Repeated_music*> (music_l ());
   factor_  = Moment (1, rep->repeat_count ());
   child_iter_p_ = get_iterator_p (rep->body ());
 }
@@ -41,11 +41,11 @@ Chord_tremolo_iterator::process (Moment m)
 {
   if (!m)
     {
-      Music_iterator *yeah = try_music (music_l_);
+      Music_iterator *yeah = try_music (music_l ());
       if (yeah)
 	set_translator (yeah->report_to_l ());
       else
-	music_l_->origin ()->warning (_ ("no one to print a tremolos"));
+	music_l ()->origin ()->warning (_ ("no one to print a tremolos"));
     }
 
   child_iter_p_->process (factor_ * m);
diff --git a/lily/clef-engraver.cc b/lily/clef-engraver.cc
index fb12bd8d9d..d16cb8a20b 100644
--- a/lily/clef-engraver.cc
+++ b/lily/clef-engraver.cc
@@ -167,10 +167,9 @@ Clef_engraver::inspect_clef_properties ()
 
       clef_p_->set_grob_property ("non-default", SCM_BOOL_T);
 
-       prev_cpos_ = clefpos;
-       prev_glyph_ = glyph;
-       prev_octavation_ = octavation;
-
+      prev_cpos_ = clefpos;
+      prev_glyph_ = glyph;
+      prev_octavation_ = octavation;
     }
 
   if (to_boolean (force_clef))
diff --git a/lily/duration.cc b/lily/duration.cc
index 37e75ac8d1..c0a97084bf 100644
--- a/lily/duration.cc
+++ b/lily/duration.cc
@@ -28,14 +28,14 @@ Duration::Duration ()
 {
   durlog_i_ = 0;
   dots_i_ = 0;
-  factor_ = Moment (1,1);
+  factor_ = Rational (1,1);
 }
 
 Duration::Duration (int l, int d)
 {
   durlog_i_ = l;
   dots_i_ = d;
-  factor_ = Moment (1,1);
+  factor_ = Rational (1,1);
 }
 
 Duration
@@ -52,13 +52,13 @@ Duration::length_mom () const
   Rational mom (1 << abs (durlog_i_));
 
   if (durlog_i_> 0)
-    mom = Moment (1)/mom;
+    mom = Rational (1)/mom;
 
   Rational delta = mom;
 
   for (int d = dots_i_; d; d--)
     {
-      delta /= Moment (2);
+      delta /= Rational (2);
       mom += delta;
     }
 
diff --git a/lily/folded-repeat-iterator.cc b/lily/folded-repeat-iterator.cc
index 16454dba80..3012c66429 100644
--- a/lily/folded-repeat-iterator.cc
+++ b/lily/folded-repeat-iterator.cc
@@ -59,7 +59,7 @@ Folded_repeat_iterator::pending_moment () const
 void
 Folded_repeat_iterator::construct_children ()
 {
-  Repeated_music  *  mus = dynamic_cast<Repeated_music*> (music_l_);
+  Repeated_music  *  mus = dynamic_cast<Repeated_music*> (music_l ());
   main_iter_p_ = get_iterator_p (mus->body ());
   if (!main_iter_p_->ok ())
     {
@@ -73,9 +73,9 @@ Folded_repeat_iterator::process (Moment m)
 {
   if (!m)
     {
-      bool success = try_music (music_l_);
+      bool success = try_music (music_l ());
       if (!success)
-	music_l_->origin ()->warning (_ ("no one to print a repeat brace"));
+	music_l ()->origin ()->warning (_ ("no one to print a repeat brace"));
     }
   
   if (main_iter_p_)
@@ -104,7 +104,7 @@ Folded_repeat_iterator::process (Moment m)
 void
 Folded_repeat_iterator::leave_body ()
 {
-  Repeated_music *  mus = dynamic_cast<Repeated_music *> (music_l_);
+  Repeated_music *  mus = dynamic_cast<Repeated_music *> (music_l ());
   delete main_iter_p_;
   main_iter_p_ = 0;
   main_length_mom_ +=  mus->body ()->length_mom ();
@@ -113,7 +113,7 @@ Folded_repeat_iterator::leave_body ()
 void
 Folded_repeat_iterator::enter_alternative ()
 {
-  Repeated_music *  mus = dynamic_cast<Repeated_music *> (music_l_);  
+  Repeated_music *  mus = dynamic_cast<Repeated_music *> (music_l ());  
   if (mus->alternatives ())
     {
       Simultaneous_music_iterator * s = new Simultaneous_music_iterator;
diff --git a/lily/font-size-engraver.cc b/lily/font-size-engraver.cc
new file mode 100644
index 0000000000..56f1555d9d
--- /dev/null
+++ b/lily/font-size-engraver.cc
@@ -0,0 +1,42 @@
+/*   
+  font-size-engraver.cc --  implement 
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#include "grob.hh"
+#include "engraver.hh"
+
+class Font_size_engraver : public Engraver
+{
+public:
+  VIRTUAL_COPY_CONS(Translator);
+  Font_size_engraver ();
+protected:
+  virtual void acknowledge_grob (Grob_info gi);
+private:
+};
+
+
+Font_size_engraver::Font_size_engraver ()
+{
+
+}
+
+void
+Font_size_engraver::acknowledge_grob (Grob_info gi)
+{
+  SCM sz = get_property ("fontSize");
+
+  if (gh_number_p (sz)
+      && gh_scm2int (sz)
+      && !gh_number_p (gi.elem_l_->get_grob_property ("font-relative-size")))
+    {
+      gi.elem_l_->set_grob_property ("font-relative-size", sz);
+    }
+}
+
+ADD_THIS_TRANSLATOR(Font_size_engraver);
diff --git a/lily/global-translator.cc b/lily/global-translator.cc
index e7fe6790d7..a1dd7c3501 100644
--- a/lily/global-translator.cc
+++ b/lily/global-translator.cc
@@ -83,6 +83,9 @@ Global_translator::finish ()
 void
 Global_translator::run_iterator_on_me (Music_iterator * iter)
 {
+  if (iter-> ok ())
+    prev_mom_ = now_mom_ = iter->pending_moment ();
+  
   while (iter->ok () || moments_left_i ())
     {
       Moment w;
@@ -90,7 +93,6 @@ Global_translator::run_iterator_on_me (Music_iterator * iter)
       if (iter->ok ())
 	{
 	  w = iter->pending_moment ();
-      
 	}
 
       w = sneaky_insert_extra_moment (w);
diff --git a/lily/grace-iterator.cc b/lily/grace-iterator.cc
index 18a7a62bf6..f73e610bad 100644
--- a/lily/grace-iterator.cc
+++ b/lily/grace-iterator.cc
@@ -47,7 +47,7 @@ Grace_iterator::process (Moment)
 Moment
 Grace_iterator::pending_moment () const
 {
-  return 0;
+  return  0;
 }
 
 
diff --git a/lily/grace-position-performer.cc b/lily/grace-position-performer.cc
index e275e891a7..7652ac98c6 100644
--- a/lily/grace-position-performer.cc
+++ b/lily/grace-position-performer.cc
@@ -60,7 +60,7 @@ Grace_position_performer::create_audio_elements ()
 	  for (int i=1; i < notes_.size (); i++)
 	    shortest_mom = shortest_mom <? notes_[i]->length_mom_;
 	  
-	  Rational grace_fraction_rat (1, 2);
+	  Moment grace_fraction_rat (1, 2);
 	  SCM prop = get_property ("graceFraction");
 	  if (unsmob_moment (prop))
 	    grace_fraction_rat = *unsmob_moment (prop);
@@ -81,7 +81,7 @@ Grace_position_performer::create_audio_elements ()
       for (int i=0; i < graces_.size (); i++)
 	grace_length_mom += graces_[i]->length_mom_;
 
-      Rational grace_factor_rat = delay_mom / grace_length_mom;
+      Moment grace_factor_rat = delay_mom / grace_length_mom;
 
       for (int i=0; i < graces_.size (); i++)
 	{
diff --git a/lily/include/duration.hh b/lily/include/duration.hh
index 685bddb5fc..bdb988a1c3 100644
--- a/lily/include/duration.hh
+++ b/lily/include/duration.hh
@@ -39,7 +39,7 @@ private:
   int durlog_i_;
   int dots_i_;
 
-  Moment factor_;
+  Rational factor_;
 
 };
 
diff --git a/lily/include/grace-music.hh b/lily/include/grace-music.hh
index 47def5db9d..897146133d 100644
--- a/lily/include/grace-music.hh
+++ b/lily/include/grace-music.hh
@@ -23,5 +23,16 @@ protected:
   virtual Moment length_mom () const;
 };
 
+class New_grace_music : public Music_wrapper
+{
+public:
+  VIRTUAL_COPY_CONS (Music);
+  New_grace_music (SCM);
+  New_grace_music ();
+protected:
+  virtual void compress (Moment);
+  virtual Moment length_mom () const;
+};
+
 #endif /* GRACE_MUSIC_HH */
 
diff --git a/lily/include/moment.hh b/lily/include/moment.hh
index 2583bb56ab..fca85bb458 100644
--- a/lily/include/moment.hh
+++ b/lily/include/moment.hh
@@ -15,33 +15,51 @@
 
 /**
    Rationals with glue for Guilification;
-
-   FIXME: remove self_scm_ and then remove this class */
-class Moment : public Rational
+*/
+class Moment
 {
   DECLARE_SIMPLE_SMOBS (Moment,);
 public:
-  Moment () { }
-  Moment (int m) : Rational (m) { }
-  Moment (int m, int n) : Rational (m,n) { }
-  Moment (Rational m) : Rational (m) { }
+  Moment ();
+  Moment (int m);
+  Moment (int m, int n);
+
+  Moment (Rational m);
+
+
+  void operator += (Moment const &m);
+  void operator -= (Moment const &m);  
 
+  void operator *= (Moment const &m);
+  void operator /= (Moment const &m);  
+
+  Rational main_part_;
+  Rational grace_mom_;
+
+  void set_infinite (int k);
+  
+  operator bool ();
+  int den () const;
+  int num () const;
   /*
     Deliver a copy of THIS as a smobified SCM
    */
-  SCM smobbed_copy () const; 
+  SCM smobbed_copy () const;
+  String str () const;
+  static int compare (Moment const&, Moment const&);
 };
+IMPLEMENT_ARITHMETIC_OPERATOR (Moment, + );
+IMPLEMENT_ARITHMETIC_OPERATOR (Moment, - );
+IMPLEMENT_ARITHMETIC_OPERATOR (Moment, / );
+IMPLEMENT_ARITHMETIC_OPERATOR (Moment, * );
 
 
 Moment * unsmob_moment (SCM);
+int compare (Moment const&,Moment const&);
+INSTANTIATE_COMPARE (Moment const&, Moment::compare);
 
 #if 0
-IMPLEMENT_ARITHMETIC_OPERATOR (Moment, / );
-IMPLEMENT_ARITHMETIC_OPERATOR (Moment, * );
-IMPLEMENT_ARITHMETIC_OPERATOR (Moment, + );
-IMPLEMENT_ARITHMETIC_OPERATOR (Moment, - );
 IMPLEMENT_ARITHMETIC_OPERATOR (Moment, % );
-INSTANTIATE_COMPARE (Moment const&, Rational::compare);
 #endif
 
 #endif /* MOMENT_HH */
diff --git a/lily/include/music-iterator.hh b/lily/include/music-iterator.hh
index 4041b5d028..bc99f499d3 100644
--- a/lily/include/music-iterator.hh
+++ b/lily/include/music-iterator.hh
@@ -52,11 +52,12 @@ class Music_iterator
 {
 protected:
   Moment music_length_;
-
+  Moment start_mom_;
 public:
   VIRTUAL_COPY_CONS (Music_iterator);
 
   Moment music_length_mom () const;
+  Moment music_start_mom () const;
   Music_iterator ();
   Music_iterator (Music_iterator const&);
   virtual ~Music_iterator ();
@@ -93,9 +94,6 @@ public:
   virtual void construct_children ();
   static SCM constructor_cxx_function;
   
-protected:
-  Music  * music_l_;
-
   /**
     Get an iterator for MUS, inheriting the translation unit from THIS.
    */
@@ -103,8 +101,10 @@ protected:
 
   virtual Music_iterator* try_music_in_children (Music *) const;
 
+  Music * music_l () const;
 private:
   Interpretation_context_handle handle_;
+  Music  * music_l_;
 };
 
 
diff --git a/lily/include/music-list.hh b/lily/include/music-list.hh
index b953c6a35c..a874660322 100644
--- a/lily/include/music-list.hh
+++ b/lily/include/music-list.hh
@@ -23,7 +23,7 @@ public:
   Simultaneous_music (SCM);
   virtual Pitch to_relative_octave (Pitch);
   virtual Moment length_mom () const;
-
+  virtual Moment start_mom () const;
   Simultaneous_music ();
 };
 
@@ -36,6 +36,7 @@ class Request_chord : public Simultaneous_music
 public:
   VIRTUAL_COPY_CONS (Music);
   virtual Pitch to_relative_octave (Pitch);
+  virtual Moment start_mom () const;
   Request_chord (SCM list);
 
   Request_chord ();
@@ -50,7 +51,8 @@ public:
   VIRTUAL_COPY_CONS (Music);
   Sequential_music (SCM);
   virtual Moment length_mom () const;
-
+  virtual Moment start_mom () const;
+  
   Sequential_music ();
 };
 
diff --git a/lily/include/music-sequence.hh b/lily/include/music-sequence.hh
index 797563830d..b22d029582 100644
--- a/lily/include/music-sequence.hh
+++ b/lily/include/music-sequence.hh
@@ -31,6 +31,9 @@ public:
   int length_i () const;
   Moment cumulative_length () const;
   Moment maximum_length () const;
+
+  Moment first_start () const;
+  Moment minimum_start () const;
   
 protected:
   virtual Pitch to_relative_octave (Pitch);
diff --git a/lily/include/music-wrapper.hh b/lily/include/music-wrapper.hh
index ec95046649..ed2cfe46c5 100644
--- a/lily/include/music-wrapper.hh
+++ b/lily/include/music-wrapper.hh
@@ -30,6 +30,7 @@ public:
   
   VIRTUAL_COPY_CONS (Music);
   virtual Moment length_mom () const;
+  virtual Moment start_mom () const;
   virtual Pitch to_relative_octave (Pitch);
   virtual void compress (Moment);
 };
diff --git a/lily/include/music.hh b/lily/include/music.hh
index 2c67ebdd90..2ce12fed36 100644
--- a/lily/include/music.hh
+++ b/lily/include/music.hh
@@ -50,7 +50,7 @@ public:
 
   /// The duration of this piece of music
   virtual Moment length_mom () const;
-
+  virtual Moment start_mom () const;
   void print () const;
   /// Transpose, with the interval central C to #p#
   virtual void transpose (Pitch p);
diff --git a/lily/include/new-grace-iterator.hh b/lily/include/new-grace-iterator.hh
new file mode 100644
index 0000000000..cb621e874e
--- /dev/null
+++ b/lily/include/new-grace-iterator.hh
@@ -0,0 +1,30 @@
+/*   
+  new-grace-iterator.hh -- declare New-Grace_iterator
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#ifndef NEWGRACE_ITERATOR_HH
+#define NEWGRACE_ITERATOR_HH
+
+#include "music-wrapper-iterator.hh"
+
+class New_grace_iterator : public Music_wrapper_iterator
+{
+public:
+  VIRTUAL_COPY_CONS (Music_iterator);
+  ~New_grace_iterator ();
+  virtual void construct_children () ;
+  virtual void process (Moment);
+  static SCM constructor_cxx_function;
+  Moment pending_moment () const;
+};
+
+
+
+#endif /* GRACE_ITERATOR_HH */
+
+
diff --git a/lily/include/new-grace-music.hh b/lily/include/new-grace-music.hh
new file mode 100644
index 0000000000..aae5ce001d
--- /dev/null
+++ b/lily/include/new-grace-music.hh
@@ -0,0 +1,28 @@
+/*   
+  grace-music.hh -- declare Grace_music
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#ifndef NGRACE_MUSIC_HH
+#define NGRACE_MUSIC_HH
+
+#include "music-wrapper.hh"
+
+class New_grace_music : public Music_wrapper
+{
+public:
+  VIRTUAL_COPY_CONS (Music);
+  New_grace_music (SCM);
+  New_grace_music ();
+protected:
+  virtual void compress (Moment);
+  virtual Moment length_mom () const;
+  virtual Moment start_mom () const;
+};
+
+#endif /* GRACE_MUSIC_HH */
+
diff --git a/lily/include/score-engraver.hh b/lily/include/score-engraver.hh
index bbb53792b6..815f04c05e 100644
--- a/lily/include/score-engraver.hh
+++ b/lily/include/score-engraver.hh
@@ -26,7 +26,7 @@ class Score_engraver :
     
   Paper_column* command_column_l_;
   Paper_column* musical_column_l_;
-  void make_columns (Moment);
+  void make_columns ();
   void set_columns (Paper_column*,Paper_column*);
   void typeset_all ();
     
diff --git a/lily/include/sequential-music-iterator.hh b/lily/include/sequential-music-iterator.hh
index 963faf2d07..6f13f44141 100644
--- a/lily/include/sequential-music-iterator.hh
+++ b/lily/include/sequential-music-iterator.hh
@@ -11,6 +11,15 @@
 
 #include "music-iterator.hh"
 
+
+struct Grace_skip 
+{
+  Moment start_;
+  Rational length_;
+  Rational grace_length_;  
+  Grace_skip *next_;
+};
+
 /** Sequential_music iteration: walk each element in turn, and
   construct an iterator for every element.
   
@@ -18,6 +27,8 @@
 class Sequential_music_iterator :  public Music_iterator
 {
 public:
+  Grace_skip * grace_skips_;
+  
   VIRTUAL_COPY_CONS (Music_iterator);
   static SCM constructor_cxx_function;
   Sequential_music_iterator ();
diff --git a/lily/include/spaceable-element.hh b/lily/include/spaceable-element.hh
index 2c40d2e8f5..272365ecd4 100644
--- a/lily/include/spaceable-element.hh
+++ b/lily/include/spaceable-element.hh
@@ -1,28 +1,3 @@
-/*   
-  spaceable-grob.hh -- declare Spaceable_grob
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 2000--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
 
-#ifndef SPACEABLE_GROB_HH
-#define SPACEABLE_GROB_HH
-
-#include "lily-guile.hh"
-#include "lily-proto.hh"
-
-struct Spaceable_grob
-{
-  /// set a minimum distance
-  static void add_rod (Grob*me, Grob * to, Real distance);
-  static void add_spring (Grob*me,Grob * to, Real dist, Real strength);
-  static void set_interface (Grob*);
-  static void remove_interface (Grob*);
-  static SCM get_minimum_distances (Grob*);
-  static SCM get_ideal_distances (Grob*);
-};
-
-#endif /* SPACEABLE_GROB_HH */
+#error
 
diff --git a/lily/include/spaceable-grob.hh b/lily/include/spaceable-grob.hh
new file mode 100644
index 0000000000..2c40d2e8f5
--- /dev/null
+++ b/lily/include/spaceable-grob.hh
@@ -0,0 +1,28 @@
+/*   
+  spaceable-grob.hh -- declare Spaceable_grob
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 2000--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#ifndef SPACEABLE_GROB_HH
+#define SPACEABLE_GROB_HH
+
+#include "lily-guile.hh"
+#include "lily-proto.hh"
+
+struct Spaceable_grob
+{
+  /// set a minimum distance
+  static void add_rod (Grob*me, Grob * to, Real distance);
+  static void add_spring (Grob*me,Grob * to, Real dist, Real strength);
+  static void set_interface (Grob*);
+  static void remove_interface (Grob*);
+  static SCM get_minimum_distances (Grob*);
+  static SCM get_ideal_distances (Grob*);
+};
+
+#endif /* SPACEABLE_GROB_HH */
+
diff --git a/lily/include/timing-translator.hh b/lily/include/timing-translator.hh
index 122f8d0d80..8a170e3019 100644
--- a/lily/include/timing-translator.hh
+++ b/lily/include/timing-translator.hh
@@ -31,7 +31,6 @@ protected:
 
 public:
   Moment measure_position () const;
-  Moment measure_length () const;  
-
+  Rational measure_length () const;  
 };
 #endif // TIMING_TRANSLATOR_HH
diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc
index 3d9eecc7e0..6052b89ffd 100644
--- a/lily/lyric-combine-music-iterator.cc
+++ b/lily/lyric-combine-music-iterator.cc
@@ -53,7 +53,7 @@ Lyric_combine_music_iterator::ok () const
 void
 Lyric_combine_music_iterator::construct_children ()
 {
-  Lyric_combine_music const * m = dynamic_cast<Lyric_combine_music const*> (music_l_);
+  Lyric_combine_music const * m = dynamic_cast<Lyric_combine_music const*> (music_l ());
   
   music_iter_p_ = get_iterator_p (m->music_l ());
   lyric_iter_p_ = get_iterator_p (m->lyrics_l ());
diff --git a/lily/main.cc b/lily/main.cc
index b4c7811733..1f355bf961 100644
--- a/lily/main.cc
+++ b/lily/main.cc
@@ -101,6 +101,7 @@ static Getopt_long *oparser_p_static = 0;
        follow regular localisation guidelines).
  */
 static Long_option_init options_static[] = {
+  /* print example usage:  lilypond -e "(set-lily-option 'help 0)" ? */
   {_i ("EXPR"), "evaluate", 'e',_i ("evalute EXPR as Scheme after .scm init is read")},
   /* another bug in option parser: --output=foe is taken as an abbreviation
      for --output-format */
@@ -168,7 +169,7 @@ _ (
 
   cout << endl;
 
-  cout << _f ("Report bugs to %s", "bug-gnu-music@gnu.org") << endl;
+  cout << _f ("Report bugs to %s", "bug-lilypond@gnu.org") << endl;
 }
 
 void
diff --git a/lily/midi-item.cc b/lily/midi-item.cc
index 80d3e6e6bc..bf046d4644 100644
--- a/lily/midi-item.cc
+++ b/lily/midi-item.cc
@@ -201,12 +201,12 @@ Midi_time_signature::Midi_time_signature (Audio_time_signature* a)
 String
 Midi_time_signature::str () const
 {
-  int num_i = audio_l_->beats_i_;
-  int den_i = audio_l_->one_beat_i_;
+  int num = audio_l_->beats_i_;
+  int den = audio_l_->one_beat_i_;
 
   String str = "ff5804";
-  str += String_convert::i2hex_str (num_i, 2, '0');
-  str += String_convert::i2hex_str (intlog2 (den_i) , 2, '0');
+  str += String_convert::i2hex_str (num, 2, '0');
+  str += String_convert::i2hex_str (intlog2 (den) , 2, '0');
   str += String_convert::i2hex_str (clocks_per_1_i_, 2, '0');
   str += String_convert::i2hex_str (8, 2, '0');
   return String_convert::hex2bin_str (str);
diff --git a/lily/molecule.cc b/lily/molecule.cc
index b414b498ae..e577691f8f 100644
--- a/lily/molecule.cc
+++ b/lily/molecule.cc
@@ -15,7 +15,7 @@
 #include "string.hh"
 #include "molecule.hh"
 #include "debug.hh"
-#include "killing-cons.tcc"
+
 
 #include "ly-smobs.icc"
 
diff --git a/lily/moment.cc b/lily/moment.cc
index a1c9e071ec..8653e38514 100644
--- a/lily/moment.cc
+++ b/lily/moment.cc
@@ -83,3 +83,109 @@ Moment::equal_p (SCM a, SCM b)
   return (*m1 == *m2) ? SCM_BOOL_T : SCM_BOOL_F;
 }
 
+/****************************************************************/
+
+int
+compare (Moment const &a, Moment const &b)
+{
+  return Moment::compare (a,b);
+}
+
+int
+Moment::compare (Moment const &a, Moment const &b)
+{
+  int c = Rational::compare (a.main_part_,b.main_part_);
+  if (c)
+    return c;
+
+  return Rational::compare (a.grace_mom_, b.grace_mom_);
+}
+
+Moment::Moment ()
+{
+
+}
+
+Moment::Moment (int m)
+{
+  main_part_ = Rational(m);
+  grace_mom_  = Rational( 0);
+}
+
+Moment::Moment (int m, int n)
+{
+  main_part_ = Rational (m,n);
+  grace_mom_  = Rational (0);
+}
+
+Moment::Moment (Rational m)
+{
+  main_part_ = m;
+  grace_mom_  = Rational (0);
+}
+
+void
+Moment::operator += (Moment const &src)
+{
+  main_part_ +=src.main_part_ ;
+  grace_mom_ += src.grace_mom_;
+}
+void
+Moment::operator -= (Moment const &src)
+{
+  main_part_ -= src.main_part_ ;
+  grace_mom_ -= src.grace_mom_;
+}
+
+/*
+  only take the main part of SRC for multiplication.
+ */
+void
+Moment::operator *= (Moment const &src)
+{
+  main_part_ *= src.main_part_ ;
+  grace_mom_ *= src.main_part_;
+}
+
+/*
+  only take the main part of SRC for multiplication.
+ */
+void
+Moment::operator /= (Moment const &src)
+{
+  main_part_ /= src.main_part_ ;
+  grace_mom_ /= src.main_part_;
+}
+
+
+#if 0
+Moment::operator Rational()
+{
+  return main_part_;
+}
+#endif
+
+int
+Moment::den () const { return main_part_.den (); }
+
+int
+Moment::num () const { return main_part_.num (); }
+
+
+Moment::operator bool ()
+{
+  return main_part_ || grace_mom_;
+}
+
+void
+Moment::set_infinite (int k)
+{
+  main_part_.set_infinite (k);
+}
+
+
+String
+Moment::str () const
+{
+  return main_part_.str ();
+}
diff --git a/lily/music-iterator.cc b/lily/music-iterator.cc
index 7d5a5155be..f27f2f0d77 100644
--- a/lily/music-iterator.cc
+++ b/lily/music-iterator.cc
@@ -26,6 +26,7 @@ Music_iterator::Music_iterator (Music_iterator const& src)
   handle_ = *src.handle_.clone ();
   music_l_ = src.music_l_;
   music_length_ = src.music_length_;
+  start_mom_ = src.start_mom_;
 }
 
 Music_iterator::~Music_iterator ()
@@ -59,7 +60,6 @@ Music_iterator::pending_moment () const
   return 0;
 }
 
-
 void
 Music_iterator::process (Moment)
 {
@@ -102,8 +102,9 @@ Music_iterator::static_get_iterator_p (Music *m)
     }
 
   p->music_l_ = m;
+  assert (m);
   p->music_length_ = m->length_mom ();
-  
+  p->start_mom_ = m->start_mom ();
   return p;
 }
 
@@ -112,12 +113,20 @@ Moment
 Music_iterator::music_length_mom () const
 {
   return music_length_;
+
+}
+
+Moment
+Music_iterator::music_start_mom ()const
+{
+  return start_mom_;
 }
 
 void
 Music_iterator::init_translator (Music *m, Translator_group *report_l)
 {
   music_l_ = m;
+  assert (m);
   if (Context_specced_music * csm =dynamic_cast<Context_specced_music *> (m))
     {
       SCM ct = csm->get_mus_property ("context-type");
@@ -169,3 +178,9 @@ Music_iterator::try_music_in_children (Music *) const
 }
 
 IMPLEMENT_CTOR_CALLBACK (Music_iterator);
+
+Music *
+Music_iterator::music_l () const
+{
+  return music_l_;
+}
diff --git a/lily/music-list.cc b/lily/music-list.cc
index e3e188e9e2..8b13789179 100644
--- a/lily/music-list.cc
+++ b/lily/music-list.cc
@@ -1,104 +1 @@
-/*
-  music-list.cc -- implement Music_sequence, Simultaneous_music, Sequential_music
 
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-#include "music-list.hh"
-#include "music-wrapper.hh"
-#include "pitch.hh"
-#include "request.hh"
-#include "musical-request.hh"
-#include "music-iterator.hh"
-#include "main.hh"
-#include "killing-cons.tcc"
-#include "simultaneous-music-iterator.hh"
-#include "sequential-music-iterator.hh"
-#include "request-chord-iterator.hh"
-
-Moment
-Simultaneous_music::length_mom () const
-{
-  return maximum_length ();
-}
-
-Simultaneous_music::Simultaneous_music (SCM head)
-  : Music_sequence (head)
-{
-  set_mus_property ("iterator-ctor",
-		    Simultaneous_music_iterator::constructor_cxx_function);
-}
-
-Simultaneous_music::Simultaneous_music ()
-  : Music_sequence ()
-{
-  set_mus_property ("iterator-ctor",
-		    Simultaneous_music_iterator::constructor_cxx_function);
-  
-}
-
-Sequential_music::Sequential_music (SCM head)
-  : Music_sequence (head)
-{
-  set_mus_property ("iterator-ctor",
-		    Sequential_music_iterator::constructor_cxx_function);
-}
-Sequential_music::Sequential_music ()
-  : Music_sequence ()
-{
-  set_mus_property ("iterator-ctor",
-		    Sequential_music_iterator::constructor_cxx_function);
-}
-
-
-Moment
-Sequential_music::length_mom () const
-{
-  return cumulative_length ();
-}
-
-Pitch
-Simultaneous_music::to_relative_octave (Pitch p)
-{
-  return do_relative_octave (p, true);
-}
-
-Request_chord::Request_chord (SCM s)
-  : Simultaneous_music (s)
-{
-  set_mus_property ("iterator-ctor",
-		    Request_chord_iterator::constructor_cxx_function);
-}
-
-Request_chord::Request_chord ()
-{
-  set_mus_property ("iterator-ctor",
-		    Request_chord_iterator::constructor_cxx_function);
-}
-
-Pitch
-Request_chord::to_relative_octave (Pitch last)
-{
-  for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
-    {
-      Music * mus = unsmob_music (gh_car (s));
-      if (Melodic_req *m= dynamic_cast <Melodic_req *> (mus))
-	{
-	  Pitch pit = *unsmob_pitch (m->get_mus_property ("pitch"));
-	  
-	  pit.to_relative_octave (last);
-	  m->set_mus_property ("pitch", pit.smobbed_copy ());
-	  	  
-	  return pit;
-	}
-    }
-  return last;
-}
-
-
-
-ADD_MUSIC (Simultaneous_music);
-ADD_MUSIC (Sequential_music);
-ADD_MUSIC (Request_chord);
diff --git a/lily/music-output-def.cc b/lily/music-output-def.cc
index eb58cec14c..d3b6d7c7f6 100644
--- a/lily/music-output-def.cc
+++ b/lily/music-output-def.cc
@@ -86,7 +86,11 @@ Music_output_def::assign_translator (SCM transdef)
   Translator_def *tp = unsmob_translator_def (transdef);
   assert (tp);
 
-  String s = ly_scm2string (tp->type_name_);
+  
+  String s;
+  if (gh_string_p (tp->type_name_))
+      s =  ly_scm2string (tp->type_name_);
+
   translator_p_dict_p_->set (s, transdef);
 }
 
@@ -124,7 +128,10 @@ Music_output_def::get_global_translator_p ()
 int
 Music_output_def::print_smob (SCM s, SCM p, scm_print_state *)
 {
-  scm_puts ("#<Music_output_def>", p);
+  Translator_def * def = unsmob_translator_def (s);
+  scm_puts ("#<Music_output_def ", p);
+  scm_write (def->type_name_, p);
+  scm_puts (">", p);
   return 1;
 }
 
diff --git a/lily/music-sequence.cc b/lily/music-sequence.cc
index 5be315fcd1..35c8bb16b3 100644
--- a/lily/music-sequence.cc
+++ b/lily/music-sequence.cc
@@ -69,10 +69,24 @@ Music_sequence::transpose (Pitch rq)
 Moment
 Music_sequence::cumulative_length () const
 {
-  Moment last=0;
+  Moment cumulative;
+  
+  Moment last_len ; 
   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
-    last += unsmob_music (gh_car (s))->length_mom ();
-  return  last;
+    {
+      Moment l = unsmob_music (gh_car (s))->length_mom ();
+      if (last_len.grace_mom_ && l.main_part_)
+	{
+	  last_len.grace_mom_ = Rational (0);
+	}
+      cumulative += last_len;
+      last_len = l;
+    }
+
+  last_len.grace_mom_ = Rational (0);
+  cumulative += last_len;
+  
+  return  cumulative;
 }
 
 Pitch
@@ -131,3 +145,37 @@ Music_sequence::Music_sequence ()
 {
   
 }
+
+Moment
+Music_sequence::minimum_start () const
+{
+  Moment m;
+  
+  for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
+    {
+      m = m <? unsmob_music (gh_car (s))->start_mom ();
+    }
+  return m;
+}
+
+Moment
+Music_sequence::first_start () const
+{
+  Moment m;
+  
+  for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
+    {
+      Music * mus = unsmob_music (gh_car (s));
+      Moment l = mus->length_mom ();
+
+      if (l.main_part_)
+	return mus->start_mom ();
+      else if (l.grace_mom_)
+	{
+	  m.grace_mom_ = - l.grace_mom_; 
+	  return m;
+	}
+    }
+  return m;
+}
+
diff --git a/lily/music-wrapper-iterator.cc b/lily/music-wrapper-iterator.cc
index a80577f387..c5f72417c9 100644
--- a/lily/music-wrapper-iterator.cc
+++ b/lily/music-wrapper-iterator.cc
@@ -34,7 +34,7 @@ void
 Music_wrapper_iterator::construct_children ()
 {
   child_iter_p_ =
-    get_iterator_p (dynamic_cast<Music_wrapper const*> (music_l_)->element ());
+    get_iterator_p (dynamic_cast<Music_wrapper const*> (music_l ())->element ());
 }
 
 bool
diff --git a/lily/music-wrapper.cc b/lily/music-wrapper.cc
index 3fc8d714c3..2541483ddd 100644
--- a/lily/music-wrapper.cc
+++ b/lily/music-wrapper.cc
@@ -58,3 +58,9 @@ Music_wrapper::Music_wrapper ()
 {
   
 }
+
+Moment
+Music_wrapper::start_mom () const
+{
+  return element ()->start_mom ();
+}
diff --git a/lily/music.cc b/lily/music.cc
index 917e14021b..1da9e5329f 100644
--- a/lily/music.cc
+++ b/lily/music.cc
@@ -89,6 +89,13 @@ Music::length_mom () const
   return 0;
 }
 
+Moment
+Music::start_mom () const
+{
+  Moment m ;
+  return m;
+}
+
 void
 print_alist (SCM a, SCM port)
 {
diff --git a/lily/musical-request.cc b/lily/musical-request.cc
index e4866b6064..21c6c5d090 100644
--- a/lily/musical-request.cc
+++ b/lily/musical-request.cc
@@ -61,7 +61,7 @@ Rhythmic_req::compress (Moment m)
 {
   Duration *d =  unsmob_duration (get_mus_property ("duration"));
 
-  set_mus_property ("duration", d ->compressed (m).smobbed_copy ());
+  set_mus_property ("duration", d ->compressed (m.main_part_).smobbed_copy ());
 }
 
 bool
diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc
index 3a41467abc..c27bf01d0d 100644
--- a/lily/my-lily-lexer.cc
+++ b/lily/my-lily-lexer.cc
@@ -52,6 +52,7 @@ static Keyword_ent the_key_tab[]={
   {"elementdescriptions", ELEMENTDESCRIPTIONS},
   {"font", FONT},
   {"grace", GRACE},
+  {"ngrace", NGRACE},
   {"glissando", GLISSANDO},
   {"header", HEADER},
   {"in", IN_T},
diff --git a/lily/new-grace-iterator.cc b/lily/new-grace-iterator.cc
new file mode 100644
index 0000000000..99cd02e6ac
--- /dev/null
+++ b/lily/new-grace-iterator.cc
@@ -0,0 +1,52 @@
+/*   
+  new-grace-music.cc --  implement New-Grace_music
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#include "new-grace-music.hh"
+#include "new-grace-iterator.hh"
+
+#include "grace-iterator.hh"
+#include "global-translator.hh"
+#include "warn.hh"
+
+
+New_grace_iterator::~New_grace_iterator () 
+{
+  //  child_iter_p_ = 0;
+}
+
+
+void
+New_grace_iterator::process (Moment m )
+{
+  Moment main ;
+  main.main_part_ = m.grace_mom_;
+  Music_wrapper_iterator::process (main);
+}
+
+void
+New_grace_iterator::construct_children ()
+{
+  Music_wrapper_iterator::construct_children ();
+}
+
+
+
+Moment
+New_grace_iterator::pending_moment () const
+{
+  Moment cp =Music_wrapper_iterator::pending_moment();
+
+  Moment pending;
+  pending.grace_mom_ = - music_length_.main_part_  + cp.main_part_;
+
+  return pending;
+}
+
+
+IMPLEMENT_CTOR_CALLBACK (New_grace_iterator);
diff --git a/lily/new-grace-music.cc b/lily/new-grace-music.cc
new file mode 100644
index 0000000000..d93708ce0f
--- /dev/null
+++ b/lily/new-grace-music.cc
@@ -0,0 +1,48 @@
+/*   
+  grace-music.cc --  implement New_grace_music
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#include "new-grace-music.hh"
+#include "new-grace-iterator.hh"
+
+void
+New_grace_music::compress (Moment m) 
+{
+  Music_wrapper::compress (m); 
+}
+
+Moment
+New_grace_music::length_mom () const
+{
+  Moment l = Music_wrapper::length_mom ();
+  Moment gl;
+  gl.grace_mom_ = l.main_part_ + l.grace_mom_ ;
+  return gl;
+}
+
+
+Moment
+New_grace_music::start_mom () const
+{
+  return Music::start_mom ();
+}
+
+New_grace_music::New_grace_music ()
+{
+  set_mus_property ("iterator-ctor",
+		    New_grace_iterator::constructor_cxx_function);
+}
+
+New_grace_music::New_grace_music (SCM p)
+  : Music_wrapper (p)
+{
+  set_mus_property ("iterator-ctor",
+		    New_grace_iterator::constructor_cxx_function);
+}
+
+ADD_MUSIC (New_grace_music);
diff --git a/lily/output-property-music-iterator.cc b/lily/output-property-music-iterator.cc
index 5759b85b42..47ec4d784f 100644
--- a/lily/output-property-music-iterator.cc
+++ b/lily/output-property-music-iterator.cc
@@ -15,10 +15,10 @@ Output_property_music_iterator::process (Moment m)
 {
   if (last_processed_mom_ < Moment (0))
     {
-      bool accepted = try_music (music_l_);
+      bool accepted = try_music (music_l ());
       if (!accepted)
-	music_l_->origin ()->warning (_f ("Junking request: `%s'",
-					  classname (music_l_)));
+	music_l ()->origin ()->warning (_f ("Junking request: `%s'",
+					  classname (music_l ())));
     }
 
   skip (m);
diff --git a/lily/paper-column.cc b/lily/paper-column.cc
index 4e76ff5ed8..e9cd3be70e 100644
--- a/lily/paper-column.cc
+++ b/lily/paper-column.cc
@@ -10,7 +10,7 @@
 #include "paper-score.hh"
 #include "debug.hh"
 #include "axis-group-interface.hh"
-#include "spaceable-element.hh"
+#include "spaceable-grob.hh"
 
 void
 Paper_column::do_break_processing ()
diff --git a/lily/parser.yy b/lily/parser.yy
index eacdc63aa8..95caa860e0 100644
--- a/lily/parser.yy
+++ b/lily/parser.yy
@@ -188,7 +188,7 @@ yylex (YYSTYPE *s,  void * v_l)
 %token EXTENDER
 %token FONT
 %token GLISSANDO
-%token GRACE
+%token GRACE NGRACE
 %token HEADER
 %token HYPHEN
 %token IN_T
@@ -806,9 +806,43 @@ Composite_music:
 		chm->set_spot (*$3->origin ());
 	}
 	| GRACE Music {
-		$$ = new Grace_music (SCM_EOL);
+#if 1
+	/*
+		The other version is for easier debugging  of
+		Sequential_music_iterator in combination with grace notes.
+	*/
+
+		SCM start = THIS->lexer_p_->lookup_identifier ("startGraceMusic");
+		SCM stop = THIS->lexer_p_->lookup_identifier ("stopGraceMusic");
+		Music *startm = unsmob_music (start);
+		Music *stopm = unsmob_music (stop);
+
+		SCM ms = SCM_EOL;
+		if (stopm) {
+			stopm = stopm->clone ();
+			ms = gh_cons (stopm->self_scm (), ms);
+			scm_unprotect_object (stopm->self_scm ());
+		}
+		ms = gh_cons ($2->self_scm (), ms);
+		scm_unprotect_object ($2->self_scm());
+		if (startm) {
+			startm = startm->clone ();
+			ms = gh_cons (startm->self_scm () , ms);
+			scm_unprotect_object (startm->self_scm ());
+		}
+
+		Music* seq = new Sequential_music (SCM_EOL);
+		seq->set_mus_property ("elements", ms);
+
+		$$ = new New_grace_music (SCM_EOL);
+		$$->set_mus_property ("element", seq->self_scm ());
+		scm_unprotect_object (seq->self_scm ());
+#else
+		$$ = new New_grace_music (SCM_EOL);
 		$$->set_mus_property ("element", $2->self_scm ());
 		scm_unprotect_object ($2->self_scm ());
+#endif
+
 
 	}
 	| CONTEXT string '=' string Music {
@@ -1604,7 +1638,7 @@ multiplied_duration:
 		$$ = unsmob_duration ($$)->compressed ( $3) .smobbed_copy ();
 	}
 	| multiplied_duration '*' FRACTION {
-		Moment m (gh_scm2int (gh_car ($3)), gh_scm2int (gh_cdr ($3)));
+		Rational  m (gh_scm2int (gh_car ($3)), gh_scm2int (gh_cdr ($3)));
 
 		$$ = unsmob_duration ($$)->compressed (m).smobbed_copy ();
 	}
diff --git a/lily/part-combine-music-iterator.cc b/lily/part-combine-music-iterator.cc
index 043f83c557..68d0516ff5 100644
--- a/lily/part-combine-music-iterator.cc
+++ b/lily/part-combine-music-iterator.cc
@@ -62,7 +62,7 @@ Part_combine_music_iterator::ok () const
 void
 Part_combine_music_iterator::construct_children ()
 {
-  Part_combine_music const * m = dynamic_cast<Part_combine_music const*> (music_l_);
+  Part_combine_music const * m = dynamic_cast<Part_combine_music const*> (music_l ());
   
   first_iter_p_ = get_iterator_p (m->first_l ());
   second_iter_p_ = get_iterator_p (m->second_l ());
@@ -141,7 +141,7 @@ int
 Part_combine_music_iterator::get_state (Moment)
 {
   int state = UNKNOWN;
-  Part_combine_music const *p = dynamic_cast<Part_combine_music const* > (music_l_);
+  Part_combine_music const *p = dynamic_cast<Part_combine_music const* > (music_l ());
 
   String w = ly_scm2string (p->get_mus_property ("what"));
     
@@ -157,7 +157,7 @@ Part_combine_music_iterator::get_state (Moment)
   
   Moment now = pending_moment ();
 
-  if (!now.mod_rat (change_mom))
+  if (!now.main_part_.mod_rat (change_mom.main_part_))
     {
       SCM interval = SCM_BOOL_F;
       if (first_until_ < now)
@@ -341,7 +341,7 @@ Part_combine_music_iterator::process (Moment m)
   else
     state = state_;
   
-  Part_combine_music const *p = dynamic_cast<Part_combine_music const* > (music_l_);
+  Part_combine_music const *p = dynamic_cast<Part_combine_music const* > (music_l ());
 
 
   bool previously_combined_b = first_iter_p_->report_to_l ()->daddy_trans_l_
diff --git a/lily/percent-repeat-engraver.cc b/lily/percent-repeat-engraver.cc
index cd11b6a89d..0082971d9b 100644
--- a/lily/percent-repeat-engraver.cc
+++ b/lily/percent-repeat-engraver.cc
@@ -103,7 +103,7 @@ Percent_repeat_engraver::try_music (Music * m)
 	meas_len = *unsmob_moment (m);
 
       if (body_length_ < meas_len &&
-	  meas_len.mod_rat (body_length_) == Moment (0,0))
+	  meas_len.main_part_.mod_rat (body_length_.main_part_) == Moment (0,0))
 	repeat_sign_type_ = BEAT;
       else if (meas_len == body_length_)
 	repeat_sign_type_ = MEASURE;
diff --git a/lily/percent-repeat-iterator.cc b/lily/percent-repeat-iterator.cc
index b9248bb7a8..3d1120981b 100644
--- a/lily/percent-repeat-iterator.cc
+++ b/lily/percent-repeat-iterator.cc
@@ -35,7 +35,7 @@ Percent_repeat_iterator::ok () const
 void
 Percent_repeat_iterator::construct_children ()
 {
-  Repeated_music * mus =dynamic_cast<Repeated_music *> (music_l_);
+  Repeated_music * mus =dynamic_cast<Repeated_music *> (music_l ());
   finish_mom_ = mus->length_mom ();
   child_iter_p_ = get_iterator_p (mus->body ());
 }
@@ -46,11 +46,11 @@ Percent_repeat_iterator::process (Moment m)
 {
   if (!m)
     {
-      Music_iterator *yeah = try_music (music_l_);
+      Music_iterator *yeah = try_music (music_l ());
       if (yeah)
 	set_translator (yeah->report_to_l ());
       else
-	music_l_->origin ()->warning ( _ ("no one to print a percent"));
+	music_l ()->origin ()->warning ( _ ("no one to print a percent"));
     }
   
   if (child_iter_p_->ok ())
diff --git a/lily/property-iterator.cc b/lily/property-iterator.cc
index 84c8486d0b..cea57f3dc3 100644
--- a/lily/property-iterator.cc
+++ b/lily/property-iterator.cc
@@ -18,10 +18,10 @@
 void
 Property_iterator::process (Moment m)
 {
-  SCM sym = music_l_->get_mus_property ("symbol");
+  SCM sym = music_l ()->get_mus_property ("symbol");
   if (gh_symbol_p (sym))
     {
-      SCM val = music_l_->get_mus_property ("value");
+      SCM val = music_l ()->get_mus_property ("value");
       bool ok= true;
       if (val != SCM_EOL)
 	ok = type_check_assignment (val, sym, ly_symbol2scm ("translation-type?"));
@@ -34,7 +34,7 @@ Property_iterator::process (Moment m)
 void
 Property_unset_iterator::process (Moment m)
 {
-  SCM sym = music_l_->get_mus_property ("symbol");
+  SCM sym = music_l ()->get_mus_property ("symbol");
   if (gh_symbol_p (sym))
     {
       report_to_l ()->unset_property (sym);
@@ -46,11 +46,11 @@ Property_unset_iterator::process (Moment m)
 void
 Push_property_iterator::process (Moment m)
 {
-  SCM syms = music_l_->get_mus_property ("symbols");
-  SCM eprop = music_l_->get_mus_property ("grob-property");
-  SCM val = music_l_->get_mus_property ("grob-value");
+  SCM syms = music_l ()->get_mus_property ("symbols");
+  SCM eprop = music_l ()->get_mus_property ("grob-property");
+  SCM val = music_l ()->get_mus_property ("grob-value");
 
-  if (to_boolean (music_l_->get_mus_property ("pop-first")))
+  if (to_boolean (music_l ()->get_mus_property ("pop-first")))
     Translator_def::apply_pushpop_property (report_to_l (),
 					    syms, eprop, SCM_UNDEFINED);
 
@@ -62,8 +62,8 @@ Push_property_iterator::process (Moment m)
 void
 Pop_property_iterator::process (Moment m)
 {
-  SCM syms = music_l_->get_mus_property ("symbols");
-  SCM eprop = music_l_->get_mus_property ("grob-property");
+  SCM syms = music_l ()->get_mus_property ("symbols");
+  SCM eprop = music_l ()->get_mus_property ("grob-property");
   Translator_def::apply_pushpop_property (report_to_l (), syms, eprop, SCM_UNDEFINED);
   
   Simple_music_iterator::process (m);
diff --git a/lily/request-chord-iterator.cc b/lily/request-chord-iterator.cc
index 55372a463f..9cee9ae4f4 100644
--- a/lily/request-chord-iterator.cc
+++ b/lily/request-chord-iterator.cc
@@ -42,7 +42,7 @@ Request_chord_iterator::construct_children ()
 Request_chord*
 Request_chord_iterator::elt_l () const
 {
-  return (Request_chord*) music_l_;
+  return (Request_chord*) music_l ();
 }
 
 SCM
@@ -51,7 +51,7 @@ Request_chord_iterator::get_music (Moment) const
   SCM s = SCM_EOL;
   if (last_processed_mom_ < Moment (0))
     {
-      Music_sequence * ms = dynamic_cast<Music_sequence*> (music_l_);
+      Music_sequence * ms = dynamic_cast<Music_sequence*> (music_l ());
      
       for (SCM m = ms->music_list (); gh_pair_p (m); m = gh_cdr (m))
 	{
@@ -66,7 +66,7 @@ Request_chord_iterator::process (Moment m)
 {
   if (last_processed_mom_ < Moment (0))
     {
-      for (SCM s = dynamic_cast<Music_sequence *> (music_l_)->music_list ();
+      for (SCM s = dynamic_cast<Music_sequence *> (music_l ())->music_list ();
 	   gh_pair_p (s);  s = gh_cdr (s))
 	{
 	  Music *mus = unsmob_music (gh_car (s));
diff --git a/lily/request-chord.cc b/lily/request-chord.cc
new file mode 100644
index 0000000000..084042f021
--- /dev/null
+++ b/lily/request-chord.cc
@@ -0,0 +1,48 @@
+#include "pitch.hh" 
+#include "request-chord-iterator.hh"
+#include "music-list.hh"
+#include "musical-request.hh"
+
+Request_chord::Request_chord (SCM s)
+  : Simultaneous_music (s)
+{
+  set_mus_property ("iterator-ctor",
+		    Request_chord_iterator::constructor_cxx_function);
+}
+
+Request_chord::Request_chord ()
+{
+  set_mus_property ("iterator-ctor",
+		    Request_chord_iterator::constructor_cxx_function);
+}
+
+
+
+Pitch
+Request_chord::to_relative_octave (Pitch last)
+{
+  for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
+    {
+      Music * mus = unsmob_music (gh_car (s));
+      if (Melodic_req *m= dynamic_cast <Melodic_req *> (mus))
+	{
+	  Pitch pit = *unsmob_pitch (m->get_mus_property ("pitch"));
+	  
+	  pit.to_relative_octave (last);
+	  m->set_mus_property ("pitch", pit.smobbed_copy ());
+	  	  
+	  return pit;
+	}
+    }
+  return last;
+}
+
+Moment
+Request_chord::start_mom () const
+{
+  return Music::start_mom ();
+}
+
+
+
+ADD_MUSIC (Request_chord);
diff --git a/lily/rod.cc b/lily/rod.cc
index 932133f339..7fcfcbc52d 100644
--- a/lily/rod.cc
+++ b/lily/rod.cc
@@ -10,7 +10,7 @@
 #include "paper-column.hh"
 #include "debug.hh"
 #include "dimensions.hh"
-#include "spaceable-element.hh"
+#include "spaceable-grob.hh"
 
 Rod::Rod ()
 {
diff --git a/lily/scm-option.cc b/lily/scm-option.cc
index 8b26f5ece0..b98327d1a3 100644
--- a/lily/scm-option.cc
+++ b/lily/scm-option.cc
@@ -53,13 +53,20 @@ Switch on any experimental features.  Not for general public use.
 SCM
 set_lily_option (SCM var, SCM val)
 {
+  /*
+    Scheme option usage:
+    lilypond -e "(set-lily-option 'help 0)"
+   */
   if (var == ly_symbol2scm ("help"))
     {
       cout << '\n';
       cout << _ ("Scheme options:");
-      cout << "help"; 
-      cout << "midi-debug (boolean)"; 
-      cout << "testing-level (int)"; 
+      cout << '\n';
+      cout << "  help (any-symbol)"; 
+      cout << '\n';
+      cout << "  midi-debug (boolean)"; 
+      cout << '\n';
+      cout << "  testing-level (int)"; 
       cout << '\n';
       exit (0);
     }
diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc
index c387a33959..733aa5a3c0 100644
--- a/lily/score-engraver.cc
+++ b/lily/score-engraver.cc
@@ -19,6 +19,9 @@
 #include "translator-def.hh"
 
 
+/*
+  TODO: the column creation logic is rather hairy. Revise it.
+ */
 Score_engraver::Score_engraver ()
 {
   scoreline_l_ =0;
@@ -29,19 +32,17 @@ Score_engraver::Score_engraver ()
 }
 
 void
-Score_engraver::make_columns (Moment w)
+Score_engraver::make_columns ()
 {
   /*
     ugh.
    */
-  if (!command_column_l_
-      || *unsmob_moment (command_column_l_->get_grob_property ("when")) != w)
+  if (!command_column_l_)
+    //      || *unsmob_moment (command_column_l_->get_grob_property ("when")) != w)
     {
       set_columns (new Paper_column (get_property (ly_symbol2scm ("NonMusicalPaperColumn"))),
 		   new Paper_column (get_property (ly_symbol2scm ("PaperColumn"))));
   
-      command_column_l_->set_grob_property ("when", w.smobbed_copy ());
-      musical_column_l_->set_grob_property ("when", w.smobbed_copy ());
       command_column_l_->set_grob_property ("breakable", SCM_BOOL_T);
 
       Grob_info i1 (command_column_l_, 0), i2 (musical_column_l_,0);
@@ -57,8 +58,8 @@ void
 Score_engraver::prepare (Moment w)
 {
   Global_translator::prepare (w);
-  make_columns (w);
 
+  make_columns ();
   start_translation_timestep ();
 }
 
@@ -70,6 +71,7 @@ Score_engraver::finish ()
    
   check_removal ();
   removal_processing ();
+
 }
 
 /*
@@ -89,11 +91,9 @@ Score_engraver::initialize ()
 
   pscore_p_->typeset_line (new Line_of_score (props));
   
-  make_columns (Moment (0));
+  make_columns ();
   scoreline_l_ = pscore_p_->line_l_;
-
   scoreline_l_->set_bound (LEFT, command_column_l_);
-  
   command_column_l_->set_grob_property ("breakable", SCM_BOOL_T);
 
   Engraver_group_engraver::initialize ();
@@ -104,12 +104,13 @@ void
 Score_engraver::finalize ()
 {
   Engraver_group_engraver::finalize ();
-  scoreline_l_->set_bound (RIGHT,command_column_l_);
-  command_column_l_->set_grob_property ("breakable", SCM_BOOL_T);
+
+  Grob * cc
+    = unsmob_grob (get_property (ly_symbol2scm ("currentCommandColumn")));
+  scoreline_l_->set_bound (RIGHT, cc);
+  cc->set_grob_property ("breakable", SCM_BOOL_T);
   
   typeset_all ();
-
-  set_columns (0,0);
 }
 
 void
@@ -217,25 +218,25 @@ Score_engraver::stop_translation_timestep ()
       if (! (breaks_i_%8))
 	progress_indication ("[" + to_str (breaks_i_) + "]");
     }
+
+  command_column_l_->set_grob_property ("when", now_mom_.smobbed_copy ());
+  musical_column_l_->set_grob_property ("when", now_mom_.smobbed_copy ());
+
+  scoreline_l_->add_column (command_column_l_);
+  scoreline_l_->add_column (musical_column_l_);
+  
+  command_column_l_ = 0;
+  musical_column_l_ = 0;
 }
 
 void
 Score_engraver::set_columns (Paper_column *new_command_l, 
 			     Paper_column *new_musical_l)
 {
-  Paper_column * news[] = {new_command_l, new_musical_l};
-  Paper_column **current[] = {&command_column_l_, &musical_column_l_};
-
-  for (int i=00; i< 2; i++) 
-    {
-      if (*current[i])
-	{
-	  scoreline_l_->add_column ((*current[i]));
-	}
-      if (news[i])
-	*current[i] = news[i];
-    }
-
+  assert (!command_column_l_ && !musical_column_l_);
+  command_column_l_ = new_command_l;
+  musical_column_l_ = new_musical_l;
+  
   if (new_musical_l)
     set_property ("currentMusicalColumn", new_musical_l->self_scm ());
   if (new_command_l)
diff --git a/lily/sequential-music-iterator.cc b/lily/sequential-music-iterator.cc
index ad1ae7b934..0f0f82d898 100644
--- a/lily/sequential-music-iterator.cc
+++ b/lily/sequential-music-iterator.cc
@@ -33,13 +33,14 @@ Sequential_music_iterator::Sequential_music_iterator ()
 {
   cursor_ = SCM_EOL;
   here_mom_ = Moment (0);
-
+  grace_skips_ = 0;
   iter_p_ =0;
 }
 
 Sequential_music_iterator::Sequential_music_iterator (Sequential_music_iterator const &src)
   : Music_iterator (src)
 {
+  grace_skips_ = src.grace_skips_;
   cursor_ = src.cursor_;
   here_mom_ = src.here_mom_;
   if (src.iter_p_)
@@ -53,10 +54,46 @@ Sequential_music_iterator::~Sequential_music_iterator ()
   delete iter_p_;
 }
 
+
+Grace_skip *
+get_grace_skips (SCM cursor)
+{
+  Moment here (0);
+  Moment last (here);
+  Grace_skip *head = 0;
+  Grace_skip **tail = &head;
+  bool first = true; 
+
+  
+  for (; gh_pair_p (cursor); cursor = gh_cdr (cursor))
+    {
+      Music * mus = unsmob_music (gh_car (cursor));
+      Moment l =mus->length_mom ();
+      if (l.main_part_)
+	{
+	  first = false;
+	  last = here;
+	  here += l;
+	}
+      else if(l.grace_mom_ && !first)
+	{
+	  assert (!l.main_part_);
+	  Grace_skip *p =new Grace_skip;
+	  p->start_ = last;
+	  p->length_ = (here - last).main_part_;
+	  p->grace_length_ = l.grace_mom_;
+	  p->next_ = 0;
+	  *tail = p;
+	  tail = &(*tail)->next_; 
+	}
+    }
+  return  head;
+}
+
 void
 Sequential_music_iterator::construct_children ()
 {
-  cursor_ = dynamic_cast<Music_sequence const*> (music_l_)->music_list ();
+  cursor_ = dynamic_cast<Music_sequence const*> (music_l ())->music_list ();
 
   iter_p_ = gh_pair_p (cursor_) ?  get_iterator_p (unsmob_music (gh_car (cursor_))) : 0;
   while (iter_p_ && !iter_p_->ok ())
@@ -64,12 +101,15 @@ Sequential_music_iterator::construct_children ()
       next_element ();
     }
 
+  grace_skips_ = get_grace_skips (cursor_);
+
+  here_mom_ = music_l ()->start_mom ();
+
   /*
     iter_p_->ok () is tautology, but what the heck.
    */
   if (iter_p_ && iter_p_->ok ()) 
     descend_to_child ();
-
 }
 
 
@@ -80,7 +120,30 @@ Sequential_music_iterator::construct_children ()
 void
 Sequential_music_iterator::next_element ()
 {
-  here_mom_ += iter_p_->music_length_mom ();
+  Moment len =iter_p_->music_length_mom ();
+  Moment start  = iter_p_->music_start_mom ();
+  assert (!grace_skips_  || grace_skips_->start_ >= here_mom_);
+
+  if (len.main_part_ && grace_skips_ && grace_skips_->start_ == here_mom_)
+    {
+      Moment sk;
+      sk.main_part_ = grace_skips_->length_;
+      here_mom_ +=  sk;
+      here_mom_.grace_mom_ = - grace_skips_->grace_length_;
+
+      Grace_skip * n =grace_skips_->next_;
+      delete       grace_skips_;
+      grace_skips_ = n;
+    }
+  else if (len.grace_mom_)
+    {
+      here_mom_.grace_mom_ =0;
+    }
+  else
+    {
+      here_mom_ += len - start;
+    }
+  
   delete iter_p_;
   cursor_ = gh_cdr (cursor_);
 
@@ -159,9 +222,9 @@ Sequential_music_iterator::get_music (Moment until)const
   return s;
 }
 /*
-  Skip events till UNTIL. We don't do any other side effects (such as
-  moving descending to child iterator contexts, because they might
-  depend on \context specs and \translator changes being executed
+  Skip events till UNTIL. We don't do any other side effects such as
+  descending to child iterator contexts, because they might depend on
+  \context specs and \translator changes being executed
     
  */
 void
@@ -185,7 +248,20 @@ Sequential_music_iterator::process (Moment until)
 {
   while (iter_p_)
     {
-      iter_p_->process (until - here_mom_);
+      if (grace_skips_ &&
+	  grace_skips_->start_ == here_mom_
+	  && (grace_skips_->start_ + grace_skips_->length_).main_part_ ==
+	  until.main_part_)
+	{
+	  /*
+	    do the stuff/note/rest preceding a grace.
+	   */
+	  Moment u = until;
+	  u.grace_mom_ = 0;
+	  iter_p_->process (u - here_mom_);
+	}
+      else
+	iter_p_->process (until - here_mom_ + iter_p_->music_start_mom ());
 
       /*
 	if the iter is still OK, there must be events left that have
@@ -204,7 +280,18 @@ Sequential_music_iterator::process (Moment until)
 Moment
 Sequential_music_iterator::pending_moment () const
 {
-  return iter_p_->pending_moment () + here_mom_;
+  Moment cp = iter_p_->pending_moment ();
+
+  if (grace_skips_
+      && here_mom_ == grace_skips_->start_
+      && cp.main_part_ >=  grace_skips_->length_)
+    {
+      cp += here_mom_ ;
+      cp.grace_mom_ = - grace_skips_->grace_length_;
+      return cp;
+    }
+  else
+    return cp + here_mom_ - iter_p_->music_start_mom ();
 }
 
 
diff --git a/lily/sequential-music.cc b/lily/sequential-music.cc
new file mode 100644
index 0000000000..8e38c38c8e
--- /dev/null
+++ b/lily/sequential-music.cc
@@ -0,0 +1,30 @@
+
+#include "music-list.hh"
+#include "sequential-music-iterator.hh"
+
+Sequential_music::Sequential_music (SCM head)
+  : Music_sequence (head)
+{
+  set_mus_property ("iterator-ctor",
+		    Sequential_music_iterator::constructor_cxx_function);
+}
+Sequential_music::Sequential_music ()
+  : Music_sequence ()
+{
+  set_mus_property ("iterator-ctor",
+		    Sequential_music_iterator::constructor_cxx_function);
+}
+
+
+Moment
+Sequential_music::length_mom () const
+{
+  return cumulative_length ();
+}
+ADD_MUSIC (Sequential_music);
+
+Moment
+Sequential_music::start_mom () const
+{
+  return first_start ();
+}
diff --git a/lily/simple-music-iterator.cc b/lily/simple-music-iterator.cc
index ef83a5abda..002f070009 100644
--- a/lily/simple-music-iterator.cc
+++ b/lily/simple-music-iterator.cc
@@ -41,7 +41,11 @@ Simple_music_iterator::pending_moment ()const
 void
 Simple_music_iterator::skip (Moment m)
 {
-  music_l_ = 0;
+  /*
+    docme??!!
+   */
+  //  music_l_ = 0;
+  
   last_processed_mom_ = m;
 }
 
diff --git a/lily/simple-spacer.cc b/lily/simple-spacer.cc
index cea9d7079d..2b9bbdde83 100644
--- a/lily/simple-spacer.cc
+++ b/lily/simple-spacer.cc
@@ -19,7 +19,7 @@
 #include "rod.hh"
 #include "warn.hh"
 #include "column-x-positions.hh"
-#include "spaceable-element.hh"
+#include "spaceable-grob.hh"
 #include "dimensions.hh"
 
 Simple_spacer::Simple_spacer ()
@@ -170,7 +170,7 @@ Simple_spacer::add_columns (Link_array<Grob> cols)
   for (int i=0; i < cols.size () - 1; i++)
     {
       SCM spring_params = SCM_UNDEFINED;
-      for (SCM s = Spaceable_grob::get_ideal_distances (cols[i]);
+      for (SCM s = cols[i]->get_grob_property ("ideal-distances");
 	   spring_params == SCM_UNDEFINED && gh_pair_p (s);
 	   s = gh_cdr (s))
 	{
diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc
index 3265bee03d..d72c81cea1 100644
--- a/lily/simultaneous-music-iterator.cc
+++ b/lily/simultaneous-music-iterator.cc
@@ -12,6 +12,7 @@
 #include "music-list.hh"
 #include "killing-cons.tcc"
 
+
 Simultaneous_music_iterator::Simultaneous_music_iterator ()
 {
   separate_contexts_b_ = false;
@@ -48,7 +49,7 @@ void
 Simultaneous_music_iterator::construct_children ()
 {
   int j = 0;
-  Music_sequence const *sim = dynamic_cast<Music_sequence const*> (music_l_);
+  Music_sequence const *sim = dynamic_cast<Music_sequence const*> (music_l ());
 
   SCM i = sim->music_list ();
   for (; gh_pair_p (i); i = gh_cdr (i), j++)
diff --git a/lily/simultaneous-music.cc b/lily/simultaneous-music.cc
new file mode 100644
index 0000000000..51bc213974
--- /dev/null
+++ b/lily/simultaneous-music.cc
@@ -0,0 +1,41 @@
+
+#include "moment.hh"
+#include "pitch.hh"
+#include "simultaneous-music-iterator.hh"
+#include "music-list.hh"
+
+Moment
+Simultaneous_music::length_mom () const
+{
+  return maximum_length ();
+}
+
+Moment
+Simultaneous_music::start_mom () const
+{
+  return minimum_start ();
+}
+
+
+
+Simultaneous_music::Simultaneous_music (SCM head)
+  : Music_sequence (head)
+{
+  set_mus_property ("iterator-ctor",
+		    Simultaneous_music_iterator::constructor_cxx_function);
+}
+
+Simultaneous_music::Simultaneous_music ()
+  : Music_sequence ()
+{
+  set_mus_property ("iterator-ctor",
+		    Simultaneous_music_iterator::constructor_cxx_function);
+  
+}
+
+Pitch
+Simultaneous_music::to_relative_octave (Pitch p)
+{
+  return do_relative_octave (p, true);
+}
+ADD_MUSIC (Simultaneous_music);
diff --git a/lily/spaceable-element.cc b/lily/spaceable-grob.cc
similarity index 83%
rename from lily/spaceable-element.cc
rename to lily/spaceable-grob.cc
index b0d6779c7d..8aa3209f28 100644
--- a/lily/spaceable-element.cc
+++ b/lily/spaceable-grob.cc
@@ -1,5 +1,5 @@
 /*   
-  spaceable-element.cc --  implement Spaceable_grob
+  spaceable-grob.cc --  implement Spaceable_grob
   
   source file of the GNU LilyPond music typesetter
   
@@ -7,7 +7,7 @@
   
  */
 
-#include "spaceable-element.hh"
+#include "spaceable-grob.hh"
 #include "grob.hh"
 #include "warn.hh"
 
@@ -42,7 +42,7 @@ Spaceable_grob::add_rod (Grob *me , Grob * p, Real d)
 void
 Spaceable_grob::add_spring (Grob*me, Grob * p, Real d, Real strength)
 {
-  SCM mins = get_ideal_distances (me);
+  SCM mins = me->get_grob_property ("ideal-distances");
   SCM newdist= gh_double2scm (d);
   for (SCM s = mins; gh_pair_p (s); s = gh_cdr (s))
     {
@@ -59,11 +59,6 @@ Spaceable_grob::add_spring (Grob*me, Grob * p, Real d, Real strength)
   me->set_grob_property ("ideal-distances", mins);
 }
 
-SCM
-Spaceable_grob::get_ideal_distances (Grob*me)
-{
-  return me->get_grob_property ("ideal-distances");
-}
 
 
 void
@@ -78,5 +73,5 @@ Spaceable_grob::remove_interface (Grob*me)
 void
 Spaceable_grob::set_interface (Grob*me)
 {
-  me->set_interface (ly_symbol2scm ("spaceable-element-interface"));
+  me->set_interface (ly_symbol2scm ("spaceable-grob-interface"));
 }
diff --git a/lily/spacing-engraver.cc b/lily/spacing-engraver.cc
index 0b3b586731..b02847bf66 100644
--- a/lily/spacing-engraver.cc
+++ b/lily/spacing-engraver.cc
@@ -64,7 +64,7 @@ int
 Rhythmic_tuple::time_compare (Rhythmic_tuple const &h1,
 			      Rhythmic_tuple const &h2)
 {
-  return (h1.end_ - h2.end_).sign ();
+  return (h1.end_ - h2.end_).main_part_.sign ();
 }
 
 Spacing_engraver::Spacing_engraver ()
diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc
index bf85b60683..31d44a0d7e 100644
--- a/lily/spacing-spanner.cc
+++ b/lily/spacing-spanner.cc
@@ -53,10 +53,18 @@ Spacing_spanner::do_measure (Grob*me, Link_array<Grob> cols)
     {
       if (dynamic_cast<Paper_column*> (cols[i])->musical_b ())
 	{
+	  Moment *when = unsmob_moment (cols[i]->get_grob_property  ("when"));
+
+	  /*
+	    ignore grace notes for shortest notes.
+	   */
+	  if (when && when->grace_mom_)
+	    continue;
+	  
 	  SCM  st = cols[i]->get_grob_property ("shortest-starter-duration");
 	  Moment this_shortest = *unsmob_moment (st);
 	  shortest = shortest <? this_shortest;
-	  if (!mean_shortest.infty_b ())
+	  if (!mean_shortest.main_part_.infty_b ())
 	    {
 	      n++;
 	      mean_shortest += this_shortest;
@@ -65,7 +73,6 @@ Spacing_spanner::do_measure (Grob*me, Link_array<Grob> cols)
     }
   mean_shortest /= n;
 
-
   for (int i= 0; i < cols.size () - 1; i++)
     {
       Item * l = dynamic_cast<Item*> (cols[i]);
@@ -266,12 +273,28 @@ Spacing_spanner::note_spacing (Grob*me, Grob *lc, Grob *rc,
   Real dist = get_duration_space (me, shortest_playing_len, shortest);
   dist *= (double) (delta_t / shortest_playing_len);
 
+
+
   /*
     UGH: KLUDGE!
   */
   
   if (delta_t > Moment (1,32))
     dist += stem_dir_correction (me, lc,rc);
+
+
+  Moment *lm = unsmob_moment (lc->get_grob_property ("when"));
+  Moment *rm = unsmob_moment (rc->get_grob_property ("when"));
+
+  if (lm && rm)
+    {
+      if (lm->grace_mom_ && rm->grace_mom_)
+	dist *= 0.5;
+      else if (!rm->grace_mom_ && lm->grace_mom_)
+	dist *= 0.7;
+    }
+
+  
   return dist;
 }
 
diff --git a/lily/span-bar-engraver.cc b/lily/span-bar-engraver.cc
index a4e19592d0..9d110e8a63 100644
--- a/lily/span-bar-engraver.cc
+++ b/lily/span-bar-engraver.cc
@@ -59,8 +59,6 @@ Span_bar_engraver::acknowledge_grob (Grob_info i)
 	{
 	  spanbar_p_ = new Item (get_property ("SpanBar"));
 	  Span_bar::set_interface (spanbar_p_);
-		
-	  spanbar_p_->set_parent (bar_l_arr_[0], Y_AXIS);
 	  spanbar_p_->set_parent (bar_l_arr_[0], X_AXIS);
 
 	  announce_grob (spanbar_p_,0);
diff --git a/lily/span-bar.cc b/lily/span-bar.cc
index fddeb470fe..b564cf1790 100644
--- a/lily/span-bar.cc
+++ b/lily/span-bar.cc
@@ -25,6 +25,73 @@ Span_bar::add_bar (Grob*me, Grob*b)
   me->add_dependency (b);
 }
 
+MAKE_SCHEME_CALLBACK (Span_bar,brew_molecule,1);
+
+/**
+ * Limitations/Bugs:
+ *
+ * (1) Elements from 'me->get_grob_property ("elements")' must be
+ * ordered according to their y coordinates relative to their common
+ * axis group parent.  Otherwise, the computation goes mad.  (TODO:
+ * apply a sort algorithm that ensures this precondition.)  However,
+ * until now, I have seen no case where lily has not fulfilled this
+ * precondition.
+ *
+ * (2) This method depends on bar_engraver not being removed from
+ * staff context.  If bar_engraver is removed, the size of the staff
+ * lines is evaluated as 0, which results in a solid span bar line
+ * with faulty y coordinate.
+ */
+
+/*
+  This routine was originally by Juergen Reuter, but it was a on the
+  bulky side. Rewritten by Han-Wen. 
+ */
+SCM
+Span_bar::brew_molecule (SCM smobbed_me) 
+{
+  Grob *me = unsmob_grob (smobbed_me);
+  SCM first_elt = me->get_grob_property ("elements");
+
+  // compute common refpoint of elements
+  Grob *refp = me;
+  for (SCM elts = first_elt; gh_pair_p (elts); elts = gh_cdr (elts))
+    {
+      SCM smobbed_staff_bar = gh_car (elts);
+      Grob *staff_bar = unsmob_grob (smobbed_staff_bar);
+      refp = staff_bar->common_refpoint (refp, Y_AXIS);
+    }
+
+  // evaluate glyph
+  Span_bar::evaluate_glyph(me);
+  SCM glyph = me->get_grob_property (ly_symbol2scm ("glyph"));
+  String glyph_str = ly_scm2string (glyph);
+
+  // compose span_bar_mol
+  Molecule span_bar_mol;
+  Grob *prev_staff_bar = 0;
+  for (SCM elts = first_elt; gh_pair_p (elts); elts = gh_cdr (elts))
+    {
+      SCM smobbed_staff_bar = gh_car (elts);
+      Grob *staff_bar = unsmob_grob (smobbed_staff_bar);
+      if (prev_staff_bar)
+	{
+	  Interval l(prev_staff_bar->extent (refp, Y_AXIS)[UP],
+		     staff_bar->extent (refp, Y_AXIS)[DOWN]);
+
+	  Molecule interbar
+	    = Bar::compound_barline (staff_bar, glyph_str, l.length());
+	  interbar.translate_axis (l.center (), Y_AXIS);
+	  span_bar_mol.add_molecule (interbar);
+	}
+      prev_staff_bar = staff_bar;
+    }
+
+  span_bar_mol.translate_axis (- me->relative_coordinate (refp, Y_AXIS), Y_AXIS);
+  
+  return span_bar_mol.smobbed_copy ();
+}
+
 MAKE_SCHEME_CALLBACK (Span_bar,width_callback,2);
 SCM
 Span_bar::width_callback (SCM element_smob, SCM scm_axis)
@@ -36,7 +103,7 @@ Span_bar::width_callback (SCM element_smob, SCM scm_axis)
 
   /*
     urg.
-   */
+  */
   Molecule m = Bar::compound_barline (se, gl, 40 PT);
   
   return ly_interval2scm (m.extent (X_AXIS));
@@ -52,7 +119,7 @@ Span_bar::before_line_breaking (SCM smob)
   /*
     no need to call   Bar::before_line_breaking (), because the info
     in ELEMENTS already has been procced by Bar::before_line_breaking ().
-   */
+  */
   return SCM_UNSPECIFIED;
 }
 
@@ -144,7 +211,7 @@ Span_bar::get_bar_size (SCM smob)
     {
       /*
 	This happens if the bars are hara-kiried from under us.
-       */
+      */
       me->suicide ();
       return gh_double2scm (-1);
     }
diff --git a/lily/spring.cc b/lily/spring.cc
index 476007d122..93ef33f59e 100644
--- a/lily/spring.cc
+++ b/lily/spring.cc
@@ -10,7 +10,7 @@
 #include "spring.hh"
 #include "debug.hh"
 #include "item.hh"
-#include "spaceable-element.hh"
+#include "spaceable-grob.hh"
 #include "paper-column.hh"
 
 Spring::Spring ()
diff --git a/lily/stem.cc b/lily/stem.cc
index 7eac4dfe63..aca140aaf7 100644
--- a/lily/stem.cc
+++ b/lily/stem.cc
@@ -511,6 +511,7 @@ Stem::brew_molecule (SCM smob)
   Interval stem_y (y1,y2);
   stem_y.unite (Interval (y2,y1));
 
+  // dy?
   Real dy = Staff_symbol_referencer::staff_space (me)/2.0;
     
   if (Grob *hed = support_head (me))
@@ -524,7 +525,10 @@ Stem::brew_molecule (SCM smob)
   
   if (!invisible_b (me))
     {
-      Real stem_width = gh_scm2double (me->get_grob_property ("thickness")) * me->paper_l ()->get_var ("stafflinethickness");
+      Real stem_width = gh_scm2double (me->get_grob_property ("thickness"))
+	// URG
+	* me->paper_l ()->get_var ("stafflinethickness");
+      
       Molecule ss =Lookup::filledbox (Box (Interval (-stem_width/2, stem_width/2),
 					   Interval (stem_y[DOWN]*dy, stem_y[UP]*dy)));
       mol.add_molecule (ss);
diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc
index ca954b5e08..061650bbff 100644
--- a/lily/tie-engraver.cc
+++ b/lily/tie-engraver.cc
@@ -310,5 +310,5 @@ int
 CHead_melodic_tuple::time_compare (CHead_melodic_tuple const&h1,
 				   CHead_melodic_tuple const &h2)
 {
-  return (h1.end_ - h2.end_).sign ();
+  return Moment::compare(h1.end_,  h2.end_);
 }
diff --git a/lily/tie-performer.cc b/lily/tie-performer.cc
index ab1ef29966..e25e6cb4b2 100644
--- a/lily/tie-performer.cc
+++ b/lily/tie-performer.cc
@@ -231,5 +231,5 @@ int
 CNote_melodic_tuple::time_compare (CNote_melodic_tuple const&h1,
 				   CNote_melodic_tuple const &h2)
 {
-  return (h1.end_ - h2.end_).sign ();
+  return (h1.end_ - h2.end_).main_part_.sign ();
 }
diff --git a/lily/time-scaled-music-iterator.cc b/lily/time-scaled-music-iterator.cc
index ee8074c6bc..b666f766bd 100644
--- a/lily/time-scaled-music-iterator.cc
+++ b/lily/time-scaled-music-iterator.cc
@@ -18,11 +18,11 @@ Time_scaled_music_iterator::process (Moment m)
 {
   if (!m)
     {
-      Music_iterator *yeah = try_music (music_l_);
+      Music_iterator *yeah = try_music (music_l ());
       if (yeah)
 	set_translator (yeah->report_to_l ());
       else
-	music_l_->origin ()->warning (_ ("no one to print a tuplet start bracket"));
+	music_l ()->origin ()->warning (_ ("no one to print a tuplet start bracket"));
     }
 
   Music_wrapper_iterator::process (m);
diff --git a/lily/timing-engraver.cc b/lily/timing-engraver.cc
index ba462c1673..fb02109583 100644
--- a/lily/timing-engraver.cc
+++ b/lily/timing-engraver.cc
@@ -16,15 +16,28 @@
   Do time bookkeeping
  */
 class Timing_engraver : public Timing_translator, public Engraver
-{   
+{
 protected:
+  /*
+    Needed to know whether we're advancing in grace notes, or not.
+   */
+  Moment last_moment_;
+  
   virtual void start_translation_timestep ();
   virtual void stop_translation_timestep ();
   virtual void process_music ();
+
 public:
+  Timing_engraver ();
   VIRTUAL_COPY_CONS (Translator);
 };
 
+
+Timing_engraver::Timing_engraver ()
+{
+  last_moment_.main_part_ = Rational (-1);
+}
+
 ADD_THIS_TRANSLATOR (Timing_engraver);
 
 void
@@ -33,20 +46,27 @@ Timing_engraver::start_translation_timestep ()
   Timing_translator::start_translation_timestep ();
 
   SCM nonauto = get_property ("barNonAuto");
-
+  Moment now = now_mom ();
   SCM which = get_property ("whichBar");
+
+  /*
+    Set the first bar of the score? 
+   */
   if (!gh_string_p (which))
-    which = now_mom ()
+    which
+      = (now.main_part_ || now.main_part_ == last_moment_.main_part_)
       ? SCM_EOL : ly_str02scm ("|");
   
   if (!gh_string_p (which) && !to_boolean (nonauto))
     {
       SCM always = get_property ("barAlways");
-      if (!measure_position ()
-	  || (to_boolean (always)))
+      Moment mp = measure_position ();
+      if ( (last_moment_.main_part_ != now.main_part_
+	    && !mp.main_part_)
+	   || (to_boolean (always)))
 	{
 	  /* should this work, or be junked?  See input/bugs/no-bars.ly */
-	  which=get_property ("defaultBarType");
+	  which = get_property ("defaultBarType");
 	}
     }
 
@@ -57,7 +77,8 @@ void
 Timing_engraver::stop_translation_timestep ()
 {
   Timing_translator::stop_translation_timestep ();
-  daddy_trans_l_->set_property ("whichBar", SCM_EOL);  
+  daddy_trans_l_->set_property ("whichBar", SCM_EOL);
+  last_moment_ = now_mom ();
 }
 
 
diff --git a/lily/timing-translator.cc b/lily/timing-translator.cc
index aa48828530..dbe365e11c 100644
--- a/lily/timing-translator.cc
+++ b/lily/timing-translator.cc
@@ -18,7 +18,6 @@
   TODO: change the rest of lily, so communication with
   Timing_translator is only done through properties.  This means the
   class declaration can go here.  */
-
 bool
 Timing_translator::try_music (Music*r)
 {
@@ -33,7 +32,7 @@ Timing_translator::try_music (Music*r)
 void
 Timing_translator::process_music ()
 {
-  if (check_ && measure_position ())
+  if (check_ && measure_position ().main_part_)
     {
       check_->origin ()->warning (_f ("barcheck failed at: %s", 
 				      measure_position ().str ()));
@@ -44,7 +43,6 @@ Timing_translator::process_music ()
     }
 }
 
-
 void
 Timing_translator::stop_translation_timestep ()
 {
@@ -92,25 +90,21 @@ Timing_translator::initialize ()
   daddy_trans_l_->set_property ("beatLength", Moment (1,4).smobbed_copy ());
 }
 
-Moment
+Rational
 Timing_translator::measure_length () const
 {
   SCM l = get_property ("measureLength");
   if (unsmob_moment (l))
-    return *unsmob_moment (l);
+    return unsmob_moment (l)->main_part_;
   else
-    return Moment (1);
+    return Rational (1);
 }
 
-
-
 Timing_translator::Timing_translator ()
 {
 
-
 }
 
-
 Moment
 Timing_translator::measure_position () const
 {
@@ -120,8 +114,8 @@ Timing_translator::measure_position () const
   if (unsmob_moment (sm))
     {
       m = *unsmob_moment (sm);
-      while (m < Moment (0))
-	m += measure_length ();
+      while (m.main_part_ < Rational (0))
+	m.main_part_ += measure_length ();
     }
   
   return m;
@@ -130,7 +124,7 @@ Timing_translator::measure_position () const
 void
 Timing_translator::start_translation_timestep ()
 {
-	check_ =00;
+  check_ = 0;
   Translator *t = this;
   Global_translator *global_l =0;
   do
@@ -174,10 +168,10 @@ Timing_translator::start_translation_timestep ()
   SCM cad = get_property ("timing");
   bool c= to_boolean (cad);
 
-  Moment len = measure_length ();
-  while (c && measposp >= len)
+  Rational len = measure_length ();
+  while (c && measposp.main_part_ >= len)
     {
-      measposp -= len;
+      measposp.main_part_ -= len;
       b ++;
     }
 
diff --git a/lily/translator-group.cc b/lily/translator-group.cc
index 33fa92d9cd..2643670a0a 100644
--- a/lily/translator-group.cc
+++ b/lily/translator-group.cc
@@ -12,7 +12,6 @@
 #include "debug.hh"
 #include "moment.hh"
 #include "scm-hash.hh"
-#include "killing-cons.tcc"
 #include "translator-def.hh"
 
 Translator_group::Translator_group (Translator_group const&s)
diff --git a/lily/unfolded-repeat-iterator.cc b/lily/unfolded-repeat-iterator.cc
index 93bc97d5f3..56c6195aed 100644
--- a/lily/unfolded-repeat-iterator.cc
+++ b/lily/unfolded-repeat-iterator.cc
@@ -120,7 +120,7 @@ the  alternative just set.
 void
 Unfolded_repeat_iterator::next_element (bool side_effect) 
 {
-  Repeated_music * repmus =dynamic_cast<Repeated_music *> (music_l_);
+  Repeated_music * repmus =dynamic_cast<Repeated_music *> (music_l ());
   delete current_iter_p_;
   current_iter_p_ =0;
 
@@ -256,7 +256,7 @@ Unfolded_repeat_iterator::pending_moment () const
 void
 Unfolded_repeat_iterator::construct_children ()
 {
-  Repeated_music * mus =dynamic_cast<Repeated_music *> (music_l_);
+  Repeated_music * mus =dynamic_cast<Repeated_music *> (music_l ());
   
   alternative_cons_ = (mus->alternatives ())
     ? mus->alternatives ()->music_list ()
diff --git a/ly/a4.ly b/ly/a4-init.ly
similarity index 100%
rename from ly/a4.ly
rename to ly/a4-init.ly
diff --git a/ly/accordion-defs.ly b/ly/accordion-defs-init.ly
similarity index 100%
rename from ly/accordion-defs.ly
rename to ly/accordion-defs-init.ly
diff --git a/ly/book-init.ly b/ly/book-init-init.ly
similarity index 61%
rename from ly/book-init.ly
rename to ly/book-init-init.ly
index f6c865109d..f12fc8683b 100644
--- a/ly/book-init.ly
+++ b/ly/book-init-init.ly
@@ -3,8 +3,8 @@
 \version "1.3.146"
 
 
-\include "declarations.ly"
-\include "paper16.ly"
+\include "declarations-init.ly"
+\include "paper16-init.ly"
 
  \paper{
 	\paperSixteen
diff --git a/ly/center.ly b/ly/center-init.ly
similarity index 70%
rename from ly/center.ly
rename to ly/center-init.ly
index c3730fbbe8..72ecace841 100644
--- a/ly/center.ly
+++ b/ly/center-init.ly
@@ -3,8 +3,8 @@
 \version "1.3.146"
 
 
-\include "declarations.ly"
-\include "paper16.ly"
+\include "declarations-init.ly"
+\include "paper16-init.ly"
 
  \paper { 
   \paperSixteen
diff --git a/ly/chord-modifiers.ly b/ly/chord-modifiers-init.ly
similarity index 100%
rename from ly/chord-modifiers.ly
rename to ly/chord-modifiers-init.ly
diff --git a/ly/declarations.ly b/ly/declarations-init.ly
similarity index 62%
rename from ly/declarations.ly
rename to ly/declarations-init.ly
index 0bb5e95a6a..c200465244 100644
--- a/ly/declarations.ly
+++ b/ly/declarations-init.ly
@@ -5,8 +5,8 @@ longa = \duration #(make-duration -2 0 )
 maxima = \duration #(make-duration -3 0)
 
 \include "nederlands.ly"		% dutch
-\include "chord-modifiers.ly"
-\include "script.ly"
+\include "chord-modifiers-init.ly"
+\include "script-init.ly"
 
 % declarations for standard directions
 left = -1
@@ -21,30 +21,31 @@ center=0
 
 break =  \penalty  #-10000
 noBreak =  \penalty #10000
-\include "scale-definitions.ly"
+\include "scale-definitions-init.ly"
 
 melisma = \property Staff.melismaBusy = ##t
 melismaEnd = \property Staff.melismaBusy = ##f
 
 
-\include "engraver.ly"
+\include "engraver-init.ly"
+\include "grace-init.ly"
 
 singleLine = \paper { linewidth = 1. }
 
 % ugh
-\include "midi.ly"
+\include "midi-init.ly"
 
 papersize = "a4"
-paperfile = \papersize + ".ly"
+paperfile = \papersize + "-init.ly"
 
-\include "generic-paper.ly"
-\include "paper20.ly"
+\include "generic-paper-init.ly"
+\include "paper20-init.ly"
 
 
-\include "dynamic-scripts.ly"
-\include "spanners.ly"
+\include "dynamic-scripts-init.ly"
+\include "spanners-init.ly"
 
-\include "property.ly"
+\include "property-init.ly"
 
 
 
diff --git a/ly/drumpitch.ly b/ly/drumpitch-init.ly
similarity index 100%
rename from ly/drumpitch.ly
rename to ly/drumpitch-init.ly
diff --git a/ly/dynamic-scripts.ly b/ly/dynamic-scripts-init.ly
similarity index 100%
rename from ly/dynamic-scripts.ly
rename to ly/dynamic-scripts-init.ly
diff --git a/ly/engraver.ly b/ly/engraver-init.ly
similarity index 85%
rename from ly/engraver.ly
rename to ly/engraver-init.ly
index b8fa85214a..968fd4b11e 100644
--- a/ly/engraver.ly
+++ b/ly/engraver-init.ly
@@ -9,12 +9,11 @@ StaffContext=\translator {
 	\name Staff 
 	\consists "Output_property_engraver"	
 	Generic_property_list = #generic-staff-properties
-	\consists "Property_engraver"
 	
 	\consists "Bar_engraver"
  % Bar_engraver must be first so default bars aren't overwritten
 % with empty ones.
-
+	\consists "Font_size_engraver"
 
 %	\consists "Repeat_engraver"
 	\consists "Volta_engraver"
@@ -85,7 +84,6 @@ ChoirStaffContext = \translator {
 RhythmicStaffContext=\translator{
 	\type "Engraver_group_engraver"
 	
-	\consists "Property_engraver"
 	\consists "Output_property_engraver"	
 
 	Generic_property_list = #generic-staff-properties
@@ -118,14 +116,14 @@ VoiceContext = \translator {
 	\name Voice
 
 	Generic_property_list = #generic-voice-properties
-
+	\consists "Font_size_engraver"
+	
 	% must come before all
 	\consists "Voice_devnull_engraver"
 	\consists "Output_property_engraver"	
 	\consists "Arpeggio_engraver"
 	\consists "Multi_measure_rest_engraver"
 	\consists "Text_spanner_engraver"
-	\consists "Property_engraver"
 	
 	\consists "Breathing_sign_engraver"
  	% \consists "Rest_engraver"
@@ -152,72 +150,23 @@ VoiceContext = \translator {
 	\consists "Slur_engraver"
 	\consists "Tie_engraver"
 	\consists "Tuplet_engraver"
-	\consists "Grace_position_engraver"
 	\consists "A2_engraver"
 
 	\consists "Skip_req_swallow_translator"
 	\accepts Thread % bug if you leave out this!
-	\accepts Grace
-}
-
-GraceContext=\translator {
-	\type "Grace_engraver_group"
-	\name "Grace"
-	\consists "Output_property_engraver"	
-
-	Generic_property_list = #generic-grace-properties
-	
-	\consists "Note_heads_engraver"
-	\consists "Local_key_engraver"
-	\consists "Stem_engraver"
-	\consists "Beam_engraver"
-	\consists "Slur_engraver"
-
-	\consists "Auto_beam_engraver"
-	\consists "Align_note_column_engraver"
-
-	\consists "Rhythmic_column_engraver"
-
-	\consists "Dynamic_engraver"% in Grace ???
-	\consists "Text_engraver" % in Grace ???
-
-	\consists "Property_engraver"
-
-	Stem \override  #'flag-style = #"grace"
-	Stem \override  #'stem-length = #6.0
-	Stem \override  #'direction = #1
-
-	NoteHead \override #'font-relative-size = #-1
-	Stem \override #'font-relative-size = #-1
-	Stem \override #'stem-shorten = #'(0)
-	Beam \override #'font-relative-size = #-1
-	TextScript \override #'font-relative-size = #-1
-	Slur \override #'font-relative-size = #-1
-	Accidentals \override #'font-relative-size = #-1
-	Beam \override #'thickness = #0.3
-	Beam \override #'space-function = #(lambda (x) 0.5)
-
-	Stem \override #'lengths = #(map (lambda (x) (* 0.8 x)) '(3.5 3.5 3.5 4.5 5.0))
-	Stem \override #'beamed-lengths =
-		#'(0.0 2.5 2.0 1.5)
-	Stem \override #'beamed-minimum-lengths
-		 = #(map (lambda (x) (* 0.8 x)) '(0.0 2.5 2.0 1.5))
-
-	weAreGraceContext = ##t   
-	graceAccidentalSpace= #1.5  % in staff space
 }
 
 ThreadContext = \translator{
 	\type Engraver_group_engraver
 	\name Thread
-	
+
+	\consists "Font_size_engraver"	
 	\consists "Thread_devnull_engraver"
 	\consists "Note_heads_engraver"
 	\consists "Rest_engraver"
 	\consists "Note_head_line_engraver"
 	\consists "Output_property_engraver"	
 	Generic_property_list = #generic-thread-properties
-	\consists "Property_engraver"
 }
 
 GrandStaffContext=\translator{
@@ -228,7 +177,6 @@ GrandStaffContext=\translator{
 	\consists "System_start_delimiter_engraver"
 	SystemStartDelimiter \override #'glyph = #'brace
 	
-	\consists "Property_engraver"	
 	Generic_property_list = #generic-grand-staff-properties
 	\accepts "Staff"
 }
@@ -311,7 +259,7 @@ LyricsContext = \translator {
 	\name Lyrics
 	\consists Vertical_align_engraver %need this for getting folded repeats right.
 	Generic_property_list = #generic-lyrics-properties
-	\consists "Property_engraver"
+
 	\consistsend "Axis_group_engraver"
 	MinimumVerticalExtent = ##f
 	ExtraVerticalExtent = ##f
@@ -327,7 +275,7 @@ ChordNamesContext = \translator {
 
 	Generic_property_list = #generic-chord-staff-properties
 
-	\consists "Property_engraver"	
+
 	\consists "Output_property_engraver"	
 	\consists "Separating_line_group_engraver"
 	\consists "Chord_name_engraver"
@@ -459,3 +407,7 @@ EasyNotation =  \translator {
 	easyPlay = ##t
 }
 
+% retain for compatibility reasons.
+GraceContext = \translator {
+	\type "Engraver_group_engraver"
+}
diff --git a/ly/generate-interface-doc.ly b/ly/generate-interface-doc-init.ly
similarity index 100%
rename from ly/generate-interface-doc.ly
rename to ly/generate-interface-doc-init.ly
diff --git a/ly/generic-paper.ly b/ly/generic-paper-init.ly
similarity index 100%
rename from ly/generic-paper.ly
rename to ly/generic-paper-init.ly
diff --git a/ly/german-chords.ly b/ly/german-chords-init.ly
similarity index 100%
rename from ly/german-chords.ly
rename to ly/german-chords-init.ly
diff --git a/ly/grace-init.ly b/ly/grace-init.ly
new file mode 100644
index 0000000000..54211cb4d9
--- /dev/null
+++ b/ly/grace-init.ly
@@ -0,0 +1,58 @@
+
+
+ #(define (grace-beam-space-function multiplicity)
+         (* (if (<= multiplicity 3) 0.816 0.844) 0.8))
+
+
+ #(define (make-text-checker text)
+  (lambda (elt) (equal? text (ly-get-grob-property elt 'text))))
+
+
+startGraceMusic = {
+
+%{
+from GraceContext
+	Stem \override  #'flag-style = #"grace"
+	Stem \override  #'stem-length = #6.0
+	Stem \override  #'direction = #1
+
+	NoteHead \override #'font-relative-size = #-1
+	Stem \override #'font-relative-size = #-1
+	Stem \override #'stem-shorten = #'(0)
+	Beam \override #'font-relative-size = #-1
+	TextScript \override #'font-relative-size = #-1
+	Slur \override #'font-relative-size = #-1
+	Accidentals \override #'font-relative-size = #-1
+	Beam \override #'thickness = #0.3
+	Beam \override #'space-function = #(lambda (x) 0.5)
+
+	Stem \override #'lengths = #(map (lambda (x) (* 0.8 x)) '(3.5 3.5 3.5 4.5 5.0))
+	Stem \override #'beamed-lengths =
+		#'(0.0 2.5 2.0 1.5)
+	Stem \override #'beamed-minimum-lengths
+		 = #(map (lambda (x) (* 0.8 x)) '(0.0 2.5 2.0 1.5))
+%}
+
+
+    \property Voice.NoteHead \override #'font-relative-size = #-1
+    \property Voice.Stem \override #'length = #6
+    \property Voice.Stem \override #'beamed-lengths =
+        #(map (lambda (x) (* 1.25 x)) '(0.0 2.5 2.0 1.5))
+    \property Voice.Stem \override #'beamed-minimum-lengths =
+        #(map (lambda (x) (* 1.25 x)) '(0.0 1.5 1.25 1.0))
+    \property Voice.Beam \override #'space-function = #grace-beam-space-function
+    \property Voice.fontSize = #-2
+    \property Voice.Stem \override #'no-stem-extend = ##t
+
+%    \property Voice.Stem \override #'flag-style  = #"grace"
+}
+
+stopGraceMusic = {
+% \property Voice.Stem \revert #'flag-style
+    \property Voice.Stem \override #'no-stem-extend = ##f 
+    \property Voice.Stem \revert #'length
+    \property Voice.Stem \revert #'beamed-lengths
+    \property Voice.Stem \revert #'beamed-minimum-lengths
+    \property Voice.Beam \revert #'space-function
+    \property Voice.fontSize \unset
+}
diff --git a/ly/init.fly b/ly/init.fly
deleted file mode 100644
index 640f13692f..0000000000
--- a/ly/init.fly
+++ /dev/null
@@ -1,14 +0,0 @@
-% Toplevel initialisation file. 
-	
-\version "1.3.146"
-
-
-\include "declarations.ly"
-
-\score { 
-  \context Voice \notes\relative c {
-    \maininput
-  }
-  \paper { }  
-  \midi { }
-}
diff --git a/ly/init.ly b/ly/init.ly
index fea720a03c..0ddb2db3a9 100644
--- a/ly/init.ly
+++ b/ly/init.ly
@@ -3,6 +3,6 @@
 
 \version "1.3.146"
 
-\include "declarations.ly"
+\include "declarations-init.ly"
 
 \maininput
diff --git a/ly/init.sly b/ly/init.sly
deleted file mode 100644
index 497dfd8daa..0000000000
--- a/ly/init.sly
+++ /dev/null
@@ -1,17 +0,0 @@
-% Toplevel initialisation file. 
-	
-\version "1.3.146"
-
-
-\include "declarations.ly"
-
-\score { 
-  \context Voice \notes\relative c {
-    \maininput
-  }
-  \paper {
-
-	% indent = 0.0
-  }  
-  \midi{ }
-}
diff --git a/ly/ledger.ly b/ly/ledger-init.ly
similarity index 100%
rename from ly/ledger.ly
rename to ly/ledger-init.ly
diff --git a/ly/legal.ly b/ly/legal-init.ly
similarity index 76%
rename from ly/legal.ly
rename to ly/legal-init.ly
index 4291b819f5..47f413c0d3 100644
--- a/ly/legal.ly
+++ b/ly/legal-init.ly
@@ -1,5 +1,5 @@
 \version "1.3.146"
-% legal.ly
+% legal-init.ly
 
 hsize = 8.5 \in
 vsize = 14.0 \in
diff --git a/ly/letter.ly b/ly/letter-init.ly
similarity index 76%
rename from ly/letter.ly
rename to ly/letter-init.ly
index c9be6592b5..1ae8c499db 100644
--- a/ly/letter.ly
+++ b/ly/letter-init.ly
@@ -1,5 +1,5 @@
 \version "1.3.146"
-% letter.ly
+% letter-init.ly
 
 hsize = 8.5 \in
 vsize = 11.0 \in
diff --git a/ly/midi.ly b/ly/midi-init.ly
similarity index 69%
rename from ly/midi.ly
rename to ly/midi-init.ly
index a4283f4ccf..730d92a483 100644
--- a/ly/midi.ly
+++ b/ly/midi-init.ly
@@ -1,7 +1,7 @@
 \version "1.3.146"
 \midi {
         \tempo 4=60
-	\include "performer.ly"
+	\include "performer-init.ly"
 %	unfold_all = "1"
 }
 
diff --git a/ly/paper-as5.ly b/ly/paper-as5-init.ly
similarity index 83%
rename from ly/paper-as5.ly
rename to ly/paper-as5-init.ly
index d325b9be52..f7f58a3a3d 100644
--- a/ly/paper-as5.ly
+++ b/ly/paper-as5-init.ly
@@ -1,4 +1,4 @@
-% paper-as5.ly
+% paper-as5-init.ly
 
 \version "1.3.146"
 
@@ -11,7 +11,7 @@ paperAsFive = \paper {
 
 	% no beam-slope
 	%\translator { \VoiceContext beamHeight = #0 }
-	\include "params-as.ly"
+	\include "params-as-init.ly"
 }
 
 \paper { \paperAsFive }
diff --git a/ly/paper-as9.ly b/ly/paper-as9-init.ly
similarity index 79%
rename from ly/paper-as9.ly
rename to ly/paper-as9-init.ly
index d35590f5af..86866b0eff 100644
--- a/ly/paper-as9.ly
+++ b/ly/paper-as9-init.ly
@@ -1,4 +1,4 @@
-% paper-as9.ly
+% paper-as9-init.ly
 
 \version "1.3.146"
 
@@ -9,7 +9,7 @@ paperAsNine = \paper {
 
 	\stylesheet #(as-make-style-sheet 'as9)
 
-	\include "params-as.ly"
+	\include "params-as-init.ly"
 	
 }
 
diff --git a/ly/paper.ly b/ly/paper-init.ly
similarity index 95%
rename from ly/paper.ly
rename to ly/paper-init.ly
index fb9aea728c..f6ac488597 100644
--- a/ly/paper.ly
+++ b/ly/paper-init.ly
@@ -1,5 +1,5 @@
 \version "1.3.146"
-% paper.ly
+% paper-init.ly
 
 %% Why som complicated?  /MB
 %linewidth20 = \hsize - 2.5 * \staffheight
diff --git a/ly/paper11.ly b/ly/paper11-init.ly
similarity index 75%
rename from ly/paper11.ly
rename to ly/paper11-init.ly
index 61dbaf5e08..2cc39133f3 100644
--- a/ly/paper11.ly
+++ b/ly/paper11-init.ly
@@ -1,4 +1,4 @@
-% paper11.ly
+% paper11-init.ly
 
 \version "1.3.146"
 
@@ -6,7 +6,7 @@ paperEleven = \paper {
 	staffheight = 11.0\pt
 	\stylesheet #(make-style-sheet 'paper11)
 
-	\include "params.ly"
+	\include "params-init.ly"
 }
 
 \paper { \paperEleven }
diff --git a/ly/paper13.ly b/ly/paper13-init.ly
similarity index 76%
rename from ly/paper13.ly
rename to ly/paper13-init.ly
index 445c37e929..cdccec434e 100644
--- a/ly/paper13.ly
+++ b/ly/paper13-init.ly
@@ -1,4 +1,4 @@
-% paper13.ly
+% paper13-init.ly
 
 \version "1.3.146"
 
@@ -7,7 +7,7 @@ paperThirteen = \paper {
 
 	\stylesheet #(make-style-sheet 'paper13)
 	
-	\include "params.ly"
+	\include "params-init.ly"
 }
 
 \paper { \paperThirteen }
diff --git a/ly/paper16-init.ly b/ly/paper16-init.ly
new file mode 100644
index 0000000000..c747eac11d
--- /dev/null
+++ b/ly/paper16-init.ly
@@ -0,0 +1,12 @@
+% paper16-init.ly
+
+\version "1.3.146"
+
+paperSixteen = \paper {
+	staffheight = 16.0\pt
+	\stylesheet #(make-style-sheet 'paper16)
+
+	\include "params-init.ly"
+}
+
+\paper {\paperSixteen }
diff --git a/ly/paper16.ly b/ly/paper16.ly
index a03bfdd3e7..2621cae3e6 100644
--- a/ly/paper16.ly
+++ b/ly/paper16.ly
@@ -1,12 +1,2 @@
-% paper16.ly
 
-\version "1.3.146"
-
-paperSixteen = \paper {
-	staffheight = 16.0\pt
-	\stylesheet #(make-style-sheet 'paper16)
-
-	\include "params.ly"
-}
-
-\paper {\paperSixteen }
+\include "paper16-init.ly"
diff --git a/ly/paper20.ly b/ly/paper20-init.ly
similarity index 75%
rename from ly/paper20.ly
rename to ly/paper20-init.ly
index b213bbc0ec..13a67f0809 100644
--- a/ly/paper20.ly
+++ b/ly/paper20-init.ly
@@ -1,4 +1,4 @@
-% paper20.ly
+% paper20-init.ly
 
 
 \version "1.3.146"
@@ -7,7 +7,7 @@ paperTwenty = \paper {
 	staffheight = 20.0\pt
 	\stylesheet #(make-style-sheet 'paper20)
 	
-	\include "params.ly"
+	\include "params-init.ly"
 }
 
 \paper { \paperTwenty }
diff --git a/ly/paper23.ly b/ly/paper23-init.ly
similarity index 76%
rename from ly/paper23.ly
rename to ly/paper23-init.ly
index aa08a5e756..bbb55106e0 100644
--- a/ly/paper23.ly
+++ b/ly/paper23-init.ly
@@ -1,4 +1,4 @@
-% paper23.ly
+% paper23-init.ly
 
 
 \version "1.3.146"
@@ -6,7 +6,7 @@
 paperTwentythree = \paper {
 	staffheight = 23.0\pt
 	\stylesheet #(make-style-sheet 'paper23)
-	\include "params.ly"
+	\include "params-init.ly"
 }
 
 \paper { \paperTwentythree }
diff --git a/ly/paper26-init.ly b/ly/paper26-init.ly
new file mode 100644
index 0000000000..e64eba6a54
--- /dev/null
+++ b/ly/paper26-init.ly
@@ -0,0 +1,12 @@
+% paper26-init.ly
+
+\version "1.3.146"
+
+paperTwentysix = \paper {
+	staffheight = 26.0\pt
+	\stylesheet #(make-style-sheet 'paper26)	
+
+	\include "params-init.ly"
+}
+
+\paper { \paperTwentysix }
diff --git a/ly/paper26.ly b/ly/paper26.ly
index 5ff9ece986..c874b34f25 100644
--- a/ly/paper26.ly
+++ b/ly/paper26.ly
@@ -1,12 +1,2 @@
-% paper26.ly
 
-\version "1.3.146"
-
-paperTwentysix = \paper {
-	staffheight = 26.0\pt
-	\stylesheet #(make-style-sheet 'paper26)	
-
-	\include "params.ly"
-}
-
-\paper { \paperTwentysix }
+\include "paper26-init.ly"
diff --git a/ly/params-as.ly b/ly/params-as-init.ly
similarity index 97%
rename from ly/params-as.ly
rename to ly/params-as-init.ly
index fafb495c0a..b9928df8b1 100644
--- a/ly/params-as.ly
+++ b/ly/params-as-init.ly
@@ -1,5 +1,5 @@
 \version "1.3.146"
-% params-as.ly
+% params-as-init.ly
 % generic paper parameters
 
 outputscale = \staffheight / 4.0
diff --git a/ly/params.ly b/ly/params-init.ly
similarity index 89%
rename from ly/params.ly
rename to ly/params-init.ly
index 13bab53ff6..64fe88deee 100644
--- a/ly/params.ly
+++ b/ly/params-init.ly
@@ -11,12 +11,12 @@ papersize = \papersize
 % direct PostScript line height for single line staffs
 lineheight = 14
 
-paperfile = \papersize + ".ly"
+paperfile = \papersize + "-init.ly"
 
-% paperfile = "a4.ly"
+% paperfile = "a4-init.ly"
 
 \include \paperfile
-\include "paper.ly"
+\include "paper-init.ly"
 
 staffspace = \staffheight / 4.0
 stafflinethickness = \staffspace / 10.0
@@ -26,7 +26,7 @@ outputscale = \staffheight / 4.0
 \translator { \ScoreContext }
 \translator { \ChoirStaffContext}
 \translator { \InnerChoirStaffContext}
-\translator { \GraceContext}
+
 \translator { \RhythmicStaffContext}
 \translator { \StaffContext }
 \translator { \VoiceContext}
diff --git a/ly/part-paper.ly b/ly/part-paper-init.ly
similarity index 86%
rename from ly/part-paper.ly
rename to ly/part-paper-init.ly
index 5c2c17f170..4e8fea418f 100644
--- a/ly/part-paper.ly
+++ b/ly/part-paper-init.ly
@@ -1,7 +1,7 @@
 \version "1.3.146"
 
 % JUNKME
-%part-paper.ly
+%part-paper-init.ly
 
 \paper {
 	\translator { \OrchestralPartStaffContext }
diff --git a/ly/performer.ly b/ly/performer-init.ly
similarity index 100%
rename from ly/performer.ly
rename to ly/performer-init.ly
diff --git a/ly/property.ly b/ly/property-init.ly
similarity index 99%
rename from ly/property.ly
rename to ly/property-init.ly
index 1ebe98c918..84c8d2d46e 100644
--- a/ly/property.ly
+++ b/ly/property-init.ly
@@ -1,4 +1,4 @@
-% property.ly
+% property-init.ly
 
 \version "1.3.146"
 
diff --git a/ly/scale-definitions.ly b/ly/scale-definitions-init.ly
similarity index 100%
rename from ly/scale-definitions.ly
rename to ly/scale-definitions-init.ly
diff --git a/ly/script.ly b/ly/script-init.ly
similarity index 100%
rename from ly/script.ly
rename to ly/script-init.ly
diff --git a/ly/spanners.ly b/ly/spanners-init.ly
similarity index 100%
rename from ly/spanners.ly
rename to ly/spanners-init.ly
diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm
index 223d9c39f0..406f128e38 100644
--- a/make/out/lilypond.lsm
+++ b/make/out/lilypond.lsm
@@ -1,15 +1,15 @@
 Begin3
 Title: LilyPond
-Version: 1.4.4
-Entered-date: 27JUN01
+Version: 1.5.0
+Entered-date: 29JUN01
 Description: @BLURB@
 Keywords: music notation typesetting midi fonts engraving
 Author: hanwen@cs.uu.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
-	1000k lilypond-1.4.4.tar.gz 
+	1000k lilypond-1.5.0.tar.gz 
 Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
-	1000k lilypond-1.4.4.tar.gz 
+	1000k lilypond-1.5.0.tar.gz 
 Copying-policy: GPL
 End
diff --git a/make/out/lilypond.redhat.spec b/make/out/lilypond.redhat.spec
index d9044e4aab..e79cb62513 100644
--- a/make/out/lilypond.redhat.spec
+++ b/make/out/lilypond.redhat.spec
@@ -1,11 +1,11 @@
 %define info yes
 
 Name: lilypond
-Version: 1.4.4
+Version: 1.5.0
 Release: 1
 License: GPL
 Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.4.4.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.0.tar.gz
 Summary: Create and print music notation 
 URL: http://www.cs.uu.nl/~hanwen/lilypond
 BuildRoot: /tmp/lilypond-install
diff --git a/make/out/lilypond.suse.spec b/make/out/lilypond.suse.spec
index 864cd17a94..ba89252f43 100644
--- a/make/out/lilypond.suse.spec
+++ b/make/out/lilypond.suse.spec
@@ -14,11 +14,11 @@
 
 Distribution: SuSE Linux 7.0 (i386)
 Name: lilypond
-Version: 1.4.4
+Version: 1.5.0
 Release: 2
 Copyright:    GPL
 Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.4.4.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.0.tar.gz
 # music notation software for.. ?
 Summary: A program for printing sheet music.
 URL: http://www.lilypond.org/
diff --git a/midi2ly/duration.cc b/midi2ly/duration.cc
index 5289273358..6e1e9b54ae 100644
--- a/midi2ly/duration.cc
+++ b/midi2ly/duration.cc
@@ -44,8 +44,8 @@ Duration::duration_type_b (int t)
 void
 Duration::compress (Rational m)
 {
-  plet_.iso_i_ *= m.num_i ();
-  plet_.type_i_ *= m.den_i (); 
+  plet_.iso_i_ *= m.num ();
+  plet_.type_i_ *= m.den (); 
 }
 
 Rational
diff --git a/ps/lilyponddefs.ps b/ps/lilyponddefs.ps
index 53fed1bb2c..114d0beaaa 100644
--- a/ps/lilyponddefs.ps
+++ b/ps/lilyponddefs.ps
@@ -46,29 +46,6 @@
 	grestore
 } bind def
 
-%
-% FIXME.  translate to middle of box.
-%
-
-/draw-box % breapth width depth height
-{
-	/h exch def
-	/d exch def
-	/w exch def
-	/b exch def
-	gsave
-
-	0 setlinewidth
-	b neg d neg rmoveto
-	b w add 0 rlineto
-	0 d h add rlineto
-	b w add neg 0 rlineto
-	closepath % 0 d h add neg rlineto
-	fill
-
-	grestore
-} bind def
-
 /start-line % height
 {
 	dup base-line-skip gt {
diff --git a/ps/music-drawing-routines.ps b/ps/music-drawing-routines.ps
index 2ed8afd583..86b39dff6b 100644
--- a/ps/music-drawing-routines.ps
+++ b/ps/music-drawing-routines.ps
@@ -1,7 +1,9 @@
-%!PS-Adobe-1.0: lily.ps 
+%!PS-Adobe-1.0: music-drawing-routines.ps
 %
 % Functions for direct and embedded PostScript
 
+
+% FIXME: set with individual symbols
 % round cappings 
 1 setlinecap
 
@@ -10,17 +12,81 @@
 	1 copy mul exch 1 copy mul add sqrt 
 } bind def 
 
-/draw_beam % width slope thick 
-{ 
-        2 div /beam_thick exch def 
-        /beam_slope exch def 
-        /beam_wd exch def 
-        beam_slope beam_wd mul /beam_ht exch def 
-        0 beam_thick neg moveto  
-        beam_wd beam_ht rlineto  
-        0 beam_thick 2 mul rlineto 
-        0 beam_thick lineto 
-        closepath fill 
+% FIXME.  translate to middle of box.
+% Nice rectangle with rounded corners
+% FIXME: linewidth hardcoded.  check: too round?
+/draw_box % breapth width depth height
+{
+	%% FIXME: hardcoded
+	currentdict /testing known {
+		%% real thin lines for testing
+		/l 0.005 def
+	}{
+		/l 0.05 def
+	} ifelse
+
+	0 setlinecap
+	l setlinewidth
+	1 setlinejoin
+
+	l 2 div sub /h exch def
+	l 2 div sub /d exch def
+
+	%% UGH huh?
+	%% Where does this correction come from?
+	%% Why don't we need this in x direction?
+	h l 2 div sub /h exch def
+	d l 2 div sub /d exch def
+
+	l 2 div sub /w exch def
+	l 2 div sub /b exch def
+
+	b neg d neg moveto
+	b w add 0 rlineto
+	0 d h add rlineto
+	b w add neg 0 rlineto
+	0 d h add neg rlineto
+
+	currentdict /testing known {
+		%% outline only, for testing:
+		stroke
+	}{
+		closepath gsave stroke grestore fill
+	} ifelse
+} bind def
+
+% Nice beam with rounded corners
+% FIXME: linewidth hardcoded.  check: too round?
+/draw_beam % slope width thick 
+{
+	%% FIXME: hardcoded
+	currentdict /testing known {
+		%% real thin lines for testing
+		/l 0.01 def
+	}{
+		/l 0.1 def
+	} ifelse
+	l 2 div setlinewidth
+
+ 	0 setlinecap
+	1 setlinejoin
+
+	l sub /t exch def
+	l sub /w exch def
+	w mul /h exch def
+
+	l 2 div t 2 div neg moveto
+	w h rlineto
+	0 t rlineto
+	w neg h neg rlineto
+	0 t neg rlineto
+
+	currentdict /testing known {
+		%% outline only, for testing:
+		stroke
+	}{
+		closepath gsave stroke grestore fill
+	} ifelse
 } bind def 
 
 /draw_repeat_slash % width slope thick
diff --git a/scm/grob-description.scm b/scm/grob-description.scm
index 9d19e537d0..4ee94ca851 100644
--- a/scm/grob-description.scm
+++ b/scm/grob-description.scm
@@ -518,11 +518,9 @@
 	(SpanBar . (
 		(break-align-symbol . Staff_bar)
 		(bar-size-procedure . ,Span_bar::get_bar_size) 
-		(molecule-callback . ,Bar::brew_molecule)
+		(molecule-callback . ,Span_bar::brew_molecule)
 		(visibility-lambda . ,begin-of-line-invisible)
 		(X-extent-callback . ,Span_bar::width_callback)
-		(Y-offset-callbacks . (,Span_bar::center_on_spanned_callback))
-		
 		(breakable . #t)
 		(glyph . "|")
 		(before-line-breaking-callback . ,Span_bar::before_line_breaking)
diff --git a/scm/lily.scm b/scm/lily.scm
index 2b9d42b5cb..a0bfc1dec2 100644
--- a/scm/lily.scm
+++ b/scm/lily.scm
@@ -5,7 +5,7 @@
 ;;;; (c) 1998--2001 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;; Han-Wen Nienhuys <hanwen@cs.uu.nl>
 
-;;; Library funtions
+;;; Library functions
 
 (use-modules (ice-9 regex))
 
diff --git a/scm/ps.scm b/scm/ps.scm
index 9528079126..8e4dc95ecf 100644
--- a/scm/ps.scm
+++ b/scm/ps.scm
@@ -52,10 +52,9 @@
        "lilypondpaperoutputscale div scalefont setfont } bind def "
        "\n"))
 
-
   (define (beam width slope thick)
     (string-append
-     (numbers->string (list width slope thick)) " draw_beam" ))
+     (numbers->string (list slope width thick)) " draw_beam" ))
 
   (define (comment s)
     (string-append "% " s))
@@ -108,7 +107,7 @@
   
   (define (filledbox breapth width depth height) 
     (string-append (numbers->string (list breapth width depth height))
-		   " draw-box" ))
+		   " draw_box" ))
 
   ;; obsolete?
   (define (font-def i s)
@@ -127,6 +126,7 @@
      " {exch pop //systemdict /run get exec} "
      (ly-gulp-file "music-drawing-routines.ps")
      "{ exch pop //systemdict /run get exec } "
+     (if (defined? 'ps-testing) "\n /testing true def" "")
     ))
   
   (define (lily-def key val)
@@ -171,7 +171,7 @@ lilypondpaperoutputscale lilypondpaperoutputscale scale
   
   (define (stem breapth width depth height) 
     (string-append (numbers->string (list breapth width depth height))
-		   " draw-box" ))
+		   " draw_box" ))
 
   (define (stop-line)
       "}\nstop-line\n")
diff --git a/scm/tex.scm b/scm/tex.scm
index 4c8904415d..c002a22b3f 100644
--- a/scm/tex.scm
+++ b/scm/tex.scm
@@ -97,13 +97,14 @@
   (define (header-end)
     (string-append
      "\\special{\\string! "
-
+     
      ;; URG: ly-gulp-file: now we can't use scm output without Lily
      (if use-regex
 	 ;; fixed in 1.3.4 for powerpc -- broken on Windows
 	 (regexp-substitute/global #f "\n"
 				   (ly-gulp-file "music-drawing-routines.ps") 'pre " %\n" 'post)
 	 (ly-gulp-file "music-drawing-routines.ps"))
+     (if (defined? 'ps-testing) "/testing true def%\n" "")
      "}"
      "\\input lilyponddefs\\newdimen\\outputscale \\outputscale=\\lilypondpaperoutputscale pt\\turnOnPostScript"))
 
@@ -164,13 +165,18 @@
     "}\\vss}\\interscoreline\n")
   (define (stop-last-line)
     "}\\vss}")
-  (define (filledbox breapth width depth height) 
+  (define (xfilledbox breapth width depth height) 
     (string-append 
      "\\kern" (number->dim (- breapth))
      "\\vrule width " (number->dim (+ breapth width))
      "depth " (number->dim depth)
      "height " (number->dim height) " "))
 
+  (define (filledbox breapth width depth height) 
+    (embedded-ps
+     (string-append (numbers->string (list breapth width depth height))
+		   " draw_box" )))
+
   (define (text s)
     (string-append "\\hbox{" (output-tex-string s) "}"))
   
diff --git a/scm/translator-property-description.scm b/scm/translator-property-description.scm
index 5900032c1b..f5aacffd24 100644
--- a/scm/translator-property-description.scm
+++ b/scm/translator-property-description.scm
@@ -179,6 +179,10 @@ procedure? "visibility-lambda function for explicit Key changes;
 
 (translator-property-description 'followVoice boolean?
 				 "if set, note heads are tracked  across staff switches by a thin line")
+(translator-property-description 'fontSize integer?
+				 "Used to set the relative size of all grobs
+in a context. This is done using the @code{Font_size_engraver}.")
+
 (translator-property-description 'forceClef boolean? "Show clef symbol, even if it hasn't changed. Only active for the first clef after the property is set, not for the full staff.")
 (translator-property-description 'forgetAccidentals boolean? "do
 not set localKeySignature when a note alterated differently from
-- 
2.39.2