Index: tmp/org.txm.rcp/src/main/java/org/txm/rcp/editors/TableKeyListener.java
===================================================================
--- tmp/org.txm.rcp/src/main/java/org/txm/rcp/editors/TableKeyListener.java	(revision 2017)
+++ tmp/org.txm.rcp/src/main/java/org/txm/rcp/editors/TableKeyListener.java	(revision 2018)
@@ -17,10 +17,10 @@
 import org.txm.utils.logger.Log;
 
 public class TableKeyListener implements KeyListener {
-	TableViewer viewer;
+	TableViewer[] viewers;
 
-	public TableKeyListener(TableViewer viewer) {
-		this.viewer = viewer;
+	public TableKeyListener(TableViewer... viewers) {
+		this.viewers = viewers;
 	}
 
 	@Override
@@ -32,69 +32,79 @@
 	public void keyPressed(KeyEvent e) {
 		//System.out.println("key code: "+e.keyCode);
 		if ((e.stateMask & SWT.CTRL) != 0 && e.keyCode == 99 ) { // CTRL + C
-			copyLinesToClipboard();
+			copyLinesToClipboard(e);
 		} else if ((e.stateMask & SWT.CTRL) != 0 && e.keyCode == 102 ) { // CTRL + F
-			searchInLines();
+			searchInLines(e);
 		} else if ((e.stateMask & SWT.COMMAND) != 0 && e.keyCode == 99 ) { // CMD + C
-			copyLinesToClipboard();
+			copyLinesToClipboard(e);
 		} else if ((e.stateMask & SWT.COMMAND) != 0 && e.keyCode == 102 ) { // CMD + F
-			searchInLines();
+			searchInLines(e);
 		}
 	}
 
 	/**
 	 * Opens a dialog box to enter a REGEX that selects lines in the table.
 	 */
-	public void searchInLines() {
-		TableItem[] items = viewer.getTable().getItems();
-		//System.out.println("search in tablein items: "+Arrays.toString(items));
+	public void searchInLines(KeyEvent e) {
+		
+		InputDialog dialog = new InputDialog(viewers[0].getTable().getShell(), "Compute", TXMUIMessages.common_enterRegularExpressionOfYourSearch, "", null);  //$NON-NLS-1$
+		if (dialog.open() == Window.OK) {
+			for (TableViewer viewer : viewers) {
+				TableItem[] items = viewer.getTable().getItems();
+				//System.out.println("search in tablein items: "+Arrays.toString(items));
 
-		TableColumn[] cols = viewer.getTable().getColumns();
-		InputDialog dialog = new InputDialog(viewer.getTable().getShell(), "Compute", TXMUIMessages.common_enterRegularExpressionOfYourSearch, "", null);  //$NON-NLS-1$
-		if (dialog.open() == Window.OK) {
-			String reg = dialog.getValue();
-			Pattern p = Pattern.compile(reg);
-			// TODO: useless ?
-			//ArrayList<TableItem> matchingItem = new ArrayList<TableItem>();
-			ArrayList<Integer> matchingIndexes = new ArrayList<Integer>();
-			for (int l = 0 ; l < items.length ; l++) {
-				TableItem item = items[l];
-				for (int i = 0 ; i < cols.length ; i++) {
-					if (p.matcher(item.getText(i)).matches()) {
-						// TODO: useless
-						//matchingItem.add(item);
-						matchingIndexes.add(l);
-						break; // next line
+				TableColumn[] cols = viewer.getTable().getColumns();
+					String reg = dialog.getValue();
+					Pattern p = Pattern.compile(reg);
+					// TODO: useless ?
+					//ArrayList<TableItem> matchingItem = new ArrayList<TableItem>();
+					ArrayList<Integer> matchingIndexes = new ArrayList<Integer>();
+					for (int l = 0 ; l < items.length ; l++) {
+						TableItem item = items[l];
+						for (int i = 0 ; i < cols.length ; i++) {
+							if (p.matcher(item.getText(i)).matches()) {
+								// TODO: useless
+								//matchingItem.add(item);
+								matchingIndexes.add(l);
+								break; // next line
+							}
+						}
 					}
-				}
-			}
-			Log.fine(TXMCoreMessages.bind(TXMUIMessages.foundLinesColon, matchingIndexes));
+					Log.fine(TXMCoreMessages.bind(TXMUIMessages.foundLinesColon, matchingIndexes));
 
-			// TODO: useless ?
-//			int[] indexes = new int[matchingIndexes.size()];
-//			TableItem[] mitems = new TableItem[matchingItem.size()];
-//			int i = 0;
-//			for(int index : matchingIndexes) {
-//				indexes[i++] = index;
-//			}
-//			i = 0;
-//			for(TableItem item : matchingItem) {
-//				mitems[i++] = item;
-//			}
+					// TODO: useless ?
+//					int[] indexes = new int[matchingIndexes.size()];
+//					TableItem[] mitems = new TableItem[matchingItem.size()];
+//					int i = 0;
+//					for(int index : matchingIndexes) {
+//						indexes[i++] = index;
+//					}
+//					i = 0;
+//					for(TableItem item : matchingItem) {
+//						mitems[i++] = item;
+//					}
 
-			// TODO: old version which doesn't trigger selection event
-//			if (mitems.length > 0) {
-//				viewer.getTable().showItem(mitems[0]); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
-//				viewer.getTable().deselectAll(); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
-//				viewer.getTable().select(indexes); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
-			
-			// trigger selection event on viewer
-			if (matchingIndexes.size() > 0) {
-				ArrayList elements = new ArrayList(matchingIndexes.size());
-				for(int j = 0; j < matchingIndexes.size(); j++) {
-					elements.add(viewer.getElementAt(matchingIndexes.get(j)));
-				}
-				viewer.setSelection(new StructuredSelection(elements), true);
+					// TODO: old version which doesn't trigger selection event
+//					if (mitems.length > 0) {
+//						viewer.getTable().showItem(mitems[0]); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
+//						viewer.getTable().deselectAll(); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
+//						viewer.getTable().select(indexes); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
+					
+					// trigger selection event on viewer
+					if (matchingIndexes.size() > 0) {
+						ArrayList elements = new ArrayList(matchingIndexes.size());
+						for(int j = 0; j < matchingIndexes.size(); j++) {
+							elements.add(viewer.getElementAt(matchingIndexes.get(j)));
+						}
+						viewer.setSelection(new StructuredSelection(elements), true);
+						for (TableViewer oViewer : viewers) {
+							if (oViewer != viewer) {
+								oViewer.getTable().deselectAll();
+								oViewer.getTable().select(viewer.getTable().getSelectionIndices());
+							}
+						}
+						return;
+					}
 			}
 		}
 	}
@@ -102,21 +112,30 @@
 	/**
 	 * Copies the current lines selection to the clipboard.
 	 */
-	public void copyLinesToClipboard() {
-		TableItem[] items = viewer.getTable().getSelection();
-		String str = ""; //$NON-NLS-1$
-		TableColumn[] cols = viewer.getTable().getColumns();
-		for (int l = 0 ; l < items.length ; l++) {
-			TableItem item = items[l];
-			if (l > 0) str += "\n"; //$NON-NLS-1$
-			for (int i = 0 ; i < cols.length ; i++) {
-				if (cols[i].getText().trim().length() >0) {
-					if (i > 0) str += "\t"; //$NON-NLS-1$
-					str += item.getText(i);
+	public void copyLinesToClipboard(KeyEvent e) {
+		
+		StringBuffer str = new StringBuffer(); //$NON-NLS-1$
+	
+		for (int l = 0 ; l < viewers[0].getTable().getSelection().length ; l++) {
+			
+			if (l > 0) str.append("\n"); //$NON-NLS-1$
+			
+			for (TableViewer viewer : viewers) {
+				TableColumn[] cols = viewer.getTable().getColumns();
+				TableItem[] items = viewer.getTable().getSelection();
+				TableItem item = items[l];
+				
+				for (int i = 0 ; i < cols.length ; i++) {
+					if (cols[i].getText().trim().length() >0) {
+						if (i > 0) str.append("\t"); //$NON-NLS-1$
+						str.append(item.getText(i));
+					}
 				}
 			}
+			
 		}
-		org.txm.rcp.utils.IOClipboard.write(str);
-		Log.info(TXMCoreMessages.bind(TXMUIMessages.copiedLinesColon, str));
+		String strr = str.toString();
+		org.txm.rcp.utils.IOClipboard.write(strr);
+		Log.info(TXMCoreMessages.bind(TXMUIMessages.copiedLinesColon, strr));
 	}
 }
\ No newline at end of file
Index: tmp/org.txm.rcp/src/main/java/org/txm/rcp/swt/widget/SuperTableViewer.java
===================================================================
--- tmp/org.txm.rcp/src/main/java/org/txm/rcp/swt/widget/SuperTableViewer.java	(revision 2017)
+++ tmp/org.txm.rcp/src/main/java/org/txm/rcp/swt/widget/SuperTableViewer.java	(revision 2018)
@@ -2,15 +2,25 @@
 
 import java.util.ArrayList;
 
+import org.eclipse.jface.util.Util;
 import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.FormAttachment;
 import org.eclipse.swt.layout.FormData;
 import org.eclipse.swt.layout.FormLayout;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Sash;
+import org.eclipse.swt.widgets.ScrollBar;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
 
 public class SuperTableViewer extends Composite {
 
@@ -30,7 +40,7 @@
 	public SuperTableColumn newColumn(String name) {
 		return newColumn(name, -1);
 	}
-	
+
 	public SuperTableColumn newColumn(String name, int position) {
 		SuperTableColumn col = new SuperTableColumn(this, name);
 		if (position > 0) {
@@ -42,19 +52,47 @@
 		return col;
 	}
 
+	public void setInput(Object input) {
+		for (SuperTableColumn column : columns) {
+			column.setInput(input);
+		}
+	}
+
+	public void addKeyListener(KeyListener listener) {
+//		for (SuperTableColumn column : columns) {
+//			column.getTable().addKeyListener(listener);
+//		}
+		super.addKeyListener(listener);
+	}
+
+	public void addMouseListener(MouseListener listener) {
+//		for (SuperTableColumn column : columns) {
+//			column.getTable().addMouseListener(listener);
+//		}
+		super.addMouseListener(listener);
+	}
+
 	public class SuperTableColumn extends TableViewer {
 		SuperTableViewer table;
+		Table t;
 		Sash sash;
 		FormData data = new FormData();
 		FormData data2 = new FormData();
 		String name;
 		int position;
 
-		protected SuperTableColumn(SuperTableViewer table, String name) {
-			super(table, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
+		protected SuperTableColumn(SuperTableViewer table2, String name) {
+			super(table2, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
 
-			this.table = table;
+			this.table = table2;
+			this.t = this.getTable();
+			getTable().setLinesVisible(true);
+			getTable().setHeaderVisible(true);
 
+			TableColumn firstColumn = new TableColumn(getTable(), SWT.LEFT);
+			firstColumn.setWidth(0);
+			firstColumn.setResizable(false);
+
 			sash = new Sash(table, SWT.VERTICAL);
 			sash.addSelectionListener(new SelectionAdapter() {
 				public void widgetSelected(SelectionEvent event) {
@@ -62,6 +100,37 @@
 					sash.getParent().layout();
 				}
 			});
+
+			t.addSelectionListener(new SelectionListener() {
+				@Override
+				public void widgetSelected(SelectionEvent e) {
+					for (SuperTableColumn col : table.columns) {
+						if (col != SuperTableColumn.this) {
+							col.getTable().deselectAll();
+							col.getTable().select(t.getSelectionIndices());
+						}
+					}
+
+				}
+				@Override
+				public void widgetDefaultSelected(SelectionEvent e) { }
+			});
+			ScrollBar vBarLeft = t.getVerticalBar();
+			vBarLeft.addListener(SWT.Selection, new Listener() {
+				@Override
+				public void handleEvent(Event event) {
+					for (SuperTableColumn col : table.columns) {
+						if (col != SuperTableColumn.this) {
+							if (Util.isLinux()) {
+								col.setSelection(getSelection());
+							} else {
+								col.getTable().setTopIndex(t.getTopIndex());
+							}
+						}
+					}
+
+				}
+			});
 		}
 
 		public void updatePosition(int position) {
@@ -85,6 +154,15 @@
 			}
 			sash.setLayoutData(data2);
 		}
+
+		public TableViewerColumn newColumn(int style) {
+			TableViewerColumn col = new TableViewerColumn(this, style);
+			return col;
+		}
+
+		public void setWidth(int w) {
+			data2.left = new FormAttachment(w);
+		}
 	}
 
 	public SuperTableColumn getColumn(int i) {
Index: tmp/org.txm.concordance.rcp/src/org/txm/concordance/rcp/editors/ConcordanceEditor.java
===================================================================
--- tmp/org.txm.concordance.rcp/src/org/txm/concordance/rcp/editors/ConcordanceEditor.java	(revision 2017)
+++ tmp/org.txm.concordance.rcp/src/org/txm/concordance/rcp/editors/ConcordanceEditor.java	(revision 2018)
@@ -352,7 +352,7 @@
 		displayArea.setLayout(new FormLayout());
 
 		viewerLeft = new TableViewer(displayArea, SWT.MULTI | SWT.BORDER | SWT.VIRTUAL);
-		viewerLeft.getTable().addKeyListener(new TableKeyListener(viewerLeft));
+		
 		viewerLeft.setLabelProvider(new LineLabelProvider(this) {
 			@Override
 			public String getColumnText(Object element, int columnIndex) {
@@ -408,7 +408,7 @@
 		viewerRight = new TableViewer(displayArea, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER
 				//				| SWT.VIRTUAL
 				);
-		viewerRight.getTable().addKeyListener(new TableKeyListener(viewerRight));
+
 		//viewer.setLabelProvider(new LineLabelProvider(this));
 		viewerRight.setContentProvider(new ConcordancesProvider());
 		viewerRight.getTable().setLinesVisible(true);
@@ -454,6 +454,10 @@
 		viewerRight.getTable().addKeyListener(kldelete);
 		viewerLeft.getTable().addKeyListener(kldelete);
 
+		TableKeyListener tlistener = new TableKeyListener(viewerLeft, viewerRight);
+		viewerRight.getTable().addKeyListener(tlistener);
+		viewerLeft.getTable().addKeyListener(tlistener);
+		
 		firstColumn = new TableColumn(viewerRight.getTable(), SWT.LEFT);
 		firstColumn.setWidth(0);
 		firstColumn.setResizable(false);
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xtz/XTZPager.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xtz/XTZPager.groovy	(revision 2017)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xtz/XTZPager.groovy	(revision 2018)
@@ -210,7 +210,6 @@
 					continue;
 				}
 
-
 				def pages = ed.getPageFiles()
 				for (i = 0 ; i < pages.size();) {
 					File f = pages[i][0];
@@ -280,7 +279,7 @@
 			xslParams["number-words-per-page"] = Integer.parseInt(s);
 			xslParams["pagination-element"] = project.getEditionDefinition("default").getPageElement();
 			xslParams["import-xml-path"] = project.getProjectDirectory()
-			//println "XSL PARAMS: "+xslParams
+			println "XSL PARAMS: "+xslParams
 
 			def xslFiles = xslDirectory.listFiles()
 			xslFiles = xslFiles.sort() { f -> 
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xtz/XTZDefaultPagerStep.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xtz/XTZDefaultPagerStep.groovy	(revision 2017)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xtz/XTZDefaultPagerStep.groovy	(revision 2018)
@@ -300,7 +300,6 @@
 				return false;
 			}
 
-			println "DEBUG: start parsing"
 			for (int event = parser.next(); event != XMLStreamConstants.END_DOCUMENT; event = parser.next()) {
 				rend = "";
 				switch (event) {
