public List<Event> getEvents() {
		if (this.events == null) {
			List<Event> r = new ArrayList<Event>();
			if (this.section.poincareStartPoint != null) {
				r.add(new AproximationEvent(this.section.poincareStartVector[0]
						+ getIntegrator().epoch, this.section,
						this.systemRef.descriptions,
						this.section.poincareStartBody,
						this.section.poincareStartPoint));
			}
			if (this.section.poincareEndPoint != null) {
				r.add(new AproximationEvent(this.section.poincareEndVector[0]
						+ getIntegrator().epoch, this.section,
						this.systemRef.descriptions,
						this.section.poincareEndBody,
						this.section.poincareEndPoint));
			}

			double[] flyBy = new double[this.section.integrator.bodies];

			Newton n = new Newton(this.section.integrator.M);
			n.setPosition(this.section.poincareStartVector[0],
					this.section.poincareStartPoint);
			try {
				n.checkFlyBy(this.flyByCriterion,
						this.section.poincareEndVector[0]
								- this.section.poincareStartVector[0], flyBy);

				Poincare passBy = null;
				for (int i = 1; i < this.section.integrator.bodies; i++) {
					if (i != this.section.poincareStartBody
							&& !Double.isNaN(flyBy[i])) {
						if (passBy == null) {
							passBy = new Poincare(this.section.integrator.M);
							passBy.copyState(this.section, passBy);
						}
						passBy.poincareEndBody = i;
						passBy.poincareMinTime = flyBy[i] - 10D;
						passBy.poincareMaxTime = flyBy[i] + 10D;
						if (passBy.poincareMap() == 0) {
							r.add(new AproximationEvent(
									passBy.poincareEndVector[0]
											+ passBy.integrator.epoch,
									this.section, this.systemRef.descriptions,
									passBy.poincareEndBody,
									passBy.poincareEndPoint));
						} else {
							System.err
									.println("Error finding pass-by event for body: "
											+ i);
						}

					}
				}
				this.events = r;
			} catch (Exception e) {
				this.events = Collections.emptyList();
				e.printStackTrace();
			}
		}
		return this.events;
	}