diff --git a/common/utils/T/tracer/gui/gui.h b/common/utils/T/tracer/gui/gui.h
index 0eebae91ba90ca7b321b921accc47ee0b72a7b18..c61c2dc6c0d5395d45bf4ac89f763dca6ffb54fb 100644
--- a/common/utils/T/tracer/gui/gui.h
+++ b/common/utils/T/tracer/gui/gui.h
@@ -50,6 +50,7 @@ void xy_plot_set_range(gui *gui, widget *this,
 void xy_plot_set_points(gui *gui, widget *this,
     int plot, int npoints, float *x, float *y);
 void xy_plot_get_dimensions(gui *gui, widget *this, int *width, int *height);
+void xy_plot_set_title(gui *gui, widget *this, char *label);
 
 void textlist_add(gui *gui, widget *this, const char *text, int position,
     int color);
diff --git a/common/utils/T/tracer/gui/xy_plot.c b/common/utils/T/tracer/gui/xy_plot.c
index 7d20a027a155524481d6aab45c2ada8361b83180..9342a5a464828d6855ab70941b09fcd107892631 100644
--- a/common/utils/T/tracer/gui/xy_plot.c
+++ b/common/utils/T/tracer/gui/xy_plot.c
@@ -290,3 +290,22 @@ void xy_plot_get_dimensions(gui *_gui, widget *_this, int *width, int *height)
 
   gunlock(g);
 }
+
+void xy_plot_set_title(gui *_gui, widget *_this, char *label)
+{
+  struct gui *g = _gui;
+  struct xy_plot_widget *this = _this;
+
+  glock(g);
+
+  free(this->label);
+  this->label = strdup(label); if (this->label == NULL) OOM;
+  /* TODO: be sure calling X there is valid wrt "global model" (we are
+   * not in the "gui thread") */
+  x_text_get_dimensions(g->x, DEFAULT_FONT, label,
+      &this->label_width, &this->label_height, &this->label_baseline);
+
+  send_event(g, REPACK, this->common.id);
+
+  gunlock(g);
+}