diff --git a/lily/bar-number-engraver.cc b/lily/bar-number-engraver.cc
index f5744ff..56abcc1 100644
--- a/lily/bar-number-engraver.cc
+++ b/lily/bar-number-engraver.cc
@@ -44,6 +44,9 @@ Bar_number_engraver::process_music ()
       if (mp.main_part_ == Rational (0))
 	{
 	  SCM bn = get_property ("currentBarNumber");
+	  SCM bn_proc = get_property ("currentBarNumberProc");
+          if (ly_is_procedure (bn_proc))
+            bn = scm_apply_0 (bn_proc, scm_list_1 (bn));
 	  SCM proc = get_property ("barNumberVisibility");
 	  if (scm_is_number (bn) && ly_is_procedure (proc)
 	      && to_boolean (scm_call_1 (proc, bn)))
@@ -133,6 +136,7 @@ ADD_TRANSLATOR (Bar_number_engraver,
 
 		/* read */
 		"currentBarNumber "
+		"currentBarNumberProc "
 		"whichBar "
 		"stavesFound "
 		"barNumberVisibility ",
diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm
index d45150f..7f93e1a 100644
--- a/scm/define-context-properties.scm
+++ b/scm/define-context-properties.scm
@@ -166,6 +166,7 @@ crescendi.  Available values are @samp{hairpin} and @samp{text}.  If unset,
 a hairpin crescendo is used.")
      (currentBarNumber ,integer? "Contains the current barnumber.
 This property is incremented at every bar line.")
+     (currentBarNumberProc ,procedure? "A one argument (the actual bar number) procedure that evalutates to the new current bar number.")
 
 
      (decrescendoSpanner ,symbol? "The type of spanner to be used for
