diff --git a/libempathy-gtk/empathy-new-message-dialog.c b/libempathy-gtk/empathy-new-message-dialog.c
index fc4c0f8..a29794e 100644
--- a/libempathy-gtk/empathy-new-message-dialog.c
+++ b/libempathy-gtk/empathy-new-message-dialog.c
@@ -32,9 +32,13 @@
 #include <libmissioncontrol/mission-control.h>
 
 #include <libempathy/empathy-contact-factory.h>
+#include <libempathy/empathy-contact-manager.h>
 #include <libempathy/empathy-dispatcher.h>
 #include <libempathy/empathy-utils.h>
 
+#define DEBUG_FLAG EMPATHY_DEBUG_CONTACT
+#include <libempathy/empathy-debug.h>
+
 #include <libempathy-gtk/empathy-ui-utils.h>
 
 #include "empathy-new-message-dialog.h"
@@ -47,19 +51,135 @@ typedef struct {
 	GtkWidget *entry_id;
 	GtkWidget *button_chat;
 	GtkWidget *button_call;
+        EmpathyContactManager *contact_manager;
 } EmpathyNewMessageDialog;
 
+enum {
+        EMPATHY_NEW_MESSAGE_COMPLETION_COL_TEXT = 0,
+        EMPATHY_NEW_MESSAGE_COMPLETION_COL_ID,
+        EMPATHY_NEW_MESSAGE_COMPLETION_COL_NAME,
+} EmpathyNewMessageCompletionCol;
+
+
+static void
+new_message_combobox_changed_cb(GtkComboBox             *widget,
+                                EmpathyNewMessageDialog *dialog)
+{
+        McAccount   *account;
+        EmpathyTpContactList *contact_list;
+        GList *members, *l;
+        GtkListStore *model;
+        GtkTreeIter iter;
+        gchar *tmpstr;
+
+        account = empathy_account_chooser_get_account (EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser));
+        contact_list =  empathy_contact_manager_get_list (dialog->contact_manager, account);
+        members = empathy_contact_list_get_members(EMPATHY_CONTACT_LIST(contact_list));
+        model = GTK_LIST_STORE(gtk_entry_completion_get_model(gtk_entry_get_completion(GTK_ENTRY(dialog->entry_id))));
+        gtk_list_store_clear(model);
+
+        for(l = members; l; l = l->next) {
+                if(strcmp(empathy_contact_get_status(l->data), "Offline")) {
+                        tmpstr = g_strdup_printf("%s \"%s\"", empathy_contact_get_id (l->data), empathy_contact_get_name (l->data));
+                        gtk_list_store_append(model, &iter);
+                        gtk_list_store_set( model, &iter,
+                                EMPATHY_NEW_MESSAGE_COMPLETION_COL_TEXT,    tmpstr,
+                                EMPATHY_NEW_MESSAGE_COMPLETION_COL_ID,      empathy_contact_get_id(l->data),
+                                EMPATHY_NEW_MESSAGE_COMPLETION_COL_NAME,    empathy_contact_get_name (l->data),
+                                -1);
+                        DEBUG ("Adding contact ID %s, Name %s, Status %s", empathy_contact_get_id(l->data),
+                                empathy_contact_get_name (l->data), empathy_contact_get_status(l->data));
+                        g_free(tmpstr);
+                }
+        }
+        g_object_unref (account);
+}
+
+static gboolean
+new_message_match_selected_cb (GtkEntryCompletion *widget,
+                               GtkTreeModel       *model,
+                               GtkTreeIter        *iter,
+                               EmpathyNewMessageDialog *dialog)
+{
+        GtkEntry *entry = GTK_ENTRY(dialog->entry_id);
+        gchar *id;
+        GValue gvalue = {0, };
+
+        if(!(iter && model)){
+                DEBUG ("iter & model are NULL");
+                return FALSE;
+        }
+        gtk_tree_model_get_value(model, iter, EMPATHY_NEW_MESSAGE_COMPLETION_COL_ID, &gvalue);
+        id = g_strdup(g_value_get_string(&gvalue));
+        g_value_unset(&gvalue);
+        gtk_entry_set_text(entry,id);
+        DEBUG ("Got selected match **%s**", id); 
+        g_free(id);
+        return TRUE;
+}
+
+static gboolean
+new_message_completion_match_func(GtkEntryCompletion *completion,
+                                  const gchar *key,
+                                  GtkTreeIter *iter,
+                                  gpointer user_data)
+{
+        gchar *id, *name;
+        gchar *pattern;
+        GtkTreeModel *model;
+        GValue gvalue = {0, };
+        gboolean match = FALSE;
+        GRegex *regex;
+
+
+        model = gtk_entry_completion_get_model (completion);
+        if(! (model && iter)){
+                return FALSE;
+        }
+
+        pattern = g_strdup_printf(".*%s.*", key);
+        regex = g_regex_new (pattern, G_REGEX_CASELESS, 0, NULL);
+
+        gtk_tree_model_get_value(model, iter, EMPATHY_NEW_MESSAGE_COMPLETION_COL_NAME, &gvalue);
+        name = g_strdup(g_value_get_string(&gvalue));
+        g_value_unset(&gvalue);
+
+        if(g_regex_match (regex, name, 0, NULL)){
+                match = TRUE;
+                DEBUG ("Key %s is matching name **%s**", key, name);
+                g_free(name);
+                goto new_message_completion_match_func_end;
+        }
+
+        gtk_tree_model_get_value(model, iter, EMPATHY_NEW_MESSAGE_COMPLETION_COL_ID, &gvalue);
+        id = g_strdup(g_value_get_string(&gvalue));
+        g_value_unset(&gvalue);
+
+        if(g_regex_match (regex, id, 0, NULL)){
+                DEBUG ("Key %s is matching ID **%s**", key, id);
+                match = TRUE;
+                g_free(id);
+        }
+
+new_message_completion_match_func_end:
+
+
+        g_free(pattern);
+        g_regex_unref (regex);
+        return match;
+}
+
+
 static void
 new_message_dialog_response_cb (GtkWidget               *widget,
 				gint                    response,
 				EmpathyNewMessageDialog *dialog)
 {
 	McAccount   *account;
-	const gchar *id;
-
+	const gchar *entry;
 	account = empathy_account_chooser_get_account (EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser));
-	id = gtk_entry_get_text (GTK_ENTRY (dialog->entry_id));
-	if (!account || G_STR_EMPTY (id)) {
+	entry = gtk_entry_get_text (GTK_ENTRY (dialog->entry_id));
+	if (!account || G_STR_EMPTY (entry)) {
 		if (account) {
 			g_object_unref (account);
 		}
@@ -67,11 +187,11 @@ new_message_dialog_response_cb (GtkWidget               *widget,
 		return;
 	}
 
-	if (response == 1) {
-		empathy_dispatcher_call_with_contact_id (account, id);
+        if (response == 1) {
+		empathy_dispatcher_call_with_contact_id (account, entry);
 	}	
 	else if (response == 2) {
-		empathy_dispatcher_chat_with_contact_id (account, id);
+		empathy_dispatcher_chat_with_contact_id (account, entry);
 	}
 
 	g_object_unref (account);
@@ -105,6 +225,9 @@ empathy_new_message_dialog_show (GtkWindow *parent)
 	static EmpathyNewMessageDialog *dialog = NULL;
 	GladeXML                       *glade;
 	gchar                          *filename;
+        GtkComboBox                    *combobox;
+        GtkEntryCompletion             *completion;
+        GtkListStore                   *model;
 
 	if (dialog) {
 		gtk_window_present (GTK_WINDOW (dialog->dialog));
@@ -113,7 +236,10 @@ empathy_new_message_dialog_show (GtkWindow *parent)
 
 	dialog = g_new0 (EmpathyNewMessageDialog, 1);
 
-	filename = empathy_file_lookup ("empathy-new-message-dialog.glade",
+        /* create a contact manager */
+        dialog->contact_manager = empathy_contact_manager_new();
+
+        filename = empathy_file_lookup ("empathy-new-message-dialog.glade",
 					"libempathy-gtk");
 	glade = empathy_glade_get_file (filename,
 				        "new_message_dialog",
@@ -126,7 +252,20 @@ empathy_new_message_dialog_show (GtkWindow *parent)
 				        NULL);
 	g_free (filename);
 
-	empathy_glade_connect (glade,
+        /* text completion */
+        completion = gtk_entry_completion_new();
+        model = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+        gtk_entry_completion_set_text_column(completion, EMPATHY_NEW_MESSAGE_COMPLETION_COL_TEXT);
+        gtk_entry_completion_set_match_func(completion, new_message_completion_match_func, NULL, NULL);
+        gtk_entry_set_completion(GTK_ENTRY(dialog->entry_id), completion);
+        gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(model));
+        g_signal_connect(completion,
+                         "match-selected",
+                         G_CALLBACK (new_message_match_selected_cb),
+                         dialog);
+        gtk_widget_show_all(dialog->entry_id);
+
+        empathy_glade_connect (glade,
 			       dialog,
 			       "new_message_dialog", "destroy", new_message_dialog_destroy_cb,
 			       "new_message_dialog", "response", new_message_dialog_response_cb,
@@ -135,10 +274,16 @@ empathy_new_message_dialog_show (GtkWindow *parent)
 
 	g_object_add_weak_pointer (G_OBJECT (dialog->dialog), (gpointer) &dialog);
 
+  
 	g_object_unref (glade);
-
+  
 	/* Create account chooser */
 	dialog->account_chooser = empathy_account_chooser_new ();
+        combobox =  &((EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser))->parent);
+        g_signal_connect( combobox, 
+                          "changed", 
+                          G_CALLBACK (new_message_combobox_changed_cb), 
+                          dialog);
 	gtk_table_attach_defaults (GTK_TABLE (dialog->table_contact),
 				   dialog->account_chooser,
 				   1, 2, 0, 1);
@@ -147,11 +292,17 @@ empathy_new_message_dialog_show (GtkWindow *parent)
 					    NULL);
 	gtk_widget_show (dialog->account_chooser);
 
+
+        /* Force init of entrycompletion */
+        new_message_combobox_changed_cb(combobox, dialog);
+
 	if (parent) {
 		gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog),
 					      GTK_WINDOW (parent));
 	}
 
+        g_object_unref(completion);
+        g_object_unref(model);
 	gtk_widget_set_sensitive (dialog->button_chat, FALSE);
 	gtk_widget_set_sensitive (dialog->button_call, FALSE);
 
