diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index a8ca745..21f2085 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -23,6 +23,7 @@
  *          Martyn Russell <martyn@imendio.com>
  *          Geert-Jan Van den Bogaerde <geertjan@gnome.org>
  *          Xavier Claessens <xclaesse@gmail.com>
+ *          Romulo Fernandes <abra185@yahoo.com>
  */
 
 #include <config.h>
@@ -77,6 +78,7 @@ typedef struct {
 	gint               sent_messages_index;
 	GList             *compositors;
 	GCompletion       *completion;
+	GList             *lastCompleted;
 	guint              composing_stop_timeout_id;
 	guint              block_events_timeout_id;
 	TpHandleType       handle_type;
@@ -691,6 +695,17 @@ chat_input_key_press_event_cb (GtkWidget   *widget,
 
 	priv = GET_PRIV (chat);
 
+	/* Catch keys different then TAB and Space to clean auto-complete list */
+	if (!(event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) &&
+	    (event->keyval != GDK_Tab &&
+		  event->keyval != GDK_space)) {
+
+		if (priv->lastCompleted) {
+			g_list_free (priv->lastCompleted);
+			priv->lastCompleted = NULL;
+		}
+	}
+
 	/* Catch ctrl+up/down so we can traverse messages we sent */
 	if ((event->state & GDK_CONTROL_MASK) &&
 	    (event->keyval == GDK_Up ||
@@ -775,10 +790,63 @@ chat_input_key_press_event_cb (GtkWidget   *widget,
 		gtk_text_iter_backward_word_start (&start);
 		is_start_of_buffer = gtk_text_iter_is_start (&start);
 
+		nick = gtk_text_buffer_get_text (buffer, &start, &current, FALSE);
+
+		if (priv->lastCompleted)
+		{
+			const gchar *name = NULL;
+			gchar       *complete_char = NULL;
+			GList       *iter = NULL;
+	
+			for (iter = priv->lastCompleted; iter != NULL; iter = iter->next) {
+				name = empathy_contact_get_name (iter->data);
+
+				if (!strncmp(nick, name, strlen(name)))
+					break;
+			}
+
+			// Free unused data
+			g_free (nick);
+
+			// Reset name
+			name = NULL;
+
+			if (iter && iter->next) {
+				// This is not the last iterator
+				name = empathy_contact_get_name (iter->next->data);
+			} else {
+				// We are the last iterator
+				name = empathy_contact_get_name (priv->lastCompleted->data);
+			}
+
+			gtk_text_buffer_delete (buffer, &start, &current);
+			gtk_text_buffer_insert_at_cursor (buffer, name, strlen (name));
+				
+			if (is_start_of_buffer &&
+				(empathy_conf_get_string (empathy_conf_get (),
+					 EMPATHY_PREFS_CHAT_NICK_COMPLETION_CHAR,
+					 &complete_char)) &&
+				complete_char != NULL) {
+
+				gtk_text_buffer_insert_at_cursor (buffer,
+						complete_char,
+						strlen (complete_char));
+					
+				g_free (complete_char);
+				
+			} else if (is_start_of_buffer) {
+				// Use standard ":"
+				gtk_text_buffer_insert_at_cursor (buffer, ":", 1);
+			}
+
+			gtk_text_buffer_insert_at_cursor (buffer, " ", 1);
+		
+			return TRUE;
+		}
+
 		list = empathy_contact_list_get_members (EMPATHY_CONTACT_LIST (priv->tp_chat));
 		g_completion_add_items (priv->completion, list);
 
-		nick = gtk_text_buffer_get_text (buffer, &start, &current, FALSE);
 		completed_list = g_completion_complete (priv->completion,
 							nick,
 							&completed);
@@ -786,48 +854,90 @@ chat_input_key_press_event_cb (GtkWidget   *widget,
 		g_free (nick);
 
 		if (completed) {
-			guint        len;
-			const gchar *text;
-			gchar       *complete_char = NULL;
+			guint len;
 
 			gtk_text_buffer_delete (buffer, &start, &current);
-
 			len = g_list_length (completed_list);
+				
+			if (len >= 6) {
+				/**
+				 * If we have 6 or more names, print them on the
+				 * chat window. Fixes #575670
+				 */
+
+				GList* iter;
+				GString* nickNames = g_string_new (NULL);
+
+				for (iter = completed_list; iter != NULL; iter = iter->next) {
+					const gchar *name = empathy_contact_get_name (iter->data);
+
+					g_string_append (nickNames, name);
+					
+					if (iter->next) {
+						g_string_append_c (nickNames, ' ');
+					}
+				}
+
+				empathy_chat_view_append_event (chat->view, nickNames->str);
+				g_string_free (nickNames, TRUE);
+			
+				gtk_text_buffer_insert_at_cursor (buffer, completed, strlen (completed));
+			
+				if (priv->lastCompleted) {
+					g_list_free (priv->lastCompleted);
+					priv->lastCompleted = NULL;
+				}
 
-			if (len == 1) {
+			} else {
 				/* If we only have one hit, use that text
 				 * instead of the text in completed since the
 				 * completed text will use the typed string
 				 * which might be cased all wrong.
 				 * Fixes #120876
 				 * */
-				text = empathy_contact_get_name (completed_list->data);
-			} else {
-				text = completed;
-			}
-
-			gtk_text_buffer_insert_at_cursor (buffer, text, strlen (text));
+				const gchar *text = empathy_contact_get_name (completed_list[0].data);
+				gchar       *complete_char = NULL;
+			    
+				gtk_text_buffer_insert_at_cursor (buffer, text, strlen (text));
+
+				empathy_conf_get_string (empathy_conf_get (),
+						EMPATHY_PREFS_CHAT_NICK_COMPLETION_CHAR,
+						&complete_char);
+
+				if (complete_char && is_start_of_buffer) {
+					gtk_text_buffer_insert_at_cursor (buffer,
+							complete_char,
+							strlen (complete_char));
+
+					g_free (complete_char);
+				} else if (is_start_of_buffer) {
+					/**
+					 * Use standard ":"
+					 */
+					gtk_text_buffer_insert_at_cursor (buffer, ":", 1);
+				}
 
-			if (len == 1 && is_start_of_buffer &&
-			    empathy_conf_get_string (empathy_conf_get (),
-						     EMPATHY_PREFS_CHAT_NICK_COMPLETION_CHAR,
-						     &complete_char) &&
-			    complete_char != NULL) {
-				gtk_text_buffer_insert_at_cursor (buffer,
-								  complete_char,
-								  strlen (complete_char));
 				gtk_text_buffer_insert_at_cursor (buffer, " ", 1);
-				g_free (complete_char);
-			}
 
-			g_free (completed);
+				if (len != 1) {
+					priv->lastCompleted = g_list_copy(completed_list);
+				}
+			}
+				
+		} else {
+			/**
+			 * didnt completed anything.
+			 */
+			g_list_free (priv->lastCompleted);
+			priv->lastCompleted = NULL;
 		}
-
+				
+		/* Clean up */
 		g_completion_clear_items (priv->completion);
-
+		g_free (completed);
 		g_list_foreach (list, (GFunc) g_object_unref, NULL);
 		g_list_free (list);
-
+		
 		return TRUE;
 	}
 
@@ -1579,6 +1689,11 @@ chat_finalize (GObject *object)
 	g_free (priv->subject);
 	g_completion_free (priv->completion);
 
+	if (priv->lastCompleted) {
+		g_list_free (priv->lastCompleted);
+		priv->lastCompleted = NULL;
+	}
+
 	G_OBJECT_CLASS (empathy_chat_parent_class)->finalize (object);
 }
 
@@ -1726,6 +1841,7 @@ empathy_chat_init (EmpathyChat *chat)
 
 	/* Add nick name completion */
 	priv->completion = g_completion_new ((GCompletionFunc) empathy_contact_get_name);
+	priv->lastCompleted = NULL;
 	g_completion_set_compare (priv->completion, chat_contacts_completion_func);
 }
 
