             versionProviding: BundleAppVersionProviding.shared,
             reviewPromptAppVersionRepository: UserDefaultsReviewPromptAppVersionRepository(),
             appStateProviding: ApplicationAppStateProviding(),
-            eventsService: services.events
-        )
-        
+            eventsService: session.services.events
+        )
+        
+        guard let appWindow = UIApplication.shared.delegate?.window,
+              let window = appWindow else { fatalError() }
+        
+        principalWindowController = PrincipalWindowController(
+            window: window,
+            services: session.services,
+            repositories: session.repositories,
+            urlOpener: urlOpener
+        )
+    }
+
+}
+
+struct PrincipalWindowController {
+    
+    private let router: ContentRouter
+    
+    func route<T>(_ content: T) where T: ContentRepresentation {
+        try? router.route(content)
+    }
+    
+    init(
+        window: UIWindow,
+        services: Services,
+        repositories: Repositories,
+        urlOpener: URLOpener
+    ) {
         let router = MutableContentRouter()
         self.router = router
         
-        let moduleRepository = ApplicationModuleRepository(services: services, repositories: session.repositories)
+        let moduleRepository = ApplicationModuleRepository(services: services, repositories: repositories)
         let newsSubrouter = NewsSubrouter(router: router)
         let scheduleSubrouter = ShowEventFromSchedule(router: router)
         let dealerSubrouter = ShowDealerFromDealers(router: router)

            .with(UIKitMapCoordinateRender())
            .with(UpdateRemoteConfigRefreshCollaboration(remoteConfigurationLoader: remoteConfigurationLoader))
            .build()

        services = session.services
        
        backgroundFetcher = BackgroundFetchService(refreshService: services.refresh)
        
        // TODO: Source from preferences/Firebase
        let upcomingEventReminderInterval: TimeInterval = 900


    static let instance: Application = Application()
    private let session: EurofurenceSession
    private let backgroundFetcher: BackgroundFetchService
    private let notificationScheduleController: NotificationScheduleController
    private let reviewPromptController: ReviewPromptController
    private let principalWindowController: PrincipalWindowController
    
    static func assemble() {
        _ = instance
    }
    
    static func storeRemoteNotificationsToken(_ deviceToken: Data) {
        instance.session.services.notifications.storeRemoteNotificationsToken(deviceToken)
    }
    
    static func executeBackgroundFetch(
