diff --git a/src/common/connection.py b/src/common/connection.py
index d07bed3ec4c46053fc6b335e8b87ecd22c175b1e..6119a32e14f50a6c9a66bc588174a9b0ab668972 100644
--- a/src/common/connection.py
+++ b/src/common/connection.py
@@ -1383,8 +1383,7 @@ class Connection(CommonConnection, ConnectionHandlers):
             errnum = con.Connection.ssl_errnum
         except AttributeError:
             errnum = [] # we don't have an errnum
-        i = 0
-        for er in errnum:
+        for i, er in enumerate(errnum):
             if er > 0 and str(er) not in gajim.config.get_per('accounts',
             self.name, 'ignore_ssl_errors').split():
                 text = _('The authenticity of the %s certificate could be '
@@ -1399,7 +1398,6 @@ class Connection(CommonConnection, ConnectionHandlers):
                     fingerprint=con.Connection.ssl_fingerprint_sha1[i],
                     certificate=con.Connection.ssl_certificate[i]))
                 return True
-            i += 1
         if len(con.Connection.ssl_fingerprint_sha1):
             saved_fingerprint = gajim.config.get_per('accounts', self.name,
                 'ssl_fingerprint_sha1')
@@ -2846,6 +2844,19 @@ class Connection(CommonConnection, ConnectionHandlers):
         """
         Send invitation
         """
+        contact = gajim.contacts.get_contact_from_full_jid(self.name, to)
+        if contact and contact.supports(nbxmpp.NS_CONFERENCE):
+            # send direct invite
+            message=nbxmpp.Message(to=to)
+            attrs = {'jid': room}
+            if reason:
+                attrs['reason'] = reason
+            if continue_tag:
+                attrs['continue'] = 'true'
+            c = message.addChild(name='x', attrs=attrs,
+                namespace=nbxmpp.NS_CONFERENCE)
+            self.connection.send(message)
+            return
         message=nbxmpp.Message(to=room)
         c = message.addChild(name='x', namespace=nbxmpp.NS_MUC_USER)
         c = c.addChild(name='invite', attrs={'to': to})
diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py
index b9ecf6808c21dad677831bf97148d7875ec4d44e..16c4e1be78fe9ae23024de727a09593b9f577205 100644
--- a/src/common/connection_handlers_events.py
+++ b/src/common/connection_handlers_events.py
@@ -1077,10 +1077,15 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
         self.invite_tag = None
         self.decline_tag = None
         if not self.enc_tag:
+            # Direct invitation?
             self.invite_tag = self.stanza.getTag('x',
-                namespace=nbxmpp.NS_MUC_USER)
-            if self.invite_tag and not self.invite_tag.getTag('invite'):
-                self.invite_tag = None
+                namespace=nbxmpp.NS_CONFERENCE)
+            # Mediated invitation?
+            if not self.invite_tag:
+                self.invite_tag = self.stanza.getTag('x',
+                    namespace=nbxmpp.NS_MUC_USER)
+                if self.invite_tag and not self.invite_tag.getTag('invite'):
+                    self.invite_tag = None
 
             self.decline_tag = self.stanza.getTag('x',
                 namespace=nbxmpp.NS_MUC_USER)
@@ -1193,25 +1198,47 @@ class GcInvitationReceivedEvent(nec.NetworkIncomingEvent):
     base_network_events = []
 
     def generate(self):
-        self.room_jid = self.msg_obj.fjid
+        invite_tag = self.msg_obj.invite_tag
+        if invite_tag.getNamespace() == nbxmpp.NS_CONFERENCE:
+            # direct invitation
+            try:
+                self.room_jid = helpers.parse_jid(invite_tag.getAttr('jid'))
+            except helpers.InvalidFormat:
+                log.warn('Invalid JID: %s, ignoring it' % invite_tag.getAttr(
+                    'jid'))
+                return
+            self.jid_from = self.msg_obj.fjid
+            self.reason = invite_tag.getAttr('reason')
+            self.password = invite_tag.getAttr('password')
+            self.is_continued = False
+            if invite_tag.getAttr('continue') == 'true':
+                self.is_continued = True
+        else
+            self.room_jid = self.msg_obj.fjid
+            item = self.msg_obj.invite_tag.getTag('invite')
+            try:
+                self.jid_from = helpers.parse_jid(item.getAttr('from'))
+            except helpers.InvalidFormat:
+                log.warning('Invalid JID: %s, ignoring it' % item.getAttr(
+                    'from'))
+                return
 
-        item = self.msg_obj.invite_tag.getTag('invite')
-        try:
-            self.jid_from = helpers.parse_jid(item.getAttr('from'))
-        except helpers.InvalidFormat:
-            log.warning('Invalid JID: %s, ignoring it' % item.getAttr('from'))
+            self.reason = item.getTagData('reason')
+            self.password = invite_tag.getTagData('password')
+
+            self.is_continued = False
+            if item.getTag('continue'):
+                self.is_continued = True
+
+        if self.room_jid in gajim.gc_connected[self.conn.name] and \
+        gajim.gc_connected[self.conn.name][self.room_jid]:
+            # We are already in groupchat. Ignore invitation
             return
         jid = gajim.get_jid_without_resource(self.jid_from)
         if gajim.config.get_per('accounts', self.conn.name,
         'ignore_unknown_contacts') and not gajim.contacts.get_contacts(
         self.conn.name, jid):
             return
-        self.reason = item.getTagData('reason')
-        self.password = self.msg_obj.invite_tag.getTagData('password')
-
-        self.is_continued = False
-        if item.getTag('continue'):
-            self.is_continued = True
 
         return True
 
diff --git a/src/common/contacts.py b/src/common/contacts.py
index d51d449f9764d7677560bd9d0eaf5bf415101484..dc5d841a143d2eb7d1e2229e72fdfee8c3a128e7 100644
--- a/src/common/contacts.py
+++ b/src/common/contacts.py
@@ -488,6 +488,7 @@ class Contacts():
             for c in self._contacts[jid]:
                 if c.resource == resource:
                     return c
+            return self._contacts[jid][0]
 
     def iter_contacts(self):
         for jid in list(self._contacts.keys()):
diff --git a/src/common/gajim.py b/src/common/gajim.py
index 0b83479d98327900b164428d85b4949b62bdc61e..f71eb3240f866b6f5a66a574d3e453100e028c35 100644
--- a/src/common/gajim.py
+++ b/src/common/gajim.py
@@ -212,7 +212,7 @@ gajim_common_features = [nbxmpp.NS_BYTESTREAM, nbxmpp.NS_SI, nbxmpp.NS_FILE,
     nbxmpp.NS_SSN, nbxmpp.NS_MOOD, nbxmpp.NS_ACTIVITY, nbxmpp.NS_NICK,
     nbxmpp.NS_ROSTERX, nbxmpp.NS_SECLABEL, nbxmpp.NS_HASHES,
     nbxmpp.NS_HASHES_MD5, nbxmpp.NS_HASHES_SHA1, nbxmpp.NS_HASHES_SHA256,
-    nbxmpp.NS_HASHES_SHA512, nbxmpp.NS_CORRECT]
+    nbxmpp.NS_HASHES_SHA512, nbxmpp.NS_CORRECT, nbxmpp.NS_CONFERENCE]
 
 # Optional features gajim supports per account
 gajim_optional_features = {}
diff --git a/src/roster_window.py b/src/roster_window.py
index 61ef13772f4208fe98a3c3f2d426f4dcfb359b29..4bf166e76a38110077162f1c31eda0d4f278ad6c 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -3335,7 +3335,7 @@ class RosterWindow:
                 break
 
     def on_invite_to_room(self, widget, list_, room_jid, room_account,
-                    resource=None):
+    resource=None):
         """
         Resource parameter MUST NOT be used if more than one contact in list
         """