diff --git a/app/src/main/java/de/ccc/events/badge/card10/common/ConnectionService.kt b/app/src/main/java/de/ccc/events/badge/card10/common/ConnectionService.kt
index 007473bc65f86069a885fef7353d939849a4b972..a5d97c3b4d0bf0979160d021a33605fe7a928bf8 100644
--- a/app/src/main/java/de/ccc/events/badge/card10/common/ConnectionService.kt
+++ b/app/src/main/java/de/ccc/events/badge/card10/common/ConnectionService.kt
@@ -42,7 +42,7 @@ object ConnectionService {
     private var connection: BluetoothGatt? = null
 
     private var connectionState = BluetoothGatt.STATE_DISCONNECTED
-    private var gattListeners = mutableListOf<GattListener>()
+    private var gattListeners = mutableMapOf<String, GattListener>()
 
     private val fileServiceUuid = UUID.fromString("42230100-2342-2342-2342-234223422342")
 
@@ -58,8 +58,8 @@ object ConnectionService {
 
     fun isConnected() = connectionState == BluetoothGatt.STATE_CONNECTED
 
-    fun addGattListener(listener: GattListener) {
-        gattListeners.add(listener)
+    fun addGattListener(tag: String, listener: GattListener) {
+        gattListeners[tag] = listener
     }
 
     fun connect(context: Context) {
@@ -113,8 +113,6 @@ object ConnectionService {
             connectionState = newState
             connection = gatt
 
-            gattListeners.map { it.onConnectionStateChange(newState) }
-
             when (newState) {
                 BluetoothGatt.STATE_CONNECTED -> {
                     gatt?.discoverServices()
@@ -132,6 +130,8 @@ object ConnectionService {
             mtu = newMtu - 3 // Very precise science
 
             leService?.enableNotify(gatt)
+
+            gattListeners.values.map { it.onConnectionReady() }
         }
 
         override fun onCharacteristicWrite(
@@ -145,7 +145,7 @@ object ConnectionService {
 
             connection = gatt
 
-            gattListeners.map { it.onCharacteristicWrite(characteristic, status) }
+            gattListeners.values.map { it.onCharacteristicWrite(characteristic, status) }
         }
 
         override fun onCharacteristicChanged(gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic?) {
@@ -155,7 +155,7 @@ object ConnectionService {
                 throw IllegalStateException()
             }
 
-            gattListeners.map { it.onCharacteristicChanged(characteristic) }
+            gattListeners.values.map { it.onCharacteristicChanged(characteristic) }
         }
     }
 
diff --git a/app/src/main/java/de/ccc/events/badge/card10/common/GattListener.kt b/app/src/main/java/de/ccc/events/badge/card10/common/GattListener.kt
index a05fd2ca0ad85677df48c7a034b5c8bf211fc95e..0dc4b7504ac845cf039804f3ddb330ded7ffc96b 100644
--- a/app/src/main/java/de/ccc/events/badge/card10/common/GattListener.kt
+++ b/app/src/main/java/de/ccc/events/badge/card10/common/GattListener.kt
@@ -27,5 +27,5 @@ import android.bluetooth.BluetoothGattCharacteristic
 interface GattListener {
     fun onCharacteristicWrite(characteristic: BluetoothGattCharacteristic, status: Int) {}
     fun onCharacteristicChanged(characteristic: BluetoothGattCharacteristic) {}
-    fun onConnectionStateChange(state: Int) {}
+    fun onConnectionReady() {}
 }
\ No newline at end of file
diff --git a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/BatchTransferFragment.kt b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/BatchTransferFragment.kt
index 946f5932fe6b5936b2337ba299d7135657681864..5fd1fd17b32920ed82c213085142f0e4f235c73a 100644
--- a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/BatchTransferFragment.kt
+++ b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/BatchTransferFragment.kt
@@ -77,7 +77,7 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
 
     private fun initConnection() {
         val ctx = context ?: throw IllegalStateException()
-        ConnectionService.addGattListener(this)
+        ConnectionService.addGattListener("batchfiletransfer", this)
         ConnectionService.connect(ctx)
     }
 
@@ -91,6 +91,7 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
     }
 
     private fun transferNext() {
+        Thread.sleep(1000)
         val item = queue.dequeue()
 
         if (item == null || isCancelled) {
@@ -122,10 +123,8 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
         }
     }
 
-    override fun onConnectionStateChange(state: Int) {
-        if (state == BluetoothGatt.STATE_CONNECTED) {
-            startTransfer()
-        }
+    override fun onConnectionReady() {
+        startTransfer()
     }
 
     override fun onError() {
diff --git a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransfer.kt b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransfer.kt
index 413fdc68ddd64fff4621ed2b84762f7141dc9daa..1ce612075333b58834f9addc38a63198727ccd02 100644
--- a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransfer.kt
+++ b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransfer.kt
@@ -41,7 +41,7 @@ class FileTransfer(
     private var currentState = TransferState.IDLE
 
     init {
-        service.addOnPacketReceivedListener(this)
+        service.setOnPacketReceivedListener(this)
     }
 
     override fun onPacketReceived(packet: Packet) {
@@ -98,13 +98,13 @@ class FileTransfer(
             throw IllegalStateException()
         }
 
+        currentState = TransferState.START_SENT
         service.sendPacket(
             Packet(
                 PacketType.START,
                 destinationPath.toByteArray(Charset.forName("ASCII"))
             )
         )
-        currentState = TransferState.START_SENT
     }
 
     private fun sendNext() {
diff --git a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/LowEffortService.kt b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/LowEffortService.kt
index d76380ba4fa6c41e0ee789474dfda4fde116d53b..c77e23ca5f1cafe58afa437d4b80aa9f83641ac7 100644
--- a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/LowEffortService.kt
+++ b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/LowEffortService.kt
@@ -43,7 +43,7 @@ class LowEffortService(
     private val centralRxCharacteristicUuid = UUID.fromString("42230102-2342-2342-2342-234223422342")
 
     private var notifyEnabled = false
-    private val listeners = mutableListOf<OnPacketReceivedListener>()
+    private var listener: OnPacketReceivedListener? = null
 
     init {
         val tx = service.getCharacteristic(centralTxCharacteristicUuid)
@@ -58,7 +58,7 @@ class LowEffortService(
         centralTx = tx
         centralRx = rx
 
-        ConnectionService.addGattListener(this)
+        ConnectionService.addGattListener("filetransfer",this)
     }
 
     fun enableNotify(gatt: BluetoothGatt) {
@@ -89,8 +89,8 @@ class LowEffortService(
         return status
     }
 
-    fun addOnPacketReceivedListener(listener: OnPacketReceivedListener) {
-        listeners.add(listener)
+    fun setOnPacketReceivedListener(packetListener: OnPacketReceivedListener) {
+        listener = packetListener
     }
 
     // GattListener methods
@@ -99,6 +99,6 @@ class LowEffortService(
     }
 
     override fun onCharacteristicChanged(characteristic: BluetoothGattCharacteristic) {
-        listeners.map { it.onPacketReceived(Packet.fromBytes(characteristic.value)) }
+        listener?.onPacketReceived(Packet.fromBytes(characteristic.value))
     }
 }
\ No newline at end of file