                            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

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

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