     
     // MARK: - Initialization
     
-    public init(socket: L2CAPSocket,
-                maximumTransmissionUnit: ATTMaximumTransmissionUnit = .default,
-                log: ((String) -> ())? = nil,
-                writePending: (() -> ())? = nil) {
-        
+    public init(
+        socket: L2CAPSocket,
+        maximumTransmissionUnit: ATTMaximumTransmissionUnit = .default,
+        log: ((String) -> ())? = nil
+    ) {
         self.connection = ATTConnection(socket: socket)
         self.preferredMaximumTransmissionUnit = maximumTransmissionUnit
         self.log = log
-        self.writePending = writePending
-        
-        // setup notifications and indications
-        self.registerATTHandlers()
-        
-        // queue MTU exchange if not default value
-        if maximumTransmissionUnit > .default {
-            self.exchangeMTU()
+        
+        // async setup tasks
+        Task { [weak self] in
+            // setup notifications and indications
+            await self?.registerATTHandlers()
+            // queue MTU exchange if not default value
+            if maximumTransmissionUnit > .default {
+                await self?.exchangeMTU()
+            }
         }
     }
     
     // MARK: - Methods
-    
-    /// Performs the actual IO for recieving data.
-    public func read() async throws {
-        return try await connection.read()
-    }
-    
-    /// Performs the actual IO for sending data.
-    public func write() async throws -> Bool {
-        return try await connection.write()
-    }
     
     // MARK: Requests
     

        // The Read Response returns the Characteristic Value in the Attribute Value parameter.
        
        // read value and try to read blob if too big
        let pdu = ATTReadRequest(handle: handle)
        
        let operation = ReadOperation(handle: handle, completion: completion)
        
        send(pdu) { [unowned self] in self.readResponse($0, operation: operation) }

        
        let operation = ReadMultipleOperation(characteristics: characteristics, completion: completion)
        
        send(pdu) { [unowned self] in
            self.readMultipleResponse($0, operation: operation)
        }
    }
    
    /**
