         configureTileRenderer()
         configureMapView()
         condfigureGPSDisabledOverlayView()
-
-        annotationController
+        registerAnnotationViews()
+        setupMapInfoViewController()
+
+        setNeedsStatusBarAppearanceUpdate()
+    }
+
+    private func registerAnnotationViews() {
+        annotationControllers
             .map { $0.annotationViewType }
             .forEach(mapView.register)
-
-        setNeedsStatusBarAppearanceUpdate()
+    }
+
+    private func setupMapInfoViewController() {
+        add(mapInfoViewController)
+        mapInfoViewController.view.addLayoutsSameSizeAndOrigin(in: view)
+        mapInfoViewController.tapHandler = { [unowned self] in
+            self.nextRideManager.nextRide.flatMap { self.focusOnCoordinate($0.coordinate) }
+        }
     }
 
     private func configureTileRenderer() {

        updateGPSDisabledOverlayVisibility()
    }

    public func presentMapInfo(with configuration: MapInfoView.Configuration) {
        dismissMapInfo()

        let view = MapInfoView.fromNib()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.configure(with: configuration)
        self.view.addSubview(view)

        let topAnchor: NSLayoutYAxisAnchor
        if #available(iOS 11.0, *) {
            topAnchor = self.view.safeAreaLayoutGuide.topAnchor
        } else {
            topAnchor = self.view.topAnchor
        }

        let widthLayoutConstraint = view.widthAnchor.constraint(equalTo: self.view.widthAnchor, constant: -32)
        widthLayoutConstraint.priority = .init(rawValue: 999)

        NSLayoutConstraint.activate([
            view.topAnchor.constraint(equalTo: topAnchor, constant: 16),
            widthLayoutConstraint,
            view.widthAnchor.constraint(lessThanOrEqualToConstant: 400),
            view.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
        ])

        UIAccessibility.post(notification: .layoutChanged, argument: view)
    }

    public func dismissMapInfo() {
        view.subviews
            .compactMap { $0 as? MapInfoView }
            .forEach { $0.removeFromSuperview() }
    }

    private func configureNotifications() {
        NotificationCenter.default.addObserver(self, selector: #selector(didReceiveInitialLocation(notification:)), name: .initialGpsDataReceived, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(updateGPSDisabledOverlayVisibility), name: .observationModeChanged, object: nil)

            return nil
        }

        guard let matchingController = annotationControllers.first(where: { type(of: annotation) == $0.annotationType }) else {
            return nil
        }

        // TODO: Remove workaround when target > iOS10 since it does not seem to work with the MKMapView+Register extension
        if annotation is CriticalMassAnnotation {
            if #available(iOS 11.0, *) {
                return mapView.dequeueReusableAnnotationView(
                    withIdentifier: CMMarkerAnnotationView.reuseIdentifier,
                    for: annotation
                )
            } else {
                return mapView.dequeueReusableAnnotationView(withIdentifier: CMAnnotationView.reuseIdentifier) as? CMAnnotationView
                    ?? CMAnnotationView(
                        annotation: annotation,
                        reuseIdentifier: CMAnnotationView.reuseIdentifier
                    )
            }
        }

        return mapView.dequeueReusableAnnotationView(ofType: matchingController.annotationViewType, with: annotation)
