private void propagateException(WorkItem workItem) {
		ActivityInstance exceptionSource = workItem.getActivityInstance();
		Exception exception = workItem.getExceptionToPropagate();

		ActivityInstance exceptionPropagator = exceptionSource;
		FaultBookmark targetBookmark = null;

		while (exceptionPropagator != null && targetBookmark == null) {
			if (!exceptionPropagator.isCompleted()) {
				// transaction abort here
			}

			// check canceling
			if (exceptionPropagator.isCancellationRequested()) {
				this.abortWorkflowInstance(new Exception("CannotPropagateExceptionWhileCanceling", exception));
				workItem.exceptionPropagated();
				return;
			}

			if (exceptionPropagator.getFaultBookmark() != null)
				targetBookmark = exceptionPropagator.getFaultBookmark();
			else
				exceptionPropagator = exceptionPropagator.getParent();
		}

		if (targetBookmark != null) {
			this.scheduler.pushWork(targetBookmark.generateWorkItem(
					exception, exceptionPropagator, workItem.getOriginalExceptionSource()));
			workItem.exceptionPropagated();
		}

		if (Trace.isEnabled())
			Trace.traceExceptionPropagated(exception,
					exceptionSource,
					exceptionPropagator != null ?
							exceptionPropagator.getParent() :
							null);
	}