diff --git a/libedataserverui/e-name-selector-entry.c b/libedataserverui/e-name-selector-entry.c
index fbb2149..9c33eb3 100644
--- a/libedataserverui/e-name-selector-entry.c
+++ b/libedataserverui/e-name-selector-entry.c
@@ -80,12 +80,28 @@ G_DEFINE_TYPE (ENameSelectorEntry, e_name_selector_entry, GTK_TYPE_ENTRY)
 /* 1/3 of the second to wait until invoking autocomplete lookup */
 #define AUTOCOMPLETE_TIMEOUT 333
 
-#define re_set_timeout(id,func,ptr)			\
-	if (id)						\
-		g_source_remove (id);			\
-	id = g_timeout_add (AUTOCOMPLETE_TIMEOUT,	\
+#define re_set_timeout(id,func,ptr,prop)						\
+	if (id)										\
+		g_source_remove (id);							\
+	g_object_set_data (G_OBJECT (ptr), prop, GINT_TO_POINTER (g_main_depth ()));	\
+	id = g_timeout_add (AUTOCOMPLETE_TIMEOUT,					\
 			    (GSourceFunc) func, ptr);
 
+static gboolean
+can_receive_timeout (ENameSelectorEntry *name_selector_entry, const gchar *prop_name)
+{
+	gint stored_depth;
+
+	g_return_val_if_fail (name_selector_entry != NULL, FALSE);
+	g_return_val_if_fail (prop_name != NULL, FALSE);
+
+	stored_depth = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (name_selector_entry), prop_name));
+	if (stored_depth <= 0)
+		stored_depth = 1;
+
+	return g_main_depth () <= stored_depth;
+}
+
 static void destination_row_inserted (ENameSelectorEntry *name_selector_entry, GtkTreePath *path, GtkTreeIter *iter);
 static void destination_row_changed  (ENameSelectorEntry *name_selector_entry, GtkTreePath *path, GtkTreeIter *iter);
 static void destination_row_deleted  (ENameSelectorEntry *name_selector_entry, GtkTreePath *path);
@@ -1009,6 +1025,10 @@ update_completion_model (ENameSelectorEntry *name_selector_entry)
 static gboolean
 type_ahead_complete_on_timeout_cb (ENameSelectorEntry *name_selector_entry)
 {
+	/* repeat the request till the previous one is done */
+	if (!can_receive_timeout (name_selector_entry, "type-ahead-complete-maindepth"))
+		return TRUE;
+
 	type_ahead_complete (name_selector_entry);
 	name_selector_entry->priv->type_ahead_complete_cb_id = 0;
 	return FALSE;
@@ -1017,6 +1037,10 @@ type_ahead_complete_on_timeout_cb (ENameSelectorEntry *name_selector_entry)
 static gboolean
 update_completions_on_timeout_cb (ENameSelectorEntry *name_selector_entry)
 {
+	/* repeat the request till the previous one is done */
+	if (!can_receive_timeout (name_selector_entry, "update-completion-maindepth"))
+		return TRUE;
+
 	update_completion_model (name_selector_entry);
 	name_selector_entry->priv->update_completions_cb_id = 0;
 	return FALSE;
@@ -1310,8 +1334,8 @@ user_insert_text (ENameSelectorEntry *name_selector_entry, gchar *new_text,
 
 	if (chars_inserted >= 1) {
 		/* If the user inserted one character, kick off completion */
-		re_set_timeout (name_selector_entry->priv->update_completions_cb_id,  update_completions_on_timeout_cb,  name_selector_entry);
-		re_set_timeout (name_selector_entry->priv->type_ahead_complete_cb_id, type_ahead_complete_on_timeout_cb, name_selector_entry);
+		re_set_timeout (name_selector_entry->priv->update_completions_cb_id,  update_completions_on_timeout_cb,  name_selector_entry, "update-completion-maindepth");
+		re_set_timeout (name_selector_entry->priv->type_ahead_complete_cb_id, type_ahead_complete_on_timeout_cb, name_selector_entry, "type-ahead-complete-maindepth");
 	}
 
 	g_signal_handlers_unblock_by_func (name_selector_entry, user_delete_text, name_selector_entry);
@@ -1349,7 +1373,7 @@ user_delete_text (ENameSelectorEntry *name_selector_entry, gint start_pos, gint
 
 	if (end_pos - start_pos == 1) {
 		/* Might be backspace; update completion model so dropdown is accurate */
-		re_set_timeout (name_selector_entry->priv->update_completions_cb_id, update_completions_on_timeout_cb, name_selector_entry);
+		re_set_timeout (name_selector_entry->priv->update_completions_cb_id, update_completions_on_timeout_cb, name_selector_entry, "update-completion-maindepth");
 	}
 
 	index_start = get_index_at_position (text, start_pos);
@@ -1936,7 +1960,7 @@ generate_contact_rows (EContactStore *contact_store, GtkTreeIter *iter,
 static void
 ensure_type_ahead_complete_on_timeout (ENameSelectorEntry *name_selector_entry)
 {
-	re_set_timeout (name_selector_entry->priv->type_ahead_complete_cb_id, type_ahead_complete_on_timeout_cb, name_selector_entry);
+	re_set_timeout (name_selector_entry->priv->type_ahead_complete_cb_id, type_ahead_complete_on_timeout_cb, name_selector_entry, "type-ahead-complete-maindepth");
 }
 
 static void
