private void unfoldNonRecursiveTails() {
		// a la mohri nederhof determinization:
		// every time a nonrecursive tail is used, make a copy for the specific used position.
		// this can be done before addReduceTransitions
		
		Relation<Item, Item> edges = new Relation<Item, Item>();
		for (Item i : allItems()) {
			for (Transition t : i.derives) {
				edges.add(i, t.target);
			}
			if (i.shift != null) {
				edges.add(i, i.shift.target);
			}
		}
		
		Relation<Item, Item> tc = new Relation<Item, Item>(Util.transitiveClosure2(edges.m));
		Set<Transition> old = new ShareableHashSet<Transition>();
		Set<Transition> neww = new ShareableHashSet<Transition>();
		for (Item i : allItems()) {
			if (tc.get(i).contains(i)) { // i is recursive
				for (Transition t : i.derives) {
					Item j = t.target;
					if (!tc.get(j).contains(j)) { // j is not recusive
						// unfold
						Item u = unfold(j, i);
						neww.add(addTransition(i, t.label, u));
						old.add(t);
					}
				}
			}
		}
		for (Transition t : old) {
			t.source.derives.remove(t);
		}
		transitions.removeAll(old);
		
		for (Transition t : neww) {
			t.source.derives.add(t);
		}
		transitions.addAll(neww);		
	}