diff --git a/libempathy-gtk/empathy-chat-text-view.c b/libempathy-gtk/empathy-chat-text-view.c
index c47b547..11bce5d 100644
--- a/libempathy-gtk/empathy-chat-text-view.c
+++ b/libempathy-gtk/empathy-chat-text-view.c
@@ -1153,14 +1153,59 @@ static void
 chat_text_view_copy_clipboard (EmpathyChatView *view)
 {
 	GtkTextBuffer *buffer;
+	GtkTextIter start, iter, end;
 	GtkClipboard  *clipboard;
+	GdkPixbuf *pixbuf;
+	gunichar c;
+	GtkTextChildAnchor *anchor = NULL;
+	GString *str;
+	GList *list;
+	gboolean flag_return = FALSE;
+
+	str = g_string_new ("");
 
 	g_return_if_fail (EMPATHY_IS_CHAT_TEXT_VIEW (view));
 
 	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
 	clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
 
-	gtk_text_buffer_copy_clipboard (buffer, clipboard);
+	if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
+		iter = start;
+		while ((c = gtk_text_iter_get_char (&iter)) != 0 &&
+			!gtk_text_iter_equal (&iter, &end)) {
+			if (c == 0xFFFC) {
+				flag_return = FALSE;
+				if ((pixbuf = gtk_text_iter_get_pixbuf (&iter))) {
+					gchar *text;
+					text = g_object_get_data (G_OBJECT(pixbuf),
+								  "smiley_str");
+					if (text)
+						str = g_string_append (str, text);
+				} else if ((anchor = gtk_text_iter_get_child_anchor (&iter))) {
+					gchar *text;
+					list = gtk_text_child_anchor_get_widgets (anchor);
+					if (list) {
+						text = g_object_get_data (G_OBJECT(list->data),
+									  "str_obj");
+						if (text)
+							str = g_string_append (str, text);
+					}
+					g_list_free (list);
+				}
+			} else if (c == '\n') {
+				if (!flag_return) {
+					flag_return = TRUE;
+					str = g_string_append_unichar (str, c);
+				}
+			} else {
+				flag_return = FALSE;
+				str = g_string_append_unichar (str, c);
+			}
+			gtk_text_iter_forward_char (&iter);
+		}
+	}
+
+	gtk_clipboard_set_text (clipboard, g_string_free (str, FALSE), -1);
 }
 
 static void
diff --git a/libempathy-gtk/empathy-smiley-manager.c b/libempathy-gtk/empathy-smiley-manager.c
index 900e921..0d3e4c5 100644
--- a/libempathy-gtk/empathy-smiley-manager.c
+++ b/libempathy-gtk/empathy-smiley-manager.c
@@ -245,6 +245,8 @@ smiley_manager_add_valist (EmpathySmileyManager *manager,
 	}
 
 	/* We give the ownership of path to the smiley */
+	g_object_set_data_full (G_OBJECT (pixbuf), "smiley_str",
+				g_strdup (first_str), g_free);
 	smiley = smiley_new (pixbuf, g_strdup (first_str), path);
 	priv->smileys = g_slist_prepend (priv->smileys, smiley);
 }
diff --git a/libempathy-gtk/empathy-theme-boxes.c b/libempathy-gtk/empathy-theme-boxes.c
index f522427..0c989ba 100644
--- a/libempathy-gtk/empathy-theme-boxes.c
+++ b/libempathy-gtk/empathy-theme-boxes.c
@@ -199,6 +199,7 @@ theme_boxes_maybe_append_header (EmpathyThemeBoxes *theme,
 	gboolean              color_set;
 	GtkTextTagTable      *table;
 	GtkTextTag           *tag;
+	GString              *str_obj;
 
 	contact = empathy_message_get_sender (msg);
 	name = empathy_contact_get_name (contact);
@@ -267,6 +268,12 @@ theme_boxes_maybe_append_header (EmpathyThemeBoxes *theme,
 			       "use-markup", TRUE,
 			       "xalign", 1.0,
 			       NULL);
+
+	str_obj = g_string_new ("\n- ");
+	str_obj = g_string_append (str_obj, name);
+	str_obj = g_string_append (str_obj, ", ");
+	str_obj = g_string_append (str_obj, tmp);
+	str_obj = g_string_append (str_obj, " -");
 	g_free (tmp);
 	g_free (str);
 
@@ -290,6 +297,10 @@ theme_boxes_maybe_append_header (EmpathyThemeBoxes *theme,
 	gtk_box_pack_start (GTK_BOX (box), label2, TRUE, TRUE, 0);
 
 	/* Add the header box to the text view */
+	g_object_set_data_full (G_OBJECT (box),
+				"str_obj",
+				g_string_free (str_obj, FALSE),
+				g_free);
 	gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (view),
 					   box,
 					   anchor);
