diff --git a/src/common/protocol/bytestream.py b/src/common/protocol/bytestream.py
index 4f6df6f8a89c6d8444b595aff9cf3f4ae3d21487..a8f317b32decdbb37ccd327343a7e643bcfca3bf 100644
--- a/src/common/protocol/bytestream.py
+++ b/src/common/protocol/bytestream.py
@@ -803,6 +803,16 @@ class ConnectionIBBytestream(ConnectionBytestream):
             file_props.fp = open(file_props.file_name, 'w')
         conn.send(rep)
 
+    def CloseIBBStream(self, file_props):
+        file_props.connected = False
+        file_props.fp.close()
+        file_props.stopped = True
+        self.connection.send(nbxmpp.Protocol('iq',
+            file_props.direction[1:], 'set',
+            payload=[nbxmpp.Node(nbxmpp.NS_IBB + ' close',
+            {'sid':file_props.sid})]))
+
+
     def OpenStream(self, sid, to, fp, blocksize=4096):
         """
         Start new stream. You should provide stream id 'sid', the endpoind jid
@@ -849,6 +859,9 @@ class ConnectionIBBytestream(ConnectionBytestream):
             if file_props.direction[0] == '>':
                 if file_props.paused:
                     continue
+                if not file_props.connected:
+                    #TODO: Reply with out of order error
+                    continue
                 chunk = file_props.fp.read(file_props.block_size)
                 if chunk:
                     datanode = nbxmpp.Node(nbxmpp.NS_IBB + ' data', {'sid': sid,
@@ -939,6 +952,9 @@ class ConnectionIBBytestream(ConnectionBytestream):
             reply.delChild('close')
             conn.send(reply)
             file_props.fp.close()
+            file_props.completed = file_props.received_len >= file_props.size
+            if not file_props.completed:
+                file_props.error = -1
             gajim.socks5queue.complete_transfer_cb(self.name, file_props)
         else:
             conn.send(nbxmpp.Error(stanza, nbxmpp.ERR_ITEM_NOT_FOUND))
@@ -953,8 +969,9 @@ class ConnectionIBBytestream(ConnectionBytestream):
         syn_id = stanza.getID()
         log.debug('IBBAllIqHandler called syn_id->%s' % syn_id)
         for file_props in FilesProp.getAllFileProp():
-            if not file_props.direction:
+            if not file_props.direction or not file_props.connected:
                 # It's socks5 bytestream
+                # Or we closed the IBB stream
                 continue
             if file_props.syn_id == syn_id:
                 if stanza.getType() == 'error':
diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py
index 40edc2d26b431ba230ce2884a27c034be2b1a3f8..d91539f8070eb8634b94637ad3ebd9c7fbe81edd 100644
--- a/src/filetransfers_window.py
+++ b/src/filetransfers_window.py
@@ -943,7 +943,11 @@ class FileTransfersWindow:
         account = file_props.tt_account
         if account not in gajim.connections:
             return
-        gajim.connections[account].disconnect_transfer(file_props)
+        con = gajim.connections[account]
+        # Check if we are in a IBB transfer
+        if file_props.direction:
+            con.CloseIBBStream(file_props)
+        con.disconnect_transfer(file_props)
         self.set_status(file_props, 'stop')
 
     def show_tooltip(self, widget):