         
         fileprivate(set) var service: GATTClient.Service
         
-        private(set) var characteristics = [BluetoothUUID: CachedCharacteristic]()
-        
-        mutating func update(_ newValue: [GATTClient.Characteristic]) {
+        fileprivate(set) var characteristics = [BluetoothUUID: CachedCharacteristic]()
+        
+        mutating func update(_ newValue: [GATTClient.Characteristic], isCompleteSet: Bool = true) {
             
             // remove services that no longer exist on the server
-            self.characteristics.keys
-                .filter { uuid in newValue.contains(where: { $0.uuid == uuid }) }
-                .forEach { self.characteristics[$0] = nil }
+            if isCompleteSet {
+                
+                self.characteristics.keys
+                    .filter { uuid in newValue.contains(where: { $0.uuid == uuid }) }
+                    .forEach { self.characteristics[$0] = nil }
+            }
             
             // update cache
             newValue.forEach {

            
            return nil
        }
    }
}


        // The Attribute Type is set to the UUID for «Characteristic» and the Starting Handle and Ending Handle
        // parameters shall be set to the service handle range.
        
        discoverCharacteristics(uuid: uuid, service: service) { [unowned self] (response) in
            
            // update cache
            switch response {
            case .error:
                break
            case let .value(value):
                self.cache.services[service.uuid]?.update(value, isCompleteSet: false)
            }
            
            // call completion
            completion(response)
        }
    }
    
    /**
