diff --git a/src/common/connection.py b/src/common/connection.py
index 4ff4a7270a67e2fb66a608f996507b12fe006d7e..39a0cc5ca3a195f9fa12352564bad7f7f39f31d6 100644
--- a/src/common/connection.py
+++ b/src/common/connection.py
@@ -39,6 +39,7 @@ import operator
 
 import time
 import locale
+import hmac
 
 try:
 	randomsource = random.SystemRandom()
@@ -190,6 +191,7 @@ class Connection(ConnectionHandlers):
 		self.vcard_supported = False
 		self.private_storage_supported = True
 		self.streamError = ''
+		self.secret_hmac = str(random.random())[2:]
 	# END __init__
 
 	def put_event(self, ev):
@@ -1775,8 +1777,12 @@ class Connection(ConnectionHandlers):
 				last_log = 0
 			self.last_history_time[room_jid] = last_log
 
-		p = common.xmpp.Presence(to = '%s/%s' % (room_jid, nick),
-			show = show, status = self.status)
+		p = common.xmpp.Presence(to='%s/%s' % (room_jid, nick),
+			show=show, status=self.status)
+		h = hmac.new(self.secret_hmac, room_jid).hexdigest()[:6]
+		id_ = self.connection.getAnID()
+		id_ = 'gajim_muc_' + id_ + '_' + h
+		p.setID(id_)
 		if gajim.config.get('send_sha_in_gc_presence'):
 			p = self.add_sha(p)
 		self.add_lang(p)
@@ -1843,6 +1849,10 @@ class Connection(ConnectionHandlers):
 		xmpp_show = helpers.get_xmpp_show(show)
 		p = common.xmpp.Presence(to = '%s/%s' % (jid, nick), typ = ptype,
 			show = xmpp_show, status = status)
+		h = hmac.new(self.secret_hmac, jid).hexdigest()[:6]
+		id_ = self.connection.getAnID()
+		id_ = 'gajim_muc_' + id_ + '_' + h
+		p.setID(id_)
 		if gajim.config.get('send_sha_in_gc_presence') and show != 'offline':
 			p = self.add_sha(p, ptype != 'unavailable')
 		self.add_lang(p)
diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py
index dcd61a946f18a4b3ab650c24984d12cf2f32d92d..c221cfb8b3c711bc39ca8a251ca4952952f09921 100644
--- a/src/common/connection_handlers.py
+++ b/src/common/connection_handlers.py
@@ -34,6 +34,7 @@ import socket
 import sys
 import operator
 import hashlib
+import hmac
 
 from time import (altzone, daylight, gmtime, localtime, mktime, strftime,
 	time as time_time, timezone, tzname)
@@ -2207,6 +2208,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
 			return
 		jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who)
 		timestamp = None
+		id_ = prs.getID()
 		is_gc = False # is it a GC presence ?
 		sigTag = None
 		ns_muc_user_x = None
@@ -2246,6 +2248,13 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
 				if self.connection.getRoster().getItem(agent): # to be sure it's a transport contact
 					transport_auto_auth = True
 
+		if not is_gc and id_ and id_.startswith('gajim_muc_') and \
+		ptype == 'error':
+			# Error presences may not include sent stanza, so we don't detect it's
+			# a muc preence. So detect it by ID
+			h = hmac.new(self.secret_hmac, jid_stripped).hexdigest()[:6]
+			if id_.split('_')[-1] = h:
+				is_gc = True
 		status = prs.getStatus() or ''
 		show = prs.getShow()
 		if not show in gajim.SHOW_LIST: