diff --git a/src/common/connection.py b/src/common/connection.py
index 195ac89cb5278b1401cf6d5daf71cf213b5471f3..c8694ddfca20a85774418605493e8b8291054c42 100644
--- a/src/common/connection.py
+++ b/src/common/connection.py
@@ -140,9 +140,13 @@ class Connection:
 			gajim.config.set('usegpg', False)
 	# END __init__
 
+	def put_event(self, ev):
+		gajim.events_for_ui[self.name].append(ev)
+
 	def dispatch(self, event, data):
 		'''always passes account name as first param'''
-		gajim.events_for_ui[self.name].append([event, data])
+		gajim.mutex_events_for_ui.lock(self.put_event, [event, data])
+		gajim.mutex_events_for_ui.unlock()
 
 	def add_sha(self, p):
 		c = p.setTag('x', namespace = common.xmpp.NS_VCARD_UPDATE)
diff --git a/src/common/gajim.py b/src/common/gajim.py
index b1e7573da2b93f917d6d63833d1fa1049f9703f6..1150eaf14f184c84458d2972e5e9c4900cf78d40 100644
--- a/src/common/gajim.py
+++ b/src/common/gajim.py
@@ -19,6 +19,8 @@
 
 import os
 import logging
+import mutex
+
 import common.config
 import common.logger
 
@@ -63,8 +65,10 @@ 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
+#queues of events from connections...
 events_for_ui = {}
+#... and its mutex
+mutex_events_for_ui = mutex.mutex()
 
 socks5quue = None
 
diff --git a/src/gajim.py b/src/gajim.py
index 3ca1088c68aafa0d174cdbfd0bd6373c1500be87..16db87e72446b3cc18276d70e1314e36fe4a08cf 100755
--- a/src/gajim.py
+++ b/src/gajim.py
@@ -999,6 +999,10 @@ class Interface:
 			'HTTP_AUTH': self.handle_event_http_auth,
 		}
 
+	def exec_event(self, account):
+		ev = gajim.events_for_ui[account].pop(0)
+		self.handlers[ev[0]](account, ev[1])
+
 	def process_connections(self):
 		try:
 			# We copy the list of connections because one can disappear while we 
@@ -1012,8 +1016,8 @@ class Interface:
 				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])
+					gajim.mutex_events_for_ui.lock(self.exec_event, account)
+					gajim.mutex_events_for_ui.unlock()
 			time.sleep(0.01) # so threads in connection.py have time to run
 			return True # renew timeout (loop for ever)
 		except KeyboardInterrupt: