diff --git a/libempathy-gtk/empathy-conf.h b/libempathy-gtk/empathy-conf.h
index 5516273..bf59c62 100644
--- a/libempathy-gtk/empathy-conf.h
+++ b/libempathy-gtk/empathy-conf.h
@@ -70,6 +70,7 @@ struct _EmpathyConfClass {
 #define EMPATHY_PREFS_CHAT_AVATAR_IN_ICON          EMPATHY_PREFS_PATH "/conversation/avatar_in_icon"
 #define EMPATHY_PREFS_CHAT_WEBKIT_DEVELOPER_TOOLS  EMPATHY_PREFS_PATH "/conversation/enable_webkit_developer_tools"
 #define EMPATHY_PREFS_UI_SEPARATE_CHAT_WINDOWS     EMPATHY_PREFS_PATH "/ui/separate_chat_windows"
+#define EMPATHY_PREFS_UI_AUTO_OPEN_EVENTS          EMPATHY_PREFS_PATH "/ui/auto_open_events"
 #define EMPATHY_PREFS_UI_MAIN_WINDOW_HIDDEN        EMPATHY_PREFS_PATH "/ui/main_window_hidden"
 #define EMPATHY_PREFS_UI_AVATAR_DIRECTORY          EMPATHY_PREFS_PATH "/ui/avatar_directory"
 #define EMPATHY_PREFS_UI_SHOW_AVATARS              EMPATHY_PREFS_PATH "/ui/show_avatars"
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index 3fa39d5..46d4375 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -1407,9 +1407,8 @@ empathy_window_iconify (GtkWindow *window, GtkStatusIcon *status_icon)
 /* Takes care of moving the window to the current workspace. */
 void
 empathy_window_present (GtkWindow *window,
-			gboolean   steal_focus)
+			guint32 action_time)
 {
-	guint32 timestamp;
 	GdkWindow *gdk_window;
 
 	g_return_if_fail (GTK_IS_WINDOW (window));
@@ -1432,8 +1431,8 @@ empathy_window_present (GtkWindow *window,
 			gtk_widget_hide (GTK_WIDGET (window));
 	}
 
-	timestamp = gtk_get_current_event_time ();
-	gtk_window_present_with_time (window, timestamp);
+	gtk_window_present_with_time (window, action_time);
+
 	gtk_window_set_skip_taskbar_hint (window, FALSE);
 	gtk_window_deiconify (window);
 }
diff --git a/libempathy-gtk/empathy-ui-utils.h b/libempathy-gtk/empathy-ui-utils.h
index 925ecc5..9b0c7f5 100644
--- a/libempathy-gtk/empathy-ui-utils.h
+++ b/libempathy-gtk/empathy-ui-utils.h
@@ -106,7 +106,7 @@ gboolean    empathy_text_iter_backward_search           (const GtkTextIter*iter,
 /* Windows */
 gboolean    empathy_window_get_is_visible               (GtkWindow        *window);
 void        empathy_window_present                      (GtkWindow        *window,
-							 gboolean          steal_focus);
+							 guint32 action_time);
 void        empathy_window_iconify                      (GtkWindow        *window,
 							 GtkStatusIcon    *status_icon);
 GtkWindow * empathy_get_toplevel_window                 (GtkWidget        *widget);
diff --git a/libempathy/empathy-dispatch-operation.c b/libempathy/empathy-dispatch-operation.c
index 20ebadb..eac81ab 100644
--- a/libempathy/empathy-dispatch-operation.c
+++ b/libempathy/empathy-dispatch-operation.c
@@ -88,6 +88,7 @@ struct _EmpathyDispatchOperationPriv
   gboolean approved;
   gulong invalidated_handler;
   gulong ready_handler;
+  guint32 user_action_time;
 };
 
 #define GET_PRIV(o)  \
@@ -692,3 +693,30 @@ empathy_dispatch_operation_is_incoming (EmpathyDispatchOperation *operation)
 
   return priv->incoming;
 }
+
+guint32
+empathy_dispatch_operation_get_user_action_time (
+    EmpathyDispatchOperation *self)
+{
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_val_if_fail (EMPATHY_IS_DISPATCH_OPERATION (self), 0);
+
+  priv = GET_PRIV (self);
+
+  return priv->user_action_time;
+}
+
+void
+empathy_dispatch_operation_set_user_action_time (
+    EmpathyDispatchOperation *self,
+    guint32 user_action_time)
+{
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_if_fail (EMPATHY_IS_DISPATCH_OPERATION (self));
+
+  priv = GET_PRIV (self);
+
+  priv->user_action_time = user_action_time;
+}
diff --git a/libempathy/empathy-dispatch-operation.h b/libempathy/empathy-dispatch-operation.h
index 148adec..7f1e42c 100644
--- a/libempathy/empathy-dispatch-operation.h
+++ b/libempathy/empathy-dispatch-operation.h
@@ -115,6 +115,13 @@ EmpathyDispatchOperationState empathy_dispatch_operation_get_status (
 gboolean empathy_dispatch_operation_is_incoming (
   EmpathyDispatchOperation *operation);
 
+guint32 empathy_dispatch_operation_get_user_action_time (
+  EmpathyDispatchOperation *operation);
+
+void empathy_dispatch_operation_set_user_action_time (
+  EmpathyDispatchOperation *operation,
+  guint32 user_action_time);
+
 G_END_DECLS
 
 #endif /* #ifndef __EMPATHY_DISPATCH_OPERATION_H__*/
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c
index 5ad66fd..0d3b97d 100644
--- a/src/empathy-chat-window.c
+++ b/src/empathy-chat-window.c
@@ -1186,7 +1186,8 @@ chat_window_notification_closed_cb (NotifyNotification *notify,
 	reason = notify_notification_get_closed_reason (notify);
 #endif
 	if (reason == EMPATHY_NOTIFICATION_CLOSED_DISMISSED) {
-		empathy_chat_window_present_chat (cb_data->chat);
+		empathy_chat_window_present_chat (cb_data->chat,
+			gtk_get_current_event_time ());
 	}
 
 	g_object_unref (notify);
@@ -1650,7 +1651,7 @@ chat_window_drag_data_received (GtkWidget        *widget,
 		}
 
 		/* Added to take care of any outstanding chat events */
-		empathy_chat_window_present_chat (chat);
+		empathy_chat_window_present_chat (chat, gtk_get_current_event_time ());
 
 		/* We should return TRUE to remove the data when doing
 		 * GDK_ACTION_MOVE, but we don't here otherwise it has
@@ -2184,7 +2185,8 @@ empathy_chat_window_find_chat (TpAccount   *account,
 }
 
 void
-empathy_chat_window_present_chat (EmpathyChat *chat)
+empathy_chat_window_present_chat (EmpathyChat *chat,
+				  guint32 action_time)
 {
 	EmpathyChatWindow     *window;
 	EmpathyChatWindowPriv *priv;
@@ -2205,7 +2207,7 @@ empathy_chat_window_present_chat (EmpathyChat *chat)
 
 	priv = GET_PRIV (window);
 	empathy_chat_window_switch_to_chat (window, chat);
-	empathy_window_present (GTK_WINDOW (priv->dialog), TRUE);
+	empathy_window_present (GTK_WINDOW (priv->dialog), action_time);
 
  	gtk_widget_grab_focus (chat->input_text_view);
 }
diff --git a/src/empathy-chat-window.h b/src/empathy-chat-window.h
index 93ffcc5..92c8c40 100644
--- a/src/empathy-chat-window.h
+++ b/src/empathy-chat-window.h
@@ -72,7 +72,8 @@ void               empathy_chat_window_switch_to_chat (EmpathyChatWindow *window
 gboolean           empathy_chat_window_has_focus      (EmpathyChatWindow *window);
 EmpathyChat *      empathy_chat_window_find_chat      (TpAccount        *account,
 						       const gchar      *id);
-void               empathy_chat_window_present_chat   (EmpathyChat      *chat);
+void               empathy_chat_window_present_chat   (EmpathyChat      *chat,
+						       guint32 action_time);
 
 void               empathy_chat_window_get_nb_chats   (EmpathyChatWindow *window,
 						       guint *nb_rooms,
diff --git a/src/empathy-event-manager.c b/src/empathy-event-manager.c
index c9e925d..1a28881 100644
--- a/src/empathy-event-manager.c
+++ b/src/empathy-event-manager.c
@@ -205,6 +205,7 @@ event_manager_add (EmpathyEventManager *manager,
 {
   EmpathyEventManagerPriv *priv = GET_PRIV (manager);
   EventPriv               *event;
+  gboolean auto_open_events;
 
   event = g_slice_new0 (EventPriv);
   event->public.contact = contact ? g_object_ref (contact) : NULL;
@@ -221,7 +222,14 @@ event_manager_add (EmpathyEventManager *manager,
 
   DEBUG ("Adding event %p", event);
   priv->events = g_slist_prepend (priv->events, event);
-  g_signal_emit (event->manager, signals[EVENT_ADDED], 0, event);
+
+  empathy_conf_get_bool (empathy_conf_get (),
+      EMPATHY_PREFS_UI_AUTO_OPEN_EVENTS, &auto_open_events);
+
+  if (auto_open_events)
+    empathy_event_activate (&event->public);
+  else
+    g_signal_emit (event->manager, signals[EVENT_ADDED], 0, event);
 
   if (!event->public.must_ack)
     {
@@ -1145,6 +1153,14 @@ empathy_event_activate (EmpathyEvent *event_public)
 
   g_return_if_fail (event_public != NULL);
 
+  if (event->approval->operation != NULL)
+    {
+      /* Set the time of the event which activated the EmpathyEvent as user
+       * action time */
+      empathy_dispatch_operation_set_user_action_time (
+          event->approval->operation, gtk_get_current_event_time ());
+    }
+
   if (event->func)
     event->func (event);
   else
diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c
index da67156..5da159f 100644
--- a/src/empathy-main-window.c
+++ b/src/empathy-main-window.c
@@ -1228,7 +1228,8 @@ empathy_main_window_show (void)
 	GSList                   *l;
 
 	if (main_window) {
-		empathy_window_present (GTK_WINDOW (main_window->window), TRUE);
+		empathy_window_present (GTK_WINDOW (main_window->window),
+			gtk_get_current_event_time ());
 		return main_window->window;
 	}
 
diff --git a/src/empathy-map-view.c b/src/empathy-map-view.c
index b7b3754..b34ebdd 100644
--- a/src/empathy-map-view.c
+++ b/src/empathy-map-view.c
@@ -349,7 +349,8 @@ empathy_map_view_show (void)
 
   if (window)
     {
-      empathy_window_present (GTK_WINDOW (window->window), TRUE);
+      empathy_window_present (GTK_WINDOW (window->window),
+          gtk_get_current_event_time ());
       return window->window;
     }
 
@@ -413,7 +414,8 @@ empathy_map_view_show (void)
   model = GTK_TREE_MODEL (window->list_store);
   gtk_tree_model_foreach (model, map_view_contacts_foreach, window);
 
-  empathy_window_present (GTK_WINDOW (window->window), TRUE);
+  empathy_window_present (GTK_WINDOW (window->window),
+      gtk_get_current_event_time ());
 
   /* Set up time updating loop */
   window->timeout_id = g_timeout_add_seconds (5,
diff --git a/src/empathy-preferences.c b/src/empathy-preferences.c
index 993cf77..d9bcb99 100644
--- a/src/empathy-preferences.c
+++ b/src/empathy-preferences.c
@@ -55,6 +55,7 @@ typedef struct {
 	GtkWidget *checkbutton_show_contacts_in_rooms;
 	GtkWidget *combobox_chat_theme;
 	GtkWidget *checkbutton_separate_chat_windows;
+	GtkWidget *checkbutton_auto_open_events;
 	GtkWidget *checkbutton_autoconnect;
 
 	GtkWidget *checkbutton_sounds_enabled;
@@ -212,6 +213,10 @@ preferences_setup_widgets (EmpathyPreferences *preferences)
 					  preferences->checkbutton_separate_chat_windows);
 
 	preferences_hookup_toggle_button (preferences,
+					  EMPATHY_PREFS_UI_AUTO_OPEN_EVENTS,
+					  preferences->checkbutton_auto_open_events);
+
+	preferences_hookup_toggle_button (preferences,
 					  EMPATHY_PREFS_CHAT_SHOW_SMILEYS,
 					  preferences->checkbutton_show_smileys);
 
@@ -1139,6 +1144,7 @@ empathy_preferences_show (GtkWindow *parent)
 		"checkbutton_show_contacts_in_rooms", &preferences->checkbutton_show_contacts_in_rooms,
 		"combobox_chat_theme", &preferences->combobox_chat_theme,
 		"checkbutton_separate_chat_windows", &preferences->checkbutton_separate_chat_windows,
+		"checkbutton_auto_open_events", &preferences->checkbutton_auto_open_events,
 		"checkbutton_autoconnect", &preferences->checkbutton_autoconnect,
 		"checkbutton_notifications_enabled", &preferences->checkbutton_notifications_enabled,
 		"checkbutton_notifications_disabled_away", &preferences->checkbutton_notifications_disabled_away,
diff --git a/src/empathy-preferences.ui b/src/empathy-preferences.ui
index 2e32fe9..3fcc25a 100644
--- a/src/empathy-preferences.ui
+++ b/src/empathy-preferences.ui
@@ -131,6 +131,22 @@
                                 <property name="position">1</property>
                               </packing>
                             </child>
+                            <child>
+                              <object class="GtkCheckButton" id="checkbutton_auto_open_events">
+                                <property name="label" translatable="yes">Automatically display events</property>
+                                <property name="tooltip_text" translatable="yes">If enabled, events such as new incoming chats or calls are automatically displayed without blinking on the status icon</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="use_underline">True</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
                           </object>
                         </child>
                       </object>
diff --git a/src/empathy-status-icon.c b/src/empathy-status-icon.c
index b137daf..9be7390 100644
--- a/src/empathy-status-icon.c
+++ b/src/empathy-status-icon.c
@@ -354,7 +354,8 @@ status_icon_set_visibility (EmpathyStatusIcon *icon,
 	if (!visible) {
 		empathy_window_iconify (priv->window, priv->icon);
 	} else {
-		empathy_window_present (GTK_WINDOW (priv->window), TRUE);
+		empathy_window_present (GTK_WINDOW (priv->window),
+			gtk_get_current_event_time ());
 	}
 }
 
diff --git a/src/empathy.c b/src/empathy.c
index ffb22a8..9203710 100644
--- a/src/empathy.c
+++ b/src/empathy.c
@@ -126,7 +126,8 @@ dispatch_cb (EmpathyDispatcher *dispatcher,
            * (a GtkNotebook) when we'll call empathy_chat_window_present_chat */
         }
 
-      empathy_chat_window_present_chat (chat);
+      empathy_chat_window_present_chat (chat,
+          empathy_dispatch_operation_get_user_action_time (operation));
 
       empathy_dispatch_operation_claim (operation);
     }
