diff --git a/src/chat_control.py b/src/chat_control.py
index 002f7cb8c8418a6411a88221e07a482f757ff842..b130d2f8647a03def2f799de3b3fe61c865fbfc4 100644
--- a/src/chat_control.py
+++ b/src/chat_control.py
@@ -927,9 +927,8 @@ class ChatControlBase(MessageControl):
 			if contact:
 				gajim.interface.roster.draw_contact(room_jid, self.account)
 			groupchat_control.draw_contact(nick)
-			mw = gajim.interface.msg_win_mgr.get_gc_window(room_jid, self.account)
-			if mw:
-				mw.redraw_tab(groupchat_control)
+			if groupchat_control.parent_win:
+				groupchat_control.parent_win.redraw_tab(groupchat_control)
 		else:
 			gajim.interface.roster.draw_contact(jid, self.account)
 			gajim.interface.roster.show_title()
diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py
index 3e9fece1975bd869e9b4d386bcc5cad872a3c6a0..11629328ecbd12e3308ae6ac4e013f985e083c76 100644
--- a/src/common/connection_handlers.py
+++ b/src/common/connection_handlers.py
@@ -1029,7 +1029,7 @@ class ConnectionVcard:
 			gajim.interface.remove_avatar_files(our_jid)
 
 		self.awaiting_answers[id] = (VCARD_PUBLISHED, iq2)
-	
+
 	def _IqCB(self, con, iq_obj):
 		id = iq_obj.getID()
 
@@ -1081,6 +1081,7 @@ class ConnectionVcard:
 			our_jid = gajim.get_jid_from_account(self.name)
 			if iq_obj.getType() == 'error' and jid == our_jid:
 				# our server doesn't support vcard
+				gajim.log.debug('xxx error xxx')
 				self.vcard_supported = False
 			if not iq_obj.getTag('vCard') or iq_obj.getType() == 'error':
 				if frm and frm != our_jid:
diff --git a/src/gajim.py b/src/gajim.py
index 09bab6b89a06faa255413d72662cbafe67a24e20..046792cc6d34be89fceb20326e894eecade21bd3 100755
--- a/src/gajim.py
+++ b/src/gajim.py
@@ -727,7 +727,7 @@ class Interface:
 		full_jid_with_resource = array[0]
 		jids = full_jid_with_resource.split('/', 1)
 		jid = jids[0]
-		gc_control = self.msg_win_mgr.get_control(jid, account)
+		gc_control = self.msg_win_mgr.get_gc_control(jid, account)
 		if not gc_control and \
 		jid in self.minimized_controls[account]:
 			gc_control = self.minimized_controls[account][jid]
diff --git a/src/groupchat_control.py b/src/groupchat_control.py
index 61def83457e1518b905a5c46d92c666ec60e0873..88862e5c4dcaf04e65c8c6465f4f35d025148172 100644
--- a/src/groupchat_control.py
+++ b/src/groupchat_control.py
@@ -121,7 +121,7 @@ class PrivateChatControl(ChatControl):
 
 	def __init__(self, parent_win, gc_contact, contact, account, session):
 		room_jid = contact.jid.split('/')[0]
-		room_ctrl = gajim.interface.msg_win_mgr.get_control(room_jid, account)
+		room_ctrl = gajim.interface.msg_win_mgr.get_gc_control(room_jid, account)
 		if gajim.interface.minimized_controls[account].has_key(room_jid):
 			room_ctrl = gajim.interface.minimized_controls[account][room_jid]
 		self.room_name = room_ctrl.name
@@ -448,9 +448,9 @@ class GroupchatControl(ChatControlBase):
 					'state_muc_msg_color')
 		if color_name:
 			color = gtk.gdk.colormap_get_system().alloc_color(color_name)
-			
+
 		label_str = self.name
-		
+
 		# count waiting highlighted messages
 		unread = ''
 		num_unread = self.get_nb_unread()
@@ -604,9 +604,11 @@ class GroupchatControl(ChatControlBase):
 		no_queue = len(gajim.events.get_events(self.account, fjid)) == 0
 
 		# We print if window is opened
-		pm_control = gajim.interface.msg_win_mgr.get_control(fjid, self.account)
+		pm_control = gajim.interface.msg_win_mgr.get_control(fjid, self.account, session)
+
 		if pm_control:
 			pm_control.print_conversation(msg, tim = tim, xhtml = xhtml)
+
 			return
 
 		event = gajim.events.create_event('pm', (msg, '', 'incoming', tim,
@@ -883,7 +885,7 @@ class GroupchatControl(ChatControlBase):
 
 	def on_send_pm(self, widget = None, model = None, iter = None, nick = None,
 	msg = None):
-		'''opens a chat window and msg is not None sends private message to a
+		'''opens a chat window and if msg is not None sends private message to a
 		contact in a room'''
 		if nick is None:
 			nick = model[iter][C_NICK].decode('utf-8')
@@ -1603,7 +1605,7 @@ class GroupchatControl(ChatControlBase):
 		for nick in nick_list:
 			# Update pm chat window
 			fjid = self.room_jid + '/' + nick
-			ctrl = gajim.interface.msg_win_mgr.get_control(fjid, self.account)
+			ctrl = gajim.interface.msg_win_mgr.get_gc_control(fjid, self.account)
 			if ctrl:
 				contact = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick)
 				contact.show = 'offline'
@@ -2033,7 +2035,10 @@ class GroupchatControl(ChatControlBase):
 		if not win:
 			gajim.interface.roster.new_private_chat(gc_c, self.account)
 			win = gajim.interface.msg_win_mgr.get_window(nick_jid, self.account)
-		win.set_active_tab(nick_jid, self.account)
+
+		ctrl = win.get_controls(nick_jid, self.account)[0]
+
+		win.set_active_tab(ctrl)
 		win.window.present()
 
 	def on_row_activated(self, widget, path):
diff --git a/src/roster_window.py b/src/roster_window.py
index 315683761819bc801c1e064a4319b223897f106f..0af45b8ec9a3b984b3984e8bb8cd0ec3f043d59d 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -3927,6 +3927,9 @@ class RosterWindow:
 		if not mw:
 			mw = gajim.interface.msg_win_mgr.create_window(contact, account, type_)
 
+		if not session:
+			session = gajim.connections[account].get_session(fjid, None, 'pm')
+
 		chat_control = PrivateChatControl(mw, gc_contact, contact, account, session)
 		mw.new_tab(chat_control)
 		if len(gajim.events.get_events(account, fjid)):
diff --git a/src/session.py b/src/session.py
index 1f11450b37938ba59e7144264194899e4e88fc81..cfeb407bd9db671987cb6b22df7572a28b7b1fe7 100644
--- a/src/session.py
+++ b/src/session.py
@@ -107,19 +107,18 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession):
 		if gajim.jid_is_transport(jid):
 			jid = jid.replace('@', '')
 
-		#groupchat_control = gajim.interface.msg_win_mgr.get_control(jid, self.conn.name)
+		groupchat_control = gajim.interface.msg_win_mgr.get_gc_control(jid, self.conn.name)
 
-# XXX fixme
-#		if not groupchat_control and \
-#		jid in gajim.interface.minimized_controls[self.conn.name]:
-#			groupchat_control = self.minimized_controls[self.conn.name][jid]
+		if not groupchat_control and \
+		jid in gajim.interface.minimized_controls[self.conn.name]:
+			groupchat_control = self.minimized_controls[self.conn.name][jid]
 
 		pm = False
-#		if groupchat_control and groupchat_control.type_id == \
-#		message_control.TYPE_GC:
+		if groupchat_control and groupchat_control.type_id == \
+		message_control.TYPE_GC:
 			# It's a Private message
-#			pm = True
-#			msg_type = 'pm'
+			pm = True
+			msg_type = 'pm'
 
 		jid_of_control = full_jid_with_resource
 
@@ -134,7 +133,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession):
 					contact.chatstate = chatstate
 					if contact.our_chatstate == 'ask': # we were jep85 disco?
 						contact.our_chatstate = 'active' # no more
-					#self.control.handle_incoming_chatstate() XXX
+					self.control.handle_incoming_chatstate()
 				elif contact.chatstate != 'active':
 					# got no valid jep85 answer, peer does not support it
 					contact.chatstate = False
@@ -168,8 +167,8 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession):
 
 		if pm:
 			nickname = resource
-			groupchat_control.on_private_message(nickname, msgtxt, array[2],
-				xhtml, session, msg_id)
+			groupchat_control.on_private_message(nickname, msgtxt, tim,
+				xhtml, self, msg_id)
 		else:
 			self.roster_message(jid, msgtxt, tim, encrypted, msg_type,
 				subject, resource, msg_id, user_nick, advanced_notif_num,