private Item unfoldSCC(Item i, Item from, Map<Item, Set<Item>> scc, Set<Item> current) {		
		if (i instanceof EndItem) {
			return i;
		}
		
		Pair<Item, Item> p = new Pair<Item, Item>(i, from);
		Item clone = unfolds.get(p);
		if (clone != null) {
			return clone;
		}

		if (from == null) {
			clone = i;
		} else {
			clone = i.unfold(from);
			items.add(clone);
		}
		unfolds.put(p, clone);
		
		ShareableHashSet<Transition> newDerives = new ShareableHashSet<Transition>();
		transitions.removeAll(i.derives);
		for (Transition t : i.derives) {
			Set<Item> targetScc = scc.get(t.target);
			Item newTo;
			if (targetScc != current) {
				newTo = unfoldSCC(t.target, clone, scc, targetScc);
			} else {
				newTo = unfoldSCC(t.target, from, scc, current);
			}
			newDerives.add(addTransition(clone, t.label, newTo));
		}
		
		Transition newShift = null;
		if (i.shift != null) {
			Transition t = i.shift;
			transitions.remove(t);
			Set<Item> targetScc = scc.get(t.target);
			Item newTo;
			if (targetScc != current) {
				newTo = unfoldSCC(t.target, clone, scc, targetScc);
			} else {
				newTo = unfoldSCC(t.target, from, scc, current);
			}
			newShift = addTransition(clone, t.label, newTo);
		}
		
		clone.derives = newDerives;
		clone.shift = newShift;
		
		return clone;
	}