private List<INode> mergeVirtualPlaces(ISubModel model) {
		List<INode> markToBeDeleted = new ArrayList<INode>();

		/* Parcours des places susceptibles d'être liées (VIRTUAL) */
		LOG.fine("Processing virtual places");
		for (IPlace place : model.getPlaces()) {
			if (place.isTyped(IPlace.VIRTUAL)) {
				IPlace virtualPlace = place;
				LOG.finer("  Processing virtual place: " + virtualPlace.getName() + "(ref: " + virtualPlace.getTargetName() + ")");
				markToBeDeleted.add(virtualPlace);
				// Tous les prédécesseurs de la place virtuelle doivent être liés à la cible de la référence
				for (INode pred : virtualPlace.getPrevious()) {
					for (IArc ancestorArc : model.getArcs(pred, virtualPlace)) {
						IArc link = model.createArc(pred, model.getTopModel().findNode(virtualPlace.getTargetName()), ancestorArc.getType());
						link.setValuation(ancestorArc.getValuation());
						LOG.finest("    Linking: " + pred.getName() + " -> " + model.getTopModel().findNode(virtualPlace.getTargetName()));
					}
				}

				// Tous les successeurs de la place référence doivent être liés à la cible de la référence
				for (INode succ : virtualPlace.getNext()) {
					for (IArc ancestorArc : model.getArcs(virtualPlace, succ)) {
						IArc link = model.createArc(model.getTopModel().findNode(virtualPlace.getTargetName()), succ, ancestorArc.getType());
						link.setValuation(ancestorArc.getValuation());
						LOG.finest("    Linking: " + model.getTopModel().findNode(virtualPlace.getTargetName()) + " -> " + succ.getName());
					}
				}
			}

			// Suppression du type des places input / output
			if (place.isTyped(IPlace.INPUT) || place.isTyped(IPlace.OUTPUT)) { place.setType(IPlace.NORMAL); }
		}
		return markToBeDeleted;
	}