                     let dragEndInterval = NSDate().timeIntervalSince(lmbUpMoment as Date)
                     if dragEndInterval < mouseDragRaceThresholdSeconds {
                         self.mouse.state = .pointing // flip state first to prevent race condition
-                        self.swapDraggedWindowWithDropzone(movedWindow)
+                        self.mouse.swapDraggedWindowWithDropzone(movedWindow)
                     }
                 default: ()
                 }

    init(userConfiguration: UserConfiguration) {
        self.userConfiguration = userConfiguration
        self.focusFollowsMouseManager = FocusFollowsMouseManager(userConfiguration: userConfiguration)

        super.init()

        focusFollowsMouseManager.delegate = self

        addWorkspaceNotificationObserver(NSWorkspace.didLaunchApplicationNotification, selector: #selector(applicationDidLaunch(_:)))

        }
        windowManager.switchWindow(draggedWindow, with: secondWindow)
    }
}

private class ObserveApplicationNotifications {
    enum Error: Swift.Error {
        case failed
    }

    fileprivate let application: SIApplication
    fileprivate let windowManager: WindowManager
    fileprivate let mouse: MouseStateKeeper

    init(application: SIApplication, windowManager: WindowManager) {
        self.application = application
        self.windowManager = windowManager
        mouse = windowManager.mouseStateKeeper
    }

    fileprivate func addObservers() -> Observable<Bool> {
        return _addObservers().retry(.exponentialDelayed(maxCount: 4, initial: 0.1, multiplier: 2))
    }

    private func _addObservers() -> Observable<Bool> {
        let application = self.application
        let windowManager = self.windowManager

        return Observable.create { observer in
            var success: Bool = false
