private List<Correction> removeOverlaps(List<Correction> corrections, 
			Map<Correction, Double> percentages) {
		
		if (corrections.size() <= 1) {
			return corrections;
		}
		logger.info("Removing overlaps between corrections...");
		
		boolean updates = false;
		List<Correction> correctionsCopy = new ArrayList<Correction>(corrections);
		
		for (int i = 0; i < corrections.size(); i++) {
			Correction corr1 = corrections.get(i);
			Double p1 = percentages.get(corr1);

			for (int j = i + 1; j < corrections.size(); j++) {
				Correction corr2 = corrections.get(j);
				Double p2 = percentages.get(corr2);

				if (corr1.hasSameSetting(corr2)) {
					updates = true;
					logger.info("Found overlap between correction " + 
							corr1.getName() + " (frequency " + String.format("%.2f", p1) + "%) and " + 
							"correction " + corr2.getName() + " (frequency " + String.format("%.2f", p2) + "%)");
					
					Correction moreFrequent = corr1;
					Correction lessFrequent = corr2;
					Double lessFrequentPercentage = p2;
					
					if (Double.compare(p1, p2) < 0) {
						moreFrequent = corr2;
						lessFrequent = corr1;
						lessFrequentPercentage = p1;
					} 
					correctionsCopy.remove(lessFrequent);	
					percentages.remove(lessFrequent);
					
					if (!compatible(corr1, corr2)) {
						logger.info("Corrections are incompatible, removed the less frequent");
						
					} else {
						logger.info("Corrections are compatible, updating the less frequent..");
						Correction corr = updateCorrection(lessFrequent, moreFrequent);
						correctionsCopy.add(corr);
						percentages.put(corr, lessFrequentPercentage);
					}
					break;
				}
			}
			if (updates) {
				break;
			}
		}
		
		if (updates) {
			return removeOverlaps(correctionsCopy, percentages);
		}
		return corrections;
	}