                     "Netx reporting connected, but could not get status info".cause(err)
                 )
                 self.writeNetxState.send(NetworkStatus.disconnected())
+                self.manager = Atomic(nil) // Re-load the manager (maybe VPN profile removed)
                 throw err
             }
             .eraseToAnyPublisher()

                            managers![i].removeFromPreferences(completionHandler: nil)
                        }
                    }

                    // No profiles means no perms, otherwise normal flow
                    if (managersCount == 0) {

        .eraseToAnyPublisher()
    }

    // Returns a manager ref, or loads it from API if not available
    private func getManager() -> AnyPublisher<NETunnelProviderManager, Error> {
        if let m = manager.value {
            return Just(m).setFailureType(to: Error.self).eraseToAnyPublisher()
        }

        return loadManager()
        .map { m in
            self.manager = Atomic(m)
            return m
        }
        .eraseToAnyPublisher()
    }

    private func loadManager() -> AnyPublisher<NETunnelProviderManager, Error> {
        // Get the manager object or timeout
        return Publishers.Merge(
            // Actual query for object
            Future<NETunnelProviderManager, Error> { promise in
                Logger.w("NetxService", "getManager: asking")
                return NETunnelProviderManager.loadAllFromPreferences { (managers, error) in
                    Logger.w("NetxService", "getManager: got callback")
                    if let error = error {
                        return promise(
                            .failure("getManager: loadAllPreferences".cause(error))
