diff --git a/gtk/gtkstatusicon.c b/gtk/gtkstatusicon.c
index a55996ab47..af3fecd9e9 100644
--- a/gtk/gtkstatusicon.c
+++ b/gtk/gtkstatusicon.c
@@ -302,7 +302,7 @@ gtk_status_icon_class_init (GtkStatusIconClass *class)
 							 P_("Visible"),
 							 P_("Whether the status icon is visible"),
 							 TRUE,
-							 GTK_PARAM_READWRITE));
+							 GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
 
 
   /**
@@ -362,7 +362,8 @@ gtk_status_icon_class_init (GtkStatusIconClass *class)
  							 P_("Has tooltip"),
  							 P_("Whether this tray icon has a tooltip"),
  							 FALSE,
- 							 GTK_PARAM_READWRITE));
+ 							 GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
+
   /**
    * GtkStatusIcon:tooltip-text:
    *
@@ -2374,6 +2375,7 @@ gtk_status_icon_set_has_tooltip (GtkStatusIcon *status_icon,
 				 gboolean       has_tooltip)
 {
   GtkStatusIconPrivate *priv;
+  gboolean changed = FALSE;
 
   g_return_if_fail (GTK_IS_STATUS_ICON (status_icon));
 
@@ -2381,16 +2383,27 @@ gtk_status_icon_set_has_tooltip (GtkStatusIcon *status_icon,
 
 #ifdef GDK_WINDOWING_X11
   if (priv->tray_icon)
-    gtk_widget_set_has_tooltip (priv->tray_icon, has_tooltip);
+    {
+      if (gtk_widget_get_has_tooltip (priv->tray_icon) != has_tooltip)
+        {
+          gtk_widget_set_has_tooltip (priv->tray_icon, has_tooltip);
+          changed = TRUE;
+        }
+    }
 #endif
 #ifdef GDK_WINDOWING_WIN32
+  changed = TRUE;
   if (!has_tooltip && priv->tooltip_text)
     gtk_status_icon_set_tooltip_text (status_icon, NULL);
 #endif
 #ifdef GDK_WINDOWING_QUARTZ
+  changed = TRUE;
   if (!has_tooltip && priv->tooltip_text)
     gtk_status_icon_set_tooltip_text (status_icon, NULL);
 #endif
+
+  if (changed)
+    g_object_notify (G_OBJECT (status_icon), "has-tooltip");
 }
 
 /**