docs: private List<IN> mergeDocuments(List<List<IN>> baseDocuments){
  		// we should only get here if there is something to merge
  		assert(! baseClassifiers.isEmpty() && ! baseDocuments.isEmpty());
  		// all base outputs MUST have the same length (we generated them internally!)
  		for(int i = 1; i < baseDocuments.size(); i ++)
  			assert(baseDocuments.get(0).size() == baseDocuments.get(i).size());
  
  		// baseLabels.get(i) points to the labels assigned by baseClassifiers.get(i)
  		List<Set<String>> baseLabels = new ArrayList<Set<String>>();
  		Set<String> seenLabels = new HashSet<String>();
  		for (AbstractSequenceClassifier<? extends CoreMap> baseClassifier : baseClassifiers) {
  			Set<String> labs = baseClassifier.labels();
  			labs.removeAll(seenLabels);
  			//seenLabels.addAll(labs); // AZ allow next classifiers to add same label markups
  			// TODO make this configurable
  			baseLabels.add(labs);
  		}
  		String background = baseClassifiers.get(0).flags.backgroundSymbol;
  
  		if (DEBUG) {
  			for(int i = 0; i < baseLabels.size(); i ++)
  				System.err.println("mergeDocuments: Using classifier #" + i + " for " + baseLabels.get(i));
  			System.err.println("mergeDocuments: Background symbol is " + background);
  
  			System.err.println("Base model outputs:");
  			for( int i = 0; i < baseDocuments.size(); i ++){
  				System.err.printf("Output of model #%d:", i);
  				for (IN l : baseDocuments.get(i)) {
  					System.err.print(' ');
  					System.err.print(l.get(AnswerAnnotation.class));
  				}
  				System.err.println();
  			}
  		}
  
  		// incrementally merge each additional model with the main model (i.e., baseDocuments.get(0))
  		// this keeps adding labels from the additional models to mainDocument
  		// hence, when all is done, mainDocument contains the labels of all base models
  		List<IN> mainDocument = baseDocuments.get(0);
  		for (int i = 1; i < baseDocuments.size(); i ++) {
  			//mergeTwoDocuments(mainDocument, baseDocuments.get(i), baseLabels.get(i), background);
  			mergeTwoDocumentsByLongestSequence(mainDocument, baseDocuments.get(i), baseLabels.get(i), background);
  			
  			// save extra annotation seen in aux documents
  			for (int id = 0; id < mainDocument.size(); id++) {
  				IN m = mainDocument.get(id);
  				IN n = baseDocuments.get(i).get(id);
  				if (n != null && m != null) {
  					if (n.get(DistSimAnnotation.class) != null) m.set(DistSimAnnotation.class, n.get(DistSimAnnotation.class));
  					if (n.get(LVGazAnnotation.class) != null) m.set(LVGazAnnotation.class, n.get(LVGazAnnotation.class));
  					if (n.get(LVGazFileAnnotation.class) != null) m.set(LVGazFileAnnotation.class, n.get(LVGazFileAnnotation.class));
  				}
  			}
  		}
  
  		if (DEBUG) {
  			System.err.print("Output of combined model:");
  			for (IN l: mainDocument) {
  				System.err.print(' ');
  				System.err.print(l.get(AnswerAnnotation.class));
  			}
  			System.err.println();
  			System.err.println();
  		}
  
  		return mainDocument;
  	}