diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 6931780..9a951d0 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -551,8 +551,7 @@ const AppWellIcon = new Lang.Class({
             this._menuManager.addMenu(this._menu);
         }
 
-        this.actor.set_hover(true);
-        this.actor.show_tooltip();
+        this.actor.hide_tooltip();
         this._menu.popup();
 
         return false;
diff --git a/src/st/st-button.c b/src/st/st-button.c
index 67d7b55..35cbf8c 100644
--- a/src/st/st-button.c
+++ b/src/st/st-button.c
@@ -164,8 +164,6 @@ st_button_button_press (ClutterActor       *actor,
   StButton *button = ST_BUTTON (actor);
   StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (event->button);
 
-  st_widget_hide_tooltip (ST_WIDGET (actor));
-
   if (button->priv->button_mask & mask)
     {
       if (button->priv->grabbed == 0)
diff --git a/src/st/st-widget.c b/src/st/st-widget.c
index 8681651..1c2d124 100644
--- a/src/st/st-widget.c
+++ b/src/st/st-widget.c
@@ -8,6 +8,7 @@
  * Copyright 2009 Abderrahim Kitouni
  * Copyright 2009, 2010 Florian Müllner
  * Copyright 2010 Adel Gadllah
+ * Copyright 2011 Stefano Candori
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU Lesser General Public License,
@@ -46,6 +47,8 @@
 
 #include <gtk/gtk.h>
 
+#define TOOLTIP_FADE_TIME 200
+
 /*
  * Forward declaration for sake of StWidgetChild
  */
@@ -1610,6 +1613,10 @@ st_widget_set_has_tooltip (StWidget *widget,
           priv->tooltip = g_object_new (ST_TYPE_TOOLTIP, NULL);
           g_object_ref_sink (priv->tooltip);
 
+          //Initialize the tooltip's opacity to 0 allowing the first fade-in
+          //to works properly.
+          clutter_actor_set_opacity(CLUTTER_ACTOR(priv->tooltip), 0);
+
           stage = clutter_actor_get_stage (CLUTTER_ACTOR (widget));
           if (stage != NULL)
             st_widget_ensure_tooltip_parented (widget, CLUTTER_STAGE (stage));
@@ -1730,6 +1737,9 @@ st_widget_do_show_tooltip (StWidget *widget)
       st_widget_ensure_tooltip_parented (widget, CLUTTER_STAGE (stage));
       clutter_actor_raise (tooltip, NULL);
       clutter_actor_show_all (tooltip);
+      clutter_actor_animate (tooltip, CLUTTER_EASE_IN_CUBIC, TOOLTIP_FADE_TIME,
+                             "opacity", 255,
+                             NULL);
     }
 }
 
@@ -1753,8 +1763,20 @@ st_widget_hide_tooltip (StWidget *widget)
 static void
 st_widget_do_hide_tooltip (StWidget *widget)
 {
-  if (widget->priv->tooltip)
-    clutter_actor_hide (CLUTTER_ACTOR (widget->priv->tooltip));
+  ClutterActor *actor = CLUTTER_ACTOR (widget->priv->tooltip);
+
+  if (actor)
+     clutter_actor_animate (actor, CLUTTER_EASE_IN_CUBIC, TOOLTIP_FADE_TIME,
+                            "opacity", 0,
+                            "signal-swapped-after::completed",
+                            clutter_actor_hide, actor,
+                            NULL);
+
+  if (widget->priv->tooltip_timeout_id)
+    {
+      g_source_remove (widget->priv->tooltip_timeout_id);
+      widget->priv->tooltip_timeout_id = 0;
+    }
 }
 
 /**
