Index: tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/ExportToOneFile.java
===================================================================
--- tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/ExportToOneFile.java	(revision 1290)
+++ tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/ExportToOneFile.java	(revision 1291)
@@ -44,7 +44,7 @@
 			for (String lang : langs) {
 				File propFile = messages.getFile2lang().getKey(lang);
 				if (propFile != null) {
-					BiHashMap<String, String> lmessages = messages.getLangs().get(propFile);
+					HashMap<String, String> lmessages = messages.getLangs().get(propFile);
 					for (String key : messages.getMessageKeys()) {
 						
 						if (lmessages.get(key) == null) continue;
Index: tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/NormalizeKeys.java
===================================================================
--- tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/NormalizeKeys.java	(revision 1290)
+++ tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/NormalizeKeys.java	(revision 1291)
@@ -4,6 +4,7 @@
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
+import java.util.HashMap;
 
 import org.txm.rcp.translate.i18n.PluginMessagesManager;
 import org.txm.rcp.translate.i18n.WorkspaceMessagesManager;
@@ -47,7 +48,7 @@
 	 */
 	public int normalize(PluginMessagesManager pmManager)	{
 
-		BiHashMap<String, String> messages = pmManager.getMessagesForDefaultLang();
+		HashMap<String, String> messages = pmManager.getMessagesForDefaultLang();
 
 		ArrayList<String> keys = new ArrayList<String>(pmManager.getMessageKeys());
 
Index: tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/MergeDuplicatedStringsInAPlugin.java
===================================================================
--- tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/MergeDuplicatedStringsInAPlugin.java	(revision 1290)
+++ tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/MergeDuplicatedStringsInAPlugin.java	(revision 1291)
@@ -1,10 +1,51 @@
 package org.txm.rcp.translate.devtools;
 
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+import org.txm.rcp.translate.i18n.PluginMessagesManager;
+import org.txm.rcp.translate.i18n.WorkspaceMessagesManager;
+
 /**
  * 
  * Finds duplicated strings in a plug-in, merge them in one key and remove duplicated.
  *
  */
 public class MergeDuplicatedStringsInAPlugin {
+	
+	boolean debug = false;
+	
+	/**
+	 * 
+	 * @param debug
+	 */
+	public MergeDuplicatedStringsInAPlugin(boolean debug) {
+		this.debug = debug;
+	}
 
+	public void merge(PluginMessagesManager pm) {
+		// TODO Auto-generated method stub
+	}
+	
+	/**
+	 * 
+	 * @param args
+	 * @throws IOException 
+	 * @throws FileNotFoundException 
+	 * @throws UnsupportedEncodingException 
+	 */
+	public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException, IOException {
+
+		MergeDuplicatedStringsInAPlugin merger = new MergeDuplicatedStringsInAPlugin(false);
+
+		WorkspaceMessagesManager wmm = new WorkspaceMessagesManager();
+		for (PluginMessagesManager pm : wmm.getPluginMessages().values()) {
+			merger.merge(pm);
+			
+			//pm.saveChanges(true);
+		}
+
+		//wmm.saveKeyModificationsInSources();
+	}
 }
Index: tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/RemoveUnusedTranslations.java
===================================================================
--- tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/RemoveUnusedTranslations.java	(revision 1290)
+++ tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/RemoveUnusedTranslations.java	(revision 1291)
@@ -5,6 +5,7 @@
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.TreeSet;
@@ -29,16 +30,16 @@
 				
 				int n = 0;
 				
-				BiHashMap<String, String> lmessages = messages.getMessagesForLang(lang);
+				HashMap<String, String> lmessages = messages.getMessagesForLang(lang);
 				if (lmessages == null) continue;
 				
-				ArrayList<String> propskeys = new ArrayList<String>(lmessages.getKeys());
+				ArrayList<String> propskeys = new ArrayList<String>(lmessages.keySet());
 				ArrayList<String> removed = new ArrayList<String>();
 				
 				for (String k : propskeys) {
 					if (!keys.contains(k)) {
 						//System.out.println(" Remove key="+k);
-						lmessages.removeByKey(k);
+						lmessages.remove(k);
 						removed.add(k);
 						n++;
 					}
Index: tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/i18n/PluginMessagesManager.java
===================================================================
--- tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/i18n/PluginMessagesManager.java	(revision 1290)
+++ tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/i18n/PluginMessagesManager.java	(revision 1291)
@@ -99,7 +99,7 @@
 		return osgiKeys;
 	}
 
-	public TreeMap<File, BiHashMap<String, String>> getOsgiLangs() {
+	public TreeMap<File, HashMap<String, String>> getOsgiLangs() {
 		return osgiLangs;
 	}
 
@@ -111,7 +111,7 @@
 	/**
 	 * The OSGI messages stored by properties file
 	 */
-	TreeMap<File, BiHashMap<String, String>> osgiLangs = new TreeMap<File, BiHashMap<String, String>>();
+	TreeMap<File, HashMap<String, String>> osgiLangs = new TreeMap<File, HashMap<String, String>>();
 
 	/**
 	 * Stores the key modifications for further saves in the source files
@@ -121,7 +121,7 @@
 	/**
 	 * The messages stored by properties file
 	 */
-	TreeMap<File, BiHashMap<String, String>> langs = new TreeMap<File, BiHashMap<String, String>>();
+	TreeMap<File, HashMap<String, String>> langs = new TreeMap<File, HashMap<String, String>>();
 
 	/**
 	 * the properties files langs
@@ -207,10 +207,10 @@
 				//messages.properties
 				//messages_xx.properties
 				String lang = name.substring(8, name.indexOf(".properties"));
-				langs.put(propFile, new BiHashMap<String, String>());
+				langs.put(propFile, new HashMap<String, String>());
 				file2lang.put(propFile, lang);
 
-				BiHashMap<String, String> hash = langs.get(propFile);
+				HashMap<String, String> hash = langs.get(propFile);
 
 				Properties props1 = new Properties();
 				props1.load(IOUtils.getReader(propFile, ENCODING));
@@ -258,7 +258,9 @@
 					if (propFile.getName().startsWith("bundle") && propFile.getName().endsWith(".properties")) {
 						Properties props = new Properties();
 						props.load(IOUtils.getReader(propFile));
-						osgiLangs.put(propFile, new BiHashMap<String, String>(props));
+						HashMap<String, String> h = new HashMap<String, String>();
+						for (Object k : props.keySet()) h.put(k.toString(), props.getProperty(k.toString()));
+						osgiLangs.put(propFile, h);
 					}
 				}
 			}
@@ -403,19 +405,19 @@
 	 * @param lang
 	 * @return the map of the messages keys and values for the specified language.
 	 */
-	public BiHashMap<String, String> getMessagesForLang(String lang) {
+	public HashMap<String, String> getMessagesForLang(String lang) {
 		if (javaMessageFile != null) {
 			File p = new File(javaMessageFile.getParentFile(), "messages" + lang + ".properties");
 			return langs.get(p);
 		} else {
-			return new BiHashMap<String, String>();
+			return new HashMap<String, String>();
 		}
 	}
 
 	/**
 	 * @return the map of the messages keys and values for the main language.
 	 */
-	public BiHashMap<String, String> getMessagesForDefaultLang() {
+	public HashMap<String, String> getMessagesForDefaultLang() {
 		return this.getMessagesForLang(""); //$NON-NLS-1$
 	}
 
@@ -425,12 +427,12 @@
 		File p = new File(javaMessageFile.getParentFile(), "messages"+lang+".properties");
 
 		if (!langs.containsKey(p)) {
-			langs.put(p, new BiHashMap<String, String>());
+			langs.put(p, new HashMap<String, String>());
 			file2lang.put(p, lang);
 		}
 
 		if (message == null) {
-			langs.get(p).removeByKey(key);
+			langs.get(p).remove(key);
 		} else {
 			langs.get(p).put(key, message);
 		}
@@ -509,8 +511,8 @@
 					return Collections.enumeration(set);
 				}
 			};
-			BiHashMap<String, String> h = langs.get(propFile);
-			for (String k : h.getKeys()) {
+			HashMap<String, String> h = langs.get(propFile);
+			for (String k : h.keySet()) {
 				props.setProperty(k, h.get(k));
 			}
 
@@ -590,9 +592,9 @@
 			System.out.println("  ------------------------------------------------------------------------------------------------------------------------------");
 			System.out.println("  " + lang);
 			System.out.println("  ------------------------------------------------------------------------------------------------------------------------------");
-			BiHashMap<String, String> hash = langs.get(lang);
-			System.out.println(" keys="+ hash.getKeys());
-			for (String key : hash.getKeys()) {
+			HashMap<String, String> hash = langs.get(lang);
+			System.out.println(" keys="+ hash.keySet());
+			for (String key : hash.keySet()) {
 				System.out.println("  " + key + "="+hash.get(key));
 			}
 		}
@@ -672,10 +674,10 @@
 		messageKeys.add(newName);
 
 		for (File p : langs.keySet()) {
-			BiHashMap<String, String> h = langs.get(p);
+			HashMap<String, String> h = langs.get(p);
 			if (h.containsKey(oldName)) {
 				h.put(newName, h.get(oldName));
-				h.removeByKey(oldName);
+				h.remove(oldName);
 			}
 		}
 
@@ -696,9 +698,9 @@
 		messageKeys.remove(key);
 
 		for (File p : langs.keySet()) {
-			BiHashMap<String, String> h = langs.get(p);
+			HashMap<String, String> h = langs.get(p);
 			if (h.containsKey(key)) {
-				h.removeByKey(key);
+				h.remove(key);
 			}
 		}
 
@@ -717,7 +719,7 @@
 		return file2lang;
 	}
 
-	public TreeMap<File, BiHashMap<String, String>> getLangs() {
+	public TreeMap<File, HashMap<String, String>> getLangs() {
 		return langs;
 	}
 
