public void nextStep() {
		// handle timing and onEntryStepEnd
		if (sold != null) {
			final long t = System.currentTimeMillis() - told;

			final double progress = 1 - (double) stepsToComplete.size() / (double) totalSteps;

			for (final ProgressListener l : progressListeners) {
				l.onEntryStepProgress(this, sold, 1);
				l.onEntryStepEnd(this, sold, t, progress);
			}
		}

		final QueueEntry that = this;

		// we are finished
		if (stepsToComplete.isEmpty()) {
			for (final ProgressListener l : progressListeners) {
				l.onEntryEnd(this);
			}
			cleanUp();
			return;
		}

		// execute the next step
		final Step s = stepsToComplete.removeFirst();
		sold = s;
		told = System.currentTimeMillis();

		for (final ProgressListener l : progressListeners) {
			l.onEntryStepBegin(this, s);
			l.onEntryStepProgress(that, s, 0);
		}
		s.addListener(new StepListener() {
			@Override
			public void stepProgress(final double progress) {
				for (final ProgressListener l : progressListeners) {
					l.onEntryStepProgress(that, s, progress);
				}
			}
		});
		s.doStep();
	}