Index: SRUAggregator/trunk/aggregator.yml
===================================================================
--- SRUAggregator/trunk/aggregator.yml	(revision 6057)
+++ SRUAggregator/trunk/aggregator.yml	(revision 6065)
@@ -1,7 +1,7 @@
 aggregatorParams:
-  # CENTER_REGISTRY_URL: http://centres.clarin.eu/restxml/
+  CENTER_REGISTRY_URL: http://centres.clarin.eu/restxml/
   additionalCQLEndpoints:
     - https://clarin.ids-mannheim.de/digibibsru-new
-    - https://lux17.mpi.nl/ds/cqlsearch
+    # - https://lux17.mpi.nl/ds/cqlsearch
     # - http://cqlservlet.mpi.nl/
     # - http://dspin.dwds.de:8088/ddc-sru/dingler/
@@ -28,5 +28,14 @@
   EXECUTOR_SHUTDOWN_TIMEOUT_MS: 1000
 
-  WEBLICHT_URL: https://weblicht.sfs.uni-tuebingen.de/WebLicht-4/?input=
+  weblichtConfig:
+    url: https://weblicht.sfs.uni-tuebingen.de/WebLicht-4/?input=
+    acceptedTcfLanguages:
+      - en
+      - de
+      - nl
+      - fr
+      - it
+      - sp
+      - pl
 
 # use the simple server factory, run on a single port
Index: SRUAggregator/trunk/build.sh
===================================================================
--- SRUAggregator/trunk/build.sh	(revision 6057)
+++ SRUAggregator/trunk/build.sh	(revision 6065)
@@ -32,9 +32,12 @@
 node_modules/react-tools/bin/jsx --no-cache-dir $JSDIR $JSDIR
 
-# mvn -q clean package
+if [ "$1" == "--jar" ]
+then
+	mvn -q clean package
+fi
 
 # Run in production:
-#java -jar target/Aggregator2-2.0.0-alpha-6.jar server aggregator.yml
+#java -jar target/Aggregator2-2.0.0.jar server aggregator.yml
 
 # Run for development:
-# java -cp src/main/resources:target/Aggregator2-2.0.0-alpha-10.jar eu.clarin.sru.fcs.aggregator.app.Aggregator server aggregator_development.yml
+# java -cp src/main/resources:target/Aggregator2-2.0.0.jar eu.clarin.sru.fcs.aggregator.app.Aggregator server aggregator_development.yml
Index: SRUAggregator/trunk/pom.xml
===================================================================
--- SRUAggregator/trunk/pom.xml	(revision 6057)
+++ SRUAggregator/trunk/pom.xml	(revision 6065)
@@ -8,5 +8,5 @@
 	<groupId>eu.clarin.sru.fcs</groupId>
 	<artifactId>Aggregator2</artifactId>
-	<version>2.0.0-alpha-24</version>
+	<version>2.0.0-alpha-25</version>
 	<name>FCS Aggregator</name>
 
@@ -90,9 +90,4 @@
 
 		<dependency>
-			<groupId>org.apache.opennlp</groupId>
-			<artifactId>opennlp-tools</artifactId>
-			<version>1.5.3</version>
-		</dependency>
-		<dependency>
 		    <groupId>com.optimaize.languagedetector</groupId>
 		    <artifactId>language-detector</artifactId>
@@ -149,17 +144,4 @@
 				</configuration>
 			</plugin>
-			<!--<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<version>2.2.1</version>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>-->
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
Index: SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/Aggregator.java
===================================================================
--- SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/Aggregator.java	(revision 6057)
+++ SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/Aggregator.java	(revision 6065)
@@ -18,5 +18,5 @@
 import eu.clarin.sru.fcs.aggregator.rest.RestService;
 import eu.clarin.sru.fcs.aggregator.scan.Statistics;
-import eu.clarin.sru.fcs.aggregator.lang.LanguagesISO693_3;
+import eu.clarin.sru.fcs.aggregator.util.LanguagesISO693;
 import io.dropwizard.Application;
 import io.dropwizard.assets.AssetsBundle;
@@ -25,5 +25,4 @@
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -35,5 +34,4 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.atomic.AtomicReference;
-import opennlp.tools.tokenize.TokenizerModel;
 import org.slf4j.LoggerFactory;
 
@@ -88,4 +86,9 @@
  * @author edima
  *
+ * TODO: ?use weblicht only to show up in zoomed mode
+ * - send only tcf with only a text layer and language (from the list in params)
+ *
+ * TODO: add the modes described above (except live)
+ *
  * TODO: zoom into the results from a corpus, allow functionality only for
  * the view (search for next set of results)
@@ -95,4 +98,9 @@
  * Twan (they did a test, it worked)
  *
+ * TODO: add PiWik support, tracking the following:
+ * - visits, searches, search per corpus
+ *
+ * TODO: BUG: language detection is immediate, in UI; export implications
+ *
  * TODO: websockets
  *
@@ -122,5 +130,4 @@
 	private AtomicReference<Statistics> searchStatsAtom = new AtomicReference<Statistics>(new Statistics());
 
-	private TokenizerModel tokenizerModel;
 	private LanguageDetector languageDetector;
 	private TextObjectFactory textObjectFactory;
@@ -235,6 +242,5 @@
 		}
 
-		LanguagesISO693_3.getInstance(); // force init
-		initTokenizer();
+		LanguagesISO693.getInstance(); // force init
 		initLanguageDetector();
 
@@ -293,8 +299,4 @@
 	}
 
-	public TokenizerModel getTokenizerModel() {
-		return tokenizerModel;
-	}
-
 	private static void shutdownAndAwaitTermination(AggregatorConfiguration.Params params,
 			ThrottledClient sruClient, ExecutorService scheduler) {
@@ -313,16 +315,4 @@
 	}
 
-	private void initTokenizer() {
-		TokenizerModel model = null;
-		try {
-			try (InputStream tokenizerModelDeAsIS = Thread.currentThread().getContextClassLoader().getResourceAsStream(DE_TOK_MODEL)) {
-				model = new TokenizerModel(tokenizerModelDeAsIS);
-			}
-		} catch (IOException ex) {
-			log.error("Failed to load tokenizer model", ex);
-		}
-		tokenizerModel = model;
-	}
-
 	public void initLanguageDetector() throws IOException {
 		List<LanguageProfile> languageProfiles = new LanguageProfileReader().readAll();
Index: SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/AggregatorConfiguration.java
===================================================================
--- SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/AggregatorConfiguration.java	(revision 6057)
+++ SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/app/AggregatorConfiguration.java	(revision 6065)
@@ -14,11 +14,9 @@
 	public static class Params {
 
-		@NotEmpty
 		@JsonProperty
 		String CENTER_REGISTRY_URL;
 
-		@NotEmpty
 		@JsonProperty
-		String WEBLICHT_URL;
+		List<URL> additionalCQLEndpoints;
 
 		@NotEmpty
@@ -66,6 +64,25 @@
 		long EXECUTOR_SHUTDOWN_TIMEOUT_MS;
 
+		public static class WeblichtConfig {
+			@JsonProperty
+			String url;
+
+			@JsonProperty
+			List<String> acceptedTcfLanguages;
+
+			@JsonIgnore
+			public String getUrl() {
+				return url;
+			}
+
+			@JsonIgnore
+			public List<String> getAcceptedTcfLanguages() {
+				return acceptedTcfLanguages;
+			}
+		}
+
+		@NotEmpty
 		@JsonProperty
-		List<URL> additionalCQLEndpoints;
+		WeblichtConfig weblichtConfig;
 
 		@JsonIgnore
@@ -95,6 +112,6 @@
 
 		@JsonIgnore
-		public String getWEBLICHT_URL() {
-			return WEBLICHT_URL;
+		public WeblichtConfig getWeblichtConfig() {
+			return weblichtConfig;
 		}
 	}
Index: SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/rest/RestService.java
===================================================================
--- SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/rest/RestService.java	(revision 6057)
+++ SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/rest/RestService.java	(revision 6065)
@@ -7,4 +7,5 @@
 import eu.clarin.sru.fcs.aggregator.app.Aggregator;
 import eu.clarin.sru.fcs.aggregator.app.AggregatorConfiguration;
+import eu.clarin.sru.fcs.aggregator.app.AggregatorConfiguration.Params.WeblichtConfig;
 import eu.clarin.sru.fcs.aggregator.scan.Corpus;
 import eu.clarin.sru.fcs.aggregator.scan.Statistics;
@@ -12,6 +13,5 @@
 import eu.clarin.sru.fcs.aggregator.search.Result;
 import eu.clarin.sru.fcs.aggregator.search.Search;
-import eu.clarin.sru.fcs.aggregator.lang.LanguagesISO693_3;
-import eu.clarin.sru.fcs.aggregator.search.ExportException;
+import eu.clarin.sru.fcs.aggregator.util.LanguagesISO693;
 import eu.clarin.sru.fcs.aggregator.search.Exports;
 import java.io.IOException;
@@ -22,6 +22,4 @@
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
@@ -36,5 +34,4 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import opennlp.tools.tokenize.TokenizerModel;
 import org.slf4j.LoggerFactory;
 
@@ -113,5 +110,5 @@
 		log.info("get language codes", codes);
 		for (String code : codes) {
-			String name = LanguagesISO693_3.getInstance().nameForCode_3(code);
+			String name = LanguagesISO693.getInstance().nameForCode(code);
 			languages.put(code, name != null ? name : code);
 		}
@@ -192,11 +189,10 @@
 		}
 
-	if (format == null || format.trim().isEmpty() || format.trim().equals("text")) {
+		if (format == null || format.trim().isEmpty() || format.trim().equals("text")) {
 			String text = Exports.getExportText(search.getResults());
 			return download(text, MediaType.TEXT_PLAIN, search.getQuery() + ".txt");
 		} else if (format.equals("tcf")) {
-			byte[] bytes = Exports.getExportTokenizedTCF(
-					search.getResults(), search.getSearchLanguage(),
-					Aggregator.getInstance().getTokenizerModel());
+			byte[] bytes = Exports.getExportTCF(
+					search.getResults(), search.getSearchLanguage());
 			return download(bytes, TCF_MEDIA_TYPE, search.getQuery() + ".xml");
 		} else if (format.equals("excel")) {
@@ -240,8 +236,7 @@
 				url = DataTransfer.uploadToDropOff(bytes, "text/plan", ".txt");
 			}
-		} else if (format.equals("tokens")) {
-			byte[] bytes = Exports.getExportTokenizedTCF(
-					search.getResults(), search.getSearchLanguage(),
-					Aggregator.getInstance().getTokenizerModel());
+		} else if (format.equals("tcf")) {
+			byte[] bytes = Exports.getExportTCF(
+					search.getResults(), search.getSearchLanguage());
 			if (bytes != null) {
 				url = DataTransfer.uploadToDropOff(bytes, "text/tcf+xml", ".tcf");
@@ -251,6 +246,6 @@
 		}
 
-		URI weblichtUri = new URI(Aggregator.getInstance().getParams().getWEBLICHT_URL()
-				+ url);
+		WeblichtConfig weblicht = Aggregator.getInstance().getParams().getWeblichtConfig();
+		URI weblichtUri = new URI(weblicht.getUrl() + url);
 		return url == null
 				? Response.status(503).entity("error while exporting to weblicht").build()
Index: SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/scan/Corpus.java
===================================================================
--- SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/scan/Corpus.java	(revision 6057)
+++ SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/scan/Corpus.java	(revision 6065)
@@ -1,5 +1,5 @@
 package eu.clarin.sru.fcs.aggregator.scan;
 
-import eu.clarin.sru.fcs.aggregator.lang.LanguagesISO693_3;
+import eu.clarin.sru.fcs.aggregator.util.LanguagesISO693;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -102,8 +102,8 @@
 
 	public void addLanguage(String language) {
-		if (LanguagesISO693_3.getInstance().getCodes_3().contains(language)) {
+		if (LanguagesISO693.getInstance().isCode(language)) {
 			this.languages.add(language);
 		} else {
-			String code = LanguagesISO693_3.getInstance().code_3ForName(language);
+			String code = LanguagesISO693.getInstance().code_3ForName(language);
 			this.languages.add(code == null ? language : code);
 		}
Index: SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/search/Exports.java
===================================================================
--- SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/search/Exports.java	(revision 6057)
+++ SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/search/Exports.java	(revision 6065)
@@ -1,24 +1,15 @@
 package eu.clarin.sru.fcs.aggregator.search;
 
-import eu.clarin.sru.fcs.aggregator.lang.LanguagesISO693_2;
-import eu.clarin.sru.fcs.aggregator.lang.LanguagesISO693_3;
+import eu.clarin.sru.fcs.aggregator.util.LanguagesISO693;
 import eu.clarin.weblicht.wlfxb.io.WLDObjector;
 import eu.clarin.weblicht.wlfxb.io.WLFormatException;
 import eu.clarin.weblicht.wlfxb.md.xb.MetaData;
-import eu.clarin.weblicht.wlfxb.tc.api.MatchedCorpus;
-import eu.clarin.weblicht.wlfxb.tc.api.Token;
 import eu.clarin.weblicht.wlfxb.tc.xb.TextCorpusStored;
 import eu.clarin.weblicht.wlfxb.xb.WLData;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import opennlp.tools.tokenize.TokenizerME;
-import opennlp.tools.tokenize.TokenizerModel;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;
@@ -30,5 +21,5 @@
 /**
  * Utility for representing SearchResult data in different formats.
- * 
+ *
  * @author Yana Panchenko
  */
@@ -39,193 +30,163 @@
 	public static String getExportCSV(List<Result> resultsProcessed, String separator) {
 
-        boolean noResult = true;
-        StringBuilder csv = new StringBuilder();
-        if (resultsProcessed != null && !resultsProcessed.isEmpty()) {
-            String[] headers = new String[]{
-                "LEFT CONTEXT", "KEYWORD", "RIGHT CONTEXT", "PID", "REFERENCE"};
-            for (String header : headers) {
-                csv.append("\"");
-                csv.append(header);
-                csv.append("\"");
-                csv.append(separator);
-            }
-            csv.append("\n");
-
-            for (Result result : resultsProcessed) {
-                for (Kwic kwic : result.getKwics()) {
-                    csv.append("\"");
-                    csv.append(escapeQuotes(kwic.getLeft()));
-                    csv.append("\"");
-                    csv.append(separator);
-                    csv.append("\"");
-                    csv.append(escapeQuotes(kwic.getKeyword()));
-                    csv.append("\"");
-                    csv.append(separator);
-                    csv.append("\"");
-                    csv.append(escapeQuotes(kwic.getRight()));
-                    csv.append("\"");
-                    csv.append(separator);
-                    csv.append("\"");
-                    if (kwic.getPid() != null) {
-                        csv.append(escapeQuotes(kwic.getPid()));
-                    }
-                    csv.append("\"");
-                    csv.append(separator);
-                    csv.append("\"");
-                    if (kwic.getReference() != null) {
-                        csv.append(escapeQuotes(kwic.getReference()));
-                    }
-                    csv.append("\"");
-                    csv.append("\n");
-                    noResult = false;
-                }
-            }
-        }
-        if (noResult) {
-            return null;
-        } else {
-            return csv.toString();
-        }
-    }
+		boolean noResult = true;
+		StringBuilder csv = new StringBuilder();
+		if (resultsProcessed != null && !resultsProcessed.isEmpty()) {
+			String[] headers = new String[]{
+				"LEFT CONTEXT", "KEYWORD", "RIGHT CONTEXT", "PID", "REFERENCE"};
+			for (String header : headers) {
+				csv.append("\"");
+				csv.append(header);
+				csv.append("\"");
+				csv.append(separator);
+			}
+			csv.append("\n");
+
+			for (Result result : resultsProcessed) {
+				for (Kwic kwic : result.getKwics()) {
+					csv.append("\"");
+					csv.append(escapeQuotes(kwic.getLeft()));
+					csv.append("\"");
+					csv.append(separator);
+					csv.append("\"");
+					csv.append(escapeQuotes(kwic.getKeyword()));
+					csv.append("\"");
+					csv.append(separator);
+					csv.append("\"");
+					csv.append(escapeQuotes(kwic.getRight()));
+					csv.append("\"");
+					csv.append(separator);
+					csv.append("\"");
+					if (kwic.getPid() != null) {
+						csv.append(escapeQuotes(kwic.getPid()));
+					}
+					csv.append("\"");
+					csv.append(separator);
+					csv.append("\"");
+					if (kwic.getReference() != null) {
+						csv.append(escapeQuotes(kwic.getReference()));
+					}
+					csv.append("\"");
+					csv.append("\n");
+					noResult = false;
+				}
+			}
+		}
+		if (noResult) {
+			return null;
+		} else {
+			return csv.toString();
+		}
+	}
 
 	private static CharSequence escapeQuotes(String text) {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < text.length(); i++) {
-            char ch = text.charAt(i);
-            if (ch == '"') {
-                sb.append('"');
-            }
-            sb.append(ch);
-        }
-        return sb;
-    }
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < text.length(); i++) {
+			char ch = text.charAt(i);
+			if (ch == '"') {
+				sb.append('"');
+			}
+			sb.append(ch);
+		}
+		return sb;
+	}
 
 	public static byte[] getExportExcel(List<Result> resultsProcessed) throws ExportException {
 
-        boolean noResult = true;
-        SXSSFWorkbook workbook = null;
-        ByteArrayOutputStream excelStream = new ByteArrayOutputStream();
-        if (resultsProcessed != null && !resultsProcessed.isEmpty()) {
-            try {
-                String[] headers = new String[]{
-                    "LEFT CONTEXT", "KEYWORD", "RIGHT CONTEXT", "PID", "REFERENCE"};
-
-                workbook = new SXSSFWorkbook();
-                Sheet sheet = workbook.createSheet();
-
-                Font boldFont = workbook.createFont();
-                boldFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
-
-                // Header
-                CellStyle headerStyle = workbook.createCellStyle();
-                headerStyle.setFont(boldFont);
-
-                Row row = sheet.createRow(0);
-
-                for (int j = 0; j < headers.length; ++j) {
-                    Cell cell = row.createCell(j, Cell.CELL_TYPE_STRING);
-                    cell.setCellValue(headers[j]);
-                    cell.setCellStyle(headerStyle);
-                }
-
-                // Body
-                Cell cell;
-                for (int k = 0; k < resultsProcessed.size(); k++) {
-                    Result result = resultsProcessed.get(k);
-                    List<Kwic> kwics = result.getKwics();
-                    for (int i = 0; i < kwics.size(); i++) {
-                        Kwic kwic = kwics.get(i);
-                        row = sheet.createRow(k + i + 1);
-                        cell = row.createCell(0, Cell.CELL_TYPE_STRING);
-                        cell.setCellValue(kwic.getLeft());
-                        cell = row.createCell(1, Cell.CELL_TYPE_STRING);
-                        cell.setCellValue(kwic.getKeyword());
-                        cell = row.createCell(2, Cell.CELL_TYPE_STRING);
-                        cell.setCellValue(kwic.getRight());
-                        if (kwic.getPid() != null) {
-                            cell = row.createCell(3, Cell.CELL_TYPE_STRING);
-                            cell.setCellValue(kwic.getPid());
-                        }
-                        if (kwic.getReference() != null) {
-                            cell = row.createCell(3, Cell.CELL_TYPE_STRING);
-                            cell.setCellValue(kwic.getReference());
-                        }
-                        noResult = false;
-                    }
-                }
-                workbook.write(excelStream);
-            } catch (IOException ex) {
+		boolean noResult = true;
+		SXSSFWorkbook workbook = null;
+		ByteArrayOutputStream excelStream = new ByteArrayOutputStream();
+		if (resultsProcessed != null && !resultsProcessed.isEmpty()) {
+			try {
+				String[] headers = new String[]{
+					"LEFT CONTEXT", "KEYWORD", "RIGHT CONTEXT", "PID", "REFERENCE"};
+
+				workbook = new SXSSFWorkbook();
+				Sheet sheet = workbook.createSheet();
+
+				Font boldFont = workbook.createFont();
+				boldFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
+
+				// Header
+				CellStyle headerStyle = workbook.createCellStyle();
+				headerStyle.setFont(boldFont);
+
+				Row row = sheet.createRow(0);
+
+				for (int j = 0; j < headers.length; ++j) {
+					Cell cell = row.createCell(j, Cell.CELL_TYPE_STRING);
+					cell.setCellValue(headers[j]);
+					cell.setCellStyle(headerStyle);
+				}
+
+				// Body
+				Cell cell;
+				for (int k = 0; k < resultsProcessed.size(); k++) {
+					Result result = resultsProcessed.get(k);
+					List<Kwic> kwics = result.getKwics();
+					for (int i = 0; i < kwics.size(); i++) {
+						Kwic kwic = kwics.get(i);
+						row = sheet.createRow(k + i + 1);
+						cell = row.createCell(0, Cell.CELL_TYPE_STRING);
+						cell.setCellValue(kwic.getLeft());
+						cell = row.createCell(1, Cell.CELL_TYPE_STRING);
+						cell.setCellValue(kwic.getKeyword());
+						cell = row.createCell(2, Cell.CELL_TYPE_STRING);
+						cell.setCellValue(kwic.getRight());
+						if (kwic.getPid() != null) {
+							cell = row.createCell(3, Cell.CELL_TYPE_STRING);
+							cell.setCellValue(kwic.getPid());
+						}
+						if (kwic.getReference() != null) {
+							cell = row.createCell(3, Cell.CELL_TYPE_STRING);
+							cell.setCellValue(kwic.getReference());
+						}
+						noResult = false;
+					}
+				}
+				workbook.write(excelStream);
+			} catch (IOException ex) {
 				LOGGER.log(Level.SEVERE, null, ex);
 				throw new ExportException("Exception exporting Excel", ex);
-            } finally {
-                if (workbook != null) {
-                    workbook.dispose();
-                }
-            }
-        }
-        if (noResult) {
-            return null;
-        } else {
-            return excelStream.toByteArray();
-        }
-
-    }
-
-	private static byte[] getExportTCF(List<Result> resultsProcessed,
+			} finally {
+				if (workbook != null) {
+					workbook.dispose();
+				}
+			}
+		}
+		if (noResult) {
+			return null;
+		} else {
+			return excelStream.toByteArray();
+		}
+
+	}
+
+	public static byte[] getExportTCF(List<Result> resultsProcessed,
 			String searchLanguage) throws ExportException {
-        StringBuilder text = new StringBuilder();
-        Set<String> resultsLangs = new HashSet<String>();
-        if (resultsProcessed != null && !resultsProcessed.isEmpty()) {
-            for (Result result : resultsProcessed) {
-                resultsLangs.addAll(result.getCorpus().getLanguages());
-                for (Kwic kwic : result.getKwics()) {
-                    text.append(kwic.getLeft());
-                    text.append(" ");
-                    text.append(kwic.getKeyword());
-                    text.append(" ");
-                    text.append(kwic.getRight());
-                    text.append("\n");
-                }
-            }
-
-        }
-        if (text.length() == 0) {
-			return null;
-        } else {
-            WLData data;
-            MetaData md = new MetaData();
-            String resultsLang = "unknown";
-            if (resultsLangs.size() == 1) {
-                resultsLang = resultsLangs.iterator().next();
-				String code2 = LanguagesISO693_2.getInstance().langForCode(resultsLang).getCode_639_1();
-                if (code2 != null) {
-                    resultsLang = code2;
-                }
-            } else if (!searchLanguage.equals("anylang")) {
-				String code2 = LanguagesISO693_2.getInstance().langForCode(resultsLang).getCode_639_1();
-                if (code2 == null) {
-                    resultsLang = searchLanguage;
-                } else {
-                    resultsLang = code2;
-                }
-            }
-            TextCorpusStored tc = new TextCorpusStored(resultsLang);
-            tc.createTextLayer().addText(text.toString());
-            data = new WLData(md, tc);
+		String text = getExportText(resultsProcessed);
+		if (text == null || text.isEmpty()) {
+			return null;
+		} else {
+			WLData data;
+			MetaData md = new MetaData();
+			String languageCode = LanguagesISO693.getInstance().code_1ForCode_3(searchLanguage);
+			TextCorpusStored tc = new TextCorpusStored(languageCode);
+			tc.createTextLayer().addText(text);
+			data = new WLData(md, tc);
 			ByteArrayOutputStream os = new ByteArrayOutputStream();
-            try {
-                WLDObjector.write(data, os);
-            } catch (WLFormatException ex) {
-                LOGGER.log(Level.SEVERE, "Error exporting TCF {0} {1}", new String[]{ex.getClass().getName(), ex.getMessage()});
+			try {
+				WLDObjector.write(data, os);
+			} catch (WLFormatException ex) {
+				LOGGER.log(Level.SEVERE, "Error exporting TCF {0} {1}", new String[]{ex.getClass().getName(), ex.getMessage()});
 				throw new ExportException("Error exporting TCF", ex);
-            }
+			}
 			return os.toByteArray();
-        }
-    }
-
-	public static byte[] getExportTokenizedTCF(List<Result> resultsProcessed,
-			String searchLanguage, TokenizerModel tokenizerModel) throws ExportException {
-        StringBuilder text = new StringBuilder();
-        if (resultsProcessed != null && !resultsProcessed.isEmpty()) {
+		}
+	}
+
+	public static String getExportText(List<Result> resultsProcessed) {
+		StringBuilder text = new StringBuilder();
+		if (resultsProcessed != null && !resultsProcessed.isEmpty()) {
 			for (Result result : resultsProcessed) {
 				for (Kwic kwic : result.getKwics()) {
@@ -239,91 +200,12 @@
 					}
 					text.append("\n");
-                }
-            }
-
-        }
-        if (text.length() == 0) {
-			return null;
-        } else {
-            WLData data;
-			MetaData md = new MetaData();
-			String languageCode = LanguagesISO693_3.getInstance().code_1ForCode_3(searchLanguage);
-			TextCorpusStored tc = new TextCorpusStored(languageCode);
-            tc.createTextLayer().addText(text.toString());
-			addTokensSentencesMatches(resultsProcessed, tc, tokenizerModel);
-            data = new WLData(md, tc);
-			ByteArrayOutputStream os = new ByteArrayOutputStream();
-            try {
-                WLDObjector.write(data, os);
-            } catch (WLFormatException ex) {
-                LOGGER.log(Level.SEVERE, "Error exporting TCF {0} {1}", new String[]{ex.getClass().getName(), ex.getMessage()});
-				throw new ExportException("Error exporting TCF", ex);
-			}
-			return os.toByteArray();
-		}
-    }
-
-	private static void addTokensSentencesMatches(List<Result> resultsProcessed, TextCorpusStored tc, TokenizerModel model) {
-		if (model == null || !"de".equals(tc.getLanguage())) {
-            return;
-        }
-        TokenizerME tokenizer = new TokenizerME(model);
-
-        if (resultsProcessed != null && !resultsProcessed.isEmpty()) {
-            tc.createTokensLayer();
-            tc.createSentencesLayer();
-            tc.createMatchesLayer("FCS", resultsProcessed.get(0).getSearchString());
-            for (Result result : resultsProcessed) {
-				MatchedCorpus mCorpus = tc.getMatchesLayer().addCorpus(result.getCorpus().getTitle(), result.getCorpus().getHandle());
-                for (Kwic kwic : result.getKwics()) {
-                    List<Token> tokens = new ArrayList<Token>();
-                    addToTcfTokens(tokens, tc, tokenizer.tokenize(kwic.getLeft()));
-                    String[] target = tokenizer.tokenize(kwic.getKeyword());
-                    List<Token> targetTokens = addToTcfTokens(tokens, tc, target);
-                    addToTcfTokens(tokens, tc, tokenizer.tokenize(kwic.getRight()));
-                    tc.getSentencesLayer().addSentence(tokens);
-                    List<String> pidAndRef = new ArrayList<String>();
-                    if (kwic.getPid() != null) {
-                        pidAndRef.add(kwic.getPid());
-                    }
-                    if (kwic.getReference() != null) {
-                        pidAndRef.add(kwic.getReference());
-                    }
-                    tc.getMatchesLayer().addItem(mCorpus, targetTokens, pidAndRef);
-                }
-            }
-        }
-    }
-
-	private static List<Token> addToTcfTokens(List<Token> tokens, TextCorpusStored tc, String[] tokenStrings) {
-        List<Token> addedTokens = new ArrayList<Token>(tokenStrings.length);
-        for (String tokenString : tokenStrings) {
-            Token token = tc.getTokensLayer().addToken(tokenString);
-            addedTokens.add(token);
-            tokens.add(token);
-        }
-        return addedTokens;
-    }
-
-	public static String getExportText(List<Result> resultsProcessed) {
-        StringBuilder text = new StringBuilder();
-        if (resultsProcessed != null && !resultsProcessed.isEmpty()) {
-            for (Result result : resultsProcessed) {
-                for (Kwic kwic : result.getKwics()) {
-                    text.append(kwic.getLeft());
-                    text.append(" ");
-                    text.append(kwic.getKeyword());
-                    text.append(" ");
-                    text.append(kwic.getRight());
-                    text.append("\n");
-                }
-            }
-
-        }
-        if (text.length() == 0) {
-            return null;
-        } else {
-            return text.toString();
-        }
-    }
+				}
+			}
+		}
+		if (text.length() == 0) {
+			return null;
+		} else {
+			return text.toString();
+		}
+	}
 }
Index: SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/search/Kwic.java
===================================================================
--- SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/search/Kwic.java	(revision 6057)
+++ SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/search/Kwic.java	(revision 6065)
@@ -3,7 +3,8 @@
 import eu.clarin.sru.client.fcs.DataViewHits;
 import eu.clarin.sru.fcs.aggregator.app.Aggregator;
-import eu.clarin.sru.fcs.aggregator.lang.LanguagesISO693_3;
+import eu.clarin.sru.fcs.aggregator.util.LanguagesISO693;
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.commons.lang.StringEscapeUtils;
 
 /**
@@ -48,23 +49,29 @@
 		this.reference = reference;
 
-		String text = hits.getText();
+		// warning: the client library doesn't unescape the xml
+		// so the text can still contains &lt; and &amp; codes
+		String str = hits.getText();
+
 		int lastOffset = 0;
 		for (int i = 0; i < hits.getHitCount(); i++) {
 			int[] offsets = hits.getHitOffsets(i);
 			if (lastOffset < offsets[0]) {
-				fragments.add(new TextFragment(text.substring(lastOffset, offsets[0]), false));
+				String text = StringEscapeUtils.unescapeXml(str.substring(lastOffset, offsets[0]));
+				fragments.add(new TextFragment(text, false));
 			}
 			if (offsets[0] < offsets[1]) {
-				fragments.add(new TextFragment(text.substring(offsets[0], offsets[1]), true));
+				String text = StringEscapeUtils.unescapeXml(str.substring(offsets[0], offsets[1]));
+				fragments.add(new TextFragment(text, true));
 			}
 			lastOffset = offsets[1];
 		}
-		if (lastOffset < text.length()) {
-			fragments.add(new TextFragment(text.substring(lastOffset, text.length()), false));
+		if (lastOffset < str.length()) {
+			String text = StringEscapeUtils.unescapeXml(str.substring(lastOffset, str.length()));
+			fragments.add(new TextFragment(text, false));
 		}
 
-		String code_iso639_1 = Aggregator.getInstance().detectLanguage(hits.getText());
+		String code_iso639_1 = Aggregator.getInstance().detectLanguage(str);
 		language = code_iso639_1 == null ? null
-				: LanguagesISO693_3.getInstance().code_3ForCode_1(code_iso639_1);
+				: LanguagesISO693.getInstance().code_3ForCode(code_iso639_1);
 	}
 
@@ -87,10 +94,12 @@
 	@Deprecated
 	public String getLeft() {
+		StringBuilder sb = new StringBuilder();
 		for (TextFragment tf : fragments) {
-			if (!tf.isHit) {
-				return tf.text;
+			if (tf.isHit) {
+				break;
 			}
+			sb.append(tf.text);
 		}
-		return "";
+		return sb.toString();
 	}
 
Index: SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/util/LanguagesISO693.java
===================================================================
--- SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/util/LanguagesISO693.java	(revision 6065)
+++ SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/util/LanguagesISO693.java	(revision 6065)
@@ -0,0 +1,131 @@
+package eu.clarin.sru.fcs.aggregator.util;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents collection of languages.
+ *
+ * @author Yana Panchenko
+ */
+public class LanguagesISO693 {
+
+	private static final org.slf4j.Logger log = LoggerFactory.getLogger(LanguagesISO693.class);
+	public static final String LANGUAGES_FILE_PATH = "/lang/iso-639-3_20140320.tab";
+	public static final String LANGUAGES_FILE_ENCODING = "UTF-8";
+
+	private static LanguagesISO693 instance = null;
+
+	public static class Language {
+
+		// code is ISO-639-3 (3 letters) while code_2 is ISO-639-1 (2 letters)
+		private String code_3, code_1, name;
+
+		public Language(String code_3, String code_1, String name) {
+			this.code_3 = code_3;
+			this.code_1 = code_1;
+			this.name = name;
+		}
+	}
+
+	private Map<String, Language> codeToLang = new HashMap<String, Language>();
+	private Map<String, Language> nameToLang = new HashMap<String, Language>();
+
+	private LanguagesISO693() {
+		InputStream is = LanguagesISO693.class.getResourceAsStream(LANGUAGES_FILE_PATH);
+		try (BufferedReader br = new BufferedReader(new InputStreamReader(is, LANGUAGES_FILE_ENCODING))) {
+			br.readLine(); // ignore first line (header)
+			String line;
+			while ((line = br.readLine()) != null) {
+				if (line.length() > 0) {
+					String[] toks = line.split("\\t");
+					if (toks.length != 7 && toks.length != 8) {
+						log.error("Line error in language codes file: ", line);
+						continue;
+					}
+					String code_3 = toks[0].trim();
+					String code_1 = toks[3].trim().isEmpty() ? null : toks[3].trim();
+					if (code_1 != null && code_1.length() != 2) {
+						throw new RuntimeException("bad ISO-639-1 code: " + code_1);
+					}
+					String name = toks[6].trim();
+					Language l = new Language(code_3, code_1, name);
+					codeToLang.put(code_3, l);
+					if (code_1 != null) {
+						codeToLang.put(code_1, l);
+					}
+					nameToLang.put(name, l);
+				}
+			}
+		} catch (IOException ex) {
+			log.error("Initialization of languages code to name mapping failed.", ex);
+		}
+
+		ObjectWriter ow = new ObjectMapper().writerWithDefaultPrettyPrinter();
+		try {
+			System.out.println(ow.writeValueAsString(codeToLang));
+		} catch (JsonProcessingException ex) {
+		}
+	}
+
+	public static LanguagesISO693 getInstance() {
+		if (instance == null) {
+			instance = new LanguagesISO693();
+		}
+		return instance;
+	}
+
+	public boolean isCode(String code) {
+		return codeToLang.containsKey(code);
+	}
+
+	public String code_3ForCode(String code639_1) {
+		if (code639_1 == null) {
+			return null;
+		}
+		Language l = codeToLang.get(code639_1);
+		if (l == null) {
+			log.error("Unknown ISO-639-1 code: " + code639_1);
+			return null;
+		}
+		return l.code_3;
+	}
+
+	public String code_1ForCode_3(String code639_3) {
+		if (code639_3 == null) {
+			return null;
+		}
+		Language l = codeToLang.get(code639_3);
+		if (l == null) {
+			log.error("Unknown ISO-639-3 code: " + code639_3);
+			return null;
+		}
+		return l.code_1;
+	}
+
+	public String code_3ForName(String name) {
+		Language l = nameToLang.get(name);
+		if (l == null) {
+			log.error("Unknown language name: " + name);
+			return null;
+		}
+		return l.code_3;
+	}
+
+	public String nameForCode(String code) {
+		Language l = codeToLang.get(code);
+		if (l == null) {
+			log.error("Unknown language code: " + code);
+			return null;
+		}
+		return l.name;
+	}
+}
Index: SRUAggregator/trunk/src/main/resources/assets/js/main.js
===================================================================
--- SRUAggregator/trunk/src/main/resources/assets/js/main.js	(revision 6057)
+++ SRUAggregator/trunk/src/main/resources/assets/js/main.js	(revision 6065)
@@ -3,5 +3,5 @@
 "use strict";
 
-var VERSION = "VERSION 2.0.0.Î±24";
+var VERSION = "VERSION 2.0.0.Î±25";
 var URLROOT = "/Aggregator-testing";
 
@@ -150,5 +150,5 @@
 								React.createElement("span", {className: "icon-bar"})
 							), 
-							React.createElement("a", {className: "navbar-brand", href: "#", tabIndex: "-1"}, React.createElement("header", null, "Federated Content Search"))
+							React.createElement("a", {className: "navbar-brand", href: URLROOT, tabIndex: "-1"}, React.createElement("header", null, "Federated Content Search"))
 						), 
 						this.renderCollapsible()
Index: SRUAggregator/trunk/src/main/resources/assets/js/main.jsx
===================================================================
--- SRUAggregator/trunk/src/main/resources/assets/js/main.jsx	(revision 6057)
+++ SRUAggregator/trunk/src/main/resources/assets/js/main.jsx	(revision 6065)
@@ -3,5 +3,5 @@
 "use strict";
 
-var VERSION = "VERSION 2.0.0.Î±24";
+var VERSION = "VERSION 2.0.0.Î±25";
 var URLROOT = "/Aggregator-testing";
 
@@ -150,5 +150,5 @@
 								<span className="icon-bar"></span>
 							</button>
-							<a className="navbar-brand" href="#" tabIndex="-1"><header>Federated Content Search</header></a>
+							<a className="navbar-brand" href={URLROOT} tabIndex="-1"><header>Federated Content Search</header></a>
 						</div>
 						{this.renderCollapsible()}
Index: SRUAggregator/trunk/src/main/resources/lang/ISO-639-2_utf-8.txt
===================================================================
--- SRUAggregator/trunk/src/main/resources/lang/ISO-639-2_utf-8.txt	(revision 6057)
+++ 	(revision )
@@ -1,486 +1,0 @@
-﻿aar||aa|Afar|afar
-abk||ab|Abkhazian|abkhaze
-ace|||Achinese|aceh
-ach|||Acoli|acoli
-ada|||Adangme|adangme
-ady|||Adyghe; Adygei|adyghé
-afa|||Afro-Asiatic languages|afro-asiatiques, langues
-afh|||Afrihili|afrihili
-afr||af|Afrikaans|afrikaans
-ain|||Ainu|aïnou
-aka||ak|Akan|akan
-akk|||Akkadian|akkadien
-alb|sqi|sq|Albanian|albanais
-ale|||Aleut|aléoute
-alg|||Algonquian languages|algonquines, langues
-alt|||Southern Altai|altai du Sud
-amh||am|Amharic|amharique
-ang|||English, Old (ca.450-1100)|anglo-saxon (ca.450-1100)
-anp|||Angika|angika
-apa|||Apache languages|apaches, langues
-ara||ar|Arabic|arabe
-arc|||Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)|araméen d'empire (700-300 BCE)
-arg||an|Aragonese|aragonais
-arm|hye|hy|Armenian|arménien
-arn|||Mapudungun; Mapuche|mapudungun; mapuche; mapuce
-arp|||Arapaho|arapaho
-art|||Artificial languages|artificielles, langues
-arw|||Arawak|arawak
-asm||as|Assamese|assamais
-ast|||Asturian; Bable; Leonese; Asturleonese|asturien; bable; léonais; asturoléonais
-ath|||Athapascan languages|athapascanes, langues
-aus|||Australian languages|australiennes, langues
-ava||av|Avaric|avar
-ave||ae|Avestan|avestique
-awa|||Awadhi|awadhi
-aym||ay|Aymara|aymara
-aze||az|Azerbaijani|azéri
-bad|||Banda languages|banda, langues
-bai|||Bamileke languages|bamiléké, langues
-bak||ba|Bashkir|bachkir
-bal|||Baluchi|baloutchi
-bam||bm|Bambara|bambara
-ban|||Balinese|balinais
-baq|eus|eu|Basque|basque
-bas|||Basa|basa
-bat|||Baltic languages|baltes, langues
-bej|||Beja; Bedawiyet|bedja
-bel||be|Belarusian|biélorusse
-bem|||Bemba|bemba
-ben||bn|Bengali|bengali
-ber|||Berber languages|berbères, langues
-bho|||Bhojpuri|bhojpuri
-bih||bh|Bihari languages|langues biharis
-bik|||Bikol|bikol
-bin|||Bini; Edo|bini; edo
-bis||bi|Bislama|bichlamar
-bla|||Siksika|blackfoot
-bnt|||Bantu (Other)|bantoues, autres langues
-bos||bs|Bosnian|bosniaque
-bra|||Braj|braj
-bre||br|Breton|breton
-btk|||Batak languages|batak, langues
-bua|||Buriat|bouriate
-bug|||Buginese|bugi
-bul||bg|Bulgarian|bulgare
-bur|mya|my|Burmese|birman
-byn|||Blin; Bilin|blin; bilen
-cad|||Caddo|caddo
-cai|||Central American Indian languages|amérindiennes de L'Amérique centrale, langues
-car|||Galibi Carib|karib; galibi; carib
-cat||ca|Catalan; Valencian|catalan; valencien
-cau|||Caucasian languages|caucasiennes, langues
-ceb|||Cebuano|cebuano
-cel|||Celtic languages|celtiques, langues; celtes, langues
-cha||ch|Chamorro|chamorro
-chb|||Chibcha|chibcha
-che||ce|Chechen|tchétchène
-chg|||Chagatai|djaghataï
-chi|zho|zh|Chinese|chinois
-chk|||Chuukese|chuuk
-chm|||Mari|mari
-chn|||Chinook jargon|chinook, jargon
-cho|||Choctaw|choctaw
-chp|||Chipewyan; Dene Suline|chipewyan
-chr|||Cherokee|cherokee
-chu||cu|Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic|slavon d'église; vieux slave; slavon liturgique; vieux bulgare
-chv||cv|Chuvash|tchouvache
-chy|||Cheyenne|cheyenne
-cmc|||Chamic languages|chames, langues
-cop|||Coptic|copte
-cor||kw|Cornish|cornique
-cos||co|Corsican|corse
-cpe|||Creoles and pidgins, English based|créoles et pidgins basés sur l'anglais
-cpf|||Creoles and pidgins, French-based |créoles et pidgins basés sur le français
-cpp|||Creoles and pidgins, Portuguese-based |créoles et pidgins basés sur le portugais
-cre||cr|Cree|cree
-crh|||Crimean Tatar; Crimean Turkish|tatar de Crimé
-crp|||Creoles and pidgins |créoles et pidgins
-csb|||Kashubian|kachoube
-cus|||Cushitic languages|couchitiques, langues
-cze|ces|cs|Czech|tchèque
-dak|||Dakota|dakota
-dan||da|Danish|danois
-dar|||Dargwa|dargwa
-day|||Land Dayak languages|dayak, langues
-del|||Delaware|delaware
-den|||Slave (Athapascan)|esclave (athapascan)
-dgr|||Dogrib|dogrib
-din|||Dinka|dinka
-div||dv|Divehi; Dhivehi; Maldivian|maldivien
-doi|||Dogri|dogri
-dra|||Dravidian languages|dravidiennes, langues
-dsb|||Lower Sorbian|bas-sorabe
-dua|||Duala|douala
-dum|||Dutch, Middle (ca.1050-1350)|néerlandais moyen (ca. 1050-1350)
-dut|nld|nl|Dutch; Flemish|néerlandais; flamand
-dyu|||Dyula|dioula
-dzo||dz|Dzongkha|dzongkha
-efi|||Efik|efik
-egy|||Egyptian (Ancient)|égyptien
-eka|||Ekajuk|ekajuk
-elx|||Elamite|élamite
-eng||en|English|anglais
-enm|||English, Middle (1100-1500)|anglais moyen (1100-1500)
-epo||eo|Esperanto|espéranto
-est||et|Estonian|estonien
-ewe||ee|Ewe|éwé
-ewo|||Ewondo|éwondo
-fan|||Fang|fang
-fao||fo|Faroese|féroïen
-fat|||Fanti|fanti
-fij||fj|Fijian|fidjien
-fil|||Filipino; Pilipino|filipino; pilipino
-fin||fi|Finnish|finnois
-fiu|||Finno-Ugrian languages|finno-ougriennes, langues
-fon|||Fon|fon
-fre|fra|fr|French|français
-frm|||French, Middle (ca.1400-1600)|français moyen (1400-1600)
-fro|||French, Old (842-ca.1400)|français ancien (842-ca.1400)
-frr|||Northern Frisian|frison septentrional
-frs|||Eastern Frisian|frison oriental
-fry||fy|Western Frisian|frison occidental
-ful||ff|Fulah|peul
-fur|||Friulian|frioulan
-gaa|||Ga|ga
-gay|||Gayo|gayo
-gba|||Gbaya|gbaya
-gem|||Germanic languages|germaniques, langues
-geo|kat|ka|Georgian|géorgien
-ger|deu|de|German|allemand
-gez|||Geez|guèze
-gil|||Gilbertese|kiribati
-gla||gd|Gaelic; Scottish Gaelic|gaélique; gaélique écossais
-gle||ga|Irish|irlandais
-glg||gl|Galician|galicien
-glv||gv|Manx|manx; mannois
-gmh|||German, Middle High (ca.1050-1500)|allemand, moyen haut (ca. 1050-1500)
-goh|||German, Old High (ca.750-1050)|allemand, vieux haut (ca. 750-1050)
-gon|||Gondi|gond
-gor|||Gorontalo|gorontalo
-got|||Gothic|gothique
-grb|||Grebo|grebo
-grc|||Greek, Ancient (to 1453)|grec ancien (jusqu'à 1453)
-gre|ell|el|Greek, Modern (1453-)|grec moderne (après 1453)
-grn||gn|Guarani|guarani
-gsw|||Swiss German; Alemannic; Alsatian|suisse alémanique; alémanique; alsacien
-guj||gu|Gujarati|goudjrati
-gwi|||Gwich'in|gwich'in
-hai|||Haida|haida
-hat||ht|Haitian; Haitian Creole|haïtien; créole haïtien
-hau||ha|Hausa|haoussa
-haw|||Hawaiian|hawaïen
-heb||he|Hebrew|hébreu
-her||hz|Herero|herero
-hil|||Hiligaynon|hiligaynon
-him|||Himachali languages; Western Pahari languages|langues himachalis; langues paharis occidentales
-hin||hi|Hindi|hindi
-hit|||Hittite|hittite
-hmn|||Hmong; Mong|hmong
-hmo||ho|Hiri Motu|hiri motu
-hrv||hr|Croatian|croate
-hsb|||Upper Sorbian|haut-sorabe
-hun||hu|Hungarian|hongrois
-hup|||Hupa|hupa
-iba|||Iban|iban
-ibo||ig|Igbo|igbo
-ice|isl|is|Icelandic|islandais
-ido||io|Ido|ido
-iii||ii|Sichuan Yi; Nuosu|yi de Sichuan
-ijo|||Ijo languages|ijo, langues
-iku||iu|Inuktitut|inuktitut
-ile||ie|Interlingue; Occidental|interlingue
-ilo|||Iloko|ilocano
-ina||ia|Interlingua (International Auxiliary Language Association)|interlingua (langue auxiliaire internationale)
-inc|||Indic languages|indo-aryennes, langues
-ind||id|Indonesian|indonésien
-ine|||Indo-European languages|indo-européennes, langues
-inh|||Ingush|ingouche
-ipk||ik|Inupiaq|inupiaq
-ira|||Iranian languages|iraniennes, langues
-iro|||Iroquoian languages|iroquoises, langues
-ita||it|Italian|italien
-jav||jv|Javanese|javanais
-jbo|||Lojban|lojban
-jpn||ja|Japanese|japonais
-jpr|||Judeo-Persian|judéo-persan
-jrb|||Judeo-Arabic|judéo-arabe
-kaa|||Kara-Kalpak|karakalpak
-kab|||Kabyle|kabyle
-kac|||Kachin; Jingpho|kachin; jingpho
-kal||kl|Kalaallisut; Greenlandic|groenlandais
-kam|||Kamba|kamba
-kan||kn|Kannada|kannada
-kar|||Karen languages|karen, langues
-kas||ks|Kashmiri|kashmiri
-kau||kr|Kanuri|kanouri
-kaw|||Kawi|kawi
-kaz||kk|Kazakh|kazakh
-kbd|||Kabardian|kabardien
-kha|||Khasi|khasi
-khi|||Khoisan languages|khoïsan, langues
-khm||km|Central Khmer|khmer central
-kho|||Khotanese; Sakan|khotanais; sakan
-kik||ki|Kikuyu; Gikuyu|kikuyu
-kin||rw|Kinyarwanda|rwanda
-kir||ky|Kirghiz; Kyrgyz|kirghiz
-kmb|||Kimbundu|kimbundu
-kok|||Konkani|konkani
-kom||kv|Komi|kom
-kon||kg|Kongo|kongo
-kor||ko|Korean|coréen
-kos|||Kosraean|kosrae
-kpe|||Kpelle|kpellé
-krc|||Karachay-Balkar|karatchai balkar
-krl|||Karelian|carélien
-kro|||Kru languages|krou, langues
-kru|||Kurukh|kurukh
-kua||kj|Kuanyama; Kwanyama|kuanyama; kwanyama
-kum|||Kumyk|koumyk
-kur||ku|Kurdish|kurde
-kut|||Kutenai|kutenai
-lad|||Ladino|judéo-espagnol
-lah|||Lahnda|lahnda
-lam|||Lamba|lamba
-lao||lo|Lao|lao
-lat||la|Latin|latin
-lav||lv|Latvian|letton
-lez|||Lezghian|lezghien
-lim||li|Limburgan; Limburger; Limburgish|limbourgeois
-lin||ln|Lingala|lingala
-lit||lt|Lithuanian|lituanien
-lol|||Mongo|mongo
-loz|||Lozi|lozi
-ltz||lb|Luxembourgish; Letzeburgesch|luxembourgeois
-lua|||Luba-Lulua|luba-lulua
-lub||lu|Luba-Katanga|luba-katanga
-lug||lg|Ganda|ganda
-lui|||Luiseno|luiseno
-lun|||Lunda|lunda
-luo|||Luo (Kenya and Tanzania)|luo (Kenya et Tanzanie)
-lus|||Lushai|lushai
-mac|mkd|mk|Macedonian|macédonien
-mad|||Madurese|madourais
-mag|||Magahi|magahi
-mah||mh|Marshallese|marshall
-mai|||Maithili|maithili
-mak|||Makasar|makassar
-mal||ml|Malayalam|malayalam
-man|||Mandingo|mandingue
-mao|mri|mi|Maori|maori
-map|||Austronesian languages|austronésiennes, langues
-mar||mr|Marathi|marathe
-mas|||Masai|massaï
-may|msa|ms|Malay|malais
-mdf|||Moksha|moksa
-mdr|||Mandar|mandar
-men|||Mende|mendé
-mga|||Irish, Middle (900-1200)|irlandais moyen (900-1200)
-mic|||Mi'kmaq; Micmac|mi'kmaq; micmac
-min|||Minangkabau|minangkabau
-mis|||Uncoded languages|langues non codées
-mkh|||Mon-Khmer languages|môn-khmer, langues
-mlg||mg|Malagasy|malgache
-mlt||mt|Maltese|maltais
-mnc|||Manchu|mandchou
-mni|||Manipuri|manipuri
-mno|||Manobo languages|manobo, langues
-moh|||Mohawk|mohawk
-mon||mn|Mongolian|mongol
-mos|||Mossi|moré
-mul|||Multiple languages|multilingue
-mun|||Munda languages|mounda, langues
-mus|||Creek|muskogee
-mwl|||Mirandese|mirandais
-mwr|||Marwari|marvari
-myn|||Mayan languages|maya, langues
-myv|||Erzya|erza
-nah|||Nahuatl languages|nahuatl, langues
-nai|||North American Indian languages|nord-amérindiennes, langues
-nap|||Neapolitan|napolitain
-nau||na|Nauru|nauruan
-nav||nv|Navajo; Navaho|navaho
-nbl||nr|Ndebele, South; South Ndebele|ndébélé du Sud
-nde||nd|Ndebele, North; North Ndebele|ndébélé du Nord
-ndo||ng|Ndonga|ndonga
-nds|||Low German; Low Saxon; German, Low; Saxon, Low|bas allemand; bas saxon; allemand, bas; saxon, bas
-nep||ne|Nepali|népalais
-new|||Nepal Bhasa; Newari|nepal bhasa; newari
-nia|||Nias|nias
-nic|||Niger-Kordofanian languages|nigéro-kordofaniennes, langues
-niu|||Niuean|niué
-nno||nn|Norwegian Nynorsk; Nynorsk, Norwegian|norvégien nynorsk; nynorsk, norvégien
-nob||nb|Bokmål, Norwegian; Norwegian Bokmål|norvégien bokmål
-nog|||Nogai|nogaï; nogay
-non|||Norse, Old|norrois, vieux
-nor||no|Norwegian|norvégien
-nqo|||N'Ko|n'ko
-nso|||Pedi; Sepedi; Northern Sotho|pedi; sepedi; sotho du Nord
-nub|||Nubian languages|nubiennes, langues
-nwc|||Classical Newari; Old Newari; Classical Nepal Bhasa|newari classique
-nya||ny|Chichewa; Chewa; Nyanja|chichewa; chewa; nyanja
-nym|||Nyamwezi|nyamwezi
-nyn|||Nyankole|nyankolé
-nyo|||Nyoro|nyoro
-nzi|||Nzima|nzema
-oci||oc|Occitan (post 1500); Provençal|occitan (après 1500); provençal
-oji||oj|Ojibwa|ojibwa
-ori||or|Oriya|oriya
-orm||om|Oromo|galla
-osa|||Osage|osage
-oss||os|Ossetian; Ossetic|ossète
-ota|||Turkish, Ottoman (1500-1928)|turc ottoman (1500-1928)
-oto|||Otomian languages|otomi, langues
-paa|||Papuan languages|papoues, langues
-pag|||Pangasinan|pangasinan
-pal|||Pahlavi|pahlavi
-pam|||Pampanga; Kapampangan|pampangan
-pan||pa|Panjabi; Punjabi|pendjabi
-pap|||Papiamento|papiamento
-pau|||Palauan|palau
-peo|||Persian, Old (ca.600-400 B.C.)|perse, vieux (ca. 600-400 av. J.-C.)
-per|fas|fa|Persian|persan
-phi|||Philippine languages|philippines, langues
-phn|||Phoenician|phénicien
-pli||pi|Pali|pali
-pol||pl|Polish|polonais
-pon|||Pohnpeian|pohnpei
-por||pt|Portuguese|portugais
-pra|||Prakrit languages|prâkrit, langues
-pro|||Provençal, Old (to 1500)|provençal ancien (jusqu'à 1500)
-pus||ps|Pushto; Pashto|pachto
-qaa-qtz|||Reserved for local use|réservée à l'usage local
-que||qu|Quechua|quechua
-raj|||Rajasthani|rajasthani
-rap|||Rapanui|rapanui
-rar|||Rarotongan; Cook Islands Maori|rarotonga; maori des îles Cook
-roa|||Romance languages|romanes, langues
-roh||rm|Romansh|romanche
-rom|||Romany|tsigane
-rum|ron|ro|Romanian; Moldavian; Moldovan|roumain; moldave
-run||rn|Rundi|rundi
-rup|||Aromanian; Arumanian; Macedo-Romanian|aroumain; macédo-roumain
-rus||ru|Russian|russe
-sad|||Sandawe|sandawe
-sag||sg|Sango|sango
-sah|||Yakut|iakoute
-sai|||South American Indian (Other)|indiennes d'Amérique du Sud, autres langues
-sal|||Salishan languages|salishennes, langues
-sam|||Samaritan Aramaic|samaritain
-san||sa|Sanskrit|sanskrit
-sas|||Sasak|sasak
-sat|||Santali|santal
-scn|||Sicilian|sicilien
-sco|||Scots|écossais
-sel|||Selkup|selkoupe
-sem|||Semitic languages|sémitiques, langues
-sga|||Irish, Old (to 900)|irlandais ancien (jusqu'à 900)
-sgn|||Sign Languages|langues des signes
-shn|||Shan|chan
-sid|||Sidamo|sidamo
-sin||si|Sinhala; Sinhalese|singhalais
-sio|||Siouan languages|sioux, langues
-sit|||Sino-Tibetan languages|sino-tibétaines, langues
-sla|||Slavic languages|slaves, langues
-slo|slk|sk|Slovak|slovaque
-slv||sl|Slovenian|slovène
-sma|||Southern Sami|sami du Sud
-sme||se|Northern Sami|sami du Nord
-smi|||Sami languages|sames, langues
-smj|||Lule Sami|sami de Lule
-smn|||Inari Sami|sami d'Inari
-smo||sm|Samoan|samoan
-sms|||Skolt Sami|sami skolt
-sna||sn|Shona|shona
-snd||sd|Sindhi|sindhi
-snk|||Soninke|soninké
-sog|||Sogdian|sogdien
-som||so|Somali|somali
-son|||Songhai languages|songhai, langues
-sot||st|Sotho, Southern|sotho du Sud
-spa||es|Spanish; Castilian|espagnol; castillan
-srd||sc|Sardinian|sarde
-srn|||Sranan Tongo|sranan tongo
-srp||sr|Serbian|serbe
-srr|||Serer|sérère
-ssa|||Nilo-Saharan languages|nilo-sahariennes, langues
-ssw||ss|Swati|swati
-suk|||Sukuma|sukuma
-sun||su|Sundanese|soundanais
-sus|||Susu|soussou
-sux|||Sumerian|sumérien
-swa||sw|Swahili|swahili
-swe||sv|Swedish|suédois
-syc|||Classical Syriac|syriaque classique
-syr|||Syriac|syriaque
-tah||ty|Tahitian|tahitien
-tai|||Tai languages|tai, langues
-tam||ta|Tamil|tamoul
-tat||tt|Tatar|tatar
-tel||te|Telugu|télougou
-tem|||Timne|temne
-ter|||Tereno|tereno
-tet|||Tetum|tetum
-tgk||tg|Tajik|tadjik
-tgl||tl|Tagalog|tagalog
-tha||th|Thai|thaï
-tib|bod|bo|Tibetan|tibétain
-tig|||Tigre|tigré
-tir||ti|Tigrinya|tigrigna
-tiv|||Tiv|tiv
-tkl|||Tokelau|tokelau
-tlh|||Klingon; tlhIngan-Hol|klingon
-tli|||Tlingit|tlingit
-tmh|||Tamashek|tamacheq
-tog|||Tonga (Nyasa)|tonga (Nyasa)
-ton||to|Tonga (Tonga Islands)|tongan (Îles Tonga)
-tpi|||Tok Pisin|tok pisin
-tsi|||Tsimshian|tsimshian
-tsn||tn|Tswana|tswana
-tso||ts|Tsonga|tsonga
-tuk||tk|Turkmen|turkmène
-tum|||Tumbuka|tumbuka
-tup|||Tupi languages|tupi, langues
-tur||tr|Turkish|turc
-tut|||Altaic languages|altaïques, langues
-tvl|||Tuvalu|tuvalu
-twi||tw|Twi|twi
-tyv|||Tuvinian|touva
-udm|||Udmurt|oudmourte
-uga|||Ugaritic|ougaritique
-uig||ug|Uighur; Uyghur|ouïgour
-ukr||uk|Ukrainian|ukrainien
-umb|||Umbundu|umbundu
-und|||Undetermined|indéterminée
-urd||ur|Urdu|ourdou
-uzb||uz|Uzbek|ouszbek
-vai|||Vai|vaï
-ven||ve|Venda|venda
-vie||vi|Vietnamese|vietnamien
-vol||vo|Volapük|volapük
-vot|||Votic|vote
-wak|||Wakashan languages|wakashanes, langues
-wal|||Walamo|walamo
-war|||Waray|waray
-was|||Washo|washo
-wel|cym|cy|Welsh|gallois
-wen|||Sorbian languages|sorabes, langues
-wln||wa|Walloon|wallon
-wol||wo|Wolof|wolof
-xal|||Kalmyk; Oirat|kalmouk; oïrat
-xho||xh|Xhosa|xhosa
-yao|||Yao|yao
-yap|||Yapese|yapois
-yid||yi|Yiddish|yiddish
-yor||yo|Yoruba|yoruba
-ypk|||Yupik languages|yupik, langues
-zap|||Zapotec|zapotèque
-zbl|||Blissymbols; Blissymbolics; Bliss|symboles Bliss; Bliss
-zen|||Zenaga|zenaga
-zgh|||Standard Moroccan Tamazight|amazighe standard marocain
-zha||za|Zhuang; Chuang|zhuang; chuang
-znd|||Zande languages|zandé, langues
-zul||zu|Zulu|zoulou
-zun|||Zuni|zuni
-zxx|||No linguistic content; Not applicable|pas de contenu linguistique; non applicable
-zza|||Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki|zaza; dimili; dimli; kirdki; kirmanjki; zazaki
