Index: gtk2_ardour/editor_canvas.cc
===================================================================
--- gtk2_ardour/editor_canvas.cc	(revision 1640)
+++ gtk2_ardour/editor_canvas.cc	(working copy)
@@ -368,7 +368,7 @@
 	}
 		
 	update_fixed_rulers();
-	tempo_map_changed (Change (0), true);
+	redisplay_tempo (true);
 	
 	Resized (); /* EMIT_SIGNAL */
 
@@ -723,6 +723,6 @@
 	
 	update_fixed_rulers ();
 
-	tempo_map_changed (Change (0), !_dragging_hscrollbar);
+	redisplay_tempo (!_dragging_hscrollbar);
 }
 
Index: gtk2_ardour/editor_tempodisplay.cc
===================================================================
--- gtk2_ardour/editor_tempodisplay.cc	(revision 1640)
+++ gtk2_ardour/editor_tempodisplay.cc	(working copy)
@@ -93,14 +93,29 @@
 }
 
 void
-Editor::tempo_map_changed (Change ignored, bool immediate_redraw)
+Editor::tempo_map_changed (Change ignored)
 {
 	if (!session) {
 		return;
 	}
 
-        ENSURE_GUI_THREAD(bind (mem_fun (*this, &Editor::tempo_map_changed), ignored, immediate_redraw));
+	ENSURE_GUI_THREAD(bind (mem_fun (*this, &Editor::tempo_map_changed), ignored));
+	
+	redisplay_tempo (false); // redraw rulers and measures
+	session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers
+}
 
+/**
+ * This code was originally in tempo_map_changed, but this is called every time the canvas scrolls horizontally. 
+ * That's why this is moved in here. The new tempo_map_changed is called when the ARDOUR::TempoMap actually changed.
+ */
+void
+Editor::redisplay_tempo (bool immediate_redraw)
+{
+	if (!session) {
+		return;
+	}
+
 	BBT_Time previous_beat, next_beat; // the beats previous to the leftmost frame and after the rightmost frame
 
 	session->bbt_time(leftmost_frame, previous_beat);
@@ -153,11 +168,6 @@
 }
 
 void
-Editor::redisplay_tempo ()
-{	
-}
-
-void
 Editor::hide_measures ()
 {
 	for (TimeLineList::iterator i = used_measure_lines.begin(); i != used_measure_lines.end(); ++i) {
@@ -307,8 +317,6 @@
 	commit_reversible_command ();
 	
 	map.dump (cerr);
-
-	session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
 }
 
 void
@@ -349,8 +357,6 @@
 	commit_reversible_command ();
 	
 	map.dump (cerr);
-
-	session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
 }
 
 void
@@ -401,8 +407,6 @@
         XMLNode &after = session->tempo_map().get_state();
 	session->add_command(new MementoCommand<TempoMap>(session->tempo_map(), &before, &after));
 	commit_reversible_command ();
-
-	session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
 }
 
 void
@@ -433,8 +437,6 @@
         XMLNode &after = session->tempo_map().get_state();
 	session->add_command (new MementoCommand<TempoMap>(session->tempo_map(), &before, &after));
 	commit_reversible_command ();
-
-	session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
 }
 
 void
@@ -485,8 +487,6 @@
 	session->add_command(new MementoCommand<TempoMap>(session->tempo_map(), &before, &after));
 	commit_reversible_command ();
 
-	session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
-
 	return FALSE;
 }
 
@@ -521,7 +521,5 @@
 	session->add_command(new MementoCommand<TempoMap>(session->tempo_map(), &before, &after));
 	commit_reversible_command ();
 
-	session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
-
 	return FALSE;
 }
Index: gtk2_ardour/editor.cc
===================================================================
--- gtk2_ardour/editor.cc	(revision 1640)
+++ gtk2_ardour/editor.cc	(working copy)
@@ -1075,7 +1075,7 @@
 
 	session_connections.push_back (session->SMPTEOffsetChanged.connect (mem_fun(*this, &Editor::update_just_smpte)));
 
-	session_connections.push_back (session->tempo_map().StateChanged.connect (bind (mem_fun(*this, &Editor::tempo_map_changed), false)));
+	session_connections.push_back (session->tempo_map().StateChanged.connect (mem_fun(*this, &Editor::tempo_map_changed)));
 
 	edit_groups_changed ();
 
@@ -3665,7 +3665,7 @@
 			/* the signal handler will do the rest */
 		} else {
 			update_fixed_rulers();
-			tempo_map_changed (Change (0), true);
+			redisplay_tempo (true);
 		}
 	}
 
Index: gtk2_ardour/editor_rulers.cc
===================================================================
--- gtk2_ardour/editor_rulers.cc	(revision 1640)
+++ gtk2_ardour/editor_rulers.cc	(working copy)
@@ -709,7 +709,7 @@
 	
 	update_fixed_rulers();
 	//update_tempo_based_rulers();
-	tempo_map_changed(Change (0), false);
+	redisplay_tempo (false);
 
 	time_canvas_event_box.show_all();
 	time_button_frame.show_all();
Index: gtk2_ardour/editor.h
===================================================================
--- gtk2_ardour/editor.h	(revision 1640)
+++ gtk2_ardour/editor.h	(working copy)
@@ -1275,8 +1275,8 @@
 	void remove_metric_marks ();
 	void draw_metric_marks (const ARDOUR::Metrics& metrics);
 
-	void tempo_map_changed (ARDOUR::Change, bool immediate_redraw);
-	void redisplay_tempo ();
+	void tempo_map_changed (ARDOUR::Change);
+	void redisplay_tempo (bool immediate_redraw);
 	
 	void snap_to (nframes_t& first, int32_t direction = 0, bool for_mark = false);
 	uint32_t bbt_beat_subdivision;
