diff --git a/libempathy-gtk/empathy-new-message-dialog.c b/libempathy-gtk/empathy-new-message-dialog.c
index fc4c0f8..1c3d7ef 100644
--- a/libempathy-gtk/empathy-new-message-dialog.c
+++ b/libempathy-gtk/empathy-new-message-dialog.c
@@ -32,6 +32,7 @@
 #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>
 
@@ -47,33 +48,88 @@ typedef struct {
 	GtkWidget *entry_id;
 	GtkWidget *button_chat;
 	GtkWidget *button_call;
+  EmpathyContactManager *contact_manager;
 } EmpathyNewMessageDialog;
 
 static void
+new_message_combobox_changed_cb(GtkComboBox             *widget,
+        EmpathyNewMessageDialog *dialog)
+{
+  McAccount   *account;
+  EmpathyTpContactList *contact_list;
+  GList *members, *l;
+  GtkListStore *model;
+  GtkTreeIter iter;
+
+  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"))
+      {
+          gtk_list_store_append(model, &iter);
+          gtk_list_store_set( model, &iter, 0, empathy_contact_get_name (l->data), 1, empathy_contact_get_id(l->data), -1);
+      }
+  }
+}
+
+static void
 new_message_dialog_response_cb (GtkWidget               *widget,
 				gint                    response,
 				EmpathyNewMessageDialog *dialog)
 {
 	McAccount   *account;
-	const gchar *id;
+	const gchar *name;
+  gchar *id = NULL;
+  GtkTreeModel *model ;
+  GtkTreeIter iter;
 
 	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)) {
+	name = gtk_entry_get_text (GTK_ENTRY (dialog->entry_id));
+	if (!account || G_STR_EMPTY (name)) {
 		if (account) {
 			g_object_unref (account);
 		}
 		gtk_widget_destroy (widget);
 		return;
 	}
-
-	if (response == 1) {
+  
+  model = GTK_TREE_MODEL(gtk_entry_completion_get_model(gtk_entry_get_completion(GTK_ENTRY(dialog->entry_id))));  
+  //lookup for contact id
+  if(gtk_tree_model_get_iter_first(model, &iter))
+  {
+    GValue val = {0, };
+    do{
+      gtk_tree_model_get_value(model, &iter, 0, &val);
+      if(strcmp(name, g_value_get_string(&val)) == 0)
+      {
+        g_value_unset(&val);
+        gtk_tree_model_get_value(model, &iter, 1, &val);
+        id = g_strdup(g_value_get_string(&val));
+      }
+      g_value_unset(&val);
+    }while(gtk_tree_model_iter_next(model, &iter));
+  }
+  if(G_STR_EMPTY(id))
+  {
+    g_free(id);
+    g_object_unref (account);
+    gtk_widget_destroy (widget);
+    return;
+  }
+  if (response == 1) {
 		empathy_dispatcher_call_with_contact_id (account, id);
 	}	
 	else if (response == 2) {
 		empathy_dispatcher_chat_with_contact_id (account, id);
 	}
 
+  if(id)
+    g_free(id);
 	g_object_unref (account);
 	gtk_widget_destroy (widget);
 }
@@ -105,6 +161,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 +172,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,6 +188,13 @@ empathy_new_message_dialog_show (GtkWindow *parent)
 				        NULL);
 	g_free (filename);
 
+  /* text completion */
+  completion = gtk_entry_completion_new();
+  model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+  gtk_entry_completion_set_text_column(completion, 0);
+  gtk_entry_set_completion(GTK_ENTRY(dialog->entry_id), completion);
+  gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(model));
+  gtk_widget_show_all(dialog->entry_id);
 	empathy_glade_connect (glade,
 			       dialog,
 			       "new_message_dialog", "destroy", new_message_dialog_destroy_cb,
@@ -135,10 +204,14 @@ 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,6 +220,10 @@ 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));
