         
         let coreService: CBService = try self.accessQueue.sync { [unowned self] in
             
-            guard let coreService = self.internalState.cache[service.peripheral]?.services.values[service.identifier]
+            guard let coreService = self.internalState.cache[service.peripheral]?.services.values[service.id]
                 else { throw CentralError.invalidAttribute(service.uuid) }
             
             return coreService

        // start discovery
        corePeripheral.discoverServices(coreServices)
        
        // wait
        try semaphore.wait()
        
        return accessQueue.sync { [unowned self] in
            self.internalState.cache[peripheral]?.services.values.map {
                Service(identifier: $0.key,
                        uuid: BluetoothUUID($0.value.uuid),
                        peripheral: peripheral,
                        isPrimary: $0.value.isPrimary)

    }
    
    public func notify(_ notification: ((Data) -> ())?,
                       for characteristic: Characteristic<Peripheral, AttributeID>,
                       timeout: TimeInterval = .gattDefaultTimeout) throws {
        
        guard state == .poweredOn
