                            withResponse: Bool = true,
                            timeout: TimeInterval = .gattDefaultTimeout) throws {
         
-        fatalError()
+        return try connection(for: characteristic.peripheral)
+            .writeValue(data, for: characteristic, withResponse: withResponse, timeout: timeout)
     }
     
     public func notify(_ notification: ((Data) -> ())?,
                        for characteristic: Characteristic<Peripheral>,
                        timeout: TimeInterval = .gattDefaultTimeout) throws {
         
-        fatalError()
+        return try connection(for: characteristic.peripheral)
+            .notify(notification, for: characteristic, timeout: timeout)
     }
     
     // MARK: - Private Methods

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

    
    public let maximumTransmissionUnit: ATTMaximumTransmissionUnit
    
    internal lazy var asyncQueue: DispatchQueue = DispatchQueue(label: "\(LinuxCentral.self) Operation Queue")
    
    internal private(set) var scanData = [Peripheral: AdvertisingReport](minimumCapacity: 1)
    
