diff --git a/src/plugins/gui/design.ml b/src/plugins/gui/design.ml
index 3c6e8d05f75cb9cb98968044e406367e3534e97c..3fc6a1b8e6f2b535280c83d8fd8f43fe6abbcc31 100644
--- a/src/plugins/gui/design.ml
+++ b/src/plugins/gui/design.ml
@@ -1184,6 +1184,10 @@ class main_window () : main_window_extension_points =
       let show o =
         history (fun () -> History.push (History.Localizable loc));
         let iter = self#source_viewer#buffer#get_iter (`OFFSET o) in
+        Gui_parameters.debug
+          ~dkey:dkey_scroll "scrolling in current view at iter %d,%d"
+          iter#line iter#line_offset
+        ;
         ignore (self#source_viewer#backward_display_line_start iter);
         self#source_viewer#buffer#place_cursor iter;
         ignore (self#source_viewer#scroll_to_mark
@@ -1494,11 +1498,22 @@ class main_window () : main_window_extension_points =
               let abs_x = int_of_float (GdkEvent.Button.x_root ev) in
               (* This function returns the absolute position of the top window,
                  or the relative position of an intern widget. *)
+              let rec get_rel_from_main acc win =
+                let x = fst (Gdk.Window.get_position win) in
+                let acc = acc + x in
+                let win = Gdk.Window.get_parent win in
+                if Gobject.get_oid win =
+                   Gobject.get_oid main_window#misc#window
+                then acc
+                else get_rel_from_main acc win
+              in
               let get_x obj = fst (Gdk.Window.get_position obj#misc#window) in
               (* Absolute position of the main window on the screen. *)
               let window_abs_x = get_x main_window in
               (* Relative position of the source_viewer in the main windows. *)
-              let viewer_rel_x = get_x source_viewer in
+              let viewer_rel_x =
+                get_rel_from_main 0 source_viewer#misc#window
+              in
               (* Width of the bullet column in the source viewer. *)
               Format.printf "viewer_rel_x: %d@." viewer_rel_x;
               Format.printf "window_abs_x: %d@." window_abs_x;
@@ -1514,16 +1529,17 @@ class main_window () : main_window_extension_points =
                   Format.printf "line is %d@." line;
                   try
                     let stmt = Hashtbl.find Feedback.call_sites line in
-                    Format.printf "stmt found@.";
-                    let kf = Kernel_function.find_englobing_kf stmt in
+                    Format.printf "stmt found@\n%a@." Printer.pp_stmt stmt;
                     Pretty_source.fold_preconds_at_callsite stmt;
-                    self#reactive_buffer#redisplay;
-                    self#scroll (PStmt (kf, stmt))
-                  with Not_found -> Format.printf "call not found@."
+                    self#reset ();
+                    (* give some time for the sourceview to recompute
+                       its height, otherwise scrolling is broken. *)
+                    Unix.sleep 1;
+                    self#view_stmt stmt;
+                 with Not_found -> Format.printf "call not found@."
                 end;
               false)
       in
-
       let extra_accel_group = GtkData.AccelGroup.create () in
       GtkData.AccelGroup.connect extra_accel_group
         ~key:GdkKeysyms._F