private OsmTrack compileTrip(ScheduledTrip trip, int offset) {
    OsmTrack track = new OsmTrack();
    track.iternity = new ArrayList<String>();
    ScheduledTrip current = trip;
    ScheduledLine lastLine = new ScheduledLine();
    ScheduledLine dummyLine = new ScheduledLine();
    List<ScheduledTrip> list = new ArrayList<ScheduledTrip>();

    int distance = 0;

    ScheduledTrip itrip = null;

    String profile = extractProfile(rc.localFunction);

    OsmNodeP nextNode = null;
    while (current != null) {
      System.out.println("trip=" + current);
      OsmNodeP node = current.getTargetNode();
      OsmPathElement pe = new OsmPathElement(node.ilon, node.ilat, node.selev, null);
      track.addNode(pe);

      if (nextNode != null) {
        distance += node.calcDistance(nextNode);
      }

      boolean isScheduled = current.link instanceof ScheduledLink;
      boolean isConnection = current.link.descriptionBitmap == null && !isScheduled;
      ScheduledLine line =
          isScheduled ? ((ScheduledLink) current.link).line : isConnection ? dummyLine : null;

      if (line != lastLine && !isConnection) {
        itrip = new ScheduledTrip();
        itrip.departure = current.departure;
        itrip.arrival = current.arrival;
        itrip.originNode = current.originNode;
        itrip.link = current.link;

        if (isScheduled && list.size() > 0) {
          list.get(list.size() - 1).originNode = current.getTargetNode();
        }
        list.add(itrip);
      } else if (itrip != null && !isConnection) {
        itrip.departure = current.departure;
        itrip.originNode = current.originNode;
      }
      lastLine = line;
      current = current.origin;
      nextNode = node;
    }
    track.distance = distance;
    track.cost = trip.cost;

    for (int i = list.size() - 1; i >= 0; i--) {
      current = list.get(i);
      String lineName = profile;

      boolean isScheduled = current.link instanceof ScheduledLink;
      if (isScheduled) {
        lineName = ((ScheduledLink) current.link).line.name;
      }
      String stationName = "*position*";
      if (current.originNode instanceof StationNode) {
        stationName = ((StationNode) current.originNode).name;
      }
      String nextStationName = "*position*";
      if (i > 0 && list.get(i - 1).originNode instanceof StationNode) {
        nextStationName = ((StationNode) list.get(i - 1).originNode).name;
      }
      {
        Date d0 = new Date(time0 + 60000L * offset + current.departure);
        Date d1 = new Date(time0 + 60000L * offset + current.arrival);
        if (track.iternity.size() > 0) track.iternity.add("");
        track.iternity.add("depart: " + d0 + " " + stationName);
        track.iternity.add("                                     --- " + lineName + " ---");
        track.iternity.add("arrive: " + d1 + " " + nextStationName);
      }
    }

    return track;
  }