   ///   - trip: The trip for which to get the next departure
   ///   - vehicles: Optional vehicles that should be for private vehicles segments
   ///   - completion: Handler called on success with a trip or on error (with optional `Error`)
-  public func fetchNextTrip(after trip: Trip, usingPrivateVehicles vehicles: [TKVehicular] = [], completion: @escaping (Result<Trip, Error>) -> Void) {
+  public static func fetchNextTrip(after trip: Trip, usingPrivateVehicles vehicles: [TKVehicular] = [], completion: @escaping (Result<Trip, Error>) -> Void) {
     
     TKServer.shared.requireRegions { error in
       guard let region = trip.request.startRegion() else {

  ///   - atStart: `true` if getting on should change, `false` if getting off should change
  ///   - vehicles: The private vehicles to use for private vehicle segments
  ///   - completion: Handler called on success with a trip or on error (with optional `Error`)
  public func fetchTrip(moving segment: TKSegment, to visit: StopVisits, atStart: Bool, usingPrivateVehicles vehicles: [TKVehicular] = [], completion: @escaping (Result<Trip, Error>) -> Void) {
    
    TKServer.shared.requireRegions { error in
      if let error = error {

    
  }
  
}

// MARK: - Picking different shared vehicles

extension TKWaypointRouter {
  
  public static func fetchTrip(movingStartOf segment: TKSegment, to location: TKModeCoordinate, usingPrivateVehicles vehicles: [TKVehicular] = [], completion: @escaping (Result<Trip, Error>) -> Void) {
    
    TKServer.shared.requireRegions { error in
      if let error = error {
        completion(.failure(error))
        return
      }
      guard let region = segment.trip.request.startRegion() else {
        completion(.failure(TKWaypointRouter.WaypointError.couldNotFindRegionForTrip))
        return
      }
      
      do {
        let builder = WaypointParasBuilder(privateVehicles: vehicles)
        let paras = try builder.build(movingStartOf: segment, to: location)

        // We group all these in the same trip group even though
        // the pattern isn't an exact match.
        self.fetchTrip(waypointParas: paras, region: region, into: segment.trip.tripGroup, completion: completion)
        
        #warning("TODO: Check if the resulting trip matches the requested pattern and, if not, show an error.")
        
      } catch {
        completion(.failure(error))
      }
    }

  }
}

// MARK: - Helpers

extension TKWaypointRouter {
  
  /// For calculating a trip and adding it to an existing trip group.
  ///
  /// - note: Only use this method if the calculated trip will fit that
  ///     trip group as this will not be checked separately. It will fit
  ///     if it's using the same modes and same/similar stops.
  private static func fetchTrip(waypointParas: [String: Any], region: TKRegion, into tripGroup: TripGroup, completion: @escaping (Result<Trip, Error>) -> Void) {
    guard let context = tripGroup.managedObjectContext else {
      completion(.failure(TKWaypointRouter.WaypointError.tripGotDisassociatedFromCoreData))
      return
