private Set<Trace> getTracesFromNode(ProcessNode node, int steps) {
		Set<Trace> traces = new HashSet<Trace>();
		
		if (node instanceof EndNode || steps == 0) {
			Trace newTrace = new Trace();
			traces.add(newTrace);
			return traces;
		}
		
		if (node instanceof ActivityNode) {
			return getTracesFromActivityNode((ActivityNode) node, steps);
		}
		if (node instanceof AndSplit) {
			AndJoin andJoin = this.getMatchingAndJoin((AndSplit) node, steps-1);
			Set<Trace> partTraces = this.getTracesInAndBlock((AndSplit) node, andJoin, steps);
			Set<Trace> nextTraces = getTracesFromNode(andJoin, steps-1);
			for (Trace t1 : partTraces) {
				for (Trace t2 : nextTraces) {
					Trace t = new Trace(t1.getActivities());
					t.addAllActivities(t2.getActivities());
					traces.add(t);
				}
			}
		}
		for (ProcessEdge edge : this.outgoingEdgesOf(node)) {
			Set<Trace> outTraces = getTracesFromNode(this.getEdgeTarget(edge), steps-1);
			traces.addAll(outTraces);
		}
		return traces;
	}