diff --git a/src/sheet-control-gui-priv.h b/src/sheet-control-gui-priv.h
index 3ec919a..c666aed 100644
--- a/src/sheet-control-gui-priv.h
+++ b/src/sheet-control-gui-priv.h
@@ -55,6 +55,12 @@ struct _SheetControlGUI {
 		int          x, y;
 	} comment;
 
+	/* im */
+	struct {
+		GtkWidget   *item;
+		int	     timer;
+	} im;
+
 	struct {
 		int		timer, counter, n;
 		gboolean	jump, horiz;
diff --git a/src/sheet-control-gui.c b/src/sheet-control-gui.c
index 341dae9..a5fc00c 100644
--- a/src/sheet-control-gui.c
+++ b/src/sheet-control-gui.c
@@ -63,6 +63,7 @@
 #include "item-cursor.h"
 #include "widgets/gnumeric-expr-entry.h"
 #include "gnm-sheet-slicer.h"
+#include "input-msg.h"
 
 #include <go-data-slicer-field.h>
 #include <goffice/goffice.h>
@@ -717,6 +718,9 @@ scg_init (SheetControlGUI *scg)
 
 	scg->grab_stack = 0;
 	scg->selected_objects = NULL;
+
+	scg->im.item = NULL;
+	scg->im.timer = 0;
 }
 
 /*************************************************************************/
@@ -1740,6 +1744,18 @@ scg_comment_timer_clear (SheetControlGUI *scg)
 }
 
 static void
+scg_im_destroy (SheetControlGUI *scg) {
+	if (scg->im.timer != 0) {
+		g_source_remove (scg->im.timer);
+		scg->im.timer = 0;
+	}
+	if (scg->im.item) {
+		gtk_widget_destroy (scg->im.item);
+		scg->im.item = NULL;
+	}	
+}
+
+static void
 scg_finalize (GObject *object)
 {
 	SheetControlGUI *scg = SHEET_CONTROL_GUI (object);
@@ -1769,6 +1785,8 @@ scg_finalize (GObject *object)
 	}
 	scg_comment_unselect (scg, scg->comment.selected);
 
+	scg_im_destroy (scg);
+
 	if (sc->view) {
 		Sheet *sheet = sv_sheet (sc->view);
 		g_signal_handlers_disconnect_by_func (sheet, scg_adjust_preferences, scg);
@@ -3665,6 +3683,75 @@ scg_scale_changed (SheetControl *sc)
 		sheet_object_update_bounds (SHEET_OBJECT (ptr->data), NULL);
 }
 
+static gboolean
+cb_cell_im_timer (SheetControlGUI *scg)
+{
+	g_return_val_if_fail (IS_SHEET_CONTROL_GUI (scg), FALSE);
+	g_return_val_if_fail (scg->im.timer != 0, FALSE);
+
+	scg->im.timer = 0;
+	scg_im_destroy (scg);
+	return FALSE;
+}
+
+static void
+scg_show_im_tooltip (SheetControl *sc, GnmInputMsg *im, GnmCellPos *pos)
+{
+	SheetControlGUI *scg = (SheetControlGUI *)sc;
+	g_return_if_fail (IS_SHEET_CONTROL_GUI (scg));
+
+	scg_im_destroy (scg);
+
+	if (im) {
+		GtkWidget *label, *box;
+		char const *text, *title;
+		int len_text, len_title;
+
+		text = gnm_input_msg_get_msg   (im);
+		title = gnm_input_msg_get_title (im);
+		len_text = (text == NULL) ? 0 : strlen (text);
+		len_title = (title == NULL) ? 0 : strlen (title);
+
+		if ((len_text == 0) && (len_title == 0))
+			return;
+
+		box = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE);
+
+		if (len_title > 0) {
+			PangoAttrList *attrs;
+			PangoAttribute *attr;
+
+			label = gtk_label_new (title);
+
+			attrs = pango_attr_list_new ();
+			attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
+			attr->start_index = 0;
+			attr->end_index = G_MAXINT;
+			pango_attr_list_insert (attrs, attr);
+			gtk_label_set_attributes (GTK_LABEL (label), attrs);
+			pango_attr_list_unref (attrs);
+
+			gtk_widget_set_halign (label, GTK_ALIGN_START);
+			gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
+		}
+		if (len_text > 0) {
+			label = gtk_label_new (text);
+
+			gtk_widget_set_halign (label, GTK_ALIGN_START);
+			gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
+			if (len_title > 0)
+				gtk_box_set_spacing (GTK_BOX (box), 10);
+		}		
+		gnumeric_convert_to_tooltip (GTK_WIDGET (scg->grid), box);
+		scg->im.item = gtk_widget_get_toplevel (box);
+		gtk_window_move (GTK_WINDOW (scg->im.item),
+				 200, 200);
+		gtk_widget_show_all (scg->im.item);
+		scg->im.timer = g_timeout_add (1500, (GSourceFunc)cb_cell_im_timer, scg);
+	}
+}
+
+
 
 static void
 scg_class_init (GObjectClass *object_class)
@@ -3691,6 +3778,7 @@ scg_class_init (GObjectClass *object_class)
 	sc_class->set_panes		   = scg_set_panes;
 	sc_class->object_create_view	   = scg_object_create_view;
 	sc_class->scale_changed		   = scg_scale_changed;
+	sc_class->show_im_tooltip	   = scg_show_im_tooltip;
 }
 
 GSF_CLASS (SheetControlGUI, sheet_control_gui,
diff --git a/src/sheet-control-priv.h b/src/sheet-control-priv.h
index 26ddcd0..a48b1b6 100644
--- a/src/sheet-control-priv.h
+++ b/src/sheet-control-priv.h
@@ -35,6 +35,8 @@ typedef struct {
 	void (*set_panes)		(SheetControl *sc);
 	void (*object_create_view)	(SheetControl *sc, SheetObject *so);
 	void (*scale_changed)		(SheetControl *sc);
+	void (*show_im_tooltip)         (SheetControl *sc, 
+					 GnmInputMsg *im, GnmCellPos *pos);
 } SheetControlClass;
 
 #define SHEET_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SHEET_CONTROL_TYPE, SheetControlClass))
diff --git a/src/sheet-control.c b/src/sheet-control.c
index 87f6a4f..acb4695 100644
--- a/src/sheet-control.c
+++ b/src/sheet-control.c
@@ -136,3 +136,6 @@ SC_VIRTUAL (set_panes, (SheetControl *sc), (sc))
 SC_VIRTUAL (object_create_view,	(SheetControl *sc, SheetObject *so), (sc, so))
 SC_VIRTUAL (scale_changed,	(SheetControl *sc), (sc))
 
+SC_VIRTUAL (show_im_tooltip,	(SheetControl *sc, GnmInputMsg *im, GnmCellPos *pos), (sc, im, pos))
+
+
diff --git a/src/sheet-control.h b/src/sheet-control.h
index bc0772a..0d8e736 100644
--- a/src/sheet-control.h
+++ b/src/sheet-control.h
@@ -46,6 +46,9 @@ void sc_set_panes		(SheetControl *sc);
 void sc_object_create_view	(SheetControl *sc, SheetObject *so);
 void sc_scale_changed		(SheetControl *sc);
 
+void sc_show_im_tooltip         (SheetControl *sc, 
+				 GnmInputMsg *im, GnmCellPos *pos);
+
 G_END_DECLS
 
 #endif /* _GNM_SHEET_CONTROL_H_ */
diff --git a/src/sheet-view.c b/src/sheet-view.c
index a2033e1..c9e3508 100644
--- a/src/sheet-view.c
+++ b/src/sheet-view.c
@@ -1,3 +1,4 @@
+/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
  * sheet-view.c:
  *
@@ -42,6 +43,8 @@
 #include "expr-name.h"
 #include "command-context.h"
 #include "gnumeric-conf.h"
+#include "sheet-style.h"
+#include "mstyle.h"
 
 #include <gsf/gsf-impl-utils.h>
 
@@ -636,6 +639,23 @@ sv_flag_selection_change (SheetView *sv)
 	sv->selection_content_changed = TRUE;
 }
 
+static void
+sheet_view_edit_pos_tool_tips (SheetView *sv)
+{
+	GnmStyle const *style;
+	GnmInputMsg	*im = NULL;
+
+	style = sheet_style_get (sv->sheet,
+				 sv->edit_pos.col,
+				 sv->edit_pos.row);
+	if (style != NULL && gnm_style_is_element_set (style, MSTYLE_INPUT_MSG))
+		im = gnm_style_get_input_msg (style);
+
+	/* We need to call these even with im == NULL to remove the old tooltip.*/
+	SHEET_VIEW_FOREACH_CONTROL (sv, control,
+				    sc_show_im_tooltip (control, im, &sv->edit_pos););
+}
+
 void
 sv_update (SheetView *sv)
 {
@@ -661,6 +681,7 @@ sv_update (SheetView *sv)
 				(sv, sc, wb_control_menu_state_update
 				 (sc_wbc (sc),
 				  MS_COMMENT_LINKS | MS_PAGE_BREAKS););
+			sheet_view_edit_pos_tool_tips (sv);
 		}
 	}
 
