         
         guard RSSI.intValue > self.minRSSI else { return }
         
-        let peer = ClinkPeer(peripheral: peripheral)
         let peerManager = self.peerManager ?? self
         
-        peerManager.save(peer: peer)
-        
-        self.connectedPeers.append(peer)
-        self.connect(peerWithId: peripheral.identifier)
-        self.delegate?.clink(self, didDiscoverPeer: peer)
-        
-        NotificationCenter.default.post(name: Clink.Notifications.didDiscoverPeer, object: peer, userInfo: peer.data)
-        
+        if (self.peerManager ?? self).getSavedPeer(withId: peripheral.identifier) == nil {
+            self.newlyDiscoveredPeripheral = peripheral
+        }
+                
+        peripheral.delegate = self
         central.connect(peripheral, options: nil)
     }
     
     public final func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
         if self.logLevel == .verbose { print("calling \(#function)") }
         
-        q.async {
+        if newlyDiscoveredPeripheral?.identifier != peripheral.identifier {
             if let i = self.connectedPeers.index(where: { $0.id == peripheral.identifier }) { self.connectedPeers.remove(at: i) }
             
             let peer = ClinkPeer(id: peripheral.identifier)
             let peerManager = self.peerManager ?? self
             
-            peripheral.delegate = self
             peer.peripheral = peripheral
             peerManager.save(peer: peer)
             

    }
}

// MARK: - PERIPHERAL MANAGER DELEGATE METHODS

extension Clink: CBPeripheralManagerDelegate {

    // MARK: - NESTED TYPES
    
    public enum OpperationError: Error {
        case pairingOpperationTimeout
        case centralManagerFailedToPowerOn
        case peripheralManagerFailedToPowerOn
    }
