diff --git a/src/conversation_textview.py b/src/conversation_textview.py
index d2590bf2ee0d04ed9001e029c2029d7cfe25a141..03fc4914ff462c49882aac64c42172d58ce28ed7 100644
--- a/src/conversation_textview.py
+++ b/src/conversation_textview.py
@@ -405,7 +405,7 @@ def hyperlink_handler(self, texttag, widget, event, iter, kind):
 				# we launch the correct application
 				helpers.launch_browser_mailer(kind, word)
 
-	def detect_and_print_special_text(self, otext, jid, other_tags):
+	def detect_and_print_special_text(self, otext, other_tags):
 		'''detects special text (emots & links & formatting)
 		prints normal text before any special text it founts,
 		then print special text (that happens many times until
@@ -581,16 +581,33 @@ def print_conversation_line(self, text, jid, kind, name, tim,
 				tim_format = time.strftime('%H:%M', tim)
 				buffer.insert_with_tags_by_name(end_iter, tim_format + '\n',
 					'time_sometimes')
-
+		other_text_tag = self.detect_other_text_tag(text, kind)
 		text_tags = other_tags_for_text[:] # create a new list
+		if other_text_tag:
+			text_tags.append(other_text_tag)
+		else: # not status nor /me
+			self.print_name(name, kind, other_tags_for_name)
+		self.print_subject(subject)
+		self.print_real_text(text, text_tags, name)
+
+		# scroll to the end of the textview
+		if at_the_end or kind == 'outgoing':
+			# we are at the end or we are sending something
+			# scroll to the end (via idle in case the scrollbar has appeared)
+			gobject.idle_add(self.scroll_to_end)
+
+		buffer.end_user_action()
+
+	def detect_other_text_tag(self, text, kind):
 		if kind == 'status':
-			text_tags.append(kind)
+			return kind
 		elif text.startswith('/me ') or text.startswith('/me\n'):
-			text = '* ' + name + text[3:]
-			text_tags.append(kind)
+			return kind
 
-		if name and len(text_tags) == len(other_tags_for_text):
-			# not status nor /me
+	def print_name(self, name, kind, other_tags_for_name):
+		if name:
+			buffer = self.get_buffer()
+			end_iter = buffer.get_end_iter()
 			name_tags = other_tags_for_name[:] # create a new list
 			name_tags.append(kind)
 			before_str = gajim.config.get('before_nickname')
@@ -598,23 +615,23 @@ def print_conversation_line(self, text, jid, kind, name, tim,
 			format = before_str + name + after_str + ' '
 			buffer.insert_with_tags_by_name(end_iter, format, *name_tags)
 
+	def print_subject(self, subject):
 		if subject: # if we have subject, show it too!
 			subject = _('Subject: %s\n') % subject
+			buffer = self.get_buffer()
 			end_iter = buffer.get_end_iter()
 			buffer.insert(end_iter, subject)
 			self.print_empty_line()
 
+	def print_real_text(self, text, text_tags = [], name = None):
+		'''/me is replaces by name if name is given'''
+		buffer = self.get_buffer()
 		# detect urls formatting and if the user has it on emoticons
-		index = self.detect_and_print_special_text(text, jid, text_tags)
+		if name and text.startswith('/me ') or text.startswith('/me\n'):
+			text = '* ' + name + text[3:]
+		index = self.detect_and_print_special_text(text, text_tags)
 
 		# add the rest of text located in the index and after
 		end_iter = buffer.get_end_iter()
 		buffer.insert_with_tags_by_name(end_iter, text[index:], *text_tags)
 
-		# scroll to the end of the textview
-		if at_the_end or kind == 'outgoing':
-			# we are at the end or we are sending something
-			# scroll to the end (via idle in case the scrollbar has appeared)
-			gobject.idle_add(self.scroll_to_end)
-
-		buffer.end_user_action()