docs: public final void removeVariables(Variable[] v) throws VariableNotFound, IllegalVariableRemoval {
  		
  		HashSet<Constraint> incidentRevised = new HashSet<Constraint>();
  
  		//Keep track of solvers of dependent variables
  		HashMap<ConstraintSolver,ArrayList<Variable>> solversToDepVars = new HashMap<ConstraintSolver, ArrayList<Variable>>();
  
  		for (Variable var : v) {
  			if (!this.theNetwork.containsVariable(var) ) throw new VariableNotFound(var);
  			Constraint[] incident = this.theNetwork.getIncidentEdges(var);
  			for (Constraint con : incident) {
  				if ((!con.isAutoRemovable() && !(con instanceof DummyConstraint))) {
  					throw new IllegalVariableRemoval(var, this.theNetwork.getIncidentEdges(var));
  				}
  				else if (con instanceof DummyConstraint) {
  					Constraint toRemove = this.removeDummyConstraint((DummyConstraint)con);
  					if (toRemove != null) incidentRevised.add(toRemove);
  				}
  				else incidentRevised.add(con);
  			}
  			
  			//Gather solvers of dependent variables
  			for (Variable depVar : var.getDependentVariables()) {
  				if (!solversToDepVars.containsKey(depVar.getConstraintSolver())) {
  					solversToDepVars.put(depVar.getConstraintSolver(), new ArrayList<Variable>());
  				}
  				solversToDepVars.get(depVar.getConstraintSolver()).add(depVar);
  			}
  		}
  		
  		//Remove dependent variables
  		for (ConstraintSolver cs : solversToDepVars.keySet()) {
  			cs.removeVariables(solversToDepVars.get(cs).toArray(new Variable[solversToDepVars.get(cs).size()]));
  			logger.finest("Removed " + solversToDepVars.get(cs).size() + " dependent variables");
  		}
  		
  		this.removeConstraints(incidentRevised.toArray(new Constraint[incidentRevised.size()]));
  
  		removeVariablesSub(v);
  		for (Variable var : v) {
  			this.theNetwork.removeVariable(var);
  		}
  		for (ArrayList<Variable> vec : components.values()) {
  			vec.removeAll(Arrays.asList(v));
  		}
  		if (!skipPropagation && autoprop && checkDomainsInstantiated()) this.propagate();
  		logger.finest("Removed variables " + Arrays.toString(v));
  		
  	}