     public func readValue(for characteristic: Characteristic<Peripheral>,
                           timeout: TimeInterval = .gattDefaultTimeout) throws -> Data {
         
-        fatalError()
+        return try connection(for: characteristic.peripheral)
+            .readValue(for: characteristic, timeout: timeout)
     }
     
     public func writeValue(_ data: Data,

            self.isRunning = true
            
            let thread = Thread { [weak self] in self?.main() }
            thread.name = "LinuxCentral Connection \(identifier)"
            thread.start()
            
            self.thread = thread

        mutating func insert(_ newValues: [GATTClient.Descriptor],
                             for characteristic: UInt) {
            
            var descriptorsCache = [UInt: DescriptorCache](minimumCapacity: newValues.count)
            
            newValues.forEach {
                descriptorsCache[UInt($0.handle)] = DescriptorCache(attribute: $0)
