Index: applications/editors/josm/plugins/OSMRecPlugin/nbproject/private/private.xml
===================================================================
--- applications/editors/josm/plugins/OSMRecPlugin/nbproject/private/private.xml	(revision 31460)
+++ applications/editors/josm/plugins/OSMRecPlugin/nbproject/private/private.xml	(revision 31461)
@@ -4,17 +4,10 @@
     <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
         <group>
-            <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/extractor/FrequenceExtractor.java</file>
-            <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/build.xml</file>
             <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/extractor/LanguageDetector.java</file>
-            <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/parsers/Mapper.java</file>
-            <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/parsers/Ontology.java</file>
             <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/OSMRecPlugin.java</file>
             <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/OSMRecToggleDialog.java</file>
-            <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/MenuExportAction.java</file>
-            <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/resources/log4j.properties</file>
             <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/OSMRecPluginHelper.java</file>
-            <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/personalization/TrainByUser.java</file>
+            <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/extractor/Analyzer.java</file>
             <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/core/TrainWorker.java</file>
-            <file>file:/home/imis-nkarag/software/josm_svn/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/extractor/SampleModelsExtractor.java</file>
         </group>
     </open-files>
Index: applications/editors/josm/plugins/OSMRecPlugin/nbproject/project.xml
===================================================================
--- applications/editors/josm/plugins/OSMRecPlugin/nbproject/project.xml	(revision 31460)
+++ applications/editors/josm/plugins/OSMRecPlugin/nbproject/project.xml	(revision 31461)
@@ -81,5 +81,5 @@
             <compilation-unit>
                 <package-root>src</package-root>
-                <classpath mode="compile">../../core/dist/josm-custom.jar:lib/liblinear-java-1.95.jar:lib/jena-core-2.12.0.jar:lib/gt-api-9.3.jar:lib/gt-referencing-9.3.jar:lib/gt-opengis-9.3.jar:lib/gt-metadata-9.3.jar:lib/slf4j-api-1.7.6.jar:lib/xercesImpl-2.11.0.jar:lib/commons-lang3-3.3.2.jar:lib/commons-pool-1.5.4.jar:lib/gt-api-9.3.jar:lib/gt-metadata-9.3.jar:lib/gt-opengis-9.3.jar:lib/gt-referencing-9.3.jar:lib/jai_core-1.1.3.jar:lib/jena-core-2.12.0.jar:lib/jena-iri-1.1.0.jar:lib/jgridshift-1.0.jar:lib/jsonic-1.2.7.jar:lib/jsr-275-1.0-beta-2.jar:lib/langdetect-1.1-20120112.jar:lib/liblinear-1.95.jar:lib/liblinear-java-1.95.jar:lib/lucene-analyzers-3.6.0.jar:lib/lucene-core-3.6.0.jar:lib/slf4j-api-1.7.6.jar:lib/slf4j-log4j12-1.7.6.jar:lib/vecmath-1.3.2.jar:lib/xercesImpl-2.11.0.jar:lib/xml-apis-1.4.01.jar:lib/jts-1.13.jar:lib/log4j-1.2.17.jar</classpath>
+                <classpath mode="compile">../../core/dist/josm-custom.jar:lib/log4j-1.2.17.jar:lib/liblinear-java-1.95.jar:lib/jena-core-2.12.0.jar:lib/jts-1.13.jar:lib/gt-api-9.3.jar:lib/gt-referencing-9.3.jar:lib/gt-opengis-9.3.jar:lib/gt-metadata-9.3.jar:lib/slf4j-api-1.7.6.jar:lib/xercesImpl-2.11.0.jar:lib/commons-lang3-3.3.2.jar:lib/commons-pool-1.5.4.jar:lib/gt-api-9.3.jar:lib/gt-metadata-9.3.jar:lib/gt-opengis-9.3.jar:lib/gt-referencing-9.3.jar:lib/jai_core-1.1.3.jar:lib/jena-core-2.12.0.jar:lib/jena-iri-1.1.0.jar:lib/jgridshift-1.0.jar:lib/jsonic-1.2.7.jar:lib/jsr-275-1.0-beta-2.jar:lib/jts-1.13.jar:lib/langdetect-1.1-20120112.jar:lib/liblinear-1.95.jar:lib/liblinear-java-1.95.jar:lib/lucene-analyzers-3.6.0.jar:lib/lucene-core-3.6.0.jar:lib/slf4j-api-1.7.6.jar:lib/slf4j-log4j12-1.7.6.jar:lib/vecmath-1.3.2.jar:lib/xercesImpl-2.11.0.jar:lib/xml-apis-1.4.01.jar</classpath>
                 <built-to>../../dist</built-to>
                 <source-level>1.7</source-level>
Index: applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/core/TrainWorker.java
===================================================================
--- applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/core/TrainWorker.java	(revision 31460)
+++ applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/core/TrainWorker.java	(revision 31461)
@@ -153,6 +153,5 @@
         //System.out.println(anal.getFrequencies());
         //System.out.println(anal.getTopKMostFrequent(15));
-        //System.out.println(anal.getWithFrequency(100));
-        
+        //System.out.println(anal.getWithFrequency(100));        
 
         textualListFilePath = modelDirectory.getAbsolutePath()+"/textualList.txt";
@@ -165,6 +164,5 @@
         } catch (IOException ex) {
             Logger.getLogger(TrainWorker.class.getName()).log(Level.SEVERE, null, ex);
-        }   
-        
+        }          
         
         //writeTextualListToFile(textualFilePath, anal.getTopKMostFrequent(15));
@@ -752,5 +750,5 @@
             //System.out.println("file created");
             model.save(modelFile);
-            //System.out.println("saved"); 
+            System.out.println("best model saved at: " + modelFile); 
         } catch (IOException ex) {
             Logger.getLogger(TrainWorker.class.getName()).log(Level.SEVERE, null, ex);
@@ -881,5 +879,5 @@
             //System.out.println("file created");
             model.save(modelFile);
-            System.out.println("model saved at: " + modelFile); 
+            System.out.println("model with classes saved at: " + modelFile); 
         } catch (IOException ex) {
             Logger.getLogger(TrainWorker.class.getName()).log(Level.SEVERE, null, ex);
@@ -918,7 +916,5 @@
     
     
-    private static void writeTextualListToFile(String filePath, List<Map.Entry<String, Integer>> textualList) 
-    {
-        
+    private static void writeTextualListToFile(String filePath, List<Map.Entry<String, Integer>> textualList) {        
         try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath, true), "UTF-8"))) {            
             for(Map.Entry<String, Integer> entry : textualList){
Index: applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/extractor/Analyzer.java
===================================================================
--- applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/extractor/Analyzer.java	(revision 31460)
+++ applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/extractor/Analyzer.java	(revision 31461)
@@ -10,4 +10,5 @@
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -17,6 +18,13 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.apache.lucene.analysis.de.GermanAnalyzer;
 import org.apache.lucene.analysis.el.GreekAnalyzer;
 import org.apache.lucene.analysis.en.EnglishAnalyzer;
+import org.apache.lucene.analysis.es.SpanishAnalyzer;
+import org.apache.lucene.analysis.fr.FrenchAnalyzer;
+import org.apache.lucene.analysis.hi.HindiAnalyzer;
+import org.apache.lucene.analysis.ru.RussianAnalyzer;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.analysis.tr.TurkishAnalyzer;
 import org.apache.lucene.queryParser.ParseException;
 import org.apache.lucene.queryParser.QueryParser;
@@ -24,5 +32,5 @@
 
 /**
- * Analyzes textual information. Languager detection, stop words removal, stemming based on language.
+ * Analyzes textual information. Language detection, stop words removal, stemming based on language.
  * Provides methods for retrieving the textual list by frequency and top-K terms.
  * @author imis-nkarag
@@ -69,6 +77,15 @@
         }
 
-        int en=0;
-        int el=0;
+        Map<String, Integer> langs = new HashMap<>();
+        langs.put("en", 0);
+        langs.put("el", 0);
+        langs.put("de", 0);
+        langs.put("es", 0);
+        langs.put("ru", 0);
+        langs.put("hi", 0);
+        langs.put("zh", 0);
+        langs.put("tr", 0);
+        langs.put("fr", 0);
+
         for(String word : sampleList){
             //System.out.println("to be detected: " + word);
@@ -78,8 +95,38 @@
                 switch (lang) {
                     case "en":
-                        en++;
+                        //en++;
+                        langs.put("en", langs.get("en")+1);                       
                         break;
                     case "el":
-                        el++;
+                        //el++;
+                        langs.put("el", langs.get("el")+1);
+                        break;                        
+                    case "de":
+                        //de++;
+                        langs.put("de", langs.get("de")+1);
+                        break;
+                    case "es":
+                        //es++; 
+                        langs.put("es", langs.get("es")+1);
+                        break;
+                    case "ru":                       
+                        //ru++;
+                        langs.put("ru", langs.get("ru")+1);
+                        break; 
+                    case "fr":
+                        //fr++;
+                        langs.put("fr", langs.get("fr")+1);
+                        break;                         
+                    case "zh":
+                        //zh++;
+                        langs.put("zh", langs.get("zh")+1);
+                        break; 
+                    case "tr":
+                        //tr++;
+                        langs.put("tr", langs.get("tr")+1);
+                        break;                         
+                    case "hi":
+                        //hi++;
+                        langs.put("hi", langs.get("hi")+1);
                         break;
                         //other lang, no support yet
@@ -90,15 +137,48 @@
             }
         }
-        if(el>en){
-            //language = "el"; 
-            normalizedList = stemGreek(normalizedList);
-        }
-        else{
-            //language = "en";
-            normalizedList = stemEnglish(normalizedList);
-        }
         
-        //List<Entry<String, Integer>> list = new ArrayList<>(set);
-        Collections.sort( normalizedList, new Comparator<Map.Entry<String, Integer>>()
+        int maxLangFreq = langs.get("en");
+        String dominantLanguage = "en";
+        for(Entry<String,Integer> lang : langs.entrySet()){
+            if(lang.getValue()> maxLangFreq){
+                maxLangFreq = lang.getValue();
+                dominantLanguage = lang.getKey();
+            }          
+        }
+        
+        switch (dominantLanguage) {
+            case "en":
+                normalizedList = stemEnglish(normalizedList);
+                break;
+            case "el":
+                normalizedList = stemGreek(normalizedList);
+                break;
+            case "de":
+                normalizedList = stemGerman(normalizedList);
+                break;
+            case "es":
+                normalizedList = stemSpanish(normalizedList);
+                break;
+            case "ru":
+                normalizedList = stemRussian(normalizedList);
+                break;
+            case "fr":
+                normalizedList = stemFrench(normalizedList);
+                break;
+            case "zh":
+                normalizedList = stemChinese(normalizedList);
+                break;
+            case "tr":
+                normalizedList = stemTurkish(normalizedList);
+                break;
+            case "hi":
+                normalizedList = stemHindi(normalizedList);
+                break;
+            default:
+                normalizedList = stemEnglish(normalizedList);
+                break;
+        }
+
+        Collections.sort(normalizedList, new Comparator<Map.Entry<String, Integer>>()
         {
             @Override
@@ -107,10 +187,9 @@
                 return (o2.getValue()).compareTo( o1.getValue() );
             }
-        } );
-        
+        } );        
         setFrequencies(normalizedList);
     }
     
-    private ArrayList<Map.Entry<String, Integer>> stemGreek(ArrayList<Map.Entry<String, Integer>> normalizedList) {
+    private static ArrayList<Map.Entry<String, Integer>> stemGreek(List<Map.Entry<String, Integer>> normalizedList) {
         org.apache.lucene.analysis.Analyzer greekAnalyzer = new GreekAnalyzer(Version.LUCENE_36);
         QueryParser greekParser = new QueryParser(Version.LUCENE_36, "", greekAnalyzer);
@@ -122,19 +201,20 @@
                     String stemmedWord = greekParser.parse(entry.getKey()).toString();
                     SimpleEntry<String, Integer> stemmed = new SimpleEntry<>(stemmedWord, entry.getValue());
-                    stemmedList.add(stemmed);
-                    
-                } catch (ParseException ex) {
-                    Logger.getLogger(Analyzer.class.getName()).log(Level.SEVERE, null, ex);
-                }
-            }
-        }  
-        return stemmedList;
-    }
-    
-    private ArrayList<Map.Entry<String, Integer>> stemEnglish(ArrayList<Map.Entry<String, Integer>> normalizedList){
+                    if(!stemmedWord.equals("")){
+                        stemmedList.add(stemmed);
+                    }                    
+                } catch (ParseException ex) {
+                    Logger.getLogger(Analyzer.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        }  
+        return stemmedList;
+    }
+    
+    private static ArrayList<Map.Entry<String, Integer>> stemEnglish(List<Map.Entry<String, Integer>> normalizedList){
         org.apache.lucene.analysis.Analyzer englishAnalyzer = new EnglishAnalyzer(Version.LUCENE_36);
         QueryParser englishParser = new QueryParser(Version.LUCENE_36, "", englishAnalyzer);
         ArrayList<Map.Entry<String, Integer>> stemmedList = new ArrayList<>();
-        for(Map.Entry<String, Integer> entry : normalizedList){
+        for(Map.Entry<String, Integer> entry : normalizedList){            
             if(!entry.getKey().isEmpty()){
                 try {
@@ -142,12 +222,163 @@
                     String stemmedWord = englishParser.parse(entry.getKey()).toString();
                     SimpleEntry<String, Integer> stemmed = new SimpleEntry<>(stemmedWord, entry.getValue());
-                    stemmedList.add(stemmed);
-                } catch (ParseException ex) {
-                    Logger.getLogger(Analyzer.class.getName()).log(Level.SEVERE, null, ex);
-                }
-            }
-        }  
-        return stemmedList;
-    }
+                    if(!stemmedWord.equals("")){
+                        stemmedList.add(stemmed);
+                    }                   
+                } catch (ParseException ex) {
+                    Logger.getLogger(Analyzer.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        }  
+        return stemmedList;
+    }
+    
+    private static ArrayList<Map.Entry<String, Integer>> stemGerman(List<Map.Entry<String, Integer>> normalizedList){
+        org.apache.lucene.analysis.Analyzer germanAnalyzer = new GermanAnalyzer(Version.LUCENE_36);
+        QueryParser germanParser = new QueryParser(Version.LUCENE_36, "", germanAnalyzer);
+        ArrayList<Map.Entry<String, Integer>> stemmedList = new ArrayList<>();
+        for(Map.Entry<String, Integer> entry : normalizedList){
+            if(!entry.getKey().isEmpty()){
+                try {
+                    //System.out.println("result: " + englishParser.parse(entry.getKey())); 
+                    String stemmedWord = germanParser.parse(entry.getKey()).toString();
+                    SimpleEntry<String, Integer> stemmed = new SimpleEntry<>(stemmedWord, entry.getValue());
+                    if(!stemmedWord.equals("")){
+                        stemmedList.add(stemmed);
+                    }                    
+                } catch (ParseException ex) {
+                    Logger.getLogger(Analyzer.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        }  
+        return stemmedList;
+    }    
+    
+    private static ArrayList<Map.Entry<String, Integer>> stemSpanish(List<Map.Entry<String, Integer>> normalizedList){
+        org.apache.lucene.analysis.Analyzer spanishAnalyzer = new SpanishAnalyzer(Version.LUCENE_36);
+        QueryParser spanishParser = new QueryParser(Version.LUCENE_36, "", spanishAnalyzer);
+        ArrayList<Map.Entry<String, Integer>> stemmedList = new ArrayList<>();
+        for(Map.Entry<String, Integer> entry : normalizedList){
+            if(!entry.getKey().isEmpty()){
+                try {
+                    //System.out.println("result: " + englishParser.parse(entry.getKey())); 
+                    String stemmedWord = spanishParser.parse(entry.getKey()).toString();
+                    SimpleEntry<String, Integer> stemmed = new SimpleEntry<>(stemmedWord, entry.getValue());
+                    if(!stemmedWord.equals("")){
+                        stemmedList.add(stemmed);
+                    }                    
+                } catch (ParseException ex) {
+                    Logger.getLogger(Analyzer.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        }  
+        return stemmedList;
+    }     
+    
+    private static ArrayList<Map.Entry<String, Integer>> stemRussian(List<Map.Entry<String, Integer>> normalizedList){
+        org.apache.lucene.analysis.Analyzer russianAnalyzer = new RussianAnalyzer(Version.LUCENE_36);
+        QueryParser russianParser = new QueryParser(Version.LUCENE_36, "", russianAnalyzer);
+        ArrayList<Map.Entry<String, Integer>> stemmedList = new ArrayList<>();
+        for(Map.Entry<String, Integer> entry : normalizedList){
+            if(!entry.getKey().isEmpty()){
+                try {
+                    //System.out.println("result: " + englishParser.parse(entry.getKey())); 
+                    String stemmedWord = russianParser.parse(entry.getKey()).toString();
+                    SimpleEntry<String, Integer> stemmed = new SimpleEntry<>(stemmedWord, entry.getValue());
+                    if(!stemmedWord.equals("")){
+                        stemmedList.add(stemmed);
+                    }                    
+                } catch (ParseException ex) {
+                    Logger.getLogger(Analyzer.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        }  
+        return stemmedList;
+    }
+
+    private static ArrayList<Map.Entry<String, Integer>> stemFrench(List<Map.Entry<String, Integer>> normalizedList){
+        org.apache.lucene.analysis.Analyzer frenchAnalyzer = new FrenchAnalyzer(Version.LUCENE_36);
+        QueryParser frenchParser = new QueryParser(Version.LUCENE_36, "", frenchAnalyzer);
+        ArrayList<Map.Entry<String, Integer>> stemmedList = new ArrayList<>();
+        for(Map.Entry<String, Integer> entry : normalizedList){
+            if(!entry.getKey().isEmpty()){
+                try {
+                    //System.out.println("result: " + englishParser.parse(entry.getKey())); 
+                    String stemmedWord = frenchParser.parse(entry.getKey()).toString();
+                    SimpleEntry<String, Integer> stemmed = new SimpleEntry<>(stemmedWord, entry.getValue());
+                    if(!stemmedWord.equals("")){
+                        stemmedList.add(stemmed);
+                    }                    
+                } catch (ParseException ex) {
+                    Logger.getLogger(Analyzer.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        }  
+        return stemmedList;
+    }  
+    
+    private static ArrayList<Map.Entry<String, Integer>> stemChinese(List<Map.Entry<String, Integer>> normalizedList){
+        org.apache.lucene.analysis.Analyzer chineseAnalyzer = new StandardAnalyzer(Version.LUCENE_36); 
+        QueryParser chineseParser = new QueryParser(Version.LUCENE_36, "", chineseAnalyzer);
+        ArrayList<Map.Entry<String, Integer>> stemmedList = new ArrayList<>();
+        for(Map.Entry<String, Integer> entry : normalizedList){
+            if(!entry.getKey().isEmpty()){
+                try {
+                    //System.out.println("result: " + englishParser.parse(entry.getKey())); 
+                    String stemmedWord = chineseParser.parse(entry.getKey()).toString();
+                    SimpleEntry<String, Integer> stemmed = new SimpleEntry<>(stemmedWord, entry.getValue());
+                    if(!stemmedWord.equals("")){
+                        stemmedList.add(stemmed);
+                    }                    
+                } catch (ParseException ex) {
+                    Logger.getLogger(Analyzer.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        }  
+        return stemmedList;
+    } 
+    
+    private static ArrayList<Map.Entry<String, Integer>> stemTurkish(List<Map.Entry<String, Integer>> normalizedList){
+        org.apache.lucene.analysis.Analyzer turkishAnalyzer = new TurkishAnalyzer(Version.LUCENE_36); 
+        QueryParser turkishParser = new QueryParser(Version.LUCENE_36, "", turkishAnalyzer);
+        ArrayList<Map.Entry<String, Integer>> stemmedList = new ArrayList<>();
+        for(Map.Entry<String, Integer> entry : normalizedList){
+            if(!entry.getKey().isEmpty()){
+                try {
+                    //System.out.println("result: " + englishParser.parse(entry.getKey())); 
+                    String stemmedWord = turkishParser.parse(entry.getKey()).toString();
+                    SimpleEntry<String, Integer> stemmed = new SimpleEntry<>(stemmedWord, entry.getValue());
+                    if(!stemmedWord.equals("")){
+                        stemmedList.add(stemmed);
+                    }                    
+                } catch (ParseException ex) {
+                    Logger.getLogger(Analyzer.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        }  
+        return stemmedList;
+    } 
+
+    private static ArrayList<Map.Entry<String, Integer>> stemHindi(List<Map.Entry<String, Integer>> normalizedList){
+        org.apache.lucene.analysis.Analyzer hindiAnalyzer = new HindiAnalyzer(Version.LUCENE_36); 
+        QueryParser hindiParser = new QueryParser(Version.LUCENE_36, "", hindiAnalyzer);
+        ArrayList<Map.Entry<String, Integer>> stemmedList = new ArrayList<>();
+        for(Map.Entry<String, Integer> entry : normalizedList){
+            if(!entry.getKey().isEmpty()){
+                try {
+                    //System.out.println("result: " + englishParser.parse(entry.getKey())); 
+                    String stemmedWord = hindiParser.parse(entry.getKey()).toString();
+                    SimpleEntry<String, Integer> stemmed = new SimpleEntry<>(stemmedWord, entry.getValue());
+                    if(!stemmedWord.equals("")){
+                        stemmedList.add(stemmed);
+                    }                    
+                } catch (ParseException ex) {
+                    Logger.getLogger(Analyzer.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        }  
+        return stemmedList;
+    } 
+    
+    
     
     private void loadStopWords(){
@@ -171,14 +402,20 @@
     
     private void setFrequencies(ArrayList<Map.Entry<String, Integer>> frequencies){
-        this.frequencies = frequencies;
+        this.frequencies = frequencies;       
+    }
+    
+    public List<Map.Entry<String, Integer>> getFrequencies(){       
+        return Collections.unmodifiableList(frequencies);
+    }
+    
+    public List<Map.Entry<String, Integer>> getTopKMostFrequent(int topK){
+        //todo recheck
+        if(topK > frequencies.size()){
+            return Collections.unmodifiableList(frequencies);
+        }
+        else{
+            return frequencies.subList(0, topK);
+        }
         
-    }
-    
-    public List<Map.Entry<String, Integer>> getFrequencies(){       
-        return frequencies;
-    }
-    
-    public List<Map.Entry<String, Integer>> getTopKMostFrequent(int topK){
-        return frequencies.subList(0, topK);
     }
     
Index: applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/extractor/LanguageDetector.java
===================================================================
--- applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/extractor/LanguageDetector.java	(revision 31460)
+++ applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/extractor/LanguageDetector.java	(revision 31461)
@@ -14,117 +14,186 @@
 /**
  * Detects language of osm textual information
- * 
+ *
  * @author imis-nkarag
  */
+public class LanguageDetector {
 
-public class LanguageDetector {
-    
     private static LanguageDetector languageDetector = null;
-    
-    private LanguageDetector(){
+
+    private LanguageDetector() {
         //prevent instatiation
     }
-    
-    public static LanguageDetector getInstance(String languageProfilesPath){
-        System.out.println("language profile path: \n" + languageProfilesPath + "/el");
-        if(languageDetector == null){
-            languageDetector = new LanguageDetector();  
+
+    public static LanguageDetector getInstance(String languageProfilesPath) {
+        //System.out.println("language profile path: \n" + languageProfilesPath + "/el");
+        if (languageDetector == null) {
+            languageDetector = new LanguageDetector();
             loadProfilesFromStream(languageProfilesPath);
             //profilesLoaded = true;
         }
-        return languageDetector;        
-    }  
-    
-    public static void loadProfilesFromStream(String languageProfilesPath){ //create profiles directory in system from stream and load them
+        return languageDetector;
+    }
 
-        InputStream languageProfilesInputStream1 = LanguageDetector.class.getResourceAsStream("/resources/profiles/el");
-        InputStream languageProfilesInputStream2 = LanguageDetector.class.getResourceAsStream("/resources/profiles/en");
-        //languageProfilesInputStream.
+    public static void loadProfilesFromStream(String languageProfilesPath) { //create profiles directory in system from stream and load them
 
-        if(!new File(languageProfilesPath).exists()){
+        /*  supported languages 
+            el:greek, en:english, de:german, fr:french, es:spanish, ru:russian, tr:turkish, zh-cn:chinese, hi:hindi 
+        */
+        InputStream languageProfilesInputStreamEl = LanguageDetector.class.getResourceAsStream("/profiles/el");
+        InputStream languageProfilesInputStreamEn = LanguageDetector.class.getResourceAsStream("/profiles/en");
+        InputStream languageProfilesInputStreamDe = LanguageDetector.class.getResourceAsStream("/profiles/de");
+        InputStream languageProfilesInputStreamFr = LanguageDetector.class.getResourceAsStream("/profiles/fr");
+        InputStream languageProfilesInputStreamEs = LanguageDetector.class.getResourceAsStream("/profiles/es");
+        InputStream languageProfilesInputStreamRu = LanguageDetector.class.getResourceAsStream("/profiles/ru");
+        InputStream languageProfilesInputStreamTr = LanguageDetector.class.getResourceAsStream("/profiles/tr");
+        InputStream languageProfilesInputStreamZh = LanguageDetector.class.getResourceAsStream("/profiles/zh-cn");
+        InputStream languageProfilesInputStreamHi = LanguageDetector.class.getResourceAsStream("/profiles/hi");       
+        //InputStream languageProfilesInputStream2 = LanguageDetector.class.getResourceAsStream("/resources/profiles/en");
+
+        if (!new File(languageProfilesPath).exists()) {
             //new File(languageProfilesPath).mkdir();
             new File(languageProfilesPath).mkdirs();
         }
-        File languageProfilesOutputFile1 = new File(languageProfilesPath + "/el");        
-        File languageProfilesOutputFile2 = new File(languageProfilesPath +"/en");
         
-        try {
-            System.out.println("languageProfilesOutputFile1.exists: " + languageProfilesOutputFile1.exists());
-            System.out.println("languageProfilesOutputFile1.getAbsolutePath(): " + languageProfilesOutputFile1.getAbsolutePath());
-            System.out.println("languageProfilesOutputFile1.canRead(): " + languageProfilesOutputFile1.canRead());
-            System.out.println("languageProfilesOutputFile1.canWrite(): " + languageProfilesOutputFile1.canWrite());
-            //System.out.println("languageProfilesOutputFile1.canRead(): " + languageProfilesOutputFile1.);
-            
-            languageProfilesOutputFile1.createNewFile();
-            languageProfilesOutputFile2.createNewFile();
-        } catch (IOException ex) {
-            Logger.getLogger(LanguageDetector.class.getName()).log(Level.SEVERE, null, ex);
-        }
-        
-        //languageProfilesOutputFile.mkdirs();
-
-        FileOutputStream outputStream = null;
-        //FileOutputStream outputStream2 = null;
-        try {
-            outputStream = new FileOutputStream(languageProfilesOutputFile1);
-            //outputStream2 = new FileOutputStream(languageProfilesOutputFile2);
-        } catch (FileNotFoundException ex) {
-            Logger.getLogger(LanguageDetector.class.getName()).log(Level.SEVERE, null, ex);
-        }
-        //System.out.println("deb1");
-
-        FileOutputStream outputStream2 = null;
-        //FileOutputStream outputStream2 = null;
-        try {
-            outputStream2 = new FileOutputStream(languageProfilesOutputFile2);
-            //outputStream2 = new FileOutputStream(languageProfilesOutputFile2);
-        } catch (FileNotFoundException ex) {
-            Logger.getLogger(LanguageDetector.class.getName()).log(Level.SEVERE, null, ex);
-        }        
-
-
-        int read = 0;
-        byte[] bytes = new byte[1024];
+        File languageProfilesOutputFileEl = new File(languageProfilesPath + "/el");
+        File languageProfilesOutputFileEn = new File(languageProfilesPath + "/en");
+        File languageProfilesOutputFileDe = new File(languageProfilesPath + "/de");
+        File languageProfilesOutputFileFr = new File(languageProfilesPath + "/fr");
+        File languageProfilesOutputFileEs = new File(languageProfilesPath + "/es");
+        File languageProfilesOutputFileRu = new File(languageProfilesPath + "/ru");
+        File languageProfilesOutputFileTr = new File(languageProfilesPath + "/tr");
+        File languageProfilesOutputFileZh = new File(languageProfilesPath + "/zh-cn");
+        File languageProfilesOutputFileHi = new File(languageProfilesPath + "/hi");
 
         try {
-            while ((read = languageProfilesInputStream1.read(bytes)) != -1) {
-                outputStream.write(bytes, 0, read);
-            }        
+
+            languageProfilesOutputFileEl.createNewFile();
+            languageProfilesOutputFileEn.createNewFile();
+            languageProfilesOutputFileDe.createNewFile();
+            languageProfilesOutputFileFr.createNewFile();
+            languageProfilesOutputFileEs.createNewFile();
+            languageProfilesOutputFileRu.createNewFile();
+            languageProfilesOutputFileTr.createNewFile();
+            languageProfilesOutputFileZh.createNewFile();
+            languageProfilesOutputFileHi.createNewFile();
+            
         } catch (IOException ex) {
             Logger.getLogger(LanguageDetector.class.getName()).log(Level.SEVERE, null, ex);
         }
 
+        FileOutputStream outputStreamEl = null;
+        FileOutputStream outputStreamEn = null;
+        FileOutputStream outputStreamDe = null;
+        FileOutputStream outputStreamFr = null;
+        FileOutputStream outputStreamEs = null;
+        FileOutputStream outputStreamRu = null;
+        FileOutputStream outputStreamTr = null;
+        FileOutputStream outputStreamZh = null;
+        FileOutputStream outputStreamHi = null;
+        
+        try {
+            
+            outputStreamEl = new FileOutputStream(languageProfilesOutputFileEl);
+            outputStreamEn = new FileOutputStream(languageProfilesOutputFileEn);
+            outputStreamDe = new FileOutputStream(languageProfilesOutputFileDe);
+            outputStreamFr = new FileOutputStream(languageProfilesOutputFileFr);
+            outputStreamEs = new FileOutputStream(languageProfilesOutputFileEs);
+            outputStreamRu = new FileOutputStream(languageProfilesOutputFileRu);
+            outputStreamTr = new FileOutputStream(languageProfilesOutputFileTr);
+            outputStreamZh = new FileOutputStream(languageProfilesOutputFileZh);
+            outputStreamHi = new FileOutputStream(languageProfilesOutputFileHi);
+            
+        } catch (FileNotFoundException ex) {
+            Logger.getLogger(LanguageDetector.class.getName()).log(Level.SEVERE, null, ex);
+        }
 
-        int read2 = 0;
-        byte[] bytes2 = new byte[1024];
+        int read = 0;
+        byte[] bytes = new byte[1024];
+        try {
+
+            while ((read = languageProfilesInputStreamEl.read(bytes)) != -1) {
+                outputStreamEl.write(bytes, 0, read);
+            }
+
+            read = 0;
+            bytes = new byte[1024];
+
+            while ((read = languageProfilesInputStreamEn.read(bytes)) != -1) {
+                outputStreamEn.write(bytes, 0, read);
+            }
+
+            read = 0;
+            bytes = new byte[1024];
+
+            while ((read = languageProfilesInputStreamDe.read(bytes)) != -1) {
+                outputStreamDe.write(bytes, 0, read);
+            }
+
+            read = 0;
+            bytes = new byte[1024];
+
+            while ((read = languageProfilesInputStreamFr.read(bytes)) != -1) {
+                outputStreamFr.write(bytes, 0, read);
+            }
+            
+            read = 0;
+            bytes = new byte[1024];
+
+            while ((read = languageProfilesInputStreamEs.read(bytes)) != -1) {
+                outputStreamEs.write(bytes, 0, read);
+            }  
+            
+            read = 0;
+            bytes = new byte[1024];
+
+            while ((read = languageProfilesInputStreamRu.read(bytes)) != -1) {
+                outputStreamRu.write(bytes, 0, read);
+            } 
+
+            read = 0;
+            bytes = new byte[1024];
+
+            while ((read = languageProfilesInputStreamTr.read(bytes)) != -1) {
+                outputStreamTr.write(bytes, 0, read);
+            } 
+            
+            read = 0;
+            bytes = new byte[1024];
+
+            while ((read = languageProfilesInputStreamZh.read(bytes)) != -1) {
+                outputStreamZh.write(bytes, 0, read);
+            }
+            
+            read = 0;
+            bytes = new byte[1024];
+
+            while ((read = languageProfilesInputStreamHi.read(bytes)) != -1) {
+                outputStreamHi.write(bytes, 0, read);
+            } 
+            
+        } catch (IOException ex) {
+            Logger.getLogger(LanguageDetector.class.getName()).log(Level.SEVERE, null, ex);
+        }
 
         try {
-            while ((read2 = languageProfilesInputStream2.read(bytes2)) != -1) {
-                outputStream2.write(bytes2, 0, read2);
-            }        
-        } catch (IOException ex) {
-            Logger.getLogger(LanguageDetector.class.getName()).log(Level.SEVERE, null, ex);
-        }        
-        try {
-
 
             DetectorFactory.loadProfile(languageProfilesPath);
-            //profilesLoaded = true;
 
         } catch (LangDetectException ex) {
-            //profilesLoaded = false;
             Logger.getLogger(LanguageDetector.class.getName()).log(Level.SEVERE, null, ex);
-        }  
+        }
     }
-    
+
     public String detect(String text) {
         try {
             Detector detector = DetectorFactory.create();
             detector.append(text);
-            return detector.detect();
-        } catch (LangDetectException ex) {            
+            String lang = detector.detect();
+            //System.out.println("language detected: " + lang);
+            return lang;
+        } catch (LangDetectException ex) {
             Logger.getLogger(LanguageDetector.class.getName()).log(Level.SEVERE, null, ex);
-            return "en"; //default lang to return
-        }       
-    }   
+            return "en"; //default lang to return if anything goes wrong at detection
+        }
+    }
 }
Index: applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/OSMRecPluginHelper.java
===================================================================
--- applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/OSMRecPluginHelper.java	(revision 31460)
+++ applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/OSMRecPluginHelper.java	(revision 31461)
@@ -27,5 +27,4 @@
 import java.awt.datatransfer.Transferable;
 import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
@@ -43,5 +42,4 @@
 import java.io.InputStream;
 import java.text.DecimalFormat;
-import java.text.Normalizer;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -106,6 +104,4 @@
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
-import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -168,6 +164,5 @@
     private boolean useCustomSVMModel = false;
     private String customSVMModelPath;
-    
-    
+       
     // Selection that we are editing by using both dialogs
     Collection<OsmPrimitive> sel;
@@ -250,15 +245,17 @@
         changedKey = null;
         sel = Main.main.getInProgressSelection();
-        if (sel == null || sel.isEmpty()) return;
-
-        String key = tagData.getValueAt(row, 0).toString();
-        objKey=key;
+        //if (sel == null || sel.isEmpty()) return;
+//        String key = tagData.getValueAt(row, 0).toString();
+        String key = "";
+//        objKey=key;
 
         @SuppressWarnings("unchecked")
+        Map<String, Integer> dumPar = new HashMap<>();
+        dumPar.put(" ", -1);
         final TrainingDialog editDialog = new TrainingDialog(key, row,
-                (Map<String, Integer>) tagData.getValueAt(row, 1), focusOnKey);
+                dumPar, focusOnKey);                
         editDialog.showDialog();
-        if (editDialog.getValue() !=1 ) return;
-        editDialog.performTagEdit();
+        //if (editDialog.getValue() !=1 ) return;
+        //editDialog.performTagEdit();
     }
 
@@ -341,21 +338,21 @@
 
     public final class TrainingDialog extends AbstractTagsDialog {
-        final String key;
-        final Map<String, Integer> m;
-        final int row;
-
-        Comparator<AutoCompletionListItem> usedValuesAwareComparator = new Comparator<AutoCompletionListItem>() {
-                @Override
-                public int compare(AutoCompletionListItem o1, AutoCompletionListItem o2) {
-                    boolean c1 = m.containsKey(o1.getValue());
-                    boolean c2 = m.containsKey(o2.getValue());
-                    if (c1 == c2)
-                        return String.CASE_INSENSITIVE_ORDER.compare(o1.getValue(), o2.getValue());
-                    else if (c1)
-                        return -1;
-                    else
-                        return +1;
-                }
-            };
+//        final String key;
+//        final Map<String, Integer> m;
+//        final int row;
+
+//        Comparator<AutoCompletionListItem> usedValuesAwareComparator = new Comparator<AutoCompletionListItem>() {
+//                @Override
+//                public int compare(AutoCompletionListItem o1, AutoCompletionListItem o2) {
+//                    boolean c1 = m.containsKey(o1.getValue());
+//                    boolean c2 = m.containsKey(o2.getValue());
+//                    if (c1 == c2)
+//                        return String.CASE_INSENSITIVE_ORDER.compare(o1.getValue(), o2.getValue());
+//                    else if (c1)
+//                        return -1;
+//                    else
+//                        return +1;
+//                }
+//            };
 
         ListCellRenderer<AutoCompletionListItem> cellRenderer = new ListCellRenderer<AutoCompletionListItem>() {
@@ -417,6 +414,4 @@
         private UserDataExtractAndTrainWorker userDataExtractAndTrainWorker;
         
-        //public TrainWorker trainWorker;
-        
         private TrainingDialog(String key, int row, Map<String, Integer> map, final boolean initialFocusOnKey) {
             //super(Main.parent, tr("Training process configuration"), new String[] {tr("Start Training"),tr("Cancel")});
@@ -427,7 +422,7 @@
             setCancelButton(2);
             //configureContextsensitiveHelp("/Dialog/EditValue", true /* show help button */);
-            this.key = key;
-            this.row = row;
-            this.m = map;
+//            this.key = key;
+//            this.row = row;
+//            this.m = map;
             
             JPanel mainPanel = new JPanel(new BorderLayout(10,10));   //6,6
@@ -697,9 +692,5 @@
             southPanel.add(resetConfigButton);
             southPanel.add(trainFromUserCheckBox);
-            
-            //Border checkBorder = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED, Color.GRAY, Color.WHITE);           
-            //trainFromUserCheckBox.setBorder(checkBorder); 
-            //trainFromUserCheckBox.setBorderPainted(true);
-            
+
             userGroup.add(byAreaRadioButton);
             userGroup.add(byTimeRadioButton);
@@ -763,25 +754,25 @@
             Collections.sort(keyList, defaultACItemComparator);
 
-            keys = new AutoCompletingComboBox(key);
-            keys.setPossibleACItems(keyList);
-            keys.setEditable(true);
-            keys.setSelectedItem(key);
-
-            List<AutoCompletionListItem> valueList = autocomplete.getValues(getAutocompletionKeys(key));
-            Collections.sort(valueList, usedValuesAwareComparator);
-            final String selection= m.size()!=1?tr("<different>"):m.entrySet().iterator().next().getKey();
-            values = new AutoCompletingComboBox(selection);
-            values.setRenderer(cellRenderer);
-            values.setEditable(true);
-            values.setPossibleACItems(valueList);
-            values.setSelectedItem(selection);
-            values.getEditor().setItem(selection);
-            values.getEditor().addActionListener(new ActionListener() {
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    buttonAction(0, null); // emulate OK button click
-                }
-            });
-            addFocusAdapter(autocomplete, usedValuesAwareComparator);
+//            keys = new AutoCompletingComboBox(key);
+//            keys.setPossibleACItems(keyList);
+//            keys.setEditable(true);
+//            keys.setSelectedItem(key);
+
+//            List<AutoCompletionListItem> valueList = autocomplete.getValues(getAutocompletionKeys(key));
+//            Collections.sort(valueList, usedValuesAwareComparator);
+//            final String selection= m.size()!=1?tr("<different>"):m.entrySet().iterator().next().getKey();
+//            values = new AutoCompletingComboBox(selection);
+//            values.setRenderer(cellRenderer);
+//            values.setEditable(true);
+//            values.setPossibleACItems(valueList);
+//            values.setSelectedItem(selection);
+//            values.getEditor().setItem(selection);
+//            values.getEditor().addActionListener(new ActionListener() {
+//                @Override
+//                public void actionPerformed(ActionEvent e) {
+//                    buttonAction(0, null); // emulate OK button click
+//                }
+//            });
+//            addFocusAdapter(autocomplete, usedValuesAwareComparator);
 
             setContent(mainPanel, false);
@@ -1020,66 +1011,66 @@
         }
         
-         /**
-         * Edit tags of multiple selected objects according to selected ComboBox values
-         * If value == "", tag will be deleted
-         * Confirmations may be needed.
-         */
-        private void performTagEdit() {
-            String value = Tag.removeWhiteSpaces(values.getEditor().getItem().toString());
-            value = Normalizer.normalize(value, java.text.Normalizer.Form.NFC);
-            if (value.isEmpty()) {
-                value = null; // delete the key
-            }
-            String newkey = Tag.removeWhiteSpaces(keys.getEditor().getItem().toString());
-            newkey = Normalizer.normalize(newkey, java.text.Normalizer.Form.NFC);
-            if (newkey.isEmpty()) {
-                newkey = key;
-                value = null; // delete the key instead
-            }
-            if (key.equals(newkey) && tr("<different>").equals(value))
-                return;
-            if (key.equals(newkey) || value == null) {
-                Main.main.undoRedo.add(new ChangePropertyCommand(sel, newkey, value));
-                AutoCompletionManager.rememberUserInput(newkey, value, true);
-            } else {
-                for (OsmPrimitive osm: sel) {
-                    if (osm.get(newkey) != null) {
-                        if (!warnOverwriteKey(tr("You changed the key from ''{0}'' to ''{1}''.", key, newkey),
-                                "overwriteEditKey"))
-                            return;
-                        break;
-                    }
-                }
-                Collection<Command> commands = new ArrayList<>();
-                commands.add(new ChangePropertyCommand(sel, key, null));
-                if (value.equals(tr("<different>"))) {
-                    Map<String, List<OsmPrimitive>> map = new HashMap<>();
-                    for (OsmPrimitive osm: sel) {
-                        String val = osm.get(key);
-                        if (val != null) {
-                            if (map.containsKey(val)) {
-                                map.get(val).add(osm);
-                            } else {
-                                List<OsmPrimitive> v = new ArrayList<>();
-                                v.add(osm);
-                                map.put(val, v);
-                            }
-                        }
-                    }
-                    for (Map.Entry<String, List<OsmPrimitive>> e: map.entrySet()) {
-                        commands.add(new ChangePropertyCommand(e.getValue(), newkey, e.getKey()));
-                    }
-                } else {
-                    commands.add(new ChangePropertyCommand(sel, newkey, value));
-                    AutoCompletionManager.rememberUserInput(newkey, value, false);
-                }
-                Main.main.undoRedo.add(new SequenceCommand(
-                        trn("Change properties of up to {0} object",
-                                "Change properties of up to {0} objects", sel.size(), sel.size()),
-                                commands));
-            }
-
-            changedKey = newkey;
-        }
+//         /**
+//         * Edit tags of multiple selected objects according to selected ComboBox values
+//         * If value == "", tag will be deleted
+//         * Confirmations may be needed.
+//         */
+//        private void performTagEdit() {
+//            String value = Tag.removeWhiteSpaces(values.getEditor().getItem().toString());
+//            value = Normalizer.normalize(value, java.text.Normalizer.Form.NFC);
+//            if (value.isEmpty()) {
+//                value = null; // delete the key
+//            }
+//            String newkey = Tag.removeWhiteSpaces(keys.getEditor().getItem().toString());
+//            newkey = Normalizer.normalize(newkey, java.text.Normalizer.Form.NFC);
+//            if (newkey.isEmpty()) {
+//                newkey = key;
+//                value = null; // delete the key instead
+//            }
+//            if (key.equals(newkey) && tr("<different>").equals(value))
+//                return;
+//            if (key.equals(newkey) || value == null) {
+//                Main.main.undoRedo.add(new ChangePropertyCommand(sel, newkey, value));
+//                AutoCompletionManager.rememberUserInput(newkey, value, true);
+//            } else {
+//                for (OsmPrimitive osm: sel) {
+//                    if (osm.get(newkey) != null) {
+//                        if (!warnOverwriteKey(tr("You changed the key from ''{0}'' to ''{1}''.", key, newkey),
+//                                "overwriteEditKey"))
+//                            return;
+//                        break;
+//                    }
+//                }
+//                Collection<Command> commands = new ArrayList<>();
+//                commands.add(new ChangePropertyCommand(sel, key, null));
+//                if (value.equals(tr("<different>"))) {
+//                    Map<String, List<OsmPrimitive>> map = new HashMap<>();
+//                    for (OsmPrimitive osm: sel) {
+//                        String val = osm.get(key);
+//                        if (val != null) {
+//                            if (map.containsKey(val)) {
+//                                map.get(val).add(osm);
+//                            } else {
+//                                List<OsmPrimitive> v = new ArrayList<>();
+//                                v.add(osm);
+//                                map.put(val, v);
+//                            }
+//                        }
+//                    }
+//                    for (Map.Entry<String, List<OsmPrimitive>> e: map.entrySet()) {
+//                        commands.add(new ChangePropertyCommand(e.getValue(), newkey, e.getKey()));
+//                    }
+//                } else {
+//                    commands.add(new ChangePropertyCommand(sel, newkey, value));
+//                    AutoCompletionManager.rememberUserInput(newkey, value, false);
+//                }
+//                Main.main.undoRedo.add(new SequenceCommand(
+//                        trn("Change properties of up to {0} object",
+//                                "Change properties of up to {0} objects", sel.size(), sel.size()),
+//                                commands));
+//            }
+//
+//            changedKey = newkey;
+//        }
     }
 
@@ -1130,5 +1121,7 @@
                     rememberWindowGeometry(geometry);
                 }
-                keys.setFixedLocale(PROPERTY_FIX_TAG_LOCALE.get());
+                if(keys != null){
+                   keys.setFixedLocale(PROPERTY_FIX_TAG_LOCALE.get()); 
+                }               
             }
             super.setVisible(visible);
@@ -1150,9 +1143,9 @@
 
         public void selectKeysComboBox() {
-            selectACComboBoxSavingUnixBuffer(keys);
+            //selectACComboBoxSavingUnixBuffer(keys);
         }
 
         public void selectValuesCombobox()   {
-            selectACComboBoxSavingUnixBuffer(values);
+            //selectACComboBoxSavingUnixBuffer(values);
         }
 
@@ -1327,9 +1320,6 @@
             this.add(mainPanel);
             
-            //JOptionPane pane = new JOptionPane(this, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_OPTION);
             JOptionPane pane = new JOptionPane(this, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
-            //pane.
-            JDialog dlg = pane.createDialog(Main.parent, tr("Model Settings"));
-            
+            JDialog dlg = pane.createDialog(Main.parent, tr("Model Settings"));            
             dlg.setVisible(true);
             //JButton ok = dlg.getRootPane().getDefaultButton();
@@ -1367,6 +1357,5 @@
                     customSVMModelPath = fileChooser.getSelectedFile().getAbsolutePath();
                 }
-                
-                
+                               
                 if(useModelCombinationCheckbox.isSelected()){
                     String svmModelPath = fileChooser.getSelectedFile().getAbsolutePath();
@@ -1478,9 +1467,4 @@
             weightsPanel.repaint();
         }
-        
-//        private static List<Double> normalizeWeights(){
-//              divide by their sum, all elements should sum to 1.
-//            return weightsList;
-//        }
     }
     
@@ -1502,6 +1486,5 @@
         private List<String> textualList = new ArrayList<>();
         //private boolean useClassFeatures = false;
-        private final JCheckBox useTagsCheckBox;
-        
+        private final JCheckBox useTagsCheckBox;       
 
         public AddTagsDialog() {
@@ -1511,5 +1494,4 @@
             configureContextsensitiveHelp("/Dialog/AddValue", true /* show help button */);
             final AddTagsDialog lala = this;
-
             
             loadOntology();
@@ -1539,6 +1521,5 @@
             modelSettingsButton = new javax.swing.JButton("Model Settings"); 
             useTagsCheckBox = new javax.swing.JCheckBox("Predict using tags");
-            recommendedClassesLabel = new javax.swing.JLabel("Recommended Classes:");
-            
+            recommendedClassesLabel = new javax.swing.JLabel("Recommended Classes:");           
             
             addAndContinueButton.addActionListener(new java.awt.event.ActionListener() {
@@ -1564,10 +1545,12 @@
                         }
                         else{
-                            //useTagsCheckBox
+                            //recommend using tags: set the checkbox selected to avoid confusing the user
+                            useTagsCheckBox.setSelected(true);
+                            
                             if(useTagsCheckBox.isSelected()){
                                 //load model with classes
                                 modelWithClasses = true;
                                 loadSVMmodel();
-                                createOSMObject(sel); //create object including class features
+                                createOSMObject(sel); //create object including class features                              
                             }
                             else{
@@ -1608,5 +1591,5 @@
                                 modelWithClasses = true;
                                 loadSVMmodel();
-                                createOSMObject(sel); //create object including class features
+                                createOSMObject(sel); //create object including class features                               
                             }
                             else{
@@ -1654,7 +1637,5 @@
 
             mainPanel.add(keys, GBC.eop().fill());
-
-            mainPanel.add(new JLabel(tr("Please select a value")), GBC.eol());
-            
+            mainPanel.add(new JLabel(tr("Please select a value")), GBC.eol());            
  
             model = new DefaultListModel<>();
@@ -1673,9 +1654,9 @@
                     modelWithClasses = false;
                     loadSVMmodel();//load original model
-                    createOSMObject(sel); //create object without class features
-                    
-                    
+                    createOSMObject(sel); //create object without class features                                   
                 }
                 else{
+                    //recommend using tags: set the checkbox selected to avoid confusing the user
+                    useTagsCheckBox.setSelected(true);                   
                     modelWithClasses = true;
                     loadSVMmodel();//load model with classes          
@@ -1684,6 +1665,4 @@
             } 
             
-            //createOSMObject(sel, false);
-
             categoryList = new JList<>(model);
 
@@ -1720,6 +1699,4 @@
             categoryList.setModel(model);
 
-            //System.out.println("components: \n" + mainPanel.getBounds());
-
             values.setEditable(true);
             mainPanel.add(values, GBC.eop().fill());
@@ -1753,6 +1730,4 @@
             suggestRecentlyAddedTags(mainPanel, recentTagsToShow, focus);
 
-            //mainPanel.add(listPanel,GBC.eop().fill());
-            
             mainPanel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED, Color.GRAY, Color.WHITE));
             listPanel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED, Color.GRAY, Color.WHITE));
@@ -1986,6 +1961,4 @@
                 }                
             }
-
-
             
             try {
@@ -2001,6 +1974,5 @@
         
         private void useCombinedSVMmodels(Collection<OsmPrimitive> sel, boolean useClassFeatures){
-            System.out.println("The system will combine " + filesAndWeights.size() + " SVM models.");
-            
+            System.out.println("The system will combine " + filesAndWeights.size() + " SVM models.");           
             
             MathTransform transform = null;
@@ -2241,6 +2213,5 @@
                         else{
                             scoreMap.put(predictedTag, finalRank);
-                        }
-                        
+                        }                     
                         //add final weight - predicted tag
                     }                    
Index: applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/OSMRecToggleDialog.java
===================================================================
--- applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/OSMRecToggleDialog.java	(revision 31460)
+++ applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/OSMRecToggleDialog.java	(revision 31461)
@@ -242,7 +242,6 @@
                 Shortcut.registerShortcut("subwindow:properties", tr("Toggle: {0}", tr("Tags/Memberships")), KeyEvent.VK_P,
                         Shortcut.ALT_SHIFT), 150, true);
-
         HelpUtil.setHelpContext(this, HelpUtil.ht("/Dialog/TagsMembership"));
-
+        
         setupTagsMenu();
         buildTagsTable(); //my
@@ -699,5 +698,6 @@
         
         addAction.setEnabled(hasSelection);
-        editAction.setEnabled(hasTags || hasMemberships);
+        //editAction.setEnabled(hasTags || hasMemberships);
+        editAction.setEnabled(true);
         deleteAction.setEnabled(hasTags || hasMemberships);
         tagTable.setVisible(hasTags);
@@ -821,5 +821,5 @@
             }
             // double click, edit or add tag
-            else if (e.getSource() == tagTable) {
+            else if (e.getSource() == tagTable ) {
                 int row = tagTable.rowAtPoint(e.getPoint());
                 if (row > -1) {
@@ -1041,9 +1041,6 @@
         public void actionPerformed(ActionEvent e) {
             //System.out.println("clicked recommend");
-            
-            
             editHelper.addTag();
-            btnAdd.requestFocusInWindow();
-            
+            btnAdd.requestFocusInWindow();            
         }
     }
@@ -1065,5 +1062,5 @@
             //images/dialogs/train.png
             //System.out.println("icon");
-            
+            setEnabled(true);
             updateEnabledState(); 
         }
@@ -1078,14 +1075,21 @@
             } else if (membershipTable.getSelectedRowCount() == 1) {
                 int row = membershipTable.getSelectedRow();
-                editMembership(row);
-            }
-        }
-
-        @Override
-        protected void updateEnabledState() {     
-            setEnabled(
-                    (tagTable != null && tagTable.getSelectedRowCount() == 1)
-                    ^ (membershipTable != null && membershipTable.getSelectedRowCount() == 1)
-                    );            
+                //System.out.println("tagTable: " + tagTable);
+                //System.out.println("membershipTable: " + membershipTable);                
+                editHelper.editTag(row, false);
+                //editMembership(row);
+            }
+            else{
+                editHelper.editTag(1, false);
+            }
+        }
+
+        @Override
+        protected void updateEnabledState() {
+            setEnabled(true);
+//            setEnabled(
+//                    (tagTable != null && tagTable.getSelectedRowCount() == 1)
+//                    ^ (membershipTable != null && membershipTable.getSelectedRowCount() == 1)
+//                    );            
         }
 
