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 1294)
+++ tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/devtools/NormalizeKeys.java	(revision 1295)
@@ -48,6 +48,11 @@
 	 */
 	public int normalize(PluginMessagesManager pmManager)	{
 
+		if(debug)	{
+			System.out.println("NormalizeKeys.normalize(): ****************************************************************************************");
+			System.out.println("NormalizeKeys.normalize(): normalizating messages keys of project " + pmManager.getProjectDirectory() + "...");
+		}
+		
 		HashMap<String, String> messages = pmManager.getMessagesForDefaultLang();
 
 		ArrayList<String> keys = new ArrayList<String>(pmManager.getMessageKeys());
@@ -56,17 +61,21 @@
 		for (String key : keys) {
 			String value = messages.get(key);
 			if (value == null) {
-				System.out.println("Warning: missing message for key="+key);
+				System.out.println("** NormalizeKeys.normalize(): warning: missing message for key="+key);
 				continue;
 			}
 			// already formatted message
 			if(key.matches(preserve))	{
-				if (debug) System.err.println("NormalizeKeys.normalize(): warning: skipped: " + key + "=" + value);
+				if (debug) {
+					System.out.println("** NormalizeKeys.normalize(): warning: skipped: " + key + "=" + value);
+				}
 				continue;
 			}
 			// empty message
 			else if(value.length() == 0)	{
-				if (debug)  System.err.println("NormalizeKeys.normalize(): warning: empty string for key: " + key); 
+				if (debug) {
+					System.out.println("** NormalizeKeys.normalize(): warning: empty string for key: " + key); 
+				}
 				continue;
 			}
 
@@ -96,6 +105,13 @@
 			n++;
 		}
 
+		if(debug)	{
+			System.out.println("NormalizeKeys.normalize(): normalization done for project " + pmManager.getProjectDirectory() + ".");
+			System.out.println("NormalizeKeys.normalize(): number of keys: " + pmManager.getMessageKeys().size() + ".");
+			System.out.println("NormalizeKeys.normalize(): number of replacements to do: " + pmManager.getKeyModifications().size() + ".");
+		}
+
+		
 		return n;
 	}
 
@@ -139,6 +155,12 @@
 			System.out.println("NormalizeKeys.normalize(): normalizing: " + str);
 		}
 
+		str = str.trim();
+
+		// special replacements
+		str = str.replaceAll("%", "percent");
+		
+		// remove all special chars
 		str = str.replaceAll("[^a-zA-Z0-9 ]", "").trim();
 
 		// empty string
@@ -230,13 +252,14 @@
 		//			e.printStackTrace();
 		//		}
 
-		NormalizeKeys keysNormalizer = new NormalizeKeys(false);
+		NormalizeKeys keysNormalizer = new NormalizeKeys(true);
 
-		WorkspaceMessagesManager wmm = new WorkspaceMessagesManager();
+		WorkspaceMessagesManager wmm = new WorkspaceMessagesManager(true);
 		for (PluginMessagesManager pm : wmm.getPluginMessages().values()) {
 			keysNormalizer.normalize(pm);
 			
-			//pm.saveChanges(true);
+			//pm.saveChanges(true); // mode homme
+			pm.saveChanges(false);
 		}
 
 		//wmm.saveKeyModificationsInSources();
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 1294)
+++ tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/i18n/PluginMessagesManager.java	(revision 1295)
@@ -15,7 +15,6 @@
 import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.LinkedHashSet;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
@@ -26,7 +25,6 @@
 
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang.StringUtils;
-import org.eclipse.osgi.util.NLS;
 import org.txm.rcp.translate.devtools.NormalizeKeys;
 import org.txm.utils.BiHashMap;
 import org.txm.utils.io.IOUtils;
@@ -45,6 +43,8 @@
 	 */
 	public static String ENCODING = "UTF-8";
 
+	public final static String FILE_SEPARATOR = System.getProperty("file.separator");
+	
 	/**
 	 * Debug state.
 	 */
@@ -72,9 +72,9 @@
 
 
 	/**
-	 * TODO Global REGEX containing all keys to later use for search in files.
+	 * Global REGEX containing all keys to later use for search in files.
 	 */
-	protected Pattern keysGlobalREGEX = Pattern.compile("...");
+	protected Pattern keysGlobalREGEX;
 
 	/**
 	 * Index of the keys used and their associated files.
@@ -137,32 +137,23 @@
 	 * @throws IOException
 	 */
 	public PluginMessagesManager(File projectDirectory) throws UnsupportedEncodingException, FileNotFoundException, IOException {
-		this(projectDirectory, findMessageFile(projectDirectory), false);
+		this(projectDirectory, false);
 	}
 
-	public static File findMessageFile(File projectDirectory2) {
-		File messagesPackageDir = new File(projectDirectory2, "src/"+projectDirectory2.getName().replaceAll("\\.", "/")+"/messages");
+	/**
+	 * 
+	 * @param projectDirectory
+	 * @param debug
+	 * @throws UnsupportedEncodingException
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 */
+	public PluginMessagesManager(File projectDirectory, boolean debug) throws UnsupportedEncodingException, FileNotFoundException, IOException {
+		this(projectDirectory, findMessageFile(projectDirectory), debug);
+	}
 
-		if (!messagesPackageDir.exists()) {
-			messagesPackageDir = new File(projectDirectory2, "src/java/"+projectDirectory2.getName().replaceAll("\\.", "/")+"/messages");
-		}
 
-		if (!messagesPackageDir.exists()) {
-			messagesPackageDir = new File(projectDirectory2, "src/main/java/"+projectDirectory2.getName().replaceAll("\\.", "/")+"/messages");
-		}
-
-		if (!messagesPackageDir.exists()) {
-			return null;
-		}
-
-		for (File messagesJavaFile : messagesPackageDir.listFiles()) {
-			if (messagesJavaFile.isDirectory()) continue;
-			if (!messagesJavaFile.getName().endsWith("Messages.java")) continue;
-			return messagesJavaFile;
-		}
-		return null;
-	}
-
+	
 	/**
 	 * 
 	 * @param projectDirectory
@@ -175,6 +166,8 @@
 		this(projectDirectory, javaMessageFile, false);
 	}
 
+	
+	
 	/**
 	 * 
 	 * @param projectDirectory
@@ -232,6 +225,10 @@
 					}
 					if (line2.endsWith(";") && !line2.contains("=") && !line2.contains("\"")) {
 						line2 = line2.substring(21, line2.length() -1);
+						
+						if(debug)	{
+							System.out.println("PluginMessagesManager.PluginMessagesManager(): messages key: " + line2 + " added.");
+						}
 						messageKeys.add(line2);
 					}
 				}
@@ -239,60 +236,157 @@
 				line2 = reader2.readLine();
 			}
 			reader2.close();
-		}
+			
+			
+			if(debug)	{
+				System.out.println("PluginMessagesManager.PluginMessagesManager(): number of keys: " + this.messageKeys.size() + ".");
+			}
+			
 
-		// create the project source files list
-		this.createSourceFilesList();
+			// create the project source files list
+			this.createSourceFilesList();
 
-		//this.createKeysGlobalREGEX();
-		this.createUsedKeysFilesIndex();
+			if(messageKeys.size() > 0)	{
+				//this.createKeysGlobalREGEX();
+				this.createUsedKeysFilesIndex();
+			}
 
-		// try loading OSGI messages 
-		if (pluginXMLFile.exists()) {
-			ArrayList<String> result = IOUtils.findWithGroup(pluginXMLFile, "\"%([^\"]+)\"");
-			osgiKeys.addAll(result);
+			// try loading OSGI messages 
+			if (pluginXMLFile.exists()) {
+				ArrayList<String> result = IOUtils.findWithGroup(pluginXMLFile, "\"%([^\"]+)\"");
+				osgiKeys.addAll(result);
 
-			File osgiInf = new File(projectDirectory, "OSGI-INF/l10n");
-			if (osgiInf.exists()) {
-				for (File propFile : osgiInf.listFiles()) {
-					if (propFile.getName().startsWith("bundle") && propFile.getName().endsWith(".properties")) {
-						Properties props = new Properties();
-						props.load(IOUtils.getReader(propFile));
-						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);
+				File osgiInf = new File(projectDirectory, "OSGI-INF/l10n");
+				if (osgiInf.exists()) {
+					for (File propFile : osgiInf.listFiles()) {
+						if (propFile.getName().startsWith("bundle") && propFile.getName().endsWith(".properties")) {
+							Properties props = new Properties();
+							props.load(IOUtils.getReader(propFile));
+							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);
+						}
 					}
 				}
+				//			System.out.println(osgiKeys);
+				//			System.out.println(osgiLangs);
 			}
-			//			System.out.println(osgiKeys);
-			//			System.out.println(osgiLangs);
-		}
 
-		if(debug)	{
-			this.dumpUsedKeysFilesIndex();
+			if(debug)	{
+				this.dumpUsedKeysFilesIndex();
+			}
 		}
+		else {
+			System.err.println("PluginMessagesManager.PluginMessagesManager(): skipped, java message file not found for project " + this.projectDirectory + ".");
+		}
 	}
 
-	//	/**
-	//	 * Creates a global REGEX containing all keys to later search in files.
-	//	 */
-	//	public void createKeysGlobalREGEX()	{
-	//		StringBuffer buffer = new StringBuffer();
-	//		for (String key : messageKeys) {
-	//			buffer.append("|" + key);
-	//		}
-	//		
-	//		// remove first pipe
-	//		buffer.deleteCharAt(0);
-	//		
-	//		this.keysGlobalREGEX = Pattern.compile("(" + buffer + ")");
-	//		
-	//		if(debug)	{
-	//			System.out.println("PluginMessagesManager.createKeysGlobalREGEX(): REGEX created: " + this.keysGlobalREGEX + ".");
-	//		}
-	//		
-	//	}
+//		/**
+//		 * Creates a global REGEX containing all keys to later search in files.
+//		 */
+//		public void createKeysGlobalREGEX()	{
+//			
+//			if(messageKeys.size() == 0) {
+//				return;
+//			}
+//			
+//			StringBuffer buffer = new StringBuffer();
+//			buffer.append(this.getMessageClassName() + "\\\\.(");
+//			
+//			int i = 0;
+//			for (String key : messageKeys) {
+//				if(i > 0)	{
+//					buffer.append("|" + key);	
+//				}
+//				else {
+//					buffer.append(key);
+//				}
+//				i++;
+//			}
+//			
+//			// remove first pipe
+//			//buffer.deleteCharAt(0);
+//			
+//			this.keysGlobalREGEX = Pattern.compile("(" + buffer + "))");
+//			
+//			if(debug)	{
+//				System.out.println("PluginMessagesManager.createKeysGlobalREGEX(): REGEX created: " + this.keysGlobalREGEX + ".");
+//			}
+//			
+//		}
 
+		
+		/**
+		 * Creates a global REGEX containing all keys to later search in files.
+		 */
+		public void createKeysGlobalREGEX()	{
+			StringBuffer buffer = new StringBuffer();
+			for (String key : messageKeys) {
+				buffer.append("|" + this.getKeyFullName(key).replaceAll("\\.", "\\\\."));
+			}
+			
+			// remove first pipe
+			buffer.deleteCharAt(0);
+			
+			this.keysGlobalREGEX = Pattern.compile("(" + buffer + ")");
+			
+			if(debug)	{
+				System.out.println("PluginMessagesManager.createKeysGlobalREGEX(): REGEX created: " + this.keysGlobalREGEX + ".");
+			}
+			
+		}
+		
+		
+		
+		public static File findMessageFile(File projectDirectory2) {
+			File messagesPackageDir = new File(projectDirectory2, "src/"+projectDirectory2.getName().replaceAll("\\.", "/")+"/messages");
+
+			if (!messagesPackageDir.exists()) {
+				messagesPackageDir = new File(projectDirectory2, "src/java/"+projectDirectory2.getName().replaceAll("\\.", "/")+"/messages");
+			}
+
+			if (!messagesPackageDir.exists()) {
+				messagesPackageDir = new File(projectDirectory2, "src/main/java/"+projectDirectory2.getName().replaceAll("\\.", "/")+"/messages");
+			}
+
+			if (!messagesPackageDir.exists()) {
+				return null;
+			}
+
+			for (File messagesJavaFile : messagesPackageDir.listFiles()) {
+				if (messagesJavaFile.isDirectory()) continue;
+				if (!messagesJavaFile.getName().endsWith("Messages.java")) continue;
+				return messagesJavaFile;
+			}
+			return null;
+		}
+	
+//	public static File findMessageFile(File projectDirectory2) {
+////		System.out.println("PluginMessagesManager.findMessageFile() " + FILE_SEPARATOR);
+//		File messagesPackageDir = new File(projectDirectory2, "src" + FILE_SEPARATOR + projectDirectory2.getName().replaceAll("\\.", "\\" + FILE_SEPARATOR) + FILE_SEPARATOR + "messages");
+//
+//		if (!messagesPackageDir.exists()) {
+//			messagesPackageDir = new File(projectDirectory2, "src" + FILE_SEPARATOR + "java" + FILE_SEPARATOR + projectDirectory2.getName().replaceAll("\\.", "\\" + FILE_SEPARATOR) + FILE_SEPARATOR + "messages");
+//		}
+//
+//		if (!messagesPackageDir.exists()) {
+//			messagesPackageDir = new File(projectDirectory2, "src" + FILE_SEPARATOR + "main" + FILE_SEPARATOR + "java" + FILE_SEPARATOR + projectDirectory2.getName().replaceAll("\\.", "\\" + FILE_SEPARATOR) + FILE_SEPARATOR + "messages");
+//		}
+//
+//		if (!messagesPackageDir.exists()) {
+//			return null;
+//		}
+//
+//		for (File messagesJavaFile : messagesPackageDir.listFiles()) {
+//			if (messagesJavaFile.isDirectory()) continue;
+//			if (!messagesJavaFile.getName().endsWith("Messages.java")) continue;
+//			return messagesJavaFile;
+//		}
+//		return null;
+//	}
+
+
+	
 	/**
 	 * Creates/updates the index of the keys used and their associated files.
 	 * @throws IOException 
@@ -300,33 +394,45 @@
 	public void createUsedKeysFilesIndex() throws IOException	{
 		this.usedKeysFilesIndex = new TreeMap<String, TreeSet<File>>();
 
-		//for (String key : messageKeys) {
+		// Old version, based on real key name
+//		for (File file : this.srcFiles) {
+//			for (String key : messageKeys) {
+//				if(debug) {
+//					System.out.println("PluginMessagesManager.createUsedKeysIndex(): looking for key " + this.getKeyFullName(key) + " in project source files...");
+//				}
+//				String lines = IOUtils.getText(file, PluginMessagesManager.ENCODING);
+//				if(lines.contains(this.getKeyFullName(key)))	{
+//					if (!this.usedKeysFilesIndex.containsKey(key)) {
+//						this.usedKeysFilesIndex.put(key, new TreeSet<File>());
+//					}
+//					this.usedKeysFilesIndex.get(key).add(file);
+//				};
+//			}
+//		}
 
-		//		if(debug) {
-		//			System.out.println("PluginMessagesManager.createUsedKeysIndex(): looking for key " + this.getKeyFullName(key) + " in project source files...");
-		//		}
-
+		// New version using REGEX
 		for (File file : this.srcFiles) {
 			if (!file.exists()) continue;
 			String lines = IOUtils.getText(file, PluginMessagesManager.ENCODING);
 
-			//			for (String line : lines) {
-			//				//					if(line.contains(this.getKeyFullName(key)))	{
-			//				//						files.add(file);
-			//				//					};
-
 			Matcher m = WorkspaceMessagesManager.KEY_REGEX.matcher(lines);
+			//Matcher m = this.keysGlobalREGEX.matcher(lines);
 			while (m.find()) {
 				// Get the matching string
 				String key = m.group();
+				
 				if (!this.usedKeysFilesIndex.containsKey(key)) {
 					this.usedKeysFilesIndex.put(key, new TreeSet<File>());
 				}
 				this.usedKeysFilesIndex.get(key).add(file);
+				
+				if(debug) {
+					System.out.println("PluginMessagesManager.createUsedKeysFilesIndex(): messages key: " + key + " added for file " + file +  ".");
+				}
+
 			}
-			//			}
+
 		}
-		//}
 	}
 
 
@@ -337,8 +443,13 @@
 
 		System.out.println("PluginMessagesManager.dumpUsedKeysIndex(): dumping used keys files index...");
 
+		if(this.usedKeysFilesIndex == null)	{
+			System.out.println("PluginMessagesManager.dumpUsedKeysIndex(): project have no used keys.");
+			return;
+		}
+		
 		for (Map.Entry<String, TreeSet<File>> entry : this.usedKeysFilesIndex.entrySet()) {
-			System.out.println("key: " + this.getKeyFullName(entry.getKey()));
+			System.out.println("key: " + entry.getKey());
 			if(entry.getValue().isEmpty())	{
 				System.out.println("   file(s): -not used in any file of the project " + this.getProjectDirectory() + "-");
 			}
@@ -348,6 +459,8 @@
 				}
 			}
 		}
+		
+		System.out.println("PluginMessagesManager.dumpUsedKeysIndex(): number of used keys: " + this.usedKeysFilesIndex.size() + ".");
 	}
 
 	/***
@@ -439,7 +552,7 @@
 	}
 
 	public String get(String lang, String key) {
-		File p = new File(javaMessageFile.getParentFile(), "messages"+lang+".properties");
+		File p = new File(javaMessageFile.getParentFile(), "messages" + lang + ".properties");
 
 		if (!file2lang.containsKey(p)) return null;
 
@@ -456,12 +569,13 @@
 
 	public String getMessageClassName() {
 		if (javaMessageFile == null) return "";
-		return javaMessageFile.getName().substring(0, javaMessageFile.getName().length()-5);
+		return javaMessageFile.getName().substring(0, javaMessageFile.getName().length() - 5);
 	}
 
 	public String getMessageFullClassName() {
 		if (javaMessageFile == null) return "";
-		return javaMessageFile.getAbsolutePath().substring(javaMessageFile.getAbsolutePath().lastIndexOf("org/txm/"), javaMessageFile.getAbsolutePath().length()-5).replace("/", ".");
+		return javaMessageFile.getAbsolutePath().substring(javaMessageFile.getAbsolutePath().lastIndexOf("org" + FILE_SEPARATOR + "txm" + FILE_SEPARATOR),
+				javaMessageFile.getAbsolutePath().length() - 5).replace(FILE_SEPARATOR, ".");
 	}
 
 	/**
@@ -474,7 +588,8 @@
 
 	public String getMessageFullName() {
 		if (javaMessageFile == null) return "";
-		return javaMessageFile.getAbsolutePath().substring(javaMessageFile.getAbsolutePath().lastIndexOf("org/txm/")+8, javaMessageFile.getAbsolutePath().length()-5-8).replace("/", ".");
+		return javaMessageFile.getAbsolutePath().substring(javaMessageFile.getAbsolutePath().lastIndexOf("org" + FILE_SEPARATOR + "txm" + FILE_SEPARATOR) + 8, 
+				javaMessageFile.getAbsolutePath().length() - 5 - 8).replace(FILE_SEPARATOR, ".");
 	}
 
 	/**
@@ -521,7 +636,7 @@
 				propFile.delete();
 				newPropFile = propFile;
 			}
-			props.store(IOUtils.getWriter(newPropFile, ENCODING), "TXM messages generated by the PluginMessages class");
+			props.store(IOUtils.getWriter(newPropFile, ENCODING), "TXM messages generated by the PluginMessagesManager class");
 		}
 
 		// write message File
@@ -601,7 +716,7 @@
 	}
 
 	/**
-	 * Parses the project and stores a list of the source files. 
+	 * Parses the specified path and stores a list of the source files. 
 	 */
 	private void createSourceFilesList(File path)	{
 		File[] list = path.listFiles();
@@ -786,9 +901,12 @@
 	 */
 	public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException, IOException {
 
-		File projectFile = new File(new File(System.getProperty("user.dir")).getParentFile().getAbsolutePath() + "/org.txm.rcp");
+		long startTime = System.currentTimeMillis();
+		
+		//File projectFile = new File(new File(System.getProperty("user.dir")).getParentFile().getAbsolutePath() + "/org.txm.rcp");
+		File projectFile = new File(new File(System.getProperty("user.dir")).getParentFile().getAbsolutePath() + "/org.txm.core");
 
-		PluginMessagesManager pmManager = new PluginMessagesManager(projectFile);
+		PluginMessagesManager pmManager = new PluginMessagesManager(projectFile, true);
 
 		// test to find files using the specified key
 		/*
@@ -816,6 +934,8 @@
 		pmManager.saveChanges(false);
 
 		System.out.println("dir="+pmManager.getProjectDirectory());
+		System.out.println("Elapsed time:"+ ((double)(System.currentTimeMillis()-startTime)/1000));
+		
 		System.out.println("PluginMessagesManager.main(): done.");
 	}
 }
\ No newline at end of file
Index: tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/i18n/WorkspaceMessagesManager.java
===================================================================
--- tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/i18n/WorkspaceMessagesManager.java	(revision 1294)
+++ tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/i18n/WorkspaceMessagesManager.java	(revision 1295)
@@ -103,6 +103,7 @@
 			if (!project.isDirectory()) continue;
 			if (project.isHidden()) continue;
 			if (!project.getName().startsWith("org.txm")) continue;
+			if (project.getName().endsWith(".feature")) continue;
 
 //			File messagesPackageDir = new File(project, "src/"+project.getName().replaceAll("\\.", "/")+"/messages");
 //			if (!messagesPackageDir.exists()) {
@@ -114,12 +115,12 @@
 
 //			if (messagesJavaFile != null && messagesJavaFile.exists()) {
 
-				PluginMessagesManager messages = new PluginMessagesManager(project);
+				PluginMessagesManager messages = new PluginMessagesManager(project, debug);
 
 				pluginsMessagesPerProject.put(project, messages);
 
 				if (debug) {
-					System.out.println(project + "=" + messages.getLangs().size()+" langs.");
+					System.out.println(project + "=" + messages.getLangs().size() + " langs.");
 				}
 //			}
 		}
@@ -160,6 +161,8 @@
 				}
 			}
 		}
+		
+		System.out.println("WorkspaceMessagesManager.dumpUsedKeysFilesIndex(): number of used keys: " + this.usedKeysFilesIndex.size());
 	}
 
 	/**
@@ -261,11 +264,18 @@
 
 			TreeMap<String, TreeSet<File>> index = pmManager.getUsedKeysFilesIndex();
 
+			if(index == null) {
+				System.err.println("WorkspaceMessagesManager.createUsedKeysFilesIndex(): project " + pmManager.getProjectDirectory() + " have no used keys.");
+				continue;
+			}
+			
 			for (Map.Entry<String, TreeSet<File>> entry :index.entrySet()) {
 
 				//String fullKeyName = pmManager.getKeyFullName(entry.getKey());
 
-				if (debug) System.out.println("WorkspaceMessagesManager.createUsedKeysFilesIndex(): key added: " + entry.getKey());
+				if (debug) {
+					System.out.println("WorkspaceMessagesManager.createUsedKeysFilesIndex(): key added: " + entry.getKey() + ".");
+				}
 
 				if(this.usedKeysFilesIndex.containsKey(entry.getKey()))	{
 					this.usedKeysFilesIndex.get(entry.getKey()).addAll(entry.getValue());
