Index: TXM/trunk/org.txm.jodconverter.core/target/classes/document-formats.js
===================================================================
--- TXM/trunk/org.txm.jodconverter.core/target/classes/document-formats.js	(revision 3568)
+++ TXM/trunk/org.txm.jodconverter.core/target/classes/document-formats.js	(revision 3569)
@@ -1,188 +0,0 @@
-[
-  {
-    "name": "Portable Document Format",
-    "extension": "pdf",
-    "mediaType": "application/pdf",
-    "storePropertiesByFamily": {
-      "DRAWING": {"FilterName": "draw_pdf_Export"},
-      "SPREADSHEET": {"FilterName": "calc_pdf_Export"},
-      "PRESENTATION": {"FilterName": "impress_pdf_Export"},
-      "TEXT": {"FilterName": "writer_pdf_Export"}
-    }
-  },
-  {
-    "name": "Macromedia Flash",
-    "extension": "swf",
-    "mediaType": "application/x-shockwave-flash",
-    "storePropertiesByFamily": {
-      "DRAWING": {"FilterName": "draw_flash_Export"},
-      "PRESENTATION": {"FilterName": "impress_flash_Export"}
-    }
-  },
-  {
-    "name": "HTML",
-    "extension": "html",
-    "mediaType": "text/html",
-    "inputFamily": "TEXT",
-    "storePropertiesByFamily": {
-      "SPREADSHEET": {"FilterName": "HTML (StarCalc)"},
-      "PRESENTATION": {"FilterName": "impress_html_Export"},
-      "TEXT": {"FilterName": "HTML (StarWriter)"}
-    }
-  },
-  {
-    "name": "OpenDocument Text",
-    "extension": "odt",
-    "mediaType": "application/vnd.oasis.opendocument.text",
-    "inputFamily": "TEXT",
-    "storePropertiesByFamily": {"TEXT": {"FilterName": "writer8"}}
-  },
-  {
-    "name": "OpenOffice.org 1.0 Text Document",
-    "extension": "sxw",
-    "mediaType": "application/vnd.sun.xml.writer",
-    "inputFamily": "TEXT",
-    "storePropertiesByFamily": {"TEXT": {"FilterName": "StarOffice XML (Writer)"}}
-  },
-  {
-    "name": "Microsoft Word",
-    "extension": "doc",
-    "mediaType": "application/msword",
-    "inputFamily": "TEXT",
-    "storePropertiesByFamily": {"TEXT": {"FilterName": "MS Word 97"}}
-  },
-  {
-    "name": "Microsoft Word 2007 XML",
-    "extension": "docx",
-    "mediaType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
-    "inputFamily": "TEXT"
-  },
-  {
-    "name": "Rich Text Format",
-    "extension": "rtf",
-    "mediaType": "text/rtf",
-    "inputFamily": "TEXT",
-    "storePropertiesByFamily": {"TEXT": {"FilterName": "Rich Text Format"}}
-  },
-  {
-    "name": "WordPerfect",
-    "extension": "wpd",
-    "mediaType": "application/wordperfect",
-    "inputFamily": "TEXT"
-  },
-  {
-    "name": "Plain Text",
-    "extension": "txt",
-    "mediaType": "text/plain",
-    "inputFamily": "TEXT",
-    "loadProperties": {
-      "FilterName": "Text (encoded)",
-      "FilterOptions": "utf8"
-    },
-    "storePropertiesByFamily": {"TEXT": {
-      "FilterName": "Text (encoded)",
-      "FilterOptions": "utf8"
-    }}
-  },
-  {
-    "name": "MediaWiki wikitext",
-    "extension": "wiki",
-    "mediaType": "text/x-wiki",
-    "storePropertiesByFamily": {"TEXT": {"FilterName": "MediaWiki"}}
-  },
-  {
-    "name": "OpenDocument Spreadsheet",
-    "extension": "ods",
-    "mediaType": "application/vnd.oasis.opendocument.spreadsheet",
-    "inputFamily": "SPREADSHEET",
-    "storePropertiesByFamily": {"SPREADSHEET": {"FilterName": "calc8"}}
-  },
-  {
-    "name": "OpenOffice.org 1.0 Spreadsheet",
-    "extension": "sxc",
-    "mediaType": "application/vnd.sun.xml.calc",
-    "inputFamily": "SPREADSHEET",
-    "storePropertiesByFamily": {"SPREADSHEET": {"FilterName": "StarOffice XML (Calc)"}}
-  },
-  {
-    "name": "Microsoft Excel",
-    "extension": "xls",
-    "mediaType": "application/vnd.ms-excel",
-    "inputFamily": "SPREADSHEET",
-    "storePropertiesByFamily": {"SPREADSHEET": {"FilterName": "MS Excel 97"}}
-  },
-  {
-    "name": "Microsoft Excel 2007 XML",
-    "extension": "xlsx",
-    "mediaType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
-    "inputFamily": "SPREADSHEET"
-  },
-  {
-    "name": "Comma Separated Values",
-    "extension": "csv",
-    "mediaType": "text/csv",
-    "inputFamily": "SPREADSHEET",
-    "loadProperties": {
-      "FilterName": "Text - txt - csv (StarCalc)",
-      "FilterOptions": "44,34,0"
-    },
-    "storePropertiesByFamily": {"SPREADSHEET": {
-      "FilterName": "Text - txt - csv (StarCalc)",
-      "FilterOptions": "44,34,0"
-    }}
-  },
-  {
-    "name": "Tab Separated Values",
-    "extension": "tsv",
-    "mediaType": "text/tab-separated-values",
-    "inputFamily": "SPREADSHEET",
-    "loadProperties": {
-      "FilterName": "Text - txt - csv (StarCalc)",
-      "FilterOptions": "9,34,0"
-    },
-    "storePropertiesByFamily": {"SPREADSHEET": {
-      "FilterName": "Text - txt - csv (StarCalc)",
-      "FilterOptions": "9,34,0"
-    }}
-  },
-  {
-    "name": "OpenDocument Presentation",
-    "extension": "odp",
-    "mediaType": "application/vnd.oasis.opendocument.presentation",
-    "inputFamily": "PRESENTATION",
-    "storePropertiesByFamily": {"PRESENTATION": {"FilterName": "impress8"}}
-  },
-  {
-    "name": "OpenOffice.org 1.0 Presentation",
-    "extension": "sxi",
-    "mediaType": "application/vnd.sun.xml.impress",
-    "inputFamily": "PRESENTATION",
-    "storePropertiesByFamily": {"PRESENTATION": {"FilterName": "StarOffice XML (Impress)"}}
-  },
-  {
-    "name": "Microsoft PowerPoint",
-    "extension": "ppt",
-    "mediaType": "application/vnd.ms-powerpoint",
-    "inputFamily": "PRESENTATION",
-    "storePropertiesByFamily": {"PRESENTATION": {"FilterName": "MS PowerPoint 97"}}
-  },
-  {
-    "name": "Microsoft PowerPoint 2007 XML",
-    "extension": "pptx",
-    "mediaType": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
-    "inputFamily": "PRESENTATION"
-  },
-  {
-    "name": "OpenDocument Drawing",
-    "extension": "odg",
-    "mediaType": "application/vnd.oasis.opendocument.graphics",
-    "inputFamily": "DRAWING",
-    "storePropertiesByFamily": {"DRAWING": {"FilterName": "draw8"}}
-  },
-  {
-    "name": "Scalable Vector Graphics",
-    "extension": "svg",
-    "mediaType": "image/svg+xml",
-    "storePropertiesByFamily": {"DRAWING": {"FilterName": "draw_svg_Export"}}
-  }
-]
Index: TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/ListMultiSelectionDialog.java
===================================================================
--- TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/ListMultiSelectionDialog.java	(revision 0)
+++ TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/ListMultiSelectionDialog.java	(revision 3569)
@@ -0,0 +1,58 @@
+package org.txm.rcp.swt.dialog;
+
+import java.util.LinkedHashMap;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Shell;
+
+public class ListMultiSelectionDialog<T> extends Dialog {
+
+	LinkedHashMap<String, T> values;
+	LinkedHashMap<String, T> selectedValues;
+	List valuesList;
+	
+	public ListMultiSelectionDialog(Shell parentShell, String title, String message, LinkedHashMap<String, T> values) {
+		
+		super(parentShell);
+		this.values = values;
+		this.selectedValues = new LinkedHashMap<>();
+	}
+	
+	public LinkedHashMap<String, T> getInitialValues() {
+		return values;
+	}
+	
+	public LinkedHashMap<String, T> getSelectedValues() {
+		return selectedValues;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	@Override
+	protected Control createDialogArea(Composite p) {
+		//System.out.println(p.getLayout());
+		
+		valuesList = new List(p, SWT.MULTI);
+		
+		valuesList.setItems(values.keySet().toArray(new String[values.size()]));
+		
+		return p;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+	 */
+	@Override
+	protected void okPressed() {
+		for (String item : valuesList.getSelection()) {
+			selectedValues.put(item, values.get(item));
+		}
+		super.okPressed();
+	}
+	
+}

Property changes on: TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/ListMultiSelectionDialog.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/MultipleChoiceDialog.java
===================================================================
--- TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/MultipleChoiceDialog.java	(revision 3568)
+++ TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/MultipleChoiceDialog.java	(revision 3569)
@@ -27,9 +27,6 @@
 //
 package org.txm.rcp.swt.dialog;
 
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
@@ -41,7 +38,6 @@
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
 
 /**
  * Open a dialog with a button per choice
Index: TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/ObjectSelectionDialog.java
===================================================================
--- TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/ObjectSelectionDialog.java	(revision 3568)
+++ TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/ObjectSelectionDialog.java	(revision 3569)
@@ -48,10 +48,9 @@
 import org.txm.rcp.IImageKeys;
 import org.txm.rcp.messages.TXMUIMessages;
 
-// TODO: Auto-generated Javadoc
 /**
- * allow to choose between a set of values and choose the order of the selection @
- * author mdecorde.
+ * allow to choose between a set of values and choose the order of the selection 
+ * @author mdecorde.
  */
 public class ObjectSelectionDialog extends Dialog {
 	
@@ -123,14 +122,11 @@
 		mainArea.setLayout(layout);
 
 		regexAvailable = new Text(mainArea, SWT.BORDER);
-		regexAvailable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-				false));
+		regexAvailable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
 
 		Button searchAvailableBtn = new Button(mainArea, SWT.PUSH);
-		searchAvailableBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL,
-				false, false));
-		searchAvailableBtn.setImage(IImageKeys
-				.getImage(IImageKeys.ACTION_SEARCH));
+		searchAvailableBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+		searchAvailableBtn.setImage(IImageKeys.getImage(IImageKeys.ACTION_SEARCH));
 		searchAvailableBtn.addSelectionListener(new SelectionListener() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -144,13 +140,10 @@
 		});
 
 		regexSelected = new Text(mainArea, SWT.BORDER);
-		regexSelected.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-				false));
+		regexSelected.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
 		Button searchSelectedBtn = new Button(mainArea, SWT.PUSH);
-		searchSelectedBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false,
-				false));
-		searchSelectedBtn.setImage(IImageKeys
-				.getImage(IImageKeys.ACTION_SEARCH));
+		searchSelectedBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+		searchSelectedBtn.setImage(IImageKeys.getImage(IImageKeys.ACTION_SEARCH));
 		searchSelectedBtn.addSelectionListener(new SelectionListener() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -163,8 +156,7 @@
 			}
 		});
 
-		availablesView = new org.eclipse.swt.widgets.List(mainArea, SWT.BORDER
-				| SWT.MULTI | SWT.V_SCROLL);
+		availablesView = new org.eclipse.swt.widgets.List(mainArea, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
 		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
 		availablesView.setLayoutData(gridData);
 
@@ -173,8 +165,7 @@
 		Button select = new Button(selectionButtons, SWT.ARROW | SWT.RIGHT);
 		Button unselect = new Button(selectionButtons, SWT.ARROW | SWT.LEFT);
 
-		selectedsView = new org.eclipse.swt.widgets.List(mainArea, SWT.BORDER
-				| SWT.MULTI | SWT.V_SCROLL);
+		selectedsView = new org.eclipse.swt.widgets.List(mainArea, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
 		gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
 		selectedsView.setLayoutData(gridData);
 
Index: TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/UpdateCorpusDialog.java
===================================================================
--- TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/UpdateCorpusDialog.java	(revision 3568)
+++ TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/swt/dialog/UpdateCorpusDialog.java	(revision 3569)
@@ -1,6 +1,9 @@
 package org.txm.rcp.swt.dialog;
 
+import java.util.LinkedHashMap;
+
 import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -8,8 +11,11 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
 import org.eclipse.swt.widgets.Shell;
+import org.txm.objects.CorpusBuild;
 import org.txm.rcp.messages.TXMUIMessages;
+import org.txm.searchengine.cqp.corpus.MainCorpus;
 
 public class UpdateCorpusDialog extends Dialog {
 
@@ -24,10 +30,15 @@
 	public boolean doOpenCorpusParameters = false;
 	public boolean doUpdateEditions = false;
 	public boolean doForceUpdate = false;
+	private LinkedHashMap<String, MainCorpus> corpora;
+	private LinkedHashMap<String, MainCorpus> selectedCorpora;
+	private List valuesList;
 	
-	public UpdateCorpusDialog(Shell parentShell) {
+	public UpdateCorpusDialog(Shell parentShell, LinkedHashMap<String, MainCorpus> corpora) {
 		
 		super(parentShell);
+		this.corpora = corpora;
+		this.selectedCorpora = new LinkedHashMap<>();
 	}
 	
 	@Override
@@ -45,8 +56,16 @@
 		layout.verticalSpacing = 20;
 		layout.marginWidth = 15;
 		
-		createTopMessageArea(comp);
+		if (topMessage !=null && topMessage.length() > 0) {
+			createTopMessageArea(comp);
+		}
 		
+		if (corpora != null && corpora.size() > 1) {
+			createCorporaSelectionArea(comp);
+		} else {
+			selectedCorpora = corpora;
+		}
+		
 		createButtonsArea(comp);
 		
 		createBottomMessageArea(comp);
@@ -54,8 +73,22 @@
 		return comp;
 	}
 	
+	private void createCorporaSelectionArea(Composite p) {
+		
+		Label valuesListLabel = new Label(p, SWT.NONE);
+		valuesListLabel.setText("Select the corpus annotations to save :");
+		valuesList = new List(p, SWT.MULTI | SWT.BORDER);
+		GridData data = new GridData(GridData.FILL_HORIZONTAL);
+		valuesList.setLayoutData(data);
+		valuesList.setItems(corpora.keySet().toArray(new String[corpora.size()]));
+		valuesList.selectAll();
+	}
+
 	protected void createButtonsArea(Composite comp) {
 		
+		Label titleLabel = new Label(comp, SWT.NONE);
+		titleLabel.setText("Options :");
+		
 		GridData data = new GridData(GridData.FILL_HORIZONTAL);
 		
 		openCorpusParameters = new Button(comp, SWT.CHECK);
@@ -102,6 +135,12 @@
 			doUpdateEditions = updateEditionsCheck.getSelection();
 			doForceUpdate = forceUpdateCheck.getSelection();
 			doOpenCorpusParameters = openCorpusParameters.getSelection();
+			if (corpora != null) {
+				selectedCorpora = new LinkedHashMap<>();
+				for (String item : valuesList.getSelection()) {
+					selectedCorpora.put(item, corpora.get(item));
+				}
+			}
 		}
 		
 		super.buttonPressed(buttonId);
@@ -171,4 +210,9 @@
 		
 		this.title = title;
 	}
+
+	public LinkedHashMap<String, MainCorpus> getSelectedCorpus() {
+		
+		return selectedCorpora;
+	}
 }
Index: TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/commands/workspace/UpdateCorpus.java
===================================================================
--- TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/commands/workspace/UpdateCorpus.java	(revision 3568)
+++ TXM/trunk/org.txm.rcp/src/main/java/org/txm/rcp/commands/workspace/UpdateCorpus.java	(revision 3569)
@@ -43,7 +43,7 @@
 		}
 		MainCorpus corpus = (MainCorpus) s;
 		
-		UpdateCorpusDialog dialog = new UpdateCorpusDialog(HandlerUtil.getActiveShell(event));
+		UpdateCorpusDialog dialog = new UpdateCorpusDialog(HandlerUtil.getActiveShell(event), null);
 		dialog.setDoUpdateEdition(TBXPreferences.getInstance().getBoolean(TBXPreferences.UPDATEEDITIONS));
 		dialog.setDoForceUpdate("true".equals(event.getParameter("org.txm.rcp.commands.workspace.UpdateCorpus.force"))); //$NON-NLS-1$ //$NON-NLS-2$
 		
Index: TXM/trunk/org.txm.annotation.kr.rcp/src/org/txm/annotation/kr/rcp/commands/SaveAnnotations.java
===================================================================
--- TXM/trunk/org.txm.annotation.kr.rcp/src/org/txm/annotation/kr/rcp/commands/SaveAnnotations.java	(revision 3568)
+++ TXM/trunk/org.txm.annotation.kr.rcp/src/org/txm/annotation/kr/rcp/commands/SaveAnnotations.java	(revision 3569)
@@ -1,5 +1,9 @@
 package org.txm.annotation.kr.rcp.commands;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
@@ -11,10 +15,16 @@
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.dialogs.ListDialog;
+import org.eclipse.ui.dialogs.ListSelectionDialog;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.txm.annotation.kr.core.AnnotationManager;
 import org.txm.annotation.kr.core.KRAnnotationEngine;
+import org.txm.objects.Workspace;
 import org.txm.rcp.messages.TXMUIMessages;
+import org.txm.rcp.swt.dialog.ListMultiSelectionDialog;
+import org.txm.rcp.swt.dialog.MultipleChoiceDialog;
+import org.txm.rcp.swt.dialog.MultipleValueDialog;
 import org.txm.rcp.utils.JobHandler;
 import org.txm.rcp.utils.SWTEditorsUtils;
 import org.txm.rcp.views.corpora.CorporaView;
@@ -28,29 +38,62 @@
 	@Override
 	public Object execute(ExecutionEvent event) throws ExecutionException {
 		
-		ISelection sel = HandlerUtil.getCurrentSelection(event);
-		if (!(sel instanceof IStructuredSelection)) return null;
-		IStructuredSelection selection = (IStructuredSelection) sel;
+		LinkedHashMap<String, MainCorpus> corporaWithAnnotationsToSave = new LinkedHashMap<>();
+		for (MainCorpus corpus : Workspace.getInstance().getDeepChildren(MainCorpus.class)) {
+			if (!corpus.getProject().isOpen()) continue;
+			AnnotationManager am;
+			try {
+				am = KRAnnotationEngine.getAnnotationManager(corpus);
+			}
+			catch (Exception e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				continue;
+			}
+			if (am == null) {
+				continue; // nothing to do
+			}
+			
+			if (!KRAnnotationEngine.needToSaveAnnotations(corpus)) {
+				continue;
+			}
+			
+			corporaWithAnnotationsToSave.put(corpus.getName(), corpus);
+		}
 		
-		Object s = selection.getFirstElement();
-		if (!(s instanceof MainCorpus))
+		if (corporaWithAnnotationsToSave.size() == 0) {
+			Log.info("No annotation to do in corpora.");
 			return null;
-		MainCorpus corpus = (MainCorpus) s;
-		try {
-			JobHandler job = save(corpus);
-			if (job == null) {
-				return null;
-			}
 		}
-		catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+		
+		ListMultiSelectionDialog<MainCorpus> dialog = new ListMultiSelectionDialog<MainCorpus>(HandlerUtil.getActiveShell(event), "Select corpus to save", "Select in the list the corpus you wich to save annotations", corporaWithAnnotationsToSave);
+		if (dialog.open() != MultipleChoiceDialog.OK) {
 			return null;
 		}
 		
+		//		Object s = selection.getFirstElement();
+		//		if (!(s instanceof MainCorpus))
+		//			return null;
+		
+		for (MainCorpus corpus :  dialog.getSelectedValues().values()) {
+			try {
+				JobHandler job = save(corpus);
+				if (job == null) {
+					return null;
+				} else {
+					job.join();
+				}
+			}
+			catch (Exception e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				return null;
+			}
+		}
+		
 		CorporaView.refresh();
 		
-		return corpus;
+		return dialog.getSelectedValues();
 	}
 	
 	public static JobHandler save(final MainCorpus corpus) throws Exception {
Index: TXM/trunk/org.txm.annotation.kr.rcp/src/org/txm/annotation/kr/rcp/commands/SaveAnnotationsAndUpdateCorpus.java
===================================================================
--- TXM/trunk/org.txm.annotation.kr.rcp/src/org/txm/annotation/kr/rcp/commands/SaveAnnotationsAndUpdateCorpus.java	(revision 3568)
+++ TXM/trunk/org.txm.annotation.kr.rcp/src/org/txm/annotation/kr/rcp/commands/SaveAnnotationsAndUpdateCorpus.java	(revision 3569)
@@ -1,5 +1,7 @@
 package org.txm.annotation.kr.rcp.commands;
 
+import java.util.LinkedHashMap;
+
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
@@ -12,10 +14,13 @@
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.handlers.HandlerUtil;
+import org.txm.annotation.kr.core.AnnotationManager;
 import org.txm.annotation.kr.core.KRAnnotationEngine;
 import org.txm.annotation.kr.core.preferences.KRAnnotationPreferences;
 import org.txm.concordance.rcp.editors.ConcordanceEditor;
 import org.txm.core.results.TXMResult;
+import org.txm.objects.CorpusBuild;
+import org.txm.objects.Workspace;
 import org.txm.rcp.commands.workspace.UpdateCorpus;
 import org.txm.rcp.messages.TXMUIMessages;
 import org.txm.rcp.swt.dialog.UpdateCorpusDialog;
@@ -31,37 +36,67 @@
 	@Override
 	public Object execute(ExecutionEvent event) throws ExecutionException {
 		
-		ISelection sel = HandlerUtil.getCurrentSelection(event);
-		if (!(sel instanceof IStructuredSelection)) {
-			Log.info("No available selection to target the corpus annotations to save");	
-			return null;
-		}
-		IStructuredSelection selection = (IStructuredSelection) sel;
+//		ISelection sel = HandlerUtil.getCurrentSelection(event);
+//		if (!(sel instanceof IStructuredSelection)) {
+//			Log.info("No available selection to target the corpus annotations to save");	
+//			return null;
+//		}
+//		IStructuredSelection selection = (IStructuredSelection) sel;
+//		
+//		MainCorpus corpus = null;
+//
+//		if (HandlerUtil.getActiveEditor(event) instanceof ConcordanceEditor) {
+//			corpus = ((ConcordanceEditor) HandlerUtil.getActiveEditor(event)).getCorpus().getMainCorpus();
+//		} else {
+//			Object s = selection.getFirstElement();
+//			if (s == null) {
+//				Log.info("No available selection to target the corpus annotations to save");
+//				return null;
+//			} else if ((s instanceof MainCorpus)) {
+//				corpus = (MainCorpus) s;
+//			} else if (s instanceof TXMResult) {
+//				corpus = ((TXMResult) s).getFirstParent(MainCorpus.class);
+//			} else {
+//				Log.info("No available selection to target the corpus annotations to save");
+//				return null;
+//			}
+//		}
+//		
 		
-		MainCorpus corpus = null;
-
-		if (HandlerUtil.getActiveEditor(event) instanceof ConcordanceEditor) {
-			corpus = ((ConcordanceEditor) HandlerUtil.getActiveEditor(event)).getCorpus().getMainCorpus();
-		} else {
-			Object s = selection.getFirstElement();
-			if (s == null) {
-				Log.info("No available selection to target the corpus annotations to save");
-				return null;
-			} else if ((s instanceof MainCorpus)) {
-				corpus = (MainCorpus) s;
-			} else if (s instanceof TXMResult) {
-				corpus = ((TXMResult) s).getFirstParent(MainCorpus.class);
-			} else {
-				Log.info("No available selection to target the corpus annotations to save");
-				return null;
+		
+		LinkedHashMap<String, MainCorpus> corporaWithAnnotationsToSave = new LinkedHashMap<>();
+		for (MainCorpus corpus : Workspace.getInstance().getDeepChildren(MainCorpus.class)) {
+			if (!corpus.getProject().isOpen()) continue;
+			AnnotationManager am;
+			try {
+				am = KRAnnotationEngine.getAnnotationManager(corpus);
 			}
+			catch (Exception e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				continue;
+			}
+			if (am == null) {
+				continue; // nothing to do
+			}
+			
+			if (!KRAnnotationEngine.needToSaveAnnotations(corpus)) {
+				continue;
+			}
+			
+			corporaWithAnnotationsToSave.put(corpus.getName(), corpus);
 		}
 		
+		if (corporaWithAnnotationsToSave.size() == 0) {
+			Log.info("No CQP annotation found to save in the corpora.");
+			return null;
+		}
+		
 		try {
-			if (!KRAnnotationEngine.needToSaveAnnotations(corpus)) {
-				Log.info(NLS.bind("No CQP annotation found to save in the {0} corpus.", corpus));
-				return null;
-			}
+//			if (!KRAnnotationEngine.needToSaveAnnotations(corpus)) {
+//				Log.info(NLS.bind("No CQP annotation found to save in the {0} corpus.", corpus));
+//				return null;
+//			}
 			
 			// System.out.println("DISPLAY="+Display.getDefault());
 			final Boolean[] doit = new Boolean[1];
@@ -70,16 +105,18 @@
 			final Boolean[] doupdateedition = new Boolean[1];
 			doupdateedition[0] = KRAnnotationPreferences.getInstance().getBoolean(KRAnnotationPreferences.UPDATE_EDITION);
 			
+			UpdateCorpusDialog dialog = new UpdateCorpusDialog(Display.getDefault().getActiveShell(), corporaWithAnnotationsToSave);
+			dialog.setTitle("Select corpus to save and update options");
+			dialog.setMessages(null, dialog.getBottomMessage());
+			dialog.setDoForceUpdate(false);
+			dialog.setDoUpdateEdition(KRAnnotationPreferences.getInstance().getBoolean(KRAnnotationPreferences.UPDATE_EDITION));
+			
 			Display.getDefault().syncExec(new Runnable() {
 				
 				@Override
 				public void run() {
-					UpdateCorpusDialog dialog = new UpdateCorpusDialog(Display.getDefault().getActiveShell());
-					dialog.setTitle("Before saving annotations...");
-					dialog.setMessages("Save Annotations and update the corpus.", dialog.getBottomMessage());
-					dialog.setDoForceUpdate(false);
-					dialog.setDoUpdateEdition(KRAnnotationPreferences.getInstance().getBoolean(KRAnnotationPreferences.UPDATE_EDITION));
 					
+					
 					doit[0] = dialog.open() == Window.OK;
 					doupdateedition[0] = dialog.getDoUpdateEdition();
 				}
@@ -88,15 +125,32 @@
 				return null;
 			}
 			
-			
-			Log.info(NLS.bind("Saving {0} annotations...", corpus.getName()));
-			JobHandler job = SaveAnnotations.save(corpus);
-			if (job == null) {
+			if (dialog.getSelectedCorpus().size() == 0) {
+				Log.info("No corpus selected. Aborting.");
 				return null;
 			}
-			final MainCorpus fcorpus = corpus;
+			
+			
+			JobHandler job = null;
+			
+			Log.info(NLS.bind("Saving {0} annotations...", dialog.getSelectedCorpus().keySet()));
+			for (MainCorpus corpus :  dialog.getSelectedCorpus().values()) {
+				try {
+					job = SaveAnnotations.save(corpus);
+					if (job == null) {
+						return null;
+					} else {
+						job.join();
+					}
+				}
+				catch (Exception e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+					return null;
+				}
+			}
 
-			if (job.getState() == Status.OK_STATUS.getCode()) {
+			if (job != null && job.getState() == Status.OK_STATUS.getCode()) {
 				if (KRAnnotationPreferences.getInstance().getBoolean(KRAnnotationPreferences.UPDATE)) {
 					
 					JobHandler job2 = new JobHandler("Updating corpus editions and indexes", true) {
@@ -106,24 +160,36 @@
 							this.runInit(monitor);
 							
 							try {
-								monitor.setTaskName("Updating corpus");
-								if (fcorpus != null && UpdateCorpus.update(fcorpus, false, doupdateedition[0]) != null) {
-									monitor.worked(50);
-									this.syncExec(new Runnable() {
-										
-										@Override
-										public void run() {
-											CorporaView.refreshObject(fcorpus);
+								monitor.setTaskName("Updating corpora: "+dialog.getSelectedCorpus().values());
+								for (MainCorpus fcorpus :  dialog.getSelectedCorpus().values()) {
+									JobHandler job2 = UpdateCorpus.update(fcorpus, false, doupdateedition[0]);
+									if (fcorpus != null && job2 != null) {
+										try {
+											job2.join();
 										}
-									});
-									return Status.OK_STATUS;
+										catch (InterruptedException e) {
+											// TODO Auto-generated catch block
+											e.printStackTrace();
+										}
+										monitor.worked(50);
+									}
+									else {
+										monitor.worked(50);
+										Log.warning("Fail to update corpus. Aborting");
+										Log.warning("Fix XML-TXM files and call command 'UpdateCorpus'");
+										return Status.CANCEL_STATUS;
+									}
 								}
-								else {
-									monitor.worked(50);
-									Log.warning("Fail to update corpus. Aborting");
-									Log.warning("Fix XML-TXM files and call command 'UpdateCorpus'");
-									return Status.CANCEL_STATUS;
-								}
+								
+								this.syncExec(new Runnable() {
+									
+									@Override
+									public void run() {
+										CorporaView.refresh();
+									}
+								});
+								return Status.OK_STATUS;
+								
 							} catch(ThreadDeath ex) {
 								Log.info(TXMUIMessages.executionCanceled);
 								return Status.CANCEL_STATUS;
@@ -144,6 +210,6 @@
 		
 		CorporaView.refresh();
 		
-		return corpus;
+		return corporaWithAnnotationsToSave;
 	}
 }
Index: TXM/trunk/org.txm.annotation.kr.rcp/plugin.xml
===================================================================
--- TXM/trunk/org.txm.annotation.kr.rcp/plugin.xml	(revision 3568)
+++ TXM/trunk/org.txm.annotation.kr.rcp/plugin.xml	(revision 3569)
@@ -262,12 +262,6 @@
               icon="icons/functions/pencil_save.png"
               label="%command.label.111"
               style="push">
-           <visibleWhen
-                 checkEnabled="false">
-              <reference
-                    definitionId="CorpusNeedtoSaveAnnotation">
-              </reference>
-           </visibleWhen>
         </command>
      </menuContribution>
      <menuContribution
