diff --git a/src/common/connection.py b/src/common/connection.py
index f23b217bf09385fd75a6d0a7de9613ad8fd4de5f..195ac89cb5278b1401cf6d5daf71cf213b5471f3 100644
--- a/src/common/connection.py
+++ b/src/common/connection.py
@@ -117,19 +117,6 @@ def get_os_info():
 class Connection:
 	"""Connection class"""
 	def __init__(self, name):
-		# dict of function to be called for each event
-		self.handlers = {'ROSTER': [], 'WARNING': [], 'ERROR': [], 
-			'INFORMATION': [], 'STATUS': [], 'NOTIFY': [], 'MSG': [],
-			'MSGERROR': [], 'MSGSENT': [] , 'SUBSCRIBED': [], 'UNSUBSCRIBED': [],
-			'SUBSCRIBE': [], 'AGENT_INFO': [], 'REGISTER_AGENT_INFO': [],
-			'AGENT_INFO_ITEMS': [], 'AGENT_INFO_INFO': [], 'QUIT': [],
-			'ACC_OK': [], 'MYVCARD': [], 'OS_INFO': [], 'VCARD': [], 'GC_MSG': [],
-			'GC_SUBJECT': [], 'GC_CONFIG': [], 'BAD_PASSPHRASE': [],
-			'ROSTER_INFO': [], 'ERROR_ANSWER': [], 'BOOKMARKS': [], 'CON_TYPE': [],
-			'FILE_REQUEST': [], 'FILE_RCV_COMPLETED': [], 'FILE_PROGRESS': [],
-			'FILE_REQUEST_ERROR': [], 'FILE_SEND_ERROR': [],
-			'STANZA_ARRIVED': [], 'STANZA_SENT': [], 'HTTP_AUTH': []
-			}
 		self.name = name
 		self.connected = 0 # offline
 		self.connection = None # xmpppy instance
@@ -142,7 +129,6 @@ class Connection:
 		self.last_incoming = time.time()
 		self.keep_alive_sent = False
 		self.to_be_sent = []
-		self.for_gui = []
 		self.last_sent = []
 		self.files_props = {}
 		self.password = gajim.config.get_per('accounts', name, 'password')
@@ -156,11 +142,7 @@ class Connection:
 
 	def dispatch(self, event, data):
 		'''always passes account name as first param'''
-		if not event in self.handlers:
-			print event, 'is not in:', self.handlers
-			return
-		for handler in self.handlers[event]:
-			handler(self.name, data)
+		gajim.events_for_ui[self.name].append([event, data])
 
 	def add_sha(self, p):
 		c = p.setTag('x', namespace = common.xmpp.NS_VCARD_UPDATE)
@@ -1204,7 +1186,8 @@ class Connection:
 
 		gajim.log.debug(_('Connected to server with %s'), con_type)
 
-		self.for_gui.append(['CON_TYPE', con_type]) # notify the gui about con_type
+		# notify the gui about con_type
+		self.dispatch('CON_TYPE', con_type)
 
 		con.RegisterHandler('message', self._messageCB)
 		con.RegisterHandler('presence', self._presenceCB)
@@ -1273,15 +1256,6 @@ class Connection:
 			return None
 	# END connect
 
-	def register_handler(self, event, function):
-		if event in self.handlers:
-			self.handlers[event].append(function)
-
-	def unregister_handler(self, event, function):
-		if event in self.handlers:
-			if function in self.handlers[event]:
-				self.handlers[event].remove(function)
-
 	def quit(self, kill_core):
 		if kill_core:
 			if self.connected > 1:
@@ -1335,7 +1309,7 @@ class Connection:
 		if signed:
 			p.setTag(common.xmpp.NS_SIGNED + ' x').setData(signed)
 		self.connection.send(p)
-		self.for_gui.append(['STATUS', 'invisible'])
+		self.dispatch('STATUS', 'invisible')
 		if initial:
 			#ask our VCard
 			self.request_vcard(None)
@@ -1364,14 +1338,14 @@ class Connection:
 		if keyID and USE_GPG:
 			if self.connected < 2 and self.gpg.passphrase is None:
 				# We didn't set a passphrase
-				self.for_gui.append(['ERROR', (_('OpenPGP Key was not given'),
-					_('You will be connected to %s without OpenPGP.') % self.name)])
+				self.dispatch('ERROR', (_('OpenPGP Key was not given'),
+					_('You will be connected to %s without OpenPGP.') % self.name))
 			else:
 				signed = self.gpg.sign(msg, keyID)
 				if signed == 'BAD_PASSPHRASE':
 					signed = ''
 					if self.connected < 2:
-						self.for_gui.append(['BAD_PASSPHRASE', ()])
+						self.dispatch('BAD_PASSPHRASE', ())
 		self.status = msg
 		if show != 'offline' and not self.connected:
 			self.connection = self.connect()
@@ -1391,7 +1365,7 @@ class Connection:
 
 				if self.connection:
 					self.connection.send(p)
-				self.for_gui.append(['STATUS', show])
+				self.dispatch('STATUS', show)
 				#ask our VCard
 				self.request_vcard(None)
 
@@ -1412,7 +1386,7 @@ class Connection:
 					self.connection.disconnect()
 				except:
 					pass
-			self.for_gui.append(['STATUS', 'offline'])
+			self.dispatch('STATUS', 'offline')
 			self.connection = None
 		elif show != 'offline' and self.connected:
 			was_invisible = self.connected == STATUS_LIST.index('invisible')
@@ -1433,7 +1407,7 @@ class Connection:
 				p.setTag(common.xmpp.NS_SIGNED + ' x').setData(signed)
 			if self.connection:
 				self.connection.send(p)
-			self.for_gui.append(['STATUS', show])
+			self.dispatch('STATUS', show)
 
 	def send_motd(self, jid, subject = '', msg = ''):
 		if not self.connection:
@@ -1861,10 +1835,6 @@ class Connection:
 				
 				self.connection.send(tosend)
 				self.last_sent.append(time.time())
-			while time.time() < t_limit and len(self.for_gui):
-				print len(self.for_gui)
-				tosend = self.for_gui.pop(0)
-				self.dispatch(tosend[0], tosend[1])
 			try:
 				if gajim.config.get_per('accounts', self.name,
 				'keep_alives_enabled'): # do we want keepalives?
diff --git a/src/common/gajim.py b/src/common/gajim.py
index 0ce06dd8335e7abc8cb9d614eeb6d531e2fb914a..b1e7573da2b93f917d6d63833d1fa1049f9703f6 100644
--- a/src/common/gajim.py
+++ b/src/common/gajim.py
@@ -63,6 +63,8 @@ sleeper_state = {} # whether we pass auto away / xa or not
 #'autoaway': autoaway and use sleeper
 #'autoxa': autoxa and use sleeper
 status_before_autoaway = {}
+#queues of events from connections
+events_for_ui = {}
 
 socks5quue = None
 
diff --git a/src/config.py b/src/config.py
index 8dab426ec46a6a83d2db5d489f8719f9c2dadb7a..7e64e70b489ca1a7fc786c164949402621e57a0f 100644
--- a/src/config.py
+++ b/src/config.py
@@ -1286,6 +1286,7 @@ _('To change the account name, you must be disconnected.')).get_response()
 					gajim.last_message_time[self.account]
 				gajim.status_before_autoaway[name] = \
 					gajim.status_before_autoaway[self.account]
+				gajim.events_for_ui[name] = gajim.events_for_ui[self.account]
 
 				#upgrade account variable in opened windows
 				for kind in ['infos', 'chats', 'gc', 'gc_config']:
@@ -1312,6 +1313,7 @@ _('To change the account name, you must be disconnected.')).get_response()
 				del gajim.encrypted_chats[self.account]
 				del gajim.last_message_time[self.account]
 				del gajim.status_before_autoaway[self.account]
+				del gajim.events_for_ui[self.account]
 				gajim.connections[self.account].name = name
 				gajim.connections[name] = gajim.connections[self.account]
 				del gajim.connections[self.account]
@@ -1366,6 +1368,7 @@ _('To change the account name, you must be disconnected.')).get_response()
 		gajim.encrypted_chats[name] = []
 		gajim.last_message_time[name] = {}
 		gajim.status_before_autoaway[name] = ''
+		gajim.events_for_ui[name] = []
 		#refresh accounts window
 		if self.plugin.windows.has_key('accounts'):
 			self.plugin.windows['accounts'].init_accounts()
@@ -2465,6 +2468,7 @@ class RemoveAccountWindow:
 		del gajim.encrypted_chats[self.account]
 		del gajim.last_message_time[self.account]
 		del gajim.status_before_autoaway[self.account]
+		del gajim.events_for_ui[self.account]
 		self.plugin.roster.draw_roster()
 		if self.plugin.windows.has_key('accounts'):
 			self.plugin.windows['accounts'].init_accounts()
diff --git a/src/gajim.py b/src/gajim.py
index 51bf1a9aedff4b1dc3941d09ecc9143bab1da584..3ca1088c68aafa0d174cdbfd0bd6373c1500be87 100755
--- a/src/gajim.py
+++ b/src/gajim.py
@@ -610,7 +610,8 @@ class Interface:
 		gajim.sleeper_state[name] = 'off'
 		gajim.encrypted_chats[name] = []
 		gajim.last_message_time[name] = {}
-		gajim.status_before_autoaway[name] = {}
+		gajim.status_before_autoaway[name] = ''
+		gajim.events_for_ui[name] = []
 		gajim.connections[name].change_status('offline', None, True)
 		gajim.connections[name].connected = 0
 		if self.windows.has_key('accounts'):
@@ -960,46 +961,43 @@ class Interface:
 		self.make_regexps()
 
 	def register_handlers(self, con):
-		con.register_handler('ROSTER', self.handle_event_roster)
-		con.register_handler('WARNING', self.handle_event_warning)
-		con.register_handler('ERROR', self.handle_event_error)
-		con.register_handler('INFORMATION', self.handle_event_information)
-		con.register_handler('ERROR_ANSWER', self.handle_event_error_answer)
-		con.register_handler('STATUS', self.handle_event_status)
-		con.register_handler('NOTIFY', self.handle_event_notify)
-		con.register_handler('MSG', self.handle_event_msg)
-		con.register_handler('MSGERROR', self.handle_event_msgerror)
-		con.register_handler('MSGSENT', self.handle_event_msgsent)
-		con.register_handler('SUBSCRIBED', self.handle_event_subscribed)
-		con.register_handler('UNSUBSCRIBED', self.handle_event_unsubscribed)
-		con.register_handler('SUBSCRIBE', self.handle_event_subscribe)
-		con.register_handler('AGENT_INFO', self.handle_event_agent_info)
-		con.register_handler('REGISTER_AGENT_INFO',
-			self.handle_event_register_agent_info)
-		con.register_handler('AGENT_INFO_ITEMS',
-			self.handle_event_agent_info_items)
-		con.register_handler('AGENT_INFO_INFO',
-			self.handle_event_agent_info_info)
-		con.register_handler('QUIT', self.handle_event_quit)
-		con.register_handler('ACC_OK', self.handle_event_acc_ok)
-		con.register_handler('MYVCARD', self.handle_event_myvcard)
-		con.register_handler('VCARD', self.handle_event_vcard)
-		con.register_handler('OS_INFO', self.handle_event_os_info)
-		con.register_handler('GC_MSG', self.handle_event_gc_msg)
-		con.register_handler('GC_SUBJECT', self.handle_event_gc_subject)
-		con.register_handler('GC_CONFIG', self.handle_event_gc_config)
-		con.register_handler('BAD_PASSPHRASE', self.handle_event_bad_passphrase)
-		con.register_handler('ROSTER_INFO', self.handle_event_roster_info)
-		con.register_handler('BOOKMARKS', self.handle_event_bookmarks)
-		con.register_handler('CON_TYPE', self.handle_event_con_type)
-		con.register_handler('FILE_REQUEST', self.handle_event_file_request)
-		con.register_handler('FILE_REQUEST_ERROR', 
-			self.handle_event_file_request_error)
-		con.register_handler('FILE_SEND_ERROR', 
-			self.handle_event_file_send_error)
-		con.register_handler('STANZA_ARRIVED', self.handle_event_stanza_arrived)
-		con.register_handler('STANZA_SENT', self.handle_event_stanza_sent)
-		con.register_handler('HTTP_AUTH', self.handle_event_http_auth)
+		self.handlers = {
+			'ROSTER': self.handle_event_roster,
+			'WARNING': self.handle_event_warning,
+			'ERROR': self.handle_event_error,
+			'INFORMATION': self.handle_event_information,
+			'ERROR_ANSWER': self.handle_event_error_answer,
+			'STATUS': self.handle_event_status,
+			'NOTIFY': self.handle_event_notify,
+			'MSG': self.handle_event_msg,
+			'MSGERROR': self.handle_event_msgerror,
+			'MSGSENT': self.handle_event_msgsent,
+			'SUBSCRIBED': self.handle_event_subscribed,
+			'UNSUBSCRIBED': self.handle_event_unsubscribed,
+			'SUBSCRIBE': self.handle_event_subscribe,
+			'AGENT_INFO': self.handle_event_agent_info,
+			'REGISTER_AGENT_INFO': self.handle_event_register_agent_info,
+			'AGENT_INFO_ITEMS': self.handle_event_agent_info_items,
+			'AGENT_INFO_INFO': self.handle_event_agent_info_info,
+			'QUIT': self.handle_event_quit,
+			'ACC_OK': self.handle_event_acc_ok,
+			'MYVCARD': self.handle_event_myvcard,
+			'VCARD': self.handle_event_vcard,
+			'OS_INFO': self.handle_event_os_info,
+			'GC_MSG': self.handle_event_gc_msg,
+			'GC_SUBJECT': self.handle_event_gc_subject,
+			'GC_CONFIG': self.handle_event_gc_config,
+			'BAD_PASSPHRASE': self.handle_event_bad_passphrase,
+			'ROSTER_INFO': self.handle_event_roster_info,
+			'BOOKMARKS': self.handle_event_bookmarks,
+			'CON_TYPE': self.handle_event_con_type,
+			'FILE_REQUEST': self.handle_event_file_request,
+			'FILE_REQUEST_ERROR': self.handle_event_file_request_error,
+			'FILE_SEND_ERROR': self.handle_event_file_send_error,
+			'STANZA_ARRIVED': self.handle_event_stanza_arrived,
+			'STANZA_SENT': self.handle_event_stanza_sent,
+			'HTTP_AUTH': self.handle_event_http_auth,
+		}
 
 	def process_connections(self):
 		try:
@@ -1013,6 +1011,9 @@ class Interface:
 					gajim.connections[account].process(0.01)
 				if gajim.socks5queue.connected:
 					gajim.socks5queue.process(0.01)
+				while len(gajim.events_for_ui[account]):
+					ev = gajim.events_for_ui[account].pop(0)
+					self.handlers[ev[0]](account, ev[1])
 			time.sleep(0.01) # so threads in connection.py have time to run
 			return True # renew timeout (loop for ever)
 		except KeyboardInterrupt:
@@ -1117,6 +1118,7 @@ class Interface:
 			gajim.encrypted_chats[a] = []
 			gajim.last_message_time[a] = {}
 			gajim.status_before_autoaway[a] = ''
+			gajim.events_for_ui[a] = []
 
 		self.roster = roster_window.RosterWindow(self)
 		if gajim.config.get('use_dbus'):