@SuppressWarnings("unused")
	private ArrayList<String> getOrderedResultsByNGramsFlexible(String first, int ngramLength) {
		ArrayList<String> ret = new ArrayList<String>();
		ArrayList<GeolocationString> toSort = new ArrayList<GeolocationString>();

		GeolocationString ngramFirst = new GeolocationString(first.toLowerCase().trim(), ngramLength);

		// Put each candidate from overkill into the new object
		for (String candidateXML : this.overkill) {
			if (candidateXML != null) {
				String candidate = getGeonamesName(candidateXML);
				if (candidate != null) {
					GeolocationString tmp = new GeolocationString(candidate.toLowerCase().replace("(historical)", "").trim(), ngramLength);
					tmp.setNGramMaster(ngramFirst);
					tmp.storeData(candidateXML);
					tmp.setPopulation(getGeonamesPop(candidateXML));
					tmp.setNumAltNames(getGeonamesNumAltNames(candidateXML));
					if (tmp.getOverlap() > 1)
						toSort.add(tmp);
				}
			}
		}

		if (!toSort.isEmpty()) {
			Collections.sort(toSort, new OriginalNGramsComparator());

			int maxOverlap = toSort.get(0).getOverlap();
			int flexOverlap = maxOverlap - 1;

			// Remove all items that have overlap less than flexOverlap
			Iterator<GeolocationString> itr = toSort.iterator();
			while (itr.hasNext()) {
				GeolocationString cur = itr.next();
				if (cur.getOverlap() < flexOverlap)
					itr.remove(); 
			}

			Collections.sort(toSort, new FlexibleNGramsComparator());

			for (GeolocationString sorted : toSort) {
				ret.add((String) sorted.getData());
			}
		}

		return ret;


	}