      When the first eligible peer is found, Clink with archive its identifyer and attempt to connect to it.
      Should the peer become disconnected, clink with attempt to reestablish it's connection untill the archived refrence to the peer is removed by the user.
      For a remote peer to become eligible for discovery, it must also be scanning and in close physical proximity (a few inches)
-     */    
-    public func startScanningForPeers() {
+     */
+    public func startPairing(completion: @escaping (Clink.OpperationResult<ClinkPeer>) -> ()) {
+        let taskTimer = Timer.scheduledTimer(withTimeInterval: 30, repeats: false) { [weak self] _ in
+            guard let this = self, let activeTask = this.activePairingTask else { return }
+            
+            this.activePairingTask = nil
+            this.centralManager.stopScan()
+            this.peripheralManager.stopAdvertising()
+            this.delegate?.clink(this, didCatchError: Clink.OpperationError.pairingOpperationTimeout)
+            
+            activeTask.completion(Clink.OpperationResult.error(.pairingOpperationTimeout))
+        }
+        
+        self.activePairingTask = PairingTask(timer: taskTimer, remotePeripheral: nil, remoteCentral: nil, completion: completion)
         self.startScaningForPeripherals(minRSSI: self.minRSSI)
         self.startAdvertisingPeripheral()
     }

        
        let service = CBMutableService(type: serviceId, primary: true)
        
        service.characteristics = [peerDataCharacteristic, timeOfLastUpdateCharacteristic]
        
        self.ensure(peripheralManagerHasState: .poweredOn) { result in
            switch result {

    public var connectedPeers: [ClinkPeer] = []
    
    fileprivate var localPeerData = Data()
    fileprivate var activePairingTask: PairingTask? = nil
    fileprivate var minRSSI = -40
    
    fileprivate lazy var centralManager: CBCentralManager = {
