From: fred <fred>
Date: Tue, 26 Mar 2002 23:23:13 +0000 (+0000)
Subject: lilypond-1.3.61
X-Git-Tag: release/1.5.59~1567
X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=3714de5baac3306fa80411921f129da150a51b12;p=lilypond.git

lilypond-1.3.61
---

diff --git a/CHANGES b/CHANGES
index e721f26d8c..652041d578 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,25 @@
+1.3.60.jcn1
+===========
+
+* Webpage hacking
+
+1.3.60.hwn1
+===========
+
+* Junk int_identifier, real_identifier. Merged Midi_def_identifier and
+Paper_def_identifier.
+
+* Fixed bug with spanning barlines in combination with Hara-Kiri staffs.
+
+* Cleaned up Text_item, Hyphen_spanner, Lyric_extender and
+Sustain_pedal and reduced them to an Score_element interface (they are
+no longer Score_element derived types).
+
+* Some instances of brew_molecule routines have moved out of
+Score_element, and are now called scheme_molecule.
+
+* Moved lots of parameters from ly/params.ly to ly/engraver.ly
+
 1.3.59.hwn1
 ===========
 
diff --git a/Documentation/footer.html.in b/Documentation/footer.html.in
index 1930f851af..bcae009876 100644
--- a/Documentation/footer.html.in
+++ b/Documentation/footer.html.in
@@ -1,3 +1,10 @@
+
+<! shamefully inspired by Franc,ois Pinard's TP pages >
+
+    </td>
+  </tr>
+</table>
+
 <!--
 
 if this file ./Documentation/footer.html.in is present, it is included
diff --git a/Documentation/header.html.in b/Documentation/header.html.in
new file mode 100644
index 0000000000..e96b3aaf29
--- /dev/null
+++ b/Documentation/header.html.in
@@ -0,0 +1,26 @@
+
+<! your header here >
+<! shamefully inspired by Franc,ois Pinard's TP pages >
+
+<! ur* can't we generate this with @table from a .texi? >
+
+<bgcolor="grey">
+<table cellpadding=5 width="100%">
+  <tr>
+    <td align=left valign=top width="15%" bgcolor="grey">
+    <table align=left>
+      <tr><td bgcolor="cyan"><b>General info</b></td></tr>
+      <tr><td><font size=-1>
+          <a href="http://www.lilypond.org"><b>Entry page</b></a><br>
+          <a href="http://appel.dyndns.org/lilypond"><b>Hacking</b></a><br>
+      </td></tr>
+      <tr><td bgcolor="cyan"><b>Download Source</b></td></tr>
+      <tr><td><font size=-1>
+          <a href="ftp://ftp.gnu.org/pub/gnu/lilypond"><b>Stable</b></a><br>
+          <a href="ftp://cs.uu.nl/pub/gnu/LilyPond/development"><b>Development</b></a><br>
+      </td></tr>
+  </table>
+  <! /tr >
+  <td align=left valign=top width="90%">
+
+
diff --git a/Documentation/regression-test.tely b/Documentation/regression-test.tely
index 83848bfbdf..661be6f850 100644
--- a/Documentation/regression-test.tely
+++ b/Documentation/regression-test.tely
@@ -328,6 +328,13 @@ two measures all have the same distance from each other:
 
 @mudelafile{breathing-sign.ly}
 
+Hara kiri staffs kill themselves if they are empty.  This example really
+contains two staffs, but the second contains only spaces, and is
+therefore removed. 
+
+@mudelafile{hara-kiri-short.ly}
+
+
 Fonts are  available in a default set of sizes: 11, 13, 16, 20, 23 and
 26pt staffheight.  Sizes of the text fonts and symbol fonts are made
 to match the staff dimensions.    
diff --git a/Documentation/topdocs/index.tely b/Documentation/topdocs/index.tely
index 86cd87f159..cd29b6442a 100644
--- a/Documentation/topdocs/index.tely
+++ b/Documentation/topdocs/index.tely
@@ -46,7 +46,7 @@ this:
 
 @quotation
 @mudela[fragment,verbatim]
-	\relative c'' { \key es; r8 [c16 b] [c8 g] [as c16 b] [c8 d] | g,4 }
+	\relative c'' { \key c \minor; r8 [c16 b] [c8 g] [as c16 b] [c8 d] | g,4 }
 @end mudela 
 @end quotation
 
@@ -65,21 +65,18 @@ almost no restrictions.  LilyPond is part of the
 @uref{http://www.gnu.org/,GNU Project}.
 
 The version numbers are in Linux-kernel style: even numbered versions
-are `stable'. The webpages for the stable version (1.2) reside at GNU,
-here: @uref{http://www.gnu.org/software/lilypond}. Big enhancements go
-into the latest odd numbered version (1.3), whose webpages are on 
- @uref{http://www.cs.uu.nl/~hanwen/lilypond/,Han-Wen's site}.
+are `stable'. The webpages for the stable version (1.2) reside
+@uref{http://www.gnu.org/software/lilypond, on the GNU servers}. Big
+enhancements go into the latest odd numbered version (1.3), whose
+webpages are on @uref{http://www.cs.uu.nl/~hanwen/lilypond/,Han-Wen's
+site}.  Information on the latest and greatest features can be found in
+the @uref{Documentation/out-www/CHANGES.txt, Change Log}.
 
 If want more information, you can browse the
 @uref{Documentation/user/out-www/lilypond.html, manual} or other
 @uref{Documentation/out-www/index.html, documentation}.
 
 
-@unnumberedsec News
-
-For the latest and greatest features, check out the
-@uref{Documentation/out-www/CHANGES.txt, Change Log}.
-
 
 @html
 <a name="music">
@@ -112,12 +109,14 @@ Lattermann also put some works
 If you want to compile LilyPond from source, download here:
 @itemize @bullet
 @item Download stable releases at
-@uref{ftp://ftp.gnu.org/gnu/lilypond/}
-@item Download development releases at
-@uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/development/}
-@item Canadian mirror   @uref{http://sca.uwaterloo.ca/lilypond/} and @uref{ftp://sca.uwaterloo.ca/pub/} 
-@item Another site in Europe
-@uref{ftp://ftp.lilypond.org/pub/LilyPond/}
+@uref{ftp://ftp.gnu.org/gnu/lilypond/,GNU}
+@item Download development releases from
+@uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/development/,the source}
+@item @uref{http://sca.uwaterloo.ca/lilypond/, by http (Canadian
+mirror)} and
+@uref{ftp://sca.uwaterloo.ca/pub/, ftp (Canadian  mirror)} 
+@item 
+@uref{ftp://ftp.lilypond.org/pub/LilyPond/,mirror (Europe)}
 @end itemize
 
 Installing and compiling requires many additional packages, which are
@@ -126,10 +125,12 @@ installation instructions}.
 
 Binaries are available, but are not updated for every version released.
 @itemize @bullet
-@item RedHat-i386 and Linuxppc RPMs:
-@uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/RedHat/RPMS/}
-@item Debian binary @uref{ftp://ftp.debian.org/pub/debian/dists/unstable/main/binary-i386/tex} 
-@item Windows NT: @uref{http://home.austin.rr.com/jbr/jeff/lilypond/}
+@item 
+@uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/RedHat/RPMS/,RedHat-i386 and Linuxppc RPMs:}
+@item
+@uref{ftp://ftp.debian.org/pub/debian/dists/unstable/main/binary-i386/tex,
+ Debian binary} 
+@item @uref{http://home.austin.rr.com/jbr/jeff/lilypond/,Windows NT}
 @end itemize
 
 
@@ -143,31 +144,27 @@ If you have questions, do write to the mailing lists!
 Frequently Asked Questions} first.)
 
 
-@table @samp
-@item info-gnu-music@@gnu.org
+@itemize @bullet
+@item @samp{info-gnu-music@@gnu.org} (@uref{http://www.mail-archive.com/info-gnu-music@@gnu.org,archive})
         is a moderated list for information on the GNU Music project, to
     subscribe: send mail with subject "subscribe" to
     info-gnu-music-request@@gnu.org.  
-
     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.
 
-   This list is archived at 
-    @uref{http://www.mail-archive.com/info-gnu-music@@gnu.org}
 
-@item help-gnu-music@@gnu.org
+@item @samp{help-gnu-music@@gnu.org} (@uref{http://www.mail-archive.com/help-gnu-music@@gnu.org,archive}).
     For help with LilyPond music project. To subscribe: send
     mail with subject "subscribe" to
-    @email{help-gnu-music-request@@gnu.org} The archive is at 
-  @uref{http://www.mail-archive.com/help-gnu-music@@gnu.org}.
+    @email{help-gnu-music-request@@gnu.org} 
 
-@item bug-gnu-music@@gnu.org
+@item @samp{bug-gnu-music@@gnu.org} (@uref{http://www.mail-archive.com/bug-gnu-music@@gnu.org,archive})
     If you have bugreports, you should send them to this list.  If you
 want to know about bugs, subscribe: send mail with subject "subscribe"
-to @email{bug-gnu-music-request@@gnu.org}. The archive is at
-@uref{http://www.mail-archive.com/bug-gnu-music@@gnu.org}
+to @email{bug-gnu-music-request@@gnu.org}. 
+
 
         Please include in your bugreport the version of LilyPond that
 you experience the problem with, a description of your system and sample
@@ -175,20 +172,20 @@ input to reproduce the problem. Do not send output files over the list,
 they tend to be very big and don't help with describing the problem.
 
 
-@item gnu-music-discuss@@gnu.org,
+@item @samp{gnu-music-discuss@@gnu.org} (@uref{http://www.mail-archive.com/gnu-music-discuss@@gnu.org,archive})
     For discussions concerning LilyPond, to subscribe: send
     mail with subject "subscribe" to
-    @email{gnu-music-discuss-request@@gnu.org}
-        The archive is at
-    @uref{http://www.mail-archive.com/gnu-music-discuss@@gnu.org}
-@end table
+    @email{gnu-music-discuss-request@@gnu.org}.
+
+
+@end itemize
 
 If you want to unsubscribe use the same procedure as subscribing, but
 substitute @code{unsubscribe} where you would put @code{subscribe}.
 
 @unnumberedsubsec Webmaster's Disclaimer
 
-These pages were entirely created from a @strong{development snapshots}
+These pages were entirely created from a @strong{development snapshot}
 of the LilyPond package.  The version of this webpage is printed at the
 bottom.
 
diff --git a/input/test/hara-kiri-short.ly b/input/test/hara-kiri-short.ly
new file mode 100644
index 0000000000..52b24f0503
--- /dev/null
+++ b/input/test/hara-kiri-short.ly
@@ -0,0 +1,33 @@
+
+\version "1.3.59";
+zager = \context Staff = zager \notes \relative c'' {
+	\clef treble;
+	c1
+}
+
+zoger = \context Staff = zoger \notes \relative c'' {
+	\clef treble;
+	\skip 1* 1;
+}
+
+zagers = \context GrandStaff <
+	\zager
+	\zoger
+>
+ 
+\score{
+	<
+		\context StaffGroup = zagers <
+			\zagers
+		>
+	>
+	\paper{
+		linewidth = 80.0\mm;
+
+		\translator { \HaraKiriStaffContext }
+%uh?
+
+	}
+}
+
+
diff --git a/input/trip.ly b/input/trip.ly
index 5cccdb146d..70ff8a0297 100644
--- a/input/trip.ly
+++ b/input/trip.ly
@@ -19,8 +19,9 @@ TODO:
 
 %}
 
+\version "1.3.59";
 praeludiumRight =  \notes {
-   \key e;
+   \key e \major;
   \clef violin;
 
   % 13 -- how to type -- where to split -- this more neatly?
@@ -46,7 +47,7 @@ praeludiumRight =  \notes {
 }
 
 praeludiumLeft = \notes \relative c {
-   \key e;
+   \key e \major;
   \clef bass;
 
   % 13
@@ -86,7 +87,7 @@ praeludiumLeft = \notes \relative c {
 
 
 fugaIIRight = \notes   \relative c''   {
-  \key e;              % E-major
+  \key e \major;              % E-major
   \clef violin;
   \time3/4;
 
@@ -137,7 +138,7 @@ fugaIIRight = \notes   \relative c''   {
 gracetest = \notes \grace { [c16 ( cis dis] }
 
 fugaIILeft = \notes {
-  \key e;
+  \key e \major;
   \clef bass;
 
   %15
@@ -155,7 +156,7 @@ fugaIILeft = \notes {
 }
 
 fugaIIPedal = \notes \relative c {
-  \key e;
+  \key e \major;
   \clef bass;
 
   %15
@@ -192,7 +193,7 @@ fugaIIPedal = \notes \relative c {
         \property Staff.instr = #"bs"	
 
         \time 4/4;
-	\key e; 
+	\key e \major; 
   \clef bass;
 
   %13
diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc
index c906fc6ac1..7e939e7c8e 100644
--- a/lily/auto-beam-engraver.cc
+++ b/lily/auto-beam-engraver.cc
@@ -119,11 +119,11 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom)
   /*
     second guess: property generic time exception
   */
-  SCM begin = get_property (time_str + "beamAutoBegin");
+  SCM begin = get_property ((time_str + "beamAutoBegin").ch_C());
   if (unsmob_moment (begin))
     begin_mom = * unsmob_moment (begin);
 
-  SCM end = get_property (time_str + "beamAutoEnd");
+  SCM end = get_property ((time_str + "beamAutoEnd").ch_C());
   if (unsmob_moment (end))
     end_mom = * unsmob_moment (end);
 
@@ -132,11 +132,11 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom)
   */
   if (type_str.length_i ())
     {
-      SCM end_mult = get_property ( time_str + "beamAutoEnd" + type_str);
+      SCM end_mult = get_property ((time_str + "beamAutoEnd" + type_str).ch_C());
       if (unsmob_moment (end_mult))
 	end_mom = * unsmob_moment (end_mult);
 
-      SCM begin_mult = get_property (time_str + "beamAutoBegin" + type_str);
+      SCM begin_mult = get_property ((time_str + "beamAutoBegin" + type_str).ch_C());
       if (unsmob_moment (begin_mult))
 	begin_mom = * unsmob_moment (begin_mult);
     }
@@ -159,11 +159,11 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom)
   */
   if (type_str.length_i ())
     {
-      SCM end_mult = get_property (String ("beamAutoEnd") + type_str);
+      SCM end_mult = get_property ((String ("beamAutoEnd") + type_str).ch_C());
       if (unsmob_moment (end_mult))
 	end_mom = * unsmob_moment (end_mult);
 
-      SCM begin_mult = get_property (String ("beamAutoBegin") + type_str);
+      SCM begin_mult = get_property ((String ("beamAutoBegin") + type_str).ch_C());
       if (unsmob_moment (begin_mult))
 	begin_mom = * unsmob_moment (begin_mult);
     }
diff --git a/lily/axis-group-engraver.cc b/lily/axis-group-engraver.cc
index 6ffe752dda..25b16bba20 100644
--- a/lily/axis-group-engraver.cc
+++ b/lily/axis-group-engraver.cc
@@ -42,7 +42,7 @@ void
 Axis_group_engraver::do_removal_processing ()
 {
   String type = daddy_grav_l ()->type_str_ ;
-  SCM dims = get_property (type  + "VerticalExtent");
+  SCM dims = get_property ((type  + "VerticalExtent").ch_C());
   
   if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
       && gh_number_p (gh_cdr (dims)))
@@ -51,12 +51,12 @@ Axis_group_engraver::do_removal_processing ()
       staffline_p_->set_elt_property ("extent-Y", dims);
     }
 
-  dims = get_property (type + "MinimumVerticalExtent");
+  dims = get_property ((type + "MinimumVerticalExtent").ch_C());
   if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
       && gh_number_p (gh_cdr (dims)))
     staffline_p_->set_elt_property ("minimum-extent-Y", dims);
 
-  dims = get_property (type + "ExtraVerticalExtent");
+  dims = get_property ((type + "ExtraVerticalExtent").ch_C());
   if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
       && gh_number_p (gh_cdr (dims)))
     staffline_p_->set_elt_property ("extra-extent-Y", dims);
diff --git a/lily/bar-engraver.cc b/lily/bar-engraver.cc
index 075cd56129..b7a240b604 100644
--- a/lily/bar-engraver.cc
+++ b/lily/bar-engraver.cc
@@ -28,7 +28,7 @@ Bar_engraver::create_bar ()
 {
   if (!bar_p_)
     {
-      bar_p_ = new Staff_bar (get_property ("basicBarlineProperties"));
+      bar_p_ = new Staff_bar (get_property ("basicBarProperties"));
 
       
       // urg: "" != empty...
diff --git a/lily/bar-number-engraver.cc b/lily/bar-number-engraver.cc
index f2961ee47f..13b50e0a6e 100644
--- a/lily/bar-number-engraver.cc
+++ b/lily/bar-number-engraver.cc
@@ -12,7 +12,7 @@
 #include "paper-def.hh"
 #include "side-position-interface.hh"
 #include "staff-symbol.hh"
-#include "text-item.hh"
+#include "item.hh"
 #include "moment.hh"
 #include "engraver.hh"
 #include "protected-scm.hh"
@@ -20,7 +20,7 @@
 class Bar_number_engraver : public Engraver
 {
 protected:
-  Text_item* text_p_;
+  Item* text_p_;
 
   Protected_scm staffs_;
 
@@ -107,7 +107,7 @@ Bar_number_engraver::create_items ()
     return;
 
   SCM b = get_property ("basicBarNumberProperties");
-  text_p_ = new Text_item (b);
+  text_p_ = new Item (b);
   Side_position_interface staffside(text_p_);
   staffside.set_axis (Y_AXIS);
 
diff --git a/lily/bar.cc b/lily/bar.cc
index 80c964c1a5..ea07643585 100644
--- a/lily/bar.cc
+++ b/lily/bar.cc
@@ -32,28 +32,39 @@ Bar::get_bar_size () const
 }
 
 
-Molecule 
-Bar::do_brew_molecule () const
+SCM 
+Bar::scheme_molecule (SCM smob) 
 {
-  SCM s = get_elt_property ("glyph");
+  Score_element * self = unsmob_element (smob);
+  Bar * fly = dynamic_cast<Bar*> (self);
+  SCM s = self->get_elt_property ("glyph");
   if (gh_string_p (s))
     {
       String str  =ly_scm2string (s);
-      return compound_barline (str, get_bar_size ());
+      return fly->compound_barline (str, fly->get_bar_size ()).create_scheme ();
     }
-  return Molecule ();
+  return SCM_EOL;
 }
 
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Bar);
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Bar);
 
 Molecule
 Bar::compound_barline (String str, Real h) const
 {
-  Real kern = paper_l()->get_var ("bar_kern");
-  Real thinkern = paper_l()->get_var ("bar_thinkern");
+  Real kern = gh_scm2double (get_elt_property ("kern"));
+  Real thinkern = gh_scm2double (get_elt_property ("thin-kern"));
+  Real hair = gh_scm2double (get_elt_property ("hair-thickness"));
+  Real fatline = gh_scm2double (get_elt_property ("thick-thickness"));
 
-  Molecule thin = simple_barline (paper_l()->get_var ("barthick_thin"), h);
-  Molecule thick = simple_barline (paper_l()->get_var ("barthick_thick"), h);
+  Real staffline = paper_l ()->get_var ("stafflinethickness");
+
+  kern *= staffline;
+  thinkern *= staffline;
+  hair *= staffline;
+  fatline *= staffline;
+  
+  Molecule thin = simple_barline (hair, h);
+  Molecule thick = simple_barline (fatline, h);
   Molecule colon = lookup_l ()->afm_find ("dots-repeatcolon");  
 
   Molecule m;
diff --git a/lily/breathing-sign.cc b/lily/breathing-sign.cc
index 8870334229..a78e610645 100644
--- a/lily/breathing-sign.cc
+++ b/lily/breathing-sign.cc
@@ -28,12 +28,13 @@ Breathing_sign::Breathing_sign (SCM  s)
 
 
 
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Breathing_sign);
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Breathing_sign);
 
-Molecule 
-Breathing_sign::do_brew_molecule () const
+SCM 
+Breathing_sign::scheme_molecule (SCM smob)
 {
-  Staff_symbol_referencer_interface si (this);
+  Score_element * sc = unsmob_element (smob);
+  Staff_symbol_referencer_interface si (sc);
   
   Real space = si.staff_space();
 
@@ -41,7 +42,7 @@ Breathing_sign::do_brew_molecule () const
   Interval i1(0, space / 6), i2(-space / 2, space / 2);
   Box b(i1, i2);
 
-  return lookup_l()->filledbox(b);
+  return sc->lookup_l()->filledbox(b).create_scheme ();
 }
 
 void
diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc
index b33e0f04de..cab0239b3c 100644
--- a/lily/chord-name-engraver.cc
+++ b/lily/chord-name-engraver.cc
@@ -14,7 +14,7 @@
 #include "paper-def.hh"
 #include "main.hh"
 #include "dimensions.hh"
-#include "text-item.hh"
+#include "item.hh"
 
 
 ADD_THIS_TRANSLATOR (Chord_name_engraver);
diff --git a/lily/chord-name.cc b/lily/chord-name.cc
index 7e784aaa07..b2ed244267 100644
--- a/lily/chord-name.cc
+++ b/lily/chord-name.cc
@@ -128,24 +128,25 @@ Chord_name::ly_text2molecule (SCM text) const
   return mol;
 }
 
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Chord_name);
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Chord_name);
 
-Molecule 
-Chord_name::do_brew_molecule () const
+SCM
+Chord_name::scheme_molecule (SCM smob) 
 {
-  SCM style = get_elt_property ("style");
+  Score_element *sc = unsmob_element (smob);
+  SCM style = sc->get_elt_property ("style");
   if (style == SCM_UNDEFINED)
     style = ly_str02scm ("banter");
 
-  SCM inversion = get_elt_property ("inversion");
+  SCM inversion = sc-> get_elt_property ("inversion");
   if (inversion == SCM_UNDEFINED)
     inversion = SCM_BOOL_F;
 
-  SCM bass = get_elt_property ("bass");
+  SCM bass =  sc->get_elt_property ("bass");
   if (bass == SCM_UNDEFINED)
     bass = SCM_BOOL_F;
 
-  SCM pitches = get_elt_property ("pitches");
+  SCM pitches =  sc->get_elt_property ("pitches");
 
   SCM text = scm_eval (gh_list (ly_symbol2scm ("chord::user-name"),
 				style,
@@ -153,7 +154,8 @@ Chord_name::do_brew_molecule () const
 				ly_quote_scm (gh_cons (inversion, bass)),
 				SCM_UNDEFINED));
 
-  return ly_text2molecule (text);
+  return dynamic_cast<Chord_name*> (sc)->
+    ly_text2molecule (text).create_scheme ();
 }
 
 Chord_name::Chord_name (SCM s)
diff --git a/lily/clef-engraver.cc b/lily/clef-engraver.cc
index 7aa6e32f0b..246d275d8b 100644
--- a/lily/clef-engraver.cc
+++ b/lily/clef-engraver.cc
@@ -23,12 +23,12 @@
 #include "engraver.hh"
 #include "direction.hh"
 #include "side-position-interface.hh"
-#include "text-item.hh"
+#include "item.hh"
 
 /// where is c-0 in the staff?
 class Clef_engraver : public  Engraver {
   Clef_item * clef_p_;
-  Text_item * octavate_p_;
+  Item * octavate_p_;
   Clef_change_req * clef_req_l_;
   
   void create_clef();
@@ -190,7 +190,7 @@ Clef_engraver::create_clef()
   si.set_position (clef_position_i_);
   if (octave_dir_)
     {
-      Text_item * g = new Text_item (get_property ("basicOctavateEightProperties"));
+      Item * g = new Item (get_property ("basicOctavateEightProperties"));
       Side_position_interface spi (g);
       spi.set_axis (Y_AXIS);
       spi.add_support (clef_p_);
diff --git a/lily/clef-item.cc b/lily/clef-item.cc
index 770694061d..64df471244 100644
--- a/lily/clef-item.cc
+++ b/lily/clef-item.cc
@@ -10,7 +10,7 @@
 #include "clef-item.hh"
 #include "string.hh"
 #include "molecule.hh"
-#include "text-item.hh"
+#include "item.hh"
 
 Clef_item::Clef_item (SCM s)
   : Item (s)
@@ -52,7 +52,8 @@ Clef_item::before_line_breaking ()
       return;
     }
 
-  // ugh. 
+  // ugh.
+  /* why not suicide? */
   if (style == "transparent")	// UGH. JUNKME
     {
       set_elt_property ("molecule-callback", SCM_BOOL_T);
diff --git a/lily/dots.cc b/lily/dots.cc
index 303f8c1509..c77175e0ad 100644
--- a/lily/dots.cc
+++ b/lily/dots.cc
@@ -16,7 +16,6 @@
 Dots::Dots (SCM s)
   : Item (s)
 {
-  set_elt_property ("dot-count", gh_int2scm (0));
 }
 
 void
@@ -35,17 +34,19 @@ Dots::after_line_breaking ()
     }
 }
 
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Dots);
-Molecule  
-Dots::do_brew_molecule () const
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Dots);
+
+SCM  
+Dots::scheme_molecule (SCM d)
 {
-  Molecule mol (lookup_l ()->blank (Box (Interval (0,0),
+  Score_element *sc = unsmob_element (d);
+  Molecule mol (sc->lookup_l ()->blank (Box (Interval (0,0),
 					 Interval (0,0))));
 
-  SCM c = get_elt_property ("dot-count");
+  SCM c = sc->get_elt_property ("dot-count");
   if (gh_number_p (c))
     {
-      Molecule d = lookup_l ()->afm_find (String ("dots-dot"));
+      Molecule d = sc->lookup_l ()->afm_find (String ("dots-dot"));
 
       Real dw = d.extent (X_AXIS).length ();
       d.translate_axis (-dw, X_AXIS);
@@ -57,7 +58,7 @@ Dots::do_brew_molecule () const
 	  mol.add_molecule (d);
 	}
     }
-  return mol;
+  return mol.create_scheme ();
 }
 
 
diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc
index 273aa10568..7c643490dd 100644
--- a/lily/dynamic-engraver.cc
+++ b/lily/dynamic-engraver.cc
@@ -15,7 +15,7 @@
 #include "paper-column.hh"
 #include "staff-symbol.hh"
 #include "note-column.hh"
-#include "text-item.hh"
+#include "item.hh"
 #include "side-position-interface.hh"
 #include "engraver.hh"
 #include "stem.hh"
@@ -77,7 +77,7 @@ Dynamic_line_spanner::add_element (Score_element* e)
  */
 class Dynamic_engraver : public Engraver
 {
-  Text_item * text_p_;
+  Item * text_p_;
   Crescendo * finished_cresc_p_;
   Crescendo * cresc_p_;
 
@@ -262,7 +262,7 @@ Dynamic_engraver::do_process_music ()
     {
       String loud = text_req_l_->text_str_;
 
-      text_p_ = new Text_item (get_property ("basicDynamicTextProperties"));
+      text_p_ = new Item (get_property ("basicDynamicTextProperties"));
       text_p_->set_elt_property ("text", ly_str02scm (loud.ch_C ()));
       if (Direction d=text_req_l_->get_direction ())
 	directional_element (text_p_).set (d);
@@ -309,7 +309,7 @@ Dynamic_engraver::do_process_music ()
 	     gh_int2scm ((span_req_l_drul_[START]->span_type_str_ == "crescendo")
 			 ? BIGGER : SMALLER));
 	      
-	  SCM s = get_property (span_req_l_drul_[START]->span_type_str_ + "Text");
+	  SCM s = get_property ((span_req_l_drul_[START]->span_type_str_ + "Text").ch_C());
 	  if (gh_string_p (s))
 	    {
 	      cresc_p_->set_elt_property ("start-text", s);
@@ -317,7 +317,7 @@ Dynamic_engraver::do_process_music ()
 					    + "Text", SCM_UNDEFINED);
 	    }
 
-	  s = get_property (span_req_l_drul_[START]->span_type_str_ + "Spanner");
+	  s = get_property ((span_req_l_drul_[START]->span_type_str_ + "Spanner").ch_C());
 
 
 	  /*
diff --git a/lily/extender-engraver.cc b/lily/extender-engraver.cc
index 8dab340163..faf311ed83 100644
--- a/lily/extender-engraver.cc
+++ b/lily/extender-engraver.cc
@@ -10,7 +10,7 @@
 #include "musical-request.hh"
 #include "extender-spanner.hh"
 #include "paper-column.hh"
-#include "text-item.hh"
+#include "item.hh"
 #include "engraver.hh"
 #include "drul-array.hh"
 #include "extender-spanner.hh"
@@ -22,16 +22,16 @@
   typesets a nice centred extender of varying length depending on the
   gap between syllables.
 
-  We remember the last Text_item that come across. When we get a
+  We remember the last Item that come across. When we get a
   request, we create the spanner, and attach the left point to the
   last lyrics, and the right point to any lyrics we receive by
   then.  */
 class Extender_engraver : public Engraver
 {
-  Text_item *  last_lyric_l_;
-  Text_item * current_lyric_l_;
+  Item *  last_lyric_l_;
+  Item * current_lyric_l_;
   Extender_req* req_l_;
-  Lyric_extender* extender_spanner_p_;
+  Spanner* extender_p_;
 public:
   Extender_engraver ();
   VIRTUAL_COPY_CONS (Translator);
@@ -54,21 +54,22 @@ Extender_engraver::Extender_engraver ()
 {
   current_lyric_l_ = 0;
   last_lyric_l_ = 0;
-  extender_spanner_p_ = 0;
+  extender_p_ = 0;
   req_l_ = 0;
 }
 
 void
 Extender_engraver::acknowledge_element (Score_element_info i)
 {
-  if (Text_item* t = dynamic_cast<Text_item*> (i.elem_l_))
+  // -> text_item
+  if (Item* t = dynamic_cast<Item*> (i.elem_l_))
     {
       current_lyric_l_ = t;
-      if (extender_spanner_p_
-	  && !extender_spanner_p_->get_bound (RIGHT)
+      if (extender_p_
+	  && !extender_p_->get_bound (RIGHT)
 	    )
 	  {
-	    extender_spanner_p_->set_textitem (RIGHT, t);
+	    Lyric_extender(extender_p_).set_textitem (RIGHT, t);
 	  }
     }
 }
@@ -91,10 +92,10 @@ Extender_engraver::do_try_music (Music* r)
 void
 Extender_engraver::do_removal_processing ()
 {
-  if (extender_spanner_p_)
+  if (extender_p_)
     {
       req_l_->warning (_ ("unterminated extender"));
-      extender_spanner_p_->set_bound(RIGHT, get_staff_info ().command_pcol_l ());
+      extender_p_->set_bound(RIGHT, get_staff_info ().command_pcol_l ());
     }
 }
 
@@ -109,9 +110,11 @@ Extender_engraver::do_process_music ()
 	  return;
 	}
       
-      extender_spanner_p_ = new Lyric_extender (get_property ("basicLyricExtenderProperties"));
-      extender_spanner_p_->set_textitem  (LEFT, last_lyric_l_);
-      announce_element (Score_element_info (extender_spanner_p_, req_l_));
+      extender_p_ = new Spanner (get_property ("basicLyricExtenderProperties"));
+      extender_p_->set_extent_callback (Score_element::point_dimension_callback, Y_AXIS);
+
+      Lyric_extender (extender_p_).set_textitem  (LEFT, last_lyric_l_);
+      announce_element (Score_element_info (extender_p_, req_l_));
     }
 }
 
@@ -119,10 +122,10 @@ Extender_engraver::do_process_music ()
 void
 Extender_engraver::do_pre_move_processing ()
 {
-  if (extender_spanner_p_)
+  if (extender_p_)
     {
-      typeset_element (extender_spanner_p_);
-      extender_spanner_p_ = 0;
+      typeset_element (extender_p_);
+      extender_p_ = 0;
     }
 
   if (current_lyric_l_)
diff --git a/lily/hara-kiri-engraver.cc b/lily/hara-kiri-engraver.cc
index 29211b6234..cab10f8cb3 100644
--- a/lily/hara-kiri-engraver.cc
+++ b/lily/hara-kiri-engraver.cc
@@ -20,6 +20,9 @@ void
 Hara_kiri_engraver::acknowledge_element (Score_element_info i)
 {
   Axis_group_engraver::acknowledge_element (i);
+
+  i.elem_l_->add_offset_callback (Hara_kiri_group_spanner::force_hara_kiri_callback, Y_AXIS);
+  
   if (Rhythmic_head *h = dynamic_cast<Rhythmic_head *> (i.elem_l_))
     {
       dynamic_cast<Hara_kiri_group_spanner*> (staffline_p_)
diff --git a/lily/hara-kiri-vertical-group-spanner.cc b/lily/hara-kiri-vertical-group-spanner.cc
index c01b068cba..21746accfd 100644
--- a/lily/hara-kiri-vertical-group-spanner.cc
+++ b/lily/hara-kiri-vertical-group-spanner.cc
@@ -13,6 +13,8 @@
 #include "debug.hh"
 #include "item.hh"
 
+/*
+ */
 Hara_kiri_group_spanner::Hara_kiri_group_spanner(SCM s)
   : Spanner (s)
 {
@@ -24,12 +26,16 @@ Hara_kiri_group_spanner::add_interesting_item (Item* n)
 {
   add_dependency (n);
   Pointer_group_interface (this, "items-worth-living").add_element (n);
+
 }
 
 void 
 Hara_kiri_group_spanner::after_line_breaking ()
 {
   SCM worth = get_elt_pointer ("items-worth-living");
+  /*
+    worth == self_scm  is a stupid way to signal that we're done.
+   */
   if (gh_pair_p (worth))
     return;
 
@@ -42,9 +48,31 @@ Hara_kiri_group_spanner::after_line_breaking ()
 	programming_error ("Killing other children too");
       s->suicide ();
     }
-  set_extent_callback (0, X_AXIS);
-  set_extent_callback (0, Y_AXIS);  
+
+  /*
+    very appropriate name here :-)
+   */
+  suicide ();
 }
 
 
 
+/*
+  We can't rely on offsets and dimensions of elements in a hara-kiri
+  group. Use a callback to make sure that hara-kiri has been done
+  before asking for offsets.  */
+Real
+Hara_kiri_group_spanner::force_hara_kiri_callback (Score_element const  *elt, Axis a)
+{
+  while (elt && !dynamic_cast<Hara_kiri_group_spanner const*> (elt))
+    elt = elt->parent_l(a);
+
+  if (elt)
+    {
+      Hara_kiri_group_spanner const  * seppuku = dynamic_cast<Hara_kiri_group_spanner const*> (elt);
+
+      ((Hara_kiri_group_spanner*)seppuku)->after_line_breaking ();
+    }
+
+  return 0.0;
+}
diff --git a/lily/hyphen-engraver.cc b/lily/hyphen-engraver.cc
index 6193fa81dc..9fbbb77f5b 100644
--- a/lily/hyphen-engraver.cc
+++ b/lily/hyphen-engraver.cc
@@ -6,10 +6,40 @@
 
 #include "proto.hh"
 #include "musical-request.hh"
-#include "hyphen-engraver.hh"
 #include "hyphen-spanner.hh"
 #include "paper-column.hh"
-#include "text-item.hh"
+#include "item.hh"
+#include "engraver.hh"
+
+/**
+  Generate an centred hyphen.  Should make a Hyphen_spanner that
+  typesets a nice centred hyphen of varying length depending on the
+  gap between syllables.
+
+  We remember the last Item that come across. When we get a
+  request, we create the spanner, and attach the left point to the
+  last lyrics, and the right point to any lyrics we receive by
+  then.  */
+class Hyphen_engraver : public Engraver
+{
+  Item *last_lyric_l_;
+  Item *current_lyric_l_;
+  Hyphen_req* req_l_;
+  Spanner* hyphen_p_;
+public:
+  Hyphen_engraver ();
+  VIRTUAL_COPY_CONS (Translator);
+
+protected:
+  virtual void acknowledge_element (Score_element_info);
+  virtual void do_removal_processing();
+  virtual void do_process_music();
+  virtual bool do_try_music (Music*);
+  virtual void do_pre_move_processing();
+  virtual void do_post_move_processing ();
+private:
+
+};
 
 ADD_THIS_TRANSLATOR (Hyphen_engraver);
 
@@ -17,21 +47,23 @@ Hyphen_engraver::Hyphen_engraver ()
 {
   current_lyric_l_ = 0;
   last_lyric_l_ = 0;
-  hyphen_spanner_p_ = 0;
+  hyphen_p_ = 0;
   req_l_ = 0;
 }
 
 void
 Hyphen_engraver::acknowledge_element (Score_element_info i)
 {
-  if (Text_item* t = dynamic_cast<Text_item*> (i.elem_l_))
+
+  // -> text-item
+  if (Item* t = dynamic_cast<Item*> (i.elem_l_))
     {
       current_lyric_l_ = t;
-      if (hyphen_spanner_p_
-	  && !hyphen_spanner_p_->get_bound (RIGHT)
+      if (hyphen_p_
+	  && !hyphen_p_->get_bound (RIGHT)
 	    )
 	  {
-	    hyphen_spanner_p_->set_textitem (RIGHT, t);
+	    Hyphen_spanner (hyphen_p_).set_textitem (RIGHT, t);
 	  }
     }
 }
@@ -54,10 +86,10 @@ Hyphen_engraver::do_try_music (Music* r)
 void
 Hyphen_engraver::do_removal_processing ()
 {
-  if (hyphen_spanner_p_)
+  if (hyphen_p_)
     {
       req_l_->warning (_ ("unterminated hyphen"));
-      hyphen_spanner_p_->set_bound(RIGHT, get_staff_info ().command_pcol_l ());
+      hyphen_p_->set_bound(RIGHT, get_staff_info ().command_pcol_l ());
     }
 }
 
@@ -72,9 +104,10 @@ Hyphen_engraver::do_process_music ()
 	  return;
 	}
       
-      hyphen_spanner_p_ = new Hyphen_spanner (get_property ("basicHyphenSpannerProperties"));
-      hyphen_spanner_p_->set_textitem  (LEFT, last_lyric_l_);
-      announce_element (Score_element_info (hyphen_spanner_p_, req_l_));
+      hyphen_p_ = new Spanner (get_property ("basicHyphenSpannerProperties"));
+      hyphen_p_->set_extent_callback (Score_element::point_dimension_callback,Y_AXIS);
+      Hyphen_spanner (hyphen_p_).set_textitem  (LEFT, last_lyric_l_);
+      announce_element (Score_element_info (hyphen_p_, req_l_));
     }
 }
 
@@ -82,10 +115,10 @@ Hyphen_engraver::do_process_music ()
 void
 Hyphen_engraver::do_pre_move_processing ()
 {
-  if (hyphen_spanner_p_)
+  if (hyphen_p_)
     {
-      typeset_element (hyphen_spanner_p_);
-      hyphen_spanner_p_ = 0;
+      typeset_element (hyphen_p_);
+      hyphen_p_ = 0;
     }
 
   if (current_lyric_l_)
diff --git a/lily/hyphen-spanner.cc b/lily/hyphen-spanner.cc
index a4ddc8c750..165c6c6b11 100644
--- a/lily/hyphen-spanner.cc
+++ b/lily/hyphen-spanner.cc
@@ -8,80 +8,54 @@
   (adapted from extender-spanner)
 */
 
-/*
-  TODO: too complicated implementation.  Why the dx_drul?.
- */
-
 #include <math.h>
+
 #include "box.hh"
-#include "debug.hh"
 #include "lookup.hh"
 #include "molecule.hh"
-#include "paper-column.hh"
 #include "paper-def.hh"
 #include "hyphen-spanner.hh"
-#include "dimension-cache.hh"
+#include "spanner.hh"
+#include "item.hh"
 
-Hyphen_spanner::Hyphen_spanner (SCM s)
-  : Spanner (s)
-{
-  dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Hyphen_spanner)
 
-  set_extent_callback (Score_element::point_dimension_callback,Y_AXIS);
-}
-
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Hyphen_spanner)
-Molecule 
-Hyphen_spanner::do_brew_molecule () const
+SCM 
+Hyphen_spanner::scheme_molecule (SCM smob)
 {
+  Spanner * sp  =dynamic_cast<Spanner*> (unsmob_element (smob));
   Molecule  mol;
 
-  Real w = spanner_length ();
+  Real leftext = sp->get_bound (LEFT)->extent (X_AXIS).length ();
 
-  w += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
+  Real ss = sp->paper_l ()->get_var ("staffspace");
+  Real lt = sp->paper_l ()->get_var ("stafflinethickness");
+  Real th = gh_scm2double (sp->get_elt_property ("thickness")) * lt ;
+  Real h = gh_scm2double (sp->get_elt_property ("height")) * ss;
+  Real l = gh_scm2double (sp->get_elt_property ("minimum-length")) * ss;  
+  Real w = sp->spanner_length () - leftext - ss/2; 
 
-  Real th = paper_l ()->get_var ("hyphen_thickness");
-  Real h = paper_l ()->get_var ("hyphen_height");
 
-  // UGH. First try: just make the hyphen take 1/3 of the available space  
-  // for length, use a geometric mean of the available space and some minimum
-  Real l = paper_l ()->get_var ("hyphen_minimum_length");
+  /* First try: just make the hyphen take 1/3 of the available space  
+   for length, use a geometric mean of the available space and some minimum
+  */
   if(l < w)
     l = sqrt(l*w);
-  Molecule a = lookup_l ()->filledbox ( Box (Interval ((w-l)/2,(w+l)/2), Interval (h,h+th)));
-  a.translate (Offset (dx_f_drul_[LEFT], 0));
-
-  mol.add_molecule (a);
 
-  return mol;
+  Box b  (Interval ( (w-l)/2, (w+l)/2), Interval (h,h+th));
+  mol.add_molecule (sp->lookup_l ()->filledbox (b));
+  mol.translate_axis(leftext, X_AXIS);
+  return mol.create_scheme ();
 }
-
-
-void
-Hyphen_spanner::after_line_breaking ()
-{
-  // UGH
-  Real gap = paper_l ()->get_var ("interline");
-
-  Direction d = LEFT;
-  do
-    {
-      Item* t = get_bound (d)
-	? get_bound (d) : get_bound ((Direction)-d);
-      if (d == LEFT)
-        dx_f_drul_[d] += t->extent (X_AXIS).length ();
-      else
-	dx_f_drul_[d] -= d * gap / 2;
-    }
-  while (flip(&d) != LEFT);
-}
-
   
 void
 Hyphen_spanner::set_textitem (Direction d, Item* textitem_l)
 {
-  set_bound (d, textitem_l);
-  add_dependency (textitem_l);
+  elt_l_->set_bound (d, textitem_l);
+  elt_l_->add_dependency (textitem_l);
 }
 
-
+Hyphen_spanner::Hyphen_spanner (Spanner*s)
+{
+  elt_l_ = s;
+}
diff --git a/lily/identifier.cc b/lily/identifier.cc
index 4c6284eb01..c35350b07d 100644
--- a/lily/identifier.cc
+++ b/lily/identifier.cc
@@ -10,9 +10,7 @@
   JUNKTHIS!
  */
 #include <assert.h>
-
-#include "midi-def.hh"
-#include "paper-def.hh"
+#include "music-output-def.hh"
 #include "score.hh"
 #include "identifier.hh"
 #include "my-lily-lexer.hh"
@@ -86,8 +84,7 @@ DEFAULT_PRINT(Translator_group);
 DEFAULT_PRINT(Music);
 DEFAULT_PRINT(Request);
 DEFAULT_PRINT(Score);
-DEFAULT_PRINT(Midi_def);
-DEFAULT_PRINT(Paper_def);
+DEFAULT_PRINT(Music_output_def);
 
 /* ugh. */
 #define DUMMY_STR(Class) \
@@ -101,8 +98,7 @@ DUMMY_STR(Translator_group);
 DUMMY_STR(Music);
 DUMMY_STR(Request);
 DUMMY_STR(Score);
-DUMMY_STR(Midi_def);
-DUMMY_STR(Paper_def);
+DUMMY_STR(Music_output_def);
 DUMMY_STR(Duration);
 
 #define STRING_PRINT(Class) \
@@ -114,8 +110,6 @@ Class ## _identifier::do_print () const\
 
 
 STRING_PRINT(Duration);
-STRING_PRINT(Real);
-STRING_PRINT(int);
   
 #define DEFAULT_STR(Class) \
 String \
@@ -124,9 +118,6 @@ Class ## _identifier::do_str () const\
   return to_str (*data_p_);\
 }
 
-DEFAULT_STR(int);
-DEFAULT_STR(Real);
-
   
 
 /*
@@ -163,22 +154,17 @@ Class ## _identifier::Class ## _identifier (Class ## _identifier const &s) \
 
 IMPLEMENT_ID_CLASS(Duration);
 IMPLEMENT_ID_CLASS(Translator_group);
-IMPLEMENT_ID_CLASS(int);
-IMPLEMENT_ID_CLASS(Real);
 IMPLEMENT_ID_CLASS(Music);
 IMPLEMENT_ID_CLASS(Score);
 IMPLEMENT_ID_CLASS(Request);
-IMPLEMENT_ID_CLASS(Midi_def);
-IMPLEMENT_ID_CLASS(Paper_def);
+IMPLEMENT_ID_CLASS(Music_output_def);
 VIRTUAL_ACCESSOR(Music);
 VIRTUAL_ACCESSOR(Request);
 VIRTUAL_ACCESSOR(Translator_group);
+VIRTUAL_ACCESSOR(Music_output_def);
 DEFAULT_ACCESSOR(Duration);
-DEFAULT_ACCESSOR(int);
-DEFAULT_ACCESSOR(Real);
 DEFAULT_ACCESSOR(Score);
-DEFAULT_ACCESSOR(Midi_def);
-DEFAULT_ACCESSOR(Paper_def);
+
 
 int
 Identifier::print_smob (SCM s, SCM p, scm_print_state*)
diff --git a/lily/include/bar.hh b/lily/include/bar.hh
index bfb2ce7379..8d408c04b9 100644
--- a/lily/include/bar.hh
+++ b/lily/include/bar.hh
@@ -23,7 +23,7 @@ public:
 
 protected:
   virtual void before_line_breaking ();
-  Molecule  do_brew_molecule () const;
+
   virtual Real get_bar_size () const;
 };
 #endif // BAR_HH
diff --git a/lily/include/extender-spanner.hh b/lily/include/extender-spanner.hh
index a86a3d0e03..0fe3b35b66 100644
--- a/lily/include/extender-spanner.hh
+++ b/lily/include/extender-spanner.hh
@@ -27,21 +27,13 @@
   extend beond, lasting the whole duration of the melissima
   (as in MUP, urg).
   */
-class Lyric_extender : public Spanner
+class Lyric_extender // interface
 {
 public:
-  Lyric_extender (SCM);
+  Spanner*elt_l_;
+  Lyric_extender (Spanner*);
   void set_textitem (Direction, Item*);
- static SCM scheme_molecule (SCM);
-  
-
-protected:
-  Molecule do_brew_molecule () const;
-  void after_line_breaking ();
- 
-  VIRTUAL_COPY_CONS (Score_element);
-
-  Drul_array<Real> dx_f_drul_;
+  static SCM scheme_molecule (SCM);
 };
 
 #endif // EXTENDER_SPANNER_HH
diff --git a/lily/include/hara-kiri-vertical-group-spanner.hh b/lily/include/hara-kiri-vertical-group-spanner.hh
index 1adc9480bf..abda869a39 100644
--- a/lily/include/hara-kiri-vertical-group-spanner.hh
+++ b/lily/include/hara-kiri-vertical-group-spanner.hh
@@ -27,6 +27,7 @@
 class Hara_kiri_group_spanner : public Spanner
 {
 public:
+  static Real force_hara_kiri_callback (Score_element const* , Axis);
   Hara_kiri_group_spanner (SCM);
   virtual void after_line_breaking ();
   void add_interesting_item (Item* n);
diff --git a/lily/include/hyphen-spanner.hh b/lily/include/hyphen-spanner.hh
index 920c4c35fa..f1ef2ea45d 100644
--- a/lily/include/hyphen-spanner.hh
+++ b/lily/include/hyphen-spanner.hh
@@ -18,23 +18,13 @@
   The length of the hyphen line should stretch based on the
   size of the gap between syllables.
   */
-class Hyphen_spanner : public Spanner
+struct Hyphen_spanner // interface
 {
 public:
-  Hyphen_spanner (SCM);
+  Spanner* elt_l_;
+  Hyphen_spanner  (Spanner*);
   void set_textitem (Direction, Item*);
- static SCM scheme_molecule (SCM);
-  
-
-protected:
-  Molecule do_brew_molecule () const;
-  Interval do_height () const;
-
-  void after_line_breaking ();
- 
-  VIRTUAL_COPY_CONS (Score_element);
-
-  Drul_array<Real> dx_f_drul_;
+  static SCM scheme_molecule (SCM);
 };
 
 #endif // HYPHEN_SPANNER_HH
diff --git a/lily/include/identifier.hh b/lily/include/identifier.hh
index 94bceeebb8..e0e4c25769 100644
--- a/lily/include/identifier.hh
+++ b/lily/include/identifier.hh
@@ -20,10 +20,7 @@
 class Translator_group_identifier;
 class Music_identifier;
 class Articulation_req_identifier;
-class Midi_def_identifier;
-class Paper_def_identifier;
-class Real_identifier;
-class int_identifier;
+class Output_def_identifier;
 class Request_identifier;
 class Score_identifier;
 class Duration_identifier;
@@ -56,12 +53,9 @@ struct Identifier : public Input {
   String str () const;
   IDACCESSOR(Translator_group)
   IDACCESSOR(Music)
-  IDACCESSOR(Midi_def)
-  IDACCESSOR(Paper_def)
-  IDACCESSOR(Real)
+  IDACCESSOR(Music_output_def)
   IDACCESSOR(Request)
   IDACCESSOR(Score)
-  IDACCESSOR(int)
   IDACCESSOR(Duration)
   VIRTUAL_COPY_CONS(Identifier);
 
@@ -86,14 +80,11 @@ struct Class ## _identifier : Identifier {\
 
 DECLARE_ID_CLASS(Translator_group);
 DECLARE_ID_CLASS(Duration);
-DECLARE_ID_CLASS(Real);
 DECLARE_ID_CLASS(General_script_def);
 DECLARE_ID_CLASS(Music);
-DECLARE_ID_CLASS(int);
 DECLARE_ID_CLASS(Score);
 DECLARE_ID_CLASS(Request);
-DECLARE_ID_CLASS(Paper_def);
-DECLARE_ID_CLASS(Midi_def);
+DECLARE_ID_CLASS(Music_output_def);
 
 Identifier * unsmob_identifier (SCM);
 SCM smobify (Identifier*);
diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh
index 8f0e8c956f..e2c3393a5b 100644
--- a/lily/include/lily-proto.hh
+++ b/lily/include/lily-proto.hh
@@ -243,8 +243,7 @@ struct Tex_font_metric_reader;
 struct Text_def;
 struct Text_engraver;
 struct Text_gob;
-struct Text_item ;
-struct Text_item;
+struct Item ;
 struct Text_req;
 struct Text_spanner;
 struct Tie;
diff --git a/lily/include/lyric-engraver.hh b/lily/include/lyric-engraver.hh
index 1ef2eb7490..d39ec7e558 100644
--- a/lily/include/lyric-engraver.hh
+++ b/lily/include/lyric-engraver.hh
@@ -31,7 +31,7 @@ public:
 
 private:
   Lyric_req * req_l_;
-  Text_item* text_p_;
+  Item* text_p_;
 };
 
 
diff --git a/lily/include/midi-def.hh b/lily/include/midi-def.hh
index 67cdcef249..6d65f6baea 100644
--- a/lily/include/midi-def.hh
+++ b/lily/include/midi-def.hh
@@ -21,7 +21,7 @@
  */
 class Midi_def : public Music_output_def {
   static int default_count_i_;
-  int count_per_minute_i;  
+
 public:
   VIRTUAL_COPY_CONS(Music_output_def);
 
diff --git a/lily/include/paper-def.hh b/lily/include/paper-def.hh
index 4970d49905..a91f537879 100644
--- a/lily/include/paper-def.hh
+++ b/lily/include/paper-def.hh
@@ -10,7 +10,6 @@
 #ifndef PAPER_DEF_HH
 #define PAPER_DEF_HH
 
-#include <map>
 
 #include "lily-proto.hh"
 #include "lily-guile.hh"
@@ -56,19 +55,19 @@ protected:
 public:    
   virtual ~Paper_def ();
 
-  Array<Interval> shape_int_a_;
   /*
     JUNKME
    */
   Real get_realvar (SCM symbol) const;
   Real get_var (String id) const;
 
-  
+  SCM get_scmvar (String id)const; 
   void reinit ();
   Paper_def ();
   void set_lookup (int, Lookup*);
 
   Paper_def (Paper_def const&);
+
   /** The distance between beams of multiplicity_i
       JUNKME
   */
diff --git a/lily/include/slur.hh b/lily/include/slur.hh
index 9a71f42d3f..cefb249d73 100644
--- a/lily/include/slur.hh
+++ b/lily/include/slur.hh
@@ -28,6 +28,10 @@ protected:
   Molecule do_brew_molecule () const;
   virtual Array<Offset> get_encompass_offset_arr () const;
   Bezier get_curve () const;
+
+  /*
+    JUNKME
+   */
   Drul_array<Real> dy_f_drul_;
   Drul_array<Real> dx_f_drul_;
 
diff --git a/lily/include/spanner.hh b/lily/include/spanner.hh
index 34339a18f9..2eb457e514 100644
--- a/lily/include/spanner.hh
+++ b/lily/include/spanner.hh
@@ -44,6 +44,7 @@ public:
   Spanner (Spanner const &);
   bool broken_b () const;
   void do_break ();
+  Real spanner_length () const;
 
   static int compare (Spanner * const &,Spanner * const &);
   virtual Array<Rod> get_rods () const;
@@ -57,7 +58,6 @@ protected:
 
   virtual void do_space_processing ();
   virtual void do_break_processing ();
-  Real spanner_length () const;
   virtual Line_of_score*line_l () const;
 };
 #endif
diff --git a/lily/include/system-start-delimiter.hh b/lily/include/system-start-delimiter.hh
index b3f545daf7..61d23efdb1 100644
--- a/lily/include/system-start-delimiter.hh
+++ b/lily/include/system-start-delimiter.hh
@@ -19,12 +19,12 @@ class System_start_delimiter : public Spanner
 {
 public:
   System_start_delimiter (SCM);
-   static SCM scheme_molecule (SCM);
+  static SCM scheme_molecule (SCM);
   
-VIRTUAL_COPY_CONS (Score_element);
+  VIRTUAL_COPY_CONS (Score_element);
 protected:
   virtual void after_line_breaking();
-  virtual  Molecule do_brew_molecule () const;
+  
   Molecule staff_bracket (Real) const;
   Molecule staff_brace (Real) const;
   Molecule simple_bar (Real) const;
diff --git a/lily/include/text-item.hh b/lily/include/text-item.hh
index d69a23f0af..8b13789179 100644
--- a/lily/include/text-item.hh
+++ b/lily/include/text-item.hh
@@ -1,30 +1 @@
-/*   
-  text-item.hh -- declare Text_item
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1998--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#ifndef Text_ITEM_HH
-#define Text_ITEM_HH
-
-#include "item.hh"
-
-/**
-   Print a text in specified style.
- */
-class Text_item : public Item
-{
-public:
-  VIRTUAL_COPY_CONS (Score_element);
-   static SCM scheme_molecule (SCM);
-  
-Text_item (SCM s);
-protected:
-  Molecule do_brew_molecule () const;
-};
-
-#endif /* Text_ITEM_HH */
 
diff --git a/lily/include/tie.hh b/lily/include/tie.hh
index c6fc1c8904..e45a456b99 100644
--- a/lily/include/tie.hh
+++ b/lily/include/tie.hh
@@ -35,6 +35,9 @@ protected:
   virtual Array<Offset> get_encompass_offset_arr () const;
   Bezier get_curve () const;
 
+  /*
+    JUNKME
+   */
   Drul_array<Real> dy_f_drul_;
   Drul_array<Real> dx_f_drul_;
 
diff --git a/lily/include/translator-group.hh b/lily/include/translator-group.hh
index 2bfaad8823..47c2ef1135 100644
--- a/lily/include/translator-group.hh
+++ b/lily/include/translator-group.hh
@@ -29,7 +29,7 @@ typedef void (Translator::*Const_method_pointer)(void) const;
 class Translator_group : public virtual Translator {
   Array<String> consists_str_arr_;
   Array<String> accepts_str_arr_;
-    Array<String> consists_end_str_arr_;
+  Array<String> consists_end_str_arr_;
   Scheme_hash_table properties_dict_;
 
   int iterator_count_;
diff --git a/lily/include/translator.hh b/lily/include/translator.hh
index c84c109ec4..6352c005dc 100644
--- a/lily/include/translator.hh
+++ b/lily/include/translator.hh
@@ -62,7 +62,7 @@ public:
     */
   Music_output_def *output_def_l () const;
 
-  SCM get_property (String) const;
+  SCM get_property (const char *) const;
   SCM get_property (SCM symbol) const;
   
   virtual Moment now_mom () const;  
diff --git a/lily/instrument-name-engraver.cc b/lily/instrument-name-engraver.cc
index 1a9bd7da1f..010db52474 100644
--- a/lily/instrument-name-engraver.cc
+++ b/lily/instrument-name-engraver.cc
@@ -9,14 +9,14 @@
  */
 
 #include "engraver.hh"
-#include "text-item.hh"
+#include "item.hh"
 #include "bar.hh"
 #include "system-start-delimiter.hh"
 #include "side-position-interface.hh"
 
 class Instrument_name_engraver : public Engraver
 {
-  Text_item *text_;
+  Item *text_;
   System_start_delimiter * delim_ ;
 
   void create_text (SCM s);
@@ -55,7 +55,7 @@ Instrument_name_engraver::create_text (SCM txt)
 {
   if(!text_)
     {
-      text_ = new Text_item (get_property ("basicInstrumentNameProperties"));
+      text_ = new Item (get_property ("basicInstrumentNameProperties"));
       text_->set_elt_property ("text", txt);
 
       /*
diff --git a/lily/lexer.ll b/lily/lexer.ll
index 57d9537bf1..44209d00e3 100644
--- a/lily/lexer.ll
+++ b/lily/lexer.ll
@@ -233,7 +233,8 @@ HYPHEN		--
 	int n = 0;
 	if (main_input_b_ && safe_global_b) {
 		error (_ ("Can't evaluate Scheme in safe mode"));
-		return SCM_EOL;
+		yylval.scm =  SCM_EOL;
+		return SCM_T;
 	}
 	yylval.scm = ly_parse_scm (s, &n);
 	DEBUG_OUT << "Scheme: ";
@@ -473,8 +474,12 @@ My_lily_lexer::scan_escaped_word (String str)
 	if (gh_string_p (sid)) {
 		yylval.scm = sid; 
 		return STRING_IDENTIFIER;
+	} else if (gh_number_p (sid)) {
+		yylval.scm = sid;
+		return NUMBER_IDENTIFIER;
 	}
 
+
 	Identifier * id = unsmob_identifier (sid);
 	if (id) {
 		yylval.id = id;
diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc
index 6336f7dd11..5c9c793c9e 100644
--- a/lily/lily-guile.cc
+++ b/lily/lily-guile.cc
@@ -353,7 +353,7 @@ ly_number2string (SCM s)
 
   char str[100];			// ugh.
 
-  if (scm_integer_p (s))
+  if (scm_integer_p (s) == SCM_BOOL_F)
     {
       Real r (gh_scm2double (s));
 
diff --git a/lily/line-number-engraver.cc b/lily/line-number-engraver.cc
index 7a9e48a6f1..2c235080e3 100644
--- a/lily/line-number-engraver.cc
+++ b/lily/line-number-engraver.cc
@@ -8,7 +8,7 @@
  */
 
 #include "engraver.hh"
-#include "text-item.hh"
+#include "item.hh"
 #include "side-position-interface.hh"
 #include "note-head.hh"
 #include "stem.hh"
@@ -36,7 +36,7 @@ Line_number_engraver::process_acknowledged ()
 {
   if (!text_item_p_ && interesting_.size ())
     {
-      text_item_p_ = new Text_item (get_property ("basicTextProperties") );
+      text_item_p_ = new Item (get_property ("basicTextProperties") );
       Side_position_interface si (text_item_p_);
       si.set_axis (Y_AXIS);
       text_item_p_->set_parent (interesting_[0].elem_l_, Y_AXIS);
diff --git a/lily/lyric-engraver.cc b/lily/lyric-engraver.cc
index fce6048163..64a306b3ed 100644
--- a/lily/lyric-engraver.cc
+++ b/lily/lyric-engraver.cc
@@ -9,7 +9,7 @@
 
 #include "lyric-engraver.hh"
 #include "musical-request.hh"
-#include "text-item.hh"
+#include "item.hh"
 #include "paper-def.hh"
 #include "lookup.hh"
 
@@ -40,7 +40,7 @@ Lyric_engraver::do_process_music()
 {
   if (req_l_)
     {
-      text_p_=  new Text_item (get_property ("basicLyricTextProperties"));
+      text_p_=  new Item (get_property ("basicLyricTextProperties"));
       
       text_p_->set_elt_property ("text",
 				 ly_str02scm   ((req_l_->text_str_ + " ").ch_C ()));
diff --git a/lily/lyric-extender.cc b/lily/lyric-extender.cc
index 879fa63772..e20d7d1ea9 100644
--- a/lily/lyric-extender.cc
+++ b/lily/lyric-extender.cc
@@ -3,13 +3,9 @@
   source file of the GNU LilyPond music typesetter
 
   (c)  1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
+  Han-Wen Nienhuys
 */
 
-/*
-  TODO: too complicated implementation.  Why the dx_drul?.
- */
-
-#
 #include "dimension-cache.hh"
 #include "box.hh"
 #include "debug.hh"
@@ -19,62 +15,32 @@
 #include "paper-def.hh"
 #include "extender-spanner.hh"
 
-Lyric_extender::Lyric_extender (SCM s)
-  : Spanner (s)
-
-{
-  dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
-  set_extent_callback (Score_element::point_dimension_callback, Y_AXIS);
-}
-
-
-
 
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Lyric_extender)
-Molecule 
-Lyric_extender::do_brew_molecule () const
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Lyric_extender)
+SCM 
+Lyric_extender::scheme_molecule (SCM smob) 
 {
-  Molecule  mol;
-
-  Real w = spanner_length ();
+  Spanner *sp = dynamic_cast<Spanner*> (unsmob_element (smob));
   
-  w += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
-  Real h = paper_l ()->get_var ("extender_height");
-  Molecule a = lookup_l ()->filledbox ( Box (Interval (0,w), Interval (0,h)));
-  a.translate (Offset (dx_f_drul_[LEFT], 0));
-
-  mol.add_molecule (a);
-
-  return mol;
+  Real leftext = sp->get_bound (LEFT)->extent (X_AXIS).length ();
+  Real ss = sp->paper_l ()->get_var ("staffspace");
+  Real w = sp->spanner_length () - leftext - ss/2;
+  
+  Real h = sp->paper_l ()->get_var ("extender_height");
+  Molecule  mol (sp->lookup_l ()->filledbox ( Box (Interval (0,w), Interval (0,h))));
+  mol.translate (Offset (leftext, 0));
+  return mol.create_scheme();
 }
 
-
-
 void
-Lyric_extender::after_line_breaking ()
+Lyric_extender::set_textitem (Direction d, Item* textitem_l)
 {
-  // UGH
-  Real gap = paper_l ()->get_var ("interline");
-
-  Direction d = LEFT;
-  do
-    {
-      Item* t = get_bound (d)
-	? get_bound (d) : get_bound ((Direction)-d);
-      if (d == LEFT)
-        dx_f_drul_[d] += t->extent (X_AXIS).length ();
-      else
-	dx_f_drul_[d] -= d * gap / 2;
-    }
-  while (flip(&d) != LEFT);
+  elt_l_->set_bound (d, textitem_l);
+  elt_l_->add_dependency (textitem_l);
 }
 
-  
-void
-Lyric_extender::set_textitem (Direction d, Item* textitem_l)
+Lyric_extender::Lyric_extender (Spanner*s)
 {
-  set_bound (d, textitem_l);
-  add_dependency (textitem_l);
+  elt_l_ = s;
 }
 
-
diff --git a/lily/mark-engraver.cc b/lily/mark-engraver.cc
index 88c1550606..92945681de 100644
--- a/lily/mark-engraver.cc
+++ b/lily/mark-engraver.cc
@@ -20,7 +20,7 @@
 #include "side-position-interface.hh"
 #include "staff-symbol-referencer.hh"
 #include "staff-symbol.hh"
-#include "text-item.hh"
+#include "item.hh"
 #include "group-interface.hh"
 
 /**
@@ -33,7 +33,7 @@ public:
   VIRTUAL_COPY_CONS(Translator);
   Mark_engraver ();
 protected:
-  Text_item* text_p_;
+  Item* text_p_;
   Protected_scm staffs_;
   
 protected:
@@ -77,7 +77,7 @@ Mark_engraver::acknowledge_element (Score_element_info inf)
     {
       /*
 	Ugh. Figure out how to do this right at beginning of line, (without
-	creating class Bar_script : public Text_item).
+	creating class Bar_script : public Item).
       */
       text_p_->set_parent (s, X_AXIS);
     }
@@ -102,7 +102,7 @@ Mark_engraver::create_items (Request *rq)
     return;
 
   SCM s = get_property ("basicMarkProperties");
-  text_p_ = new Text_item (s);
+  text_p_ = new Item (s);
 
   Group_interface (text_p_, "interfaces").add_thing (ly_symbol2scm ("Mark"));
   Side_position_interface staffside(text_p_);
diff --git a/lily/midi-def.cc b/lily/midi-def.cc
index 753976a9b6..1915e82071 100644
--- a/lily/midi-def.cc
+++ b/lily/midi-def.cc
@@ -14,12 +14,6 @@
 #include "score-performer.hh"
 #include "debug.hh"
 
-// classes, alphasorted
-//     statics
-//     constructors
-//     destructor
-//     routines, alphasorted
-
 Midi_def::Midi_def()
 {
   // ugh
diff --git a/lily/note-heads-engraver.cc b/lily/note-heads-engraver.cc
index 431c637b84..067a3d3933 100644
--- a/lily/note-heads-engraver.cc
+++ b/lily/note-heads-engraver.cc
@@ -79,7 +79,11 @@ Note_heads_engraver::do_process_music()
 	  sd.set_interface ();
 	  
 	  note_p->add_dots (d);
-	  d->set_elt_property ("dot-count", gh_int2scm (note_req_l->duration_.dots_i_));
+	  
+	  if (note_req_l->duration_.dots_i_
+	      != gh_scm2int (d->get_elt_property ("dot-count")))
+	    d->set_elt_property ("dot-count", gh_int2scm (note_req_l->duration_.dots_i_));
+	  
 	  announce_element (Score_element_info (d,0));
 	  dot_p_arr_.push (d);
 	}
diff --git a/lily/note-name-engraver.cc b/lily/note-name-engraver.cc
index 1f03a0ea1a..d6e10628de 100644
--- a/lily/note-name-engraver.cc
+++ b/lily/note-name-engraver.cc
@@ -9,14 +9,14 @@
 
 #include "engraver.hh"
 #include "musical-request.hh"
-#include "text-item.hh"
+#include "item.hh"
 
 class Note_name_engraver : public Engraver
 {
 public:
   VIRTUAL_COPY_CONS(Translator);
   Link_array<Note_req> req_l_arr_;
-  Link_array<Text_item> texts_;
+  Link_array<Item> texts_;
   virtual bool  do_try_music (Music*m);
   virtual void do_process_music ();
   virtual void do_pre_move_processing ();
@@ -46,7 +46,7 @@ Note_name_engraver::do_process_music ()
     }
   if (s.length_i())
     {
-      Text_item * t = new Text_item (SCM_EOL);
+      Item * t = new Item (SCM_EOL);
       t->set_elt_property ("text", ly_str02scm ( s.ch_C()));
       announce_element (Score_element_info (t, req_l_arr_[0]));
       texts_.push (t);
diff --git a/lily/paper-def.cc b/lily/paper-def.cc
index c32c88f415..cc8bd881d6 100644
--- a/lily/paper-def.cc
+++ b/lily/paper-def.cc
@@ -44,7 +44,6 @@ Paper_def::~Paper_def ()
 Paper_def::Paper_def (Paper_def const&s)
   : Music_output_def (s)
 {
-  shape_int_a_ = s.shape_int_a_;
   lookup_p_tab_p_ = new map<int, Lookup*>;
   
   for (map<int,Lookup*>::const_iterator ai = s.lookup_p_tab_p_->begin();
@@ -62,19 +61,30 @@ Paper_def::get_var (String s) const
   return get_realvar (ly_symbol2scm (s.ch_C()));
 }
 
+SCM
+Paper_def::get_scmvar (String s) const
+{
+  return  scope_p_->scm_elem (ly_symbol2scm (s.ch_C()));
+}
+
 Real
 Paper_def::get_realvar (SCM s) const
 {
   if (!scope_p_->elem_b (s))
-    error (_f ("unknown paper variable: `%s'", ly_symbol2string (s)));
-  Real * p = scope_p_->elem (s)->access_content_Real (false);
-  if (!p)
     {
-      error (_("not a real variable"));
+      programming_error ("unknown paper variable: " +  ly_symbol2string (s));
+      return 0.0;
+    }
+  SCM val = scope_p_->scm_elem (s);
+  if (gh_number_p (val))
+    {
+      return gh_scm2double (val);
+    }
+  else
+    {
+      non_fatal_error (_("not a real variable"));
       return 0.0;
     }
-
-  return *p;
 }
 
 /*
diff --git a/lily/paper-outputter.cc b/lily/paper-outputter.cc
index 97b542168b..8329051981 100644
--- a/lily/paper-outputter.cc
+++ b/lily/paper-outputter.cc
@@ -160,20 +160,13 @@ Paper_outputter::output_scope (Scope *scope, String prefix)
 	{
 	  output_String_def (prefix + s, ly_scm2string (v));
 	}
-      
-      Identifier * id = unsmob_identifier (v);
-      
-      if(dynamic_cast<Real_identifier*> (id))
+      else if (scm_integer_p (v) == SCM_BOOL_T)
 	{
-	  Real val  = *id->access_content_Real (false);
-
-	  output_Real_def (prefix + s, val);	  
+	  output_int_def (prefix + s, gh_scm2int (v));	  
 	}
-      else if (dynamic_cast<int_identifier*> (id))
+      else if (gh_number_p (v))
 	{
-	  int val  = *id->access_content_int (false);	  
-	  
-	  output_int_def (prefix + s, val);	  
+	  output_Real_def (prefix + s, gh_scm2double (v));	  
 	}
     }
 }
diff --git a/lily/parser.yy b/lily/parser.yy
index e7d2361273..fb8a04b914 100644
--- a/lily/parser.yy
+++ b/lily/parser.yy
@@ -50,7 +50,7 @@ is_duration_b (int t)
 
 
 // mmm JUNKME ?
-Mudela_version oldest_version ("1.3.42");
+Mudela_version oldest_version ("1.3.59");
 
 void
 print_mudela_versions (ostream &os)
@@ -82,7 +82,6 @@ print_mudela_versions (ostream &os)
 %union {
     Array<Musical_pitch> *pitch_arr;
     Link_array<Request> *reqvec;
-    Array<int> *intvec;
     Duration *duration;
     Identifier *id;
     String * string;
@@ -96,13 +95,13 @@ print_mudela_versions (ostream &os)
     Musical_pitch * pitch;
     Midi_def* midi;
     Moment *moment;
-    Paper_def *paper;
     Real real;
     Request * request;
 
     /* We use SCMs to do strings, because it saves us the trouble of
 deleting them.  Let's hope that a stack overflow doesnt trigger a move
 of the parse stack onto the heap. */
+
     SCM scm;
 
     Tempo_req *tempo;
@@ -197,20 +196,18 @@ yylex (YYSTYPE *s,  void * v_l)
 %token <id>	IDENTIFIER
 %token <id>	MUSIC_IDENTIFIER
 %token <id>	REQUEST_IDENTIFIER
-%token <id>	REAL_IDENTIFIER
 %token <id>	TRANS_IDENTIFIER
-%token <id>	INT_IDENTIFIER
+%token <scm>	NUMBER_IDENTIFIER
+
 %token <id>	SCORE_IDENTIFIER
-%token <id>	MIDI_IDENTIFIER
-%token <id>	PAPER_IDENTIFIER
-%token <real>	REAL
+%token <id>	MUSIC_OUTPUT_DEF_IDENTIFIER
 
-%token <scm>	STRING_IDENTIFIER SCM_IDENTIFIER
+%token <scm>	STRING_IDENTIFIER SCM_IDENTIFIER 
 %token <scm>	DURATION RESTNAME
-%token <scm>	STRING
+%token <scm>	STRING 
 %token <scm>	SCM_T
 %token <i>	UNSIGNED
-
+%token <real>   REAL
 
 %type <outputdef> output_def
 %type <scope> 	mudela_header mudela_header_body
@@ -220,14 +217,14 @@ yylex (YYSTYPE *s,  void * v_l)
 %type <music>	simple_element  request_chord command_element Simple_music  Composite_music 
 %type <music>	Alternative_music Repeated_music
 %type <i>	tremolo_type
-%type <i>	int unsigned
+%type <i>	bare_int  bare_unsigned
 %type <i>	script_dir
 
-%type <scm>	identifier_init
+%type <scm>	identifier_init 
 
 %type <duration> steno_duration optional_notemode_duration
 %type <duration> entered_notemode_duration explicit_duration
-%type <intvec>	 int_list
+	
 %type <reqvec>  pre_requests post_requests
 %type <request> gen_text_def
 %type <pitch>   steno_musical_pitch musical_pitch absolute_musical_pitch
@@ -236,7 +233,6 @@ yylex (YYSTYPE *s,  void * v_l)
 %type <pitch_arr>	chord_additions chord_subtractions chord_notes chord_step
 %type <music>	chord
 %type <pitch>	chord_note chord_inversion chord_bass
-%type <midi>	midi_block midi_body
 %type <duration>	duration_length
 
 %type <scm>  embedded_scm scalar
@@ -244,14 +240,13 @@ yylex (YYSTYPE *s,  void * v_l)
 %type <music>	relative_music re_rhythmed_music
 %type <music>	property_def translator_change
 %type <music_list> Music_list
-%type <paper>	paper_block paper_def_body
-%type <real>	real real_with_dimension
+%type <outputdef>  music_output_def_body
 %type <request> shorthand_command_req
 %type <request>	post_request 
 %type <request> command_req verbose_command_req
 %type <request>	extender_req
 %type <request> hyphen_req
-%type <scm>	string
+%type <scm>	string bare_number number_expression
 %type <score>	score_block score_body
 
 %type <trans>	translator_spec_block translator_spec_body
@@ -290,15 +285,13 @@ toplevel_expression:
 	| score_block {
 		score_global_array.push ($1);
 	}
-	| paper_block {
+	| output_def {
 		Identifier * id = new
-			Paper_def_identifier ($1, PAPER_IDENTIFIER);
-		THIS->lexer_p_->set_identifier ("$defaultpaper", smobify (id))
-	}
-	| midi_block {
-		Identifier * id = new
-			Midi_def_identifier ($1, MIDI_IDENTIFIER);
-		THIS->lexer_p_->set_identifier ("$defaultmidi", smobify (id))
+			Music_output_def_identifier ($1, MUSIC_OUTPUT_DEF_IDENTIFIER);
+		if (dynamic_cast<Paper_def*> ($1))
+			THIS->lexer_p_->set_identifier ("$defaultpaper", smobify (id));
+		else if (dynamic_cast<Midi_def*> ($1))
+			THIS->lexer_p_->set_identifier ("$defaultmidi", smobify (id));
 	}
 	| embedded_scm {
 		// junk value
@@ -377,14 +370,9 @@ assignment:
 identifier_init:
 	score_block {
 		$$ = smobify (new Score_identifier ($1, SCORE_IDENTIFIER));
-		
 	}
-	| paper_block {
-		$$ = smobify (new Paper_def_identifier ($1, PAPER_IDENTIFIER));
-	}
-	| midi_block {
-		$$ = smobify (new Midi_def_identifier ($1, MIDI_IDENTIFIER));
-
+	| output_def {
+		$$ = smobify (new Music_output_def_identifier ($1, MUSIC_OUTPUT_DEF_IDENTIFIER));
 	}
 	| translator_spec_block {
 		$$ = smobify (new Translator_group_identifier ($1, TRANS_IDENTIFIER));
@@ -399,15 +387,12 @@ identifier_init:
 	| explicit_duration {
 		$$ = smobify (new Duration_identifier ($1, DURATION_IDENTIFIER));
 	}
-	| real {
-		$$ = smobify (new Real_identifier (new Real ($1), REAL_IDENTIFIER));
+	| number_expression {
+		$$ = $1;
 	}
 	| string {
 		$$ = $1;
 	}
-	| int	{
-		$$ = smobify (new int_identifier (new int ($1), INT_IDENTIFIER));
-	}
 	| embedded_scm	{
 		$$ = $1;
 	}
@@ -441,21 +426,12 @@ translator_spec_body:
 		tg->set_property (ly_scm2string ($2), $4);
 	}
 	| translator_spec_body STRING '=' identifier_init semicolon	{ 
-		Identifier* id = unsmob_identifier ($4);
-
-		Real_identifier *r= dynamic_cast<Real_identifier*>(id);
-		int_identifier *i = dynamic_cast<int_identifier*> (id);
-
-		SCM v;
-		if (gh_string_p ($4))
+		SCM v = gh_int2scm (0);
+		if (gh_string_p ($4) || gh_number_p ($4))
 			v = $4;
-		else if (i) v = gh_int2scm (*i->access_content_int (false));
-		else if (r) v = gh_double2scm (*r->access_content_Real (false));
 		else 
 			THIS->parser_error (_("Wrong type for property value"));
 
-		if (id)
-			delete id;
 		/* ugh*/
 		Translator_group* tg = dynamic_cast<Translator_group*> ($$);
 		
@@ -490,7 +466,7 @@ score_block:
 		{
 		  Identifier *id =
 			unsmob_identifier (THIS->lexer_p_->lookup_identifier ("$defaultpaper"));
-		  $$->add_output (id ? id->access_content_Paper_def (true) : new Paper_def );
+		  $$->add_output (id ? id->access_content_Music_output_def (true) : new Paper_def );
 		}
 	}
 	;
@@ -515,148 +491,77 @@ score_body:
 	}
 	;
 
-output_def:
-	paper_block {
-		$$ = $1;
-	}
-	|  midi_block		{
-		$$= $1;
-	}
-	;
-
-
-/*
-	PAPER
-*/
-paper_block:
-	PAPER '{' paper_def_body '}' 	{ 
-		$$ = $3;
-		THIS-> lexer_p_->scope_l_arr_.pop ();
-	}
-	;
-
-
-paper_def_body:
-	/* empty */		 	{
-		  Identifier *id = unsmob_identifier (THIS->lexer_p_->lookup_identifier ("$defaultpaper"));
-		  Paper_def *p = id ? id->access_content_Paper_def (true) : new Paper_def;
-		THIS-> lexer_p_-> scope_l_arr_.push (p->scope_p_);
-		$$ = p;
-	}
-	| PAPER_IDENTIFIER 	{
-		Paper_def *p = $1->access_content_Paper_def (true);
-		THIS->lexer_p_->scope_l_arr_.push (p->scope_p_);
-		$$ = p;
-	}
-	| paper_def_body int '=' FONT STRING		{ // ugh, what a syntax
-		Lookup * l = new Lookup;
-		l->font_name_ = ly_scm2string ($5);
-		$$->set_lookup ($2, l);
-	}
-	| paper_def_body assignment semicolon {
-		
-	}
-	| paper_def_body translator_spec_block {
-		$$->assign_translator ($2);
-	}
-	| paper_def_body error {
-
-	}
-	;
-
-
-
-real_with_dimension:
-	REAL CM_T	{
-		$$ = $1 CM;
-	}
-	| REAL PT_T	{
-		$$ = $1 PT;
-	}
-	| REAL IN_T	{
-		$$ = $1 INCH;
-	}
-	| REAL MM_T	{
-		$$ = $1 MM;
-	}
-	| REAL CHAR_T	{
-		$$ = $1 CHAR;
-	}
-	;
 
-real:
-	REAL		{
-		$$ = $1;
-	}
-	| real_with_dimension
-	| REAL_IDENTIFIER		{
-		$$= *$1->access_content_Real (false);
-	}
-	| '-'  real %prec UNARY_MINUS {
-		$$ = -$2;
-	}
-	| real '*' real {
-		$$ = $1 * $3;
-	}
-	| real '/' real {
-		$$ = $1 / $3;
-	}
-	| real '+' real {
-		$$ = $1  + $3;
-	}
-	| real '-' real {
-		$$ = $1 - $3;
-	}
-	| '(' real ')'	{
-		$$ = $2;
-	}
-	;
-		
 /*
 	MIDI
 */
-midi_block:
-	MIDI
-	'{' midi_body '}' 	{
-		$$ = $3;
+output_def:
+	music_output_def_body '}' {
+		$$ = $1;
 		THIS-> lexer_p_-> scope_l_arr_.pop();
 	}
 	;
 
-midi_body: /* empty */ 		{
+music_output_def_body:
+	MIDI '{'    {
 	 Identifier *id = unsmob_identifier (THIS->lexer_p_->lookup_identifier ("$defaultmidi"));
-	 Midi_def* p = id
-		? id->access_content_Midi_def (true) : new Midi_def ;
+
+		
+	 Midi_def* p =0;
+	if (id)
+		p = dynamic_cast<Midi_def*> (id->access_content_Music_output_def (true));
+	else
+		p = new Midi_def;
 
 	 $$ = p;
 	 THIS->lexer_p_->scope_l_arr_.push (p->scope_p_);
 	}
-	| MIDI_IDENTIFIER	{
-		Midi_def * p =$1-> access_content_Midi_def (true);
+	| PAPER '{' 	{
+		  Identifier *id = unsmob_identifier (THIS->lexer_p_->lookup_identifier ("$defaultpaper"));
+		  Paper_def *p = 0;
+		if (id)
+			p = dynamic_cast<Paper_def*> (id->access_content_Music_output_def (true));
+		else
+			p = new Paper_def;
+		THIS-> lexer_p_-> scope_l_arr_.push (p->scope_p_);
+		$$ = p;
+	}
+	| PAPER '{' MUSIC_OUTPUT_DEF_IDENTIFIER 	{
+		Music_output_def *p = $3->access_content_Music_output_def (true);
+		THIS->lexer_p_->scope_l_arr_.push (p->scope_p_);
 		$$ = p;
+	}
+	| MIDI '{' MUSIC_OUTPUT_DEF_IDENTIFIER 	{
+		Music_output_def *p = $3->access_content_Music_output_def (true);
 		THIS->lexer_p_->scope_l_arr_.push (p->scope_p_);
+		$$ = p;
 	}
-	| midi_body assignment semicolon {
+	| music_output_def_body assignment semicolon {
 
 	}
-	| midi_body translator_spec_block	{
+	| music_output_def_body translator_spec_block	{
 		$$-> assign_translator ($2);
 	}
-	| midi_body tempo_request semicolon {
+	| music_output_def_body tempo_request semicolon {
 		/*
 			junk this ? there already is tempo stuff in
 			music.
 		*/
-		$$->set_tempo ($2->dur_.length_mom (), $2->metronome_i_);
+		dynamic_cast<Midi_def*> ($$)->set_tempo ($2->dur_.length_mom (), $2->metronome_i_);
 		delete $2;
 	}
-	| midi_body error {
+	| music_output_def_body bare_int '=' FONT STRING		{ // ugh, what a syntax
+		Lookup * l = new Lookup;
+		l->font_name_ = ly_scm2string ($5);
+		dynamic_cast<Paper_def*> ($$)->set_lookup ($2, l);
+	}
+	| music_output_def_body error {
 
 	}
 	;
 
 tempo_request:
-	TEMPO steno_duration '=' unsigned	{
+	TEMPO steno_duration '=' bare_unsigned	{
 		$$ = new Tempo_req;
 		$$->dur_ = *$2;
 		delete $2;
@@ -695,7 +600,7 @@ Alternative_music:
 
 
 Repeated_music:
-	REPEAT STRING unsigned Music Alternative_music
+	REPEAT STRING bare_unsigned Music Alternative_music
 	{
 		Music_sequence* m = dynamic_cast <Music_sequence*> ($5);
 		if (m && $3 < m->length_i ())
@@ -757,11 +662,11 @@ Simple_music:
 	| MUSIC_IDENTIFIER { $$ = $1->access_content_Music (true); }
 	| property_def
 	| translator_change
-	| Simple_music '*' unsigned '/' unsigned 	{
+	| Simple_music '*' bare_unsigned '/' bare_unsigned 	{
 		$$ = $1;
 		$$->compress (Moment($3, $5 ));
 	}
-	| Simple_music '*' unsigned		 {
+	| Simple_music '*' bare_unsigned		 {
 		$$ = $1;
 		$$->compress (Moment ($3, 1));
 	}
@@ -799,7 +704,7 @@ Composite_music:
 		THIS->remember_spot ();
 	}
 	/* CONTINUED */ 
-		unsigned '/' unsigned Music 	
+		bare_unsigned '/' bare_unsigned Music 	
 
 	{
 		$$ = new Time_scaled_music ($3, $5, $6);
@@ -882,7 +787,7 @@ property_def:
 
 scalar:
 	string		{ $$ = $1; }
-	| int		{ $$ = gh_int2scm ($1); }
+	| bare_int	{ $$ = gh_int2scm ($1); }
 	| embedded_scm 	{ $$ = $1; }
 	;
 
@@ -963,7 +868,7 @@ verbose_command_req:
 	BAR STRING 			{
 		$$ = new Bar_req (ly_scm2string ($2));
 	}
-	| COMMANDSPANREQUEST int STRING {
+	| COMMANDSPANREQUEST bare_int STRING {
 		Span_req * sp_p = new Span_req;
 		sp_p-> span_dir_  = Direction($2);
 		sp_p->span_type_str_ = ly_scm2string ($3);
@@ -980,19 +885,19 @@ verbose_command_req:
 		$$ = m;
 
 	}
-	| MARK unsigned {
+	| MARK bare_unsigned {
 		Mark_req *m = new Mark_req;
 		m->mark_label_ =  gh_int2scm ($2);
 		$$ = m;
 	}
 
-	| TIME_T unsigned '/' unsigned 	{
+	| TIME_T bare_unsigned '/' bare_unsigned 	{
 		Time_signature_change_req *m = new Time_signature_change_req;
 		m->beats_i_ = $2;
 		m->one_beat_i_=$4;
 		$$ = m;
 	}
-	| PENALTY int 	{
+	| PENALTY bare_int 	{
 		Break_req * b = new Break_req;
 		b->penalty_f_ = $2 / 100.0;
 		b->set_spot (THIS->here_input ());
@@ -1015,19 +920,6 @@ verbose_command_req:
 		Key_change_req *key_p= new Key_change_req;
 		$$ = key_p;
 	}
-/*
-TODO: Support for minor/major keys; make `major-scale' settable.
-
-FIXME: force modality.
-*/
-/*
-	| KEY NOTENAME_PITCH 	{
-		Key_change_req *key_p= new Key_change_req;
-		
-		key_p->pitch_alist_ = scm_eval (ly_symbol2scm ("major-scale"));
-		$$ = key_p; 
-	}
-*/
 	| KEY NOTENAME_PITCH SCM_IDENTIFIER 	{
 		Key_change_req *key_p= new Key_change_req;
 		
@@ -1090,9 +982,9 @@ verbose_request:
 
 		$$ = ts_p;
 	}
-	| SPANREQUEST int STRING {
+	| SPANREQUEST bare_int STRING {
 		Span_req * sp_p = new Span_req;
-		sp_p-> span_dir_  = Direction($2);
+		sp_p->span_dir_  = Direction($2);
 		sp_p->span_type_str_ = ly_scm2string ($3);
 		sp_p->set_spot (THIS->here_input ());
 		$$ = sp_p;
@@ -1172,15 +1064,15 @@ musical_pitch:
 	;
 
 explicit_duration:
-	DURATION '{' int_list '}'	{
+	DURATION embedded_scm 	{
 		$$ = new Duration;
-		Array<int> &a = *$3;
-		ARRAY_SIZE(a,2);
-			
-		$$-> durlog_i_ = a[0];
-		$$-> dots_i_ = a[1];
-
-		delete &a;		
+		if (scm_ilength ($2) == 2)
+			{
+			$$-> durlog_i_ = gh_scm2int (gh_car($2));
+			$$-> dots_i_ = gh_scm2int (gh_cadr($2));
+			}
+		else
+			THIS->parser_error (_("Must have 2 arguments for duration"));
 	}
 	;
 
@@ -1309,10 +1201,10 @@ duration_length:
 	steno_duration {
 		$$ = $1;
 	}
-	| duration_length '*' unsigned {
+	| duration_length '*' bare_unsigned {
 		$$->tuplet_iso_i_ *= $3;
 	}
-	| duration_length '/' unsigned {
+	| duration_length '/' bare_unsigned {
 		$$->tuplet_type_i_ *= $3;
 	}
 	;
@@ -1333,7 +1225,7 @@ optional_notemode_duration:
 	;
 
 steno_duration:
-	unsigned		{
+	bare_unsigned		{
 		$$ = new Duration;
 		if (!is_duration_b ($1))
 			THIS->parser_error (_f ("not a duration: %d", $1));
@@ -1354,7 +1246,7 @@ tremolo_type:
 	':'	{
 		$$ =0;
 	}
-	| ':' unsigned {
+	| ':' bare_unsigned {
 		if (!is_duration_b ($2))
 			THIS->parser_error (_f ("not a duration: %d", $2));
 		$$ = $2;
@@ -1386,7 +1278,6 @@ simple_element:
 
 		delete $1;
 		delete $4;
-
 	}
 	| RESTNAME optional_notemode_duration		{
 		  Simultaneous_music* velt_p = new Request_chord;
@@ -1438,16 +1329,16 @@ simple_element:
 	| STRING optional_notemode_duration 	{
 		if (!THIS->lexer_p_->lyric_state_b ())
 			THIS->parser_error (_ ("Have to be in Lyric mode for lyrics"));
-		  Simultaneous_music* velt_p = new Request_chord;
+		Simultaneous_music* velt_p = new Request_chord;
 
-		  Lyric_req* lreq_p = new Lyric_req;
-		  lreq_p ->text_str_ = ly_scm2string ($1);
-		  lreq_p->duration_ = *$2;
-		  lreq_p->set_spot (THIS->here_input());
+		Lyric_req* lreq_p = new Lyric_req;
+		lreq_p ->text_str_ = ly_scm2string ($1);
+		lreq_p->duration_ = *$2;
+		lreq_p->set_spot (THIS->here_input());
 
-		  velt_p->add_music (lreq_p);
+		velt_p->add_music (lreq_p);
 
-		  delete  $2;
+		delete  $2;
 		$$= velt_p;
 
 	}
@@ -1458,6 +1349,7 @@ simple_element:
 	}
 	;
 
+
 chord:
 	steno_tonic_pitch optional_notemode_duration chord_additions chord_subtractions chord_inversion chord_bass {
                 $$ = THIS->get_chord (*$1, $3, $4, $5, $6, *$2);
@@ -1529,19 +1421,19 @@ chord_step:
 	;
 
 chord_note:
-	unsigned {
+	bare_unsigned {
 		$$ = new Musical_pitch;
 		$$->notename_i_ = ($1 - 1) % 7;
 		$$->octave_i_ = $1 > 7 ? 1 : 0;
 		$$->accidental_i_ = 0;
         } 
-	| unsigned '+' {
+	| bare_unsigned '+' {
 		$$ = new Musical_pitch;
 		$$->notename_i_ = ($1 - 1) % 7;
 		$$->octave_i_ = $1 > 7 ? 1 : 0;
 		$$->accidental_i_ = 1;
 	}
-	| unsigned CHORD_MINUS {
+	| bare_unsigned CHORD_MINUS {
 		$$ = new Musical_pitch;
 		$$->notename_i_ = ($1 - 1) % 7;
 		$$->octave_i_ = $1 > 7 ? 1 : 0;
@@ -1552,48 +1444,91 @@ chord_note:
 /*
 	UTILITIES
  */
-
-/*
-  FIXME: use scm.
-*/
-/*
-pitch_list:			{
-		$$ = new Array<Musical_pitch>;
+number_expression:
+	bare_number {
+		$$ = $1;
 	}
-	| pitch_list musical_pitch	{
-		$$->push (*$2);
-		delete $2;
+	| '-'  number_expression %prec UNARY_MINUS {
+		$$ = scm_difference ($2, SCM_UNDEFINED);
 	}
-	;
-*/
-
-int_list:
-	/**/			{
-		$$ = new Array<int>
+	| number_expression '*' number_expression {
+		$$ = scm_product ($1, $3);
+	}
+	| number_expression '/' number_expression {
+		$$ = scm_divide ($1, $3);
+	}
+	| number_expression '+' number_expression {
+		$$ = scm_sum ($1, $3);
 	}
-	| int_list int 		{
-		$$->push ($2);		
+	| number_expression '-' number_expression {
+		$$ = scm_difference ($1, $3);
+	}
+	| '(' number_expression ')'	{
+		$$ = $2;
 	}
 	;
 
-unsigned:
+bare_number:
 	UNSIGNED	{
-		$$ = $1;
+		$$ = gh_int2scm ($1);
 	}
 	| DIGIT		{
+		$$ = gh_int2scm ($1);
+	}
+	| REAL		{
+		$$ = gh_double2scm ($1);
+	}
+	| NUMBER_IDENTIFIER		{
 		$$ = $1;
 	}
+	| REAL CM_T	{
+		$$ = gh_double2scm ($1 CM);
+	}
+	| REAL PT_T	{
+		$$ = gh_double2scm ($1 PT);
+	}
+	| REAL IN_T	{
+		$$ = gh_double2scm ($1 INCH);
+	}
+	| REAL MM_T	{
+		$$ = gh_double2scm ($1 MM);
+	}
+	| REAL CHAR_T	{
+		$$ = gh_double2scm ($1 CHAR);
+	}
 	;
 
-int:
-	unsigned {
-		$$ = $1;
+
+bare_unsigned:
+	bare_number {
+		if (scm_integer_p ($1) == SCM_BOOL_T) {
+			$$ = gh_scm2int ($1);
+
+		} else {
+			THIS->parser_error (_("need integer number arg"));
+			$$ = 0;
+		}
+		if ($$ < 0) {
+			THIS->parser_error (_("Must be positive integer"));
+			$$ = -$$;
+			}
+
 	}
-	| '-' unsigned {
-		$$ = -$2;
+	;
+bare_int:
+	bare_number {
+		if (scm_integer_p ($1) == SCM_BOOL_T)
+		{
+			int k = gh_scm2int ($1);
+			$$ = k;
+		} else
+		{
+			THIS->parser_error (_("need integer number arg"));
+			$$ = 0;
+		}
 	}
-	| INT_IDENTIFIER	{
-		$$ = *$1->access_content_int (false);
+	| '-' bare_int {
+		$$ = -$2;
 	}
 	;
 
@@ -1625,6 +1560,7 @@ questions:
 semicolon:
 	';'
 	;
+
 %%
 
 void
diff --git a/lily/piano-pedal-engraver.cc b/lily/piano-pedal-engraver.cc
index b8a69703a7..8f43379ba5 100644
--- a/lily/piano-pedal-engraver.cc
+++ b/lily/piano-pedal-engraver.cc
@@ -16,8 +16,8 @@
 #include "stem.hh"
 #include "side-position-interface.hh"
 #include "staff-symbol-referencer.hh"
-#include "text-item.hh"
-#include "sustain-pedal.hh"
+#include "item.hh"
+
 
 /*
    TODO:
@@ -159,7 +159,7 @@ Piano_pedal_engraver::do_process_music ()
 	    }
 	  else
 	    {
-	      s = get_property ("stopStart" + String (p->name_ ));
+	      s = get_property (("stopStart" + String (p->name_ )).ch_C());
 	    }
 	  p->start_req_l_ = p->req_l_drul_[START];
 	}
@@ -171,14 +171,14 @@ Piano_pedal_engraver::do_process_music ()
 	    }
 	  else
 	    {
-	      s = get_property ("stop" + String (p->name_ ));
+	      s = get_property (("stop" + String (p->name_ )).ch_C());
 	    }
 	  p->start_req_l_ = 0;
 	}
       else if (p->req_l_drul_[START])
 	{
 	  p->start_req_l_ = p->req_l_drul_[START];
-	  s = get_property ("start" + String (p->name_ ));
+	  s = get_property (("start" + String (p->name_ )).ch_C());
 	}
 
       if (gh_string_p (s))
@@ -186,14 +186,14 @@ Piano_pedal_engraver::do_process_music ()
 	  if (p->name_ == String ("Sustain"))
 	    {
 	      // fixme: Item should be sufficient.
-	      p->item_p_ = new Text_item (get_property ("basicSustainPedalProperties"));
+	      p->item_p_ = new Item (get_property ("basicSustainPedalProperties"));
 	    }
 	  else
 	    {
-	      p->item_p_ = new Text_item (get_property ("basicPedalProperties"));
+	      p->item_p_ = new Item (get_property ("basicPedalProperties"));
 	    }
-	      p->item_p_->set_elt_property ("text", s);
-	      // guh
+	  p->item_p_->set_elt_property ("text", s);
+	  // guh
 
 	  Side_position_interface si (p->item_p_);
 	  si.set_axis (Y_AXIS);
diff --git a/lily/rest.cc b/lily/rest.cc
index 5270a355e3..24bc4d0847 100644
--- a/lily/rest.cc
+++ b/lily/rest.cc
@@ -14,7 +14,7 @@
 #include "paper-score.hh"
 #include "staff-symbol-referencer.hh"
 
-
+// -> offset callback
 void
 Rest::after_line_breaking ()
 {
@@ -36,29 +36,35 @@ Rest::after_line_breaking ()
 }
 
 
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Rest)
-Molecule 
-Rest::do_brew_molecule () const
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Rest)
+
+SCM 
+Rest::scheme_molecule (SCM smob) 
 {
+  Score_element* sc = unsmob_element (smob);
+  
   bool ledger_b =false;
 
-  if (balltype_i () == 0 || balltype_i () == 1)
+  SCM balltype = sc->get_elt_property ("duration-log");
+  
+  if (balltype == gh_int2scm (0) || balltype == gh_int2scm (1))
     {
-      Staff_symbol_referencer_interface si(this);
-      ledger_b = abs(si.position_f ()  - (2* balltype_i () - 1))
+      Staff_symbol_referencer_interface si(sc);
+      ledger_b = abs(si.position_f ()  - (2* gh_scm2int (balltype) - 1))
 	> si.line_count (); 
     }
   
   String style; 
-  SCM style_sym =get_elt_property ("style");
-  if (balltype_i () >= 2 &&gh_string_p ( style_sym))
+  SCM style_sym =sc->get_elt_property ("style");
+  if (gh_scm2int (balltype) >= 2 && gh_string_p (style_sym))
     {
       style = ly_scm2string (style_sym);
     }
 
-  String idx =  ("rests-") + to_str (balltype_i ()) + (ledger_b ? "o" : "") + style;
+  String idx =  ("rests-") + to_str (gh_scm2int (balltype))
+    + (ledger_b ? "o" : "") + style;
 
-  return lookup_l ()->afm_find (idx);
+  return sc-> lookup_l ()->afm_find (idx).create_scheme();
 }
 
 
diff --git a/lily/scope.cc b/lily/scope.cc
index 96d1b86d33..c04878f934 100644
--- a/lily/scope.cc
+++ b/lily/scope.cc
@@ -20,15 +20,6 @@ Scope::~Scope ()
 Scope::Scope (Scope const&s)
   : id_dict_ (new Scheme_hash_table (*s.id_dict_))
 {
-  /*
-    cloning not necessary.
-
-  id_dict_ = new Hash_table<Protected_scm,Identifier*> (*s.id_dict_);
-  for (Scope_iter ai (s); ai.ok(); ai++)
-    {
-      id_dict_->elem (ai.scm_key ()) = ai.val ()->clone ();
-    }
-  */
 }
 
 Scope::Scope ()
diff --git a/lily/score-element.cc b/lily/score-element.cc
index 906c4c5a96..a0a13eb5af 100644
--- a/lily/score-element.cc
+++ b/lily/score-element.cc
@@ -38,6 +38,7 @@ remove dynamic_cast<Spanner,Item> and put this code into respective
 */
 
 
+#define INFINITY_MSG "Infinity or NaN encountered"
 
 Score_element::Score_element(SCM basicprops)
 {
@@ -49,9 +50,6 @@ Score_element::Score_element(SCM basicprops)
   status_i_ = 0;
   self_scm_ = SCM_EOL;
   original_l_ = 0;
-#ifndef READONLY_PROPS
-  basic_property_list_ = basicprops;
-#endif READONLY_PROPS
   property_alist_ = basicprops;
   pointer_alist_ = SCM_EOL;
   
@@ -67,17 +65,7 @@ Score_element::Score_element (Score_element const&s)
   self_scm_ = SCM_EOL;
   original_l_ =(Score_element*) &s;
   property_alist_ = s.property_alist_;
-#ifndef READONLY_PROPS
-  basic_property_list_ = s.basic_property_list_;
-  /*
-    TODO: should copy the private part of the list.
-   */
-  SCM y ;
-  for (SCM *sp = &s.property_alist_;  *sp != basic_property_list_; sp = &SCM_CDR(*sp))
-    {
-      *sp = gh_cons (      
-    }
-#endif
+
   pointer_alist_ = SCM_EOL;
   
   status_i_ = s.status_i_;
@@ -138,24 +126,6 @@ void
 Score_element::set_elt_property (String k, SCM val)
 {
   SCM sym = ly_symbol2scm (k.ch_C ());
-#ifndef READONLY_PROPS
-  /*
-    destructive if found in my part of the list.
-   */
-  for (SCM s = property_alist_; s != basic_property_list_; s =gh_cdr (s))
-    {
-      if (gh_caar (s)== sym)
-	{
-	  gh_set_cdr_x (gh_car (s), val);
-	  return;
-	}
-    }
-/*
-    not found in private list. Override in private list.
-   */
-  
-#endif
-  
   property_alist_ = gh_cons (gh_cons (sym, val), property_alist_);
 }
 
@@ -298,25 +268,23 @@ Score_element::do_add_processing()
 }
 
 
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Score_element)
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Score_element)
 
-  /*
+/*
   ugh.
  */  
-
-Molecule 
-Score_element::do_brew_molecule () const
+SCM
+Score_element::scheme_molecule (SCM smob) 
 {
-  SCM glyph = get_elt_property ("glyph");
+  Score_element * sc = unsmob_element (smob);
+  SCM glyph = sc->get_elt_property ("glyph");
   if (gh_string_p (glyph))
     {
-      return lookup_l ()->afm_find (String (ly_scm2string (glyph)));
+      return sc->lookup_l ()->afm_find (String (ly_scm2string (glyph))).create_scheme ();
     }
   else
     {
-      Molecule m ;
-      m.set_empty (true);
-      return m;
+      return SCM_EOL;
     }
 }
 
@@ -500,7 +468,12 @@ Score_element::find_broken_piece (Line_of_score*) const
 void
 Score_element::translate_axis (Real y, Axis a)
 {
-  dim_cache_[a].offset_ += y;
+  if (isinf (y) || isnan (y))
+    programming_error (_(INFINITY_MSG));
+  else
+    {
+      dim_cache_[a].offset_ += y;
+    }
 }  
 
 Real
@@ -532,7 +505,7 @@ Score_element::get_offset (Axis a) const
       if (isinf (r) || isnan (r))
 	{
 	  r = 0.0;
-	  programming_error ("Infinity or NaN encountered");
+	  programming_error (INFINITY_MSG);
 	}
       me->dim_cache_[a].offset_ +=r;
     }
@@ -608,9 +581,9 @@ Score_element *
 Score_element::common_refpoint (Score_element const* s, Axis a) const
 {
   /*
-    I don't like the quadratic aspect of this code. Maybe this should
-    be rewritten some time, but the largest chain of parents might be
-    10 high or so, so it shouldn't be a real issue. */
+    I don't like the quadratic aspect of this code, but I see no other
+    way. The largest chain of parents might be 10 high or so, so
+    it shouldn't be a real issue. */
   for (Score_element const *c = this; c; c = c->dim_cache_[a].parent_l_)
     for (Score_element const * d = s; d; d = d->dim_cache_[a].parent_l_)
       if (d == c)
diff --git a/lily/span-bar.cc b/lily/span-bar.cc
index da89393ba6..415f1cac8b 100644
--- a/lily/span-bar.cc
+++ b/lily/span-bar.cc
@@ -50,8 +50,12 @@ Span_bar::before_line_breaking ()
 void
 Span_bar::after_line_breaking ()
 {
-  Bar::after_line_breaking ();
   Interval i (get_spanned_interval ());
+
+  /*
+    Bar::brew_molecule delivers a barline of y-extent (-h/2,h/2), so
+    we have to translate ourselves to be in the center of the 
+    interval that we span.  */
   translate_axis (i.center (), Y_AXIS);
 }
 
diff --git a/lily/stem.cc b/lily/stem.cc
index 6c111feee1..1ca3d9b3eb 100644
--- a/lily/stem.cc
+++ b/lily/stem.cc
@@ -623,7 +623,7 @@ Stem::calc_stem_info () const
 
   s = beam_l ()->get_elt_property ("shorten");
   if (gh_number_p (s))
-    info.idealy_f_ -= gh_double2scm (s);
+    info.idealy_f_ -= gh_scm2double (s);
 
   Real interstaff_f = -beam_dir* calc_interstaff_dist (this, beam_l ());
 
diff --git a/lily/sustain-pedal.cc b/lily/sustain-pedal.cc
index 93e454441c..1906eb29ac 100644
--- a/lily/sustain-pedal.cc
+++ b/lily/sustain-pedal.cc
@@ -6,27 +6,34 @@
   (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
   
  */
-
-#include "sustain-pedal.hh"
-#include "side-position-interface.hh"
+#include "score-element.hh"
 #include "molecule.hh"
 #include "lookup.hh"
-#include "staff-symbol-referencer.hh"
 
-void
-Sustain_pedal::after_line_breaking ()
+// update comment --hwn 
+/*
+  Urg.
+  This is almost text
+  Problem is:
+    * we have no kerning
+    * symbols are at wrong place in font
+
+
+
+  Properties:
+
+  glyph -- text string (TODO:   make one large glyph of the Ped symbol, removes need for do_brew_molecule ())
+
+*/
+
+struct Sustain_pedal
 {
-  return ;
-  /*
-    UGH. Should work automatically via offset callback. 
-   */
-  Side_position_interface i (this);
-  Direction d =  i.get_direction ();
-  i.set_direction (d);
-}
+public:
+   static SCM scheme_molecule (SCM);
+};
 
-MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Sustain_pedal);
 
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Sustain_pedal);
 
 SCM
 Sustain_pedal::scheme_molecule (SCM smob) 
@@ -57,7 +64,3 @@ Sustain_pedal::scheme_molecule (SCM smob)
   return mol.create_scheme ();
 }
 
-Sustain_pedal ::Sustain_pedal(SCM s )
-  : Item (s)
-{
-}
diff --git a/lily/text-engraver.cc b/lily/text-engraver.cc
index a0390bd6a2..3611f59dcc 100644
--- a/lily/text-engraver.cc
+++ b/lily/text-engraver.cc
@@ -10,7 +10,7 @@
 #include "dimension-cache.hh"
 #include "engraver.hh"
 #include "side-position-interface.hh"
-#include "text-item.hh"
+#include "item.hh"
 #include "musical-request.hh"
 #include "note-head.hh"
 #include "stem.hh"
@@ -22,7 +22,7 @@
 class Text_engraver : public Engraver
 {
   Link_array<Text_script_req> reqs_;
-  Link_array<Text_item> texts_;
+  Link_array<Item> texts_;
 public:
 
   VIRTUAL_COPY_CONS(Translator);
@@ -78,7 +78,7 @@ Text_engraver::do_process_music ()
     {
       Text_script_req * r = reqs_[i];
 
-      Text_item *text = new Text_item (get_property ("basicTextScriptProperties"));
+      Item *text = new Item (get_property ("basicTextScriptProperties"));
       Side_position_interface stafy (text);
 
       SCM axisprop = get_property ("scriptHorizontal");
@@ -121,7 +121,7 @@ Text_engraver::do_pre_move_processing ()
 {
   for (int i=0; i < texts_.size (); i++)
     {
-      Text_item *ti = texts_[i];
+      Item *ti = texts_[i];
       Side_position_interface (ti).add_staff_support ();
       typeset_element (ti);
     }
diff --git a/lily/text-item.cc b/lily/text-item.cc
index 35e5aa5c3d..ae3ea80b40 100644
--- a/lily/text-item.cc
+++ b/lily/text-item.cc
@@ -1,5 +1,5 @@
 /*   
-  text-item.cc -- implement Text_item
+  text-item.cc -- implement Item
 
   source file of the GNU LilyPond music typesetter
   
@@ -7,40 +7,41 @@
   
  */
 
-#include "text-item.hh"
 #include "debug.hh"
 #include "molecule.hh"
 #include "paper-def.hh"
 #include "lookup.hh"
 #include "staff-symbol-referencer.hh"
 
-Text_item::Text_item (SCM s)
-  : Item (s)
+struct Text_item
 {
-  
-}
+  static SCM scheme_molecule (SCM);
+};
 
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Text_item)
 
-Molecule 
-Text_item::do_brew_molecule () const
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Text_item)
+
+SCM 
+Text_item::scheme_molecule (SCM sm) 
 {
-  SCM style = get_elt_property ("style");
+  Score_element * s = unsmob_element (sm);
+  
+  SCM style = s->get_elt_property ("style");
   String st = gh_string_p (style) ?  ly_scm2string (style) : "";
-  SCM txt = get_elt_property ("text");
+  SCM txt = s-> get_elt_property ("text");
   String t = gh_string_p (txt) ? ly_scm2string (txt) : "";
 
-  Molecule mol = paper_l ()->lookup_l(0)->text (st, t, paper_l ());
+  Molecule mol =  s->paper_l ()->lookup_l(0)->text (st, t, s->paper_l ());
 
-  SCM s = get_elt_property ("word-space");
-  if (gh_number_p (s))
+  SCM space =  s->get_elt_property ("word-space");
+  if (gh_number_p (space))
     {
       Molecule m;
       m.set_empty (false);
-      mol.add_at_edge (X_AXIS, RIGHT, m, gh_scm2double (s)*
-		       staff_symbol_referencer (this).staff_space ());
+      mol.add_at_edge (X_AXIS, RIGHT, m, gh_scm2double (space)*
+		       staff_symbol_referencer  (s).staff_space ());
     }
-  return mol; 
+  return mol.create_scheme (); 
 }
 
 
diff --git a/lily/translator.cc b/lily/translator.cc
index 9471666e8b..579deaad47 100644
--- a/lily/translator.cc
+++ b/lily/translator.cc
@@ -164,9 +164,9 @@ Translator::output_def_l () const
 }
 
 SCM
-Translator::get_property (String id) const
+Translator::get_property (char const * id) const
 {
-  return daddy_trans_l_->get_property (ly_symbol2scm (id.ch_C()));
+  return daddy_trans_l_->get_property (ly_symbol2scm (id));
 }
 
 SCM
diff --git a/lily/tuplet-spanner.cc b/lily/tuplet-spanner.cc
index fbb5f04872..eeabe86e5b 100644
--- a/lily/tuplet-spanner.cc
+++ b/lily/tuplet-spanner.cc
@@ -90,25 +90,26 @@ Tuplet_spanner::do_brew_molecule () const
 	  mol.add_molecule (num);
 	}
       
-      Real thick = paper_l ()->get_var ("tuplet_thick");
       if (bracket_visibility)      
 	{
-	  Real gap = paper_l () -> get_var ("tuplet_spanner_gap");
-	  Real height = staff_space;
+	  SCM ss = paper_l ()->get_scmvar ("staffspace");
+	  SCM lt =  paper_l ()->get_scmvar ("stafflinethickness");
+	  
+	  SCM thick = get_elt_property ("thick");
+	  SCM gap = get_elt_property ("number-gap");
+	  
 	  SCM at =gh_list(ly_symbol2scm ("tuplet"),
-				       gh_double2scm (height),
-				       gh_double2scm (gap),
-				       gh_double2scm (w),
-				       gh_double2scm (dy),
-				       gh_double2scm (thick),
-				       gh_int2scm (dir),
-				       SCM_UNDEFINED);
+			  ss,
+			  scm_product (gap, ss),
+			  gh_double2scm (w),
+			  gh_double2scm (dy),
+			  scm_product (thick, lt),
+			  gh_int2scm (dir),
+			  SCM_UNDEFINED);
 
 	  Box b;
 	  mol.add_molecule (Molecule (b, at));
 	}
-
-      //mol.translate_axis (dir * staff_space, Y_AXIS);
     }
   return mol;
 }
diff --git a/ly/declarations.ly b/ly/declarations.ly
index c113cfec3c..e6f16c1539 100644
--- a/ly/declarations.ly
+++ b/ly/declarations.ly
@@ -1,8 +1,8 @@
 
   
-breve = \duration { -1 0 }
-longa = \duration { -2 0 }
-maxima = \duration { -3 0 }
+breve = \duration #'( -1 0)
+longa = \duration #'( -2 0 )
+maxima = \duration #'( -3 0 )
 
 #(eval-string (ly-gulp-file "generic-property.scm"))
 
@@ -25,7 +25,7 @@ center=0
 
 break =  \penalty  -1000000; 
 nobreak =  \penalty 1000000; 
-\include "scales.ly"
+\include "scale-definitions.ly"
 
 melisma = \property Staff.melismaBusy = ##t
 melismaEnd = \property Staff.melismaBusy = ##f
diff --git a/ly/engraver.ly b/ly/engraver.ly
index 965321ee6c..4445e4afa7 100644
--- a/ly/engraver.ly
+++ b/ly/engraver.ly
@@ -395,11 +395,25 @@ ScoreContext = \translator {
 	% in alphabetical order
 	% TODO: uniform naming.;  
 	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-	basicBarlineProperties = #`(
+
+	%
+	% distances are given in stafflinethickness (thicknesses) and staffspace (distances)
+	%
+	
+	
+	basicBarProperties = #`(
 		(break-align-symbol . Staff_bar)
 		(molecule-callback . ,Bar::scheme_molecule)	   
 		(visibility-lambda . ,begin-of-line-invisible)
 		(breakable . #t)
+
+		;;
+		;; Ross. page 151 lists other values, we opt for a leaner look
+		;; 
+		(kern . 3.0)
+		(thin-kern . 3.0)
+		(hair-thickness . 1.6)
+		(thick-thickness . 6.0)
 	)
 
 	basicBarNumberProperties = #`(
@@ -444,6 +458,7 @@ ScoreContext = \translator {
 	)
 	basicDotsProperties = #`(
 		(molecule-callback . ,Dots::scheme_molecule)
+		(dot-count . 1) 
 	)
 	basicDynamicLineSpannerProperties = #`(
 
@@ -459,6 +474,9 @@ ScoreContext = \translator {
 	  (breakable . #t)
 	)
 	basicHyphenSpannerProperties = #`(
+	(thickness . 1.0)
+	(height . 0.4)
+	(minimum-length .  0.5) 
 		(molecule-callback . ,Hyphen_spanner::scheme_molecule)
 	)
 	basicKeyProperties = #`(
@@ -530,6 +548,13 @@ ScoreContext = \translator {
 	basicSystemStartDelimiterProperties = #`(
 		(molecule-callback . ,System_start_delimiter::scheme_molecule)
 		(collapse-height . 1.0)
+		(thickness . 1.6)
+		(arch-height . 1.5)
+		(arch-angle . 50.0)
+		(arch-thick . 0.25)
+		(arch-width . 1.5)
+		(bracket-thick . 0.25)
+		(bracket-width . 2.0)
 	)
 	basicStemProperties = #`(
 		(molecule-callback . ,Stem::scheme_molecule)
@@ -556,6 +581,8 @@ ScoreContext = \translator {
 		
 	)
 	basicTupletSpannerProperties = #`(
+		(number-gap . 2.0)   
+		(thick . 1.0) 
 		(molecule-callback . ,Tuplet_spanner::scheme_molecule)
 	)	
 	basicStemTremoloProperties = #`(
diff --git a/ly/init.ly b/ly/init.ly
index 27c3fa6612..fd0a20c879 100644
--- a/ly/init.ly
+++ b/ly/init.ly
@@ -1,4 +1,6 @@
 % Toplevel initialisation file. 
+
+foo = \tempo 4 = 100 ;
 	
 \version "1.3.59";
 
diff --git a/ly/params-as.ly b/ly/params-as.ly
index 974dae0b7b..f06f633e0f 100644
--- a/ly/params-as.ly
+++ b/ly/params-as.ly
@@ -44,12 +44,6 @@ arithmetic_basicspace = 2.;
 arithmetic_multiplier = 0.9 * \quartwidth ;
 
 
-#'Stem_tremolo::beam-width = 1.5 * \quartwidth ; 
-
-#'Clef_item::visibility-lambda = #postbreak-only-visibility
-#'Key_item::visibility-lambda = #postbreak-only-visibility
-#'Breathing_sign::visibility-lambda = #non-postbreak-visibility
-
 % catch suspect beam slopes, set slope to zero if
 % outer stem is lengthened more than
 beam_lengthened = 0.2 * \staffspace;
diff --git a/ly/params.ly b/ly/params.ly
index 09e12e0680..46e240e986 100644
--- a/ly/params.ly
+++ b/ly/params.ly
@@ -158,35 +158,9 @@ method.
 %}
 gourlay_maxmeasures = 10.;
 
-
+% vertical space between lines.
 line_kern = \staffspace;
 
-%{ Ross. page 151 lists these values, but we think that thick lines
-and kernings are too thick.
-
-bar_kern = 0.5 * \staffspace;
-bar_thinkern = 0.75 * \staffspace;
-barthick_thick = 0.5* \staffspace;
-barthick_score = 0.13333* \staffspace;
-barthick_thin = 0.1*\staffspace;
-
-%}
-
-bar_kern = 3.0 * \stafflinethickness;
-bar_thinkern = 3.0 * \stafflinethickness;
-barthick_thick = 6.0* \stafflinethickness;
-barthick_thin = 1.6*\stafflinethickness;
-barthick_score = 1.6*\stafflinethickness;
-
-bracket_arch_thick = \staffspace / 4.0;
-bracket_width = 2.0 * \staffspace;
-bracket_thick = \staffspace / 4.0;
-bracket_arch_height = 1.5 * \staffspace;
-bracket_arch_width = \bracket_arch_height;
-bracket_arch_angle = 50.0;
-
-tuplet_spanner_gap = 2.0 * \staffspace;
-tuplet_thick = 1.0*\stafflinethickness;
 volta_thick = 1.6*\stafflinethickness;
 volta_spanner_height = 2.0 *\staffspace;
 
@@ -197,9 +171,6 @@ rulethickness = \stafflinethickness;
 
 extender_height = 0.8*\stafflinethickness;
 
-hyphen_thickness = 0.05*\font_normal;
-hyphen_height = 0.2*\font_normal;
-hyphen_minimum_length = 0.25*\font_normal;
 
 % Multi-measure rests
 multi_measure_rest_x_minimum = 2.5*\staffheight;
@@ -221,9 +192,6 @@ restcollision_minimum_beamdist = 1.5;
 % unit for note collision resolving
 collision_note_width = \notewidth;	%ugh.
 
-% deprecated!
-postBreakPadding = 0.0;
-
 % optical correction amount.
 stemSpacingCorrection = 0.5*\staffspace;
 
@@ -268,9 +236,6 @@ stem_default_neutral_direction = 1.0;
 % in staffspace
 articulation_script_padding_default = 1.0;
 
-% Backward compatibility -- has no function; 
-Gourlay = 0.0;
-Wordwrap =0.0;
 
 \include "engraver.ly";
 
diff --git a/scm/lily.scm b/scm/lily.scm
index 2b3d8b26c4..80e3ffeb6a 100644
--- a/scm/lily.scm
+++ b/scm/lily.scm
@@ -136,6 +136,7 @@
    )
 )
 
+;; silly, use alist? 
 (define (find-notehead-symbol duration style)
   (case style
    ((cross) "2cross")
diff --git a/stepmake/bin/add-html-footer.py b/stepmake/bin/add-html-footer.py
index 705ed904a0..adb1152088 100644
--- a/stepmake/bin/add-html-footer.py
+++ b/stepmake/bin/add-html-footer.py
@@ -9,13 +9,11 @@ import os
 import time
 import string 
 import getopt
-import __main__
 
 fullname = "unknown"
 index_file=''
-banner_file = ''
 changelog_file=''
-changes =''
+package_name = ''
 package_version = ''
 
 mail_address = '(address unknown)'
@@ -24,17 +22,18 @@ try:
 except KeyError:
 	pass
 
-
 webmaster= mail_address
 try:
 	webmaster= os.environ['WEBMASTER']
 except KeyError:
 	pass
 
+header_file = ''
+footer_file = ''
+default_header = r"""
+"""
 
-
-footer_fn = ''
-footer = r"""<hr>Please take me <a href=%s>back to the index</a>
+default_footer = r"""<hr>Please take me <a href=%s>back to the index</a>
 of %s
 <!-- package name %s>
  <!-- webmaster fields. %s %s>
@@ -44,13 +43,8 @@ builtstr = r"""<hr><font size=-1>
 This page was built from %s-%s by 
 <address><br>%s &lt<a href="mailto:%s">%s</a>&gt,  %s.</address><p></font>"""
 
-package_name = ''
-
-(options, files) = getopt.getopt(sys.argv[1:], 'c:hp:', [
-	'name=', 'footer=', 'version=',
-	'changelog=', 'help', 'news=', 'index=']) 
 
-def gulp_file(f):
+def gulp_file (f):
 	try:
 		i = open(f)
 		i.seek (0, 2)
@@ -67,33 +61,45 @@ def gulp_file(f):
 
 def help ():
 	sys.stdout.write (r"""Usage: add-html-footer [OPTION]... HTML-FILE
-Add a nice footer, add the top of the ChangLog file (up to the ********)
+Add header, footer and top of ChangLog file (up to the ********) to HTML-FILE
+
 Options:
--h, --help                print this help
---version                 package version
---name                    package_name
---footer                  footer file
+  --changelog=FILE          use FILE as ChangeLog [ChangeLog]
+  --footer=FILE             use FILE as footer
+  --header=FILE             use FILE as header
+  -h, --help                print this help
+  --index=URL               set homepage to URL
+  --name=NAME               set package_name to NAME
+  --version=VERSION         set package version to VERSION
 """)
 	sys.exit (0)
 
+(options, files) = getopt.getopt(sys.argv[1:], 'h', [
+	'changelog=', 'footer=', 'header=', 'help', 'index=',
+	'name=', 'version=']) 
+
 for opt in options:
 	o = opt[0]
 	a = opt[1]
-	if o == '--news' or o == '--changelog' or o == '-c':
+	if o == '--changelog':
 		changelog_file = a
+	elif o == '--footer':
+		footer_file = a
+	elif o == '--header':
+		header_file = a
+	elif o == '-h' or o == '--help':
+		help ()
 	elif o == '--index':
 		index_file = a
-	elif o == '--footer':
-		footer_fn = a
 	elif o == '--name':
 		package_name = a
-	elif o == '-h' or o == '--help':
-		help ()
 	elif o == '--version':
 		package_version = a
 	else:
 		raise 'unknown opt ', o
-def set_vars():
+
+def set_vars ():
+	global fullname
 	os.environ["CONFIGSUFFIX"] = 'www';
 	if os.name == 'nt':
 		import ntpwd
@@ -102,36 +108,38 @@ def set_vars():
 		import pwd
 		pw = pwd.getpwuid (os.getuid());
 
-	f =pw[4]
+	f = pw[4]
 	f = string.split (f, ',')[0]
-	__main__.fullname=f 
-set_vars ()
+	fullname = f 
 
+#burp
+def compose_header ():
+	global default_header
+	head = default_header
+	if header_file:
+		head = gulp_file (header_file)
+	return head
 
-def footstr(index):
-	ft = __main__.footer
+def compose_footer (index):
+	global default_footer
+	foot = default_footer
 
-	if footer_fn:
-		try:
-			ft = open (footer_fn).read ()
-		except:
-			raise 'oops: ' , footer_fn
+	if footer_file:
+		foot = gulp_file (footer_file)
 
-
-	s = ft % (index, package_name, package_name, webmaster, webmaster)
+	s = foot % (index, package_name, package_name, webmaster, webmaster)
 	s = s + builtstr % (package_name, package_version, fullname,
 			    mail_address, mail_address, 
 			    time.strftime ('%c %Z', time.localtime (time.time ())))
 	return s
 
-banner = footstr (index_file)
-banner_id = '<! banner_id >'
-
-
-
+set_vars ()
+header = compose_header ()
+footer = compose_footer (index_file)
+header_tag = '<! header_tag >'
+footer_tag = '<! footer_tag >'
 
 def do_file (s):
-
 	if changelog_file:
 		changes = gulp_file (changelog_file)
 		# urg?
@@ -141,24 +149,31 @@ def do_file (s):
 			changes = changes[:m.start (0)]
 		s = re.sub ('top_of_ChangeLog', '<XMP>\n'+ changes  + '\n</XMP>\n', s)
 
+	if re.search (header_tag, s) == None:
+		body='<BODY BGCOLOR=WHITE><FONT COLOR=BLACK>'
+		s = re.sub ('(?i)<body>', body, s)
+		if re.search ('(?i)<BODY', s):
+			s = re.sub ('(?i)<body[^>]*>', body + header, s)
+		elif re.search ('(?i)<html', s):		
+			s = re.sub ('(?i)<html>', '<HTML>' + header, s)
+		else:
+			s = header + s
 
-	if re.search (banner_id, s) == None:
-		s = banner_id + s
-	else:
-		return s
-
-	s = re.sub ('(?i)<body>', '<BODY BGCOLOR=WHITE><FONT COLOR=BLACK>', s)
-	# do title.
-	#s = check_tag ('<body', '', s, 0)
-	if re.search ('(?i)</body', s):
-		s = re.sub ('(?i)</body>', banner + '</BODY>', s)
-	elif re.search ('(?i)</html', s):		
-		s = re.sub ('(?i)</html>', banner + '</HTML>', s)
-	else:
-		s = s + banner
+		s = header_tag + s
+
+	if re.search (footer_tag, s) == None:
+		s = s + footer_tag
+
+		if re.search ('(?i)</body', s):
+			s = re.sub ('(?i)</body>', footer + '</BODY>', s)
+		elif re.search ('(?i)</html', s):		
+			s = re.sub ('(?i)</html>', footer + '</HTML>', s)
+		else:
+			s = s + footer
 
 	return s
 
+
 for f in files:
 	s = gulp_file (f)
 	s = do_file (s)
diff --git a/stepmake/stepmake/documentation-vars.make b/stepmake/stepmake/documentation-vars.make
index 6fb5343eae..440e6b9410 100644
--- a/stepmake/stepmake/documentation-vars.make
+++ b/stepmake/stepmake/documentation-vars.make
@@ -3,7 +3,7 @@ AT_FILES = $(BLURBS) #
 at-dir = $(doc-dir)/
 at-ext = .in
 
-footify=$(PYTHON) $(step-bindir)/add-html-footer.py --name $(PACKAGE_NAME) --version $(TOPLEVEL_VERSION) --footer $(depth)/Documentation/footer.html.in
+footify=$(PYTHON) $(step-bindir)/add-html-footer.py --name $(PACKAGE_NAME) --version $(TOPLEVEL_VERSION) --header=$(depth)/Documentation/header.html.in --footer $(depth)/Documentation/footer.html.in
 
 footify-all-command=$(footify) `$(FIND) . -name '*.html' -print`