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 31402)
+++ applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/core/TrainWorker.java	(revision 31441)
@@ -30,5 +30,4 @@
 import java.util.logging.Logger;
 import javax.swing.SwingWorker;
-import org.opengis.referencing.FactoryException;
 import org.openstreetmap.josm.plugins.container.OSMRelation;
 import org.openstreetmap.josm.plugins.container.OSMWay;
@@ -78,5 +77,5 @@
     private static double foldScore10 = 0;
     private static double bestScore = 0;
-    int trainProgress = 0;
+    private int trainProgress = 0;
     private final boolean validateFlag;
     private final double cParameterFromUser;
@@ -87,7 +86,7 @@
     private String textualListFilePath;
     
-    private static boolean USE_CLASS_FEATURES = false;
-    private static boolean USE_RELATION_FEATURES = false;
-    private static boolean USE_TEXTUAL_FEATURES = true;
+    private static final boolean USE_CLASS_FEATURES = false;
+    private static final boolean USE_RELATION_FEATURES = false;
+    private static final boolean USE_TEXTUAL_FEATURES = true;
     private static int numberOfFeatures;
     private static LanguageDetector languageDetector;
@@ -173,9 +172,9 @@
         if(topKIsSelected){
             textualList = anal.getTopKMostFrequent(topK);
-            System.out.println(textualList);
+            //System.out.println(textualList);
         }
         else{
             textualList = anal.getWithFrequency(frequency);
-            System.out.println(textualList);
+            //System.out.println(textualList);
         }
 
@@ -230,11 +229,5 @@
         readTextualFromDefaultList(textualFileStream);
       
-        OSMParser osmParser = null;
-        try {
-            osmParser = new OSMParser(inputFilePath);
-            
-        } catch (FactoryException ex) {
-            Logger.getLogger(TrainWorker.class.getName()).log(Level.SEVERE, null, ex);
-        }        
+        OSMParser osmParser = new OSMParser(inputFilePath);     
         
         osmParser.parseDocument();
@@ -354,5 +347,5 @@
 
             if(way.getClassIDs().isEmpty()){
-                wayListSizeWithoutUnclassified = wayListSizeWithoutUnclassified-1;
+                wayListSizeWithoutUnclassified -= 1;
                 u++;
             }
@@ -465,5 +458,5 @@
             //System.out.println("file created");
             model.save(modelFile);
-            //System.out.println("saved"); 
+            System.out.println("model saved at: " + modelFile); 
         } catch (IOException ex) {
             Logger.getLogger(TrainWorker.class.getName()).log(Level.SEVERE, null, ex);
@@ -504,5 +497,5 @@
             if(way.getClassIDs().isEmpty()){
                 //System.out.println("found unclassified" + way.getClassIDs() + "class: " +way.getClassID());
-                wayListSizeWithoutUnclassified2 = wayListSizeWithoutUnclassified2-1;
+                wayListSizeWithoutUnclassified2 -= 1;
                 //u++;
             }
@@ -614,15 +607,15 @@
         
         System.out.println("Succeeded " + succededInstances + " of " + testList.size() + " total (1 class prediction)");
-        double precision1 = (double)succededInstances/(double)wayListSizeWithoutUnclassified2;
+        double precision1 = succededInstances/(double)wayListSizeWithoutUnclassified2;
         score1 = precision1;
         System.out.println(precision1);
         
         System.out.println("Succeeded " + succededInstances5 + " of " + testList.size()+ " total (5 class prediction)");
-        double precision5 = (double)succededInstances5/(double)wayListSizeWithoutUnclassified2;
+        double precision5 = succededInstances5/(double)wayListSizeWithoutUnclassified2;
         score5 = precision5;
         System.out.println(precision5);
         
         System.out.println("Succeeded " + succededInstances10 + " of " + testList.size()+ " total (10 class prediction)");
-        double precision10 = (double)succededInstances10/(double)wayListSizeWithoutUnclassified2;
+        double precision10 = succededInstances10/(double)wayListSizeWithoutUnclassified2;
         score10 = precision10;
         System.out.println(precision10);               
@@ -651,5 +644,5 @@
 
             if(way.getClassIDs().isEmpty()){
-                wayListSizeWithoutUnclassified = wayListSizeWithoutUnclassified-1;
+                wayListSizeWithoutUnclassified -= 1;
                 u++;
             }
@@ -781,5 +774,5 @@
 
             if(way.getClassIDs().isEmpty()){
-                wayListSizeWithoutUnclassified = wayListSizeWithoutUnclassified-1;
+                wayListSizeWithoutUnclassified -= 1;
                 u++;
             }
@@ -888,5 +881,5 @@
             //System.out.println("file created");
             model.save(modelFile);
-            //System.out.println("saved"); 
+            System.out.println("model saved at: " + modelFile); 
         } catch (IOException ex) {
             Logger.getLogger(TrainWorker.class.getName()).log(Level.SEVERE, null, ex);
@@ -932,5 +925,5 @@
                 writer.write(entry.getKey());
                 writer.newLine();
-                System.out.println(entry.getKey());
+                //System.out.println(entry.getKey());
             }
         } catch (UnsupportedEncodingException ex) {
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 31402)
+++ applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/OSMRecPluginHelper.java	(revision 31441)
@@ -164,5 +164,8 @@
     private static LanguageDetector languageDetector;
     private static String bestModelPath;
+    private boolean modelWithClasses;// = false;
     private final String modelWithClassesPath;
+    private boolean useCustomSVMModel = false;
+    private String customSVMModelPath;
     
     
@@ -468,4 +471,5 @@
             daysField = new javax.swing.JTextField();
             
+            cParameterCheckBox.setSelected(true);
             userHistoryPanel.setEnabled(false);
             byAreaRadioButton.setEnabled(false);
@@ -490,4 +494,7 @@
             inputFileErrorMessageLabel.setForeground(Color.RED);
             inputFileErrorMessageLabel.setText("");
+            topKField.setText("50");
+            frequencyField.setText("200");
+            cParameterField.setText("0.01");
             
             cParameterField.setColumns(FIELD_COLUMNS);
@@ -926,4 +933,5 @@
             acceptConfigButton.setEnabled(true);          
             fileBrowseButton.setEnabled(true);
+            trainFromUserCheckBox.setEnabled(true);
             
             if(trainFromUserCheckBox.isSelected()){
@@ -967,4 +975,5 @@
 
                         try {
+                            System.out.println("executing userDataExtractAndTrainWorker Thread..");
                             userDataExtractAndTrainWorker.execute();
                         } catch (Exception ex) {
@@ -1197,6 +1206,6 @@
         private final JButton chooseModelButton;
         private final JTextField chooseModelTextField;
-        private final JList modelCombinationList;
-        private final DefaultListModel<String> combinationDefaultListModel = new DefaultListModel<>();;
+        private final JList<String> modelCombinationList;
+        private final DefaultListModel<String> combinationDefaultListModel = new DefaultListModel<>();
         private final JPanel modelCombinationPanel;
         //private final JTextField weightTextField;
@@ -1336,8 +1345,12 @@
                 System.out.println("\n\nUSE COMBINED MODEL\n\n");
                 //recompute predictions with combination
-                addDialog.loadSVMmodel(false); //maybe ask user about if the model contains classes                
+                modelWithClasses = false;
+                addDialog.loadSVMmodel(); 
+                addDialog.createOSMObject(sel);
             }
             else {
                 useCombinedModel = false;
+                addDialog.loadSVMmodel();
+                addDialog.createOSMObject(sel);
             }            
         }
@@ -1351,5 +1364,8 @@
                 if(returnVal == JFileChooser.APPROVE_OPTION) {
                     chooseModelTextField.setText(fileChooser.getSelectedFile().getAbsolutePath());
-                }
+                    useCustomSVMModel = true;
+                    customSVMModelPath = fileChooser.getSelectedFile().getAbsolutePath();
+                }
+                
                 
                 if(useModelCombinationCheckbox.isSelected()){
@@ -1391,5 +1407,5 @@
                     weightPanelComponent.setEnabled(true);
                 }
-                
+                useCustomSVMModel = false; //reseting the selected custom SVM model only here
             }
             else{
@@ -1416,5 +1432,5 @@
 
                     weightValue = Math.abs(weightValue);
-                    weightSum = weightSum + weightValue;
+                    weightSum += weightValue;
                 }    
                 catch (NumberFormatException ex){
@@ -1543,6 +1559,7 @@
                         if(s.getInterestingTags().isEmpty()){
                             //load original model
-                            loadSVMmodel(false);
-                            createOSMObject(sel, false); //create object without class features
+                            modelWithClasses = false;
+                            loadSVMmodel();
+                            createOSMObject(sel); //create object without class features
                         }
                         else{
@@ -1550,10 +1567,12 @@
                             if(useTagsCheckBox.isSelected()){
                                 //load model with classes
-                                loadSVMmodel(true);
-                                createOSMObject(sel, true); //create object including class features
+                                modelWithClasses = true;
+                                loadSVMmodel();
+                                createOSMObject(sel); //create object including class features
                             }
                             else{
-                                loadSVMmodel(false);
-                                createOSMObject(sel, false); //create object including class features    
+                                modelWithClasses = false;
+                                loadSVMmodel();
+                                createOSMObject(sel); //create object including class features    
                             }
                         }                        
@@ -1579,6 +1598,7 @@
                         if(s.getInterestingTags().isEmpty()){
                             //load original model
-                            loadSVMmodel(false);
-                            createOSMObject(sel, false); //create object without class features
+                            modelWithClasses = false;
+                            loadSVMmodel();
+                            createOSMObject(sel); //create object without class features
                         }
                         else{
@@ -1586,10 +1606,12 @@
                             if(useTagsCheckBox.isSelected()){
                                 //load model with classes
-                                loadSVMmodel(true);
-                                createOSMObject(sel, true); //create object including class features
+                                modelWithClasses = true;
+                                loadSVMmodel();
+                                createOSMObject(sel); //create object including class features
                             }
                             else{
-                                loadSVMmodel(false);
-                                createOSMObject(sel, false); //create object including class features    
+                                modelWithClasses = false;
+                                loadSVMmodel();
+                                createOSMObject(sel); //create object including class features    
                             }
                         }                        
@@ -1649,12 +1671,14 @@
                 File modelWithClassesFile = new File(modelWithClassesPath); 
                 if(s.getInterestingTags().isEmpty() || !modelWithClassesFile.exists()){
-                    loadSVMmodel(false);//load original model
-                    createOSMObject(sel, false); //create object without class features
+                    modelWithClasses = false;
+                    loadSVMmodel();//load original model
+                    createOSMObject(sel); //create object without class features
                     
                     
                 }
                 else{
-                    loadSVMmodel(true);//load model with classes          
-                    createOSMObject(sel, true); //create object including class features                              
+                    modelWithClasses = true;
+                    loadSVMmodel();//load model with classes          
+                    createOSMObject(sel); //create object including class features                              
                 }                        
             } 
@@ -1938,5 +1962,5 @@
         }
 
-        private void loadSVMmodel(boolean modelWithClasses) {
+        private void loadSVMmodel() {
             if(useCombinedModel){
                 System.out.println("Using combined model.");
@@ -1948,15 +1972,24 @@
             
             File modelFile;
-            if(modelWithClasses){
-                modelFile = new File(modelDirectory.getAbsolutePath() + "/model_with_classes");
-            }
-            else {
-                modelFile = new File(modelDirectory.getAbsolutePath() + "/best_model");
-            }
+            if(useCustomSVMModel){
+                System.out.println("using custom model: " + customSVMModelPath);
+                modelFile = new File(customSVMModelPath);
+            }
+            else{
+                if(modelWithClasses){
+                    System.out.println("using model with classes: " + modelDirectory.getAbsolutePath() + "/model_with_classes");
+                    modelFile = new File(modelDirectory.getAbsolutePath() + "/model_with_classes");
+                }
+                else {
+                    System.out.println("using best model: " + modelDirectory.getAbsolutePath() + "/best_model");
+                    modelFile = new File(modelDirectory.getAbsolutePath() + "/best_model");
+                }                
+            }
+
 
             
             try {
                 modelSVM = Model.load(modelFile);
-                System.out.println("model loaded: " + modelFile.getAbsolutePath());
+                //System.out.println("model loaded: " + modelFile.getAbsolutePath());
             } catch (IOException ex) {
                 Logger.getLogger(TrainWorker.class.getName()).log(Level.SEVERE, null, ex);
@@ -2233,5 +2266,5 @@
         }
 
-        private void createOSMObject(Collection<OsmPrimitive> sel, boolean useClassFeatures) {
+        private void createOSMObject(Collection<OsmPrimitive> sel) {
                         
             MathTransform transform = null;
@@ -2270,5 +2303,5 @@
                 for(Node node : selectedWayNodes){
                     node.getCoor();
-                    System.out.println(node.getCoor()); 
+                    //System.out.println(node.getCoor()); 
                     if(node.isLatLonKnown()){
                         //LatLon coord = nod.getCoor();
@@ -2339,5 +2372,5 @@
                 classifier.calculateClasses(selectedInstance, mappings, mapperWithIDs, indirectClasses, indirectClassesWithIDs);
                 
-                if(useClassFeatures){
+                if(modelWithClasses){
                     ClassFeatures classFeatures = new ClassFeatures();
                     classFeatures.createClassFeatures(selectedInstance, mappings, mapperWithIDs, indirectClasses, indirectClassesWithIDs);
@@ -2373,5 +2406,5 @@
                     
                     mapLabelsToIDs.put(modelSVMLabels[h], h);
-                    System.out.println(h + "   <->    " + modelSVMLabels[h]);
+                    //System.out.println(h + "   <->    " + modelSVMLabels[h]);
                     
                 }               
Index: applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/personalization/TrainByUser.java
===================================================================
--- applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/personalization/TrainByUser.java	(revision 31402)
+++ applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/personalization/TrainByUser.java	(revision 31441)
@@ -8,4 +8,6 @@
 import de.bwaldvogel.liblinear.Problem;
 import de.bwaldvogel.liblinear.SolverType;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.io.BufferedWriter;
 import java.io.File;
@@ -24,6 +26,8 @@
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutionException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.swing.SwingWorker;
 import org.openstreetmap.josm.plugins.container.OSMRelation;
 import org.openstreetmap.josm.plugins.container.OSMWay;
@@ -45,5 +49,5 @@
  */
 
-public class TrainByUser {
+public class TrainByUser extends SwingWorker<Void, Void> implements ActionListener{
     
     private final String inputFilePath;
@@ -67,5 +71,5 @@
     private static double foldScore10 = 0;
     private static double bestScore = 0;
-    int trainProgress = 0;
+    //int trainProgress = 0;
     private final boolean validateFlag;
     private final double cParameterFromUser;
@@ -75,7 +79,7 @@
     private final boolean topKIsSelected;
     private String textualListFilePath;    
-    private static boolean USE_CLASS_FEATURES = false;
-    private static boolean USE_RELATION_FEATURES = false;
-    private static boolean USE_TEXTUAL_FEATURES = true;
+    private static final boolean USE_CLASS_FEATURES = false;
+    private static final boolean USE_RELATION_FEATURES = false;
+    private static final boolean USE_TEXTUAL_FEATURES = true;
     private static int numberOfFeatures;
     private static LanguageDetector languageDetector;
@@ -108,26 +112,46 @@
         TrainByUser.wayList = wayList;
     }
-    
-    
-    public void executeTraining(){        
+        
+    @Override
+    public Void doInBackground() throws Exception {         
         extractTextualList();
         parseFiles();
-        if(validateFlag){            
+        if(validateFlag){   
+            firePropertyChange("progress", getProgress(), 5);
+            //setProgress(5);
             validateLoop();
+            firePropertyChange("progress", getProgress(), 40);
+            //setProgress(40);
             System.out.println("Training model with the best c: " + bestConfParam);
             clearDataset();
             trainModel(bestConfParam);
+            firePropertyChange("progress", getProgress(), 60);
+            //setProgress(80);
             clearDataset();
             trainModelWithClasses(bestConfParam);
-            
+            firePropertyChange("progress", getProgress(), 100);
+            setProgress(100);
         }
         else{
+
+            //firePropertyChange("progress", getProgress(), 5);
+            //setProgress(5);
             clearDataset();
+            firePropertyChange("progress", getProgress(), 10);
+            //setProgress(10);
             trainModel(cParameterFromUser);
+            //setProgress(60);   
+            firePropertyChange("progress", getProgress(), 60);
             clearDataset();
-            trainModelWithClasses(cParameterFromUser);
+            firePropertyChange("progress", getProgress(), 65);
+            //setProgress(65);
+            trainModelWithClasses(cParameterFromUser);          
+            
+            firePropertyChange("progress", getProgress(), 100);
+            setProgress(100);
             System.out.println("done.");
         }
-        System.out.println("Train by user process complete.");       
+        System.out.println("Train by user process complete.");    
+        return null;
     }
     
@@ -232,5 +256,5 @@
         
         for(Double param : confParams){
-            
+            //setProgress(4*((5*(trainProgress++))/confParams.length)); 
             foldScore1 = 0;
             foldScore5 = 0;
@@ -238,5 +262,5 @@
             System.out.println("\n\n\nrunning for C = " + param);
             clearDataset();
-            System.out.println("fold1");
+            System.out.println("fold1");            
             //crossValidateFold(0, 3, 3, 4, false, param);
             crossValidateFold(0, 4, 4, 5, false, param); //4-1
@@ -294,5 +318,5 @@
             
         }
-        System.out.println(4*((5*(trainProgress++))/confParams.length));
+        //System.out.println(4*((5*(trainProgress++))/confParams.length));
         //setProgress(100);
         bestConfParam = bestC;
@@ -319,5 +343,4 @@
         //set classes for each osm instance
         int sizeToBeAddedToArray = 0; //this will be used to proper init the features array, adding the multiple vectors size 
-        int lalala = 0;
         for(OSMWay way : trainList){
 
@@ -326,5 +349,5 @@
 
             if(way.getClassIDs().isEmpty()){
-                wayListSizeWithoutUnclassified = wayListSizeWithoutUnclassified-1;
+                wayListSizeWithoutUnclassified -= 1;
                 u++;
             }
@@ -382,5 +405,4 @@
                 }               
                 for(int classID : way.getClassIDs()){
-                    lalala++;
                     trainingSetWithUnknown2[k] = featureNodeArray;
                     GROUPS_ARRAY2[k] = classID;
@@ -472,5 +494,5 @@
             if(way.getClassIDs().isEmpty()){
                 //System.out.println("found unclassified" + way.getClassIDs() + "class: " +way.getClassID());
-                wayListSizeWithoutUnclassified2 = wayListSizeWithoutUnclassified2-1;
+                wayListSizeWithoutUnclassified2 -= 1;
                 //u++;
             }
@@ -582,15 +604,15 @@
         
         System.out.println("Succeeded " + succededInstances + " of " + testList.size() + " total (1 class prediction)");
-        double precision1 = (double)succededInstances/(double)wayListSizeWithoutUnclassified2;
+        double precision1 = succededInstances/(double)wayListSizeWithoutUnclassified2;
         score1 = precision1;
         System.out.println(precision1);
         
         System.out.println("Succeeded " + succededInstances5 + " of " + testList.size()+ " total (5 class prediction)");
-        double precision5 = (double)succededInstances5/(double)wayListSizeWithoutUnclassified2;
+        double precision5 = succededInstances5/(double)wayListSizeWithoutUnclassified2;
         score5 = precision5;
         System.out.println(precision5);
         
         System.out.println("Succeeded " + succededInstances10 + " of " + testList.size()+ " total (10 class prediction)");
-        double precision10 = (double)succededInstances10/(double)wayListSizeWithoutUnclassified2;
+        double precision10 = succededInstances10/(double)wayListSizeWithoutUnclassified2;
         score10 = precision10;
         System.out.println(precision10);               
@@ -602,8 +624,6 @@
         int u = 0;
         System.out.println("trainList size: " + wayListSizeWithoutUnclassified);
-        
         //set classes for each osm instance
         int sizeToBeAddedToArray = 0; //this will be used to proper init the features array, adding the multiple vectors size 
-        int lalala = 0;
 
         //System.out.println("starting classify instances");
@@ -614,5 +634,5 @@
 
             if(way.getClassIDs().isEmpty()){
-                wayListSizeWithoutUnclassified = wayListSizeWithoutUnclassified-1;
+                wayListSizeWithoutUnclassified -= 1;
                 u++;
             }
@@ -672,5 +692,4 @@
                 }               
                 for(int classID : way.getClassIDs()){
-                    lalala++;
                     trainingSetWithUnknown2[k] = featureNodeArray;
                     GROUPS_ARRAY2[k] = classID;
@@ -744,5 +763,5 @@
 
             if(way.getClassIDs().isEmpty()){
-                wayListSizeWithoutUnclassified = wayListSizeWithoutUnclassified-1;
+                wayListSizeWithoutUnclassified -= 1;
                 u++;
             }
@@ -888,3 +907,20 @@
         }       
     }
+    
+    @Override
+    protected void done() {
+        try {
+            System.out.println("Training process complete! - > " + get());
+            firePropertyChange("progress", getProgress(), 100);
+            setProgress(100);
+        } 
+        catch (InterruptedException | ExecutionException ignore) {
+            System.out.println("Exception: " + ignore);
+        }
+    }     
+    
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        //cancel button, end process after clearing Dataset
+    }    
 }
Index: applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/personalization/UserDataExtractAndTrainWorker.java
===================================================================
--- applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/personalization/UserDataExtractAndTrainWorker.java	(revision 31402)
+++ applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/osmrec/personalization/UserDataExtractAndTrainWorker.java	(revision 31441)
@@ -1,4 +1,8 @@
 package org.openstreetmap.josm.plugins.osmrec.personalization;
 
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -7,10 +11,6 @@
 import java.util.List;
 import java.util.TimeZone;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import javax.swing.SwingWorker;
-import org.opengis.referencing.FactoryException;
 import org.openstreetmap.josm.plugins.container.OSMWay;
-import org.openstreetmap.josm.plugins.core.TrainWorker;
 import org.openstreetmap.josm.plugins.extractor.LanguageDetector;
 import org.openstreetmap.josm.plugins.parsers.OSMParser;
@@ -22,5 +22,5 @@
  */
 
-public class UserDataExtractAndTrainWorker extends SwingWorker<Void, Void> {
+public class UserDataExtractAndTrainWorker extends SwingWorker<Void, Void> implements ActionListener{
     
     private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
@@ -28,5 +28,5 @@
     private final String username;
     private final Integer days;
-    private List<OSMWay> wayList;
+    private List<OSMWay> wayList = new ArrayList<>();
     private final boolean byArea;
     private final String inputFilePath;
@@ -37,4 +37,5 @@
     private final boolean topKIsSelected;
     private final LanguageDetector languageDetector;
+    private int userTrainProgress = 0;
     
     public UserDataExtractAndTrainWorker(String inputFilePath, String username, Integer days, boolean byArea, boolean validateFlag, 
@@ -56,4 +57,6 @@
     @Override
     protected Void doInBackground() throws Exception {
+        
+        System.out.println("UserDataExtractAndTrainWorker doInBackground initiating..");
         if(byArea){
            extractByArea(); 
@@ -66,10 +69,32 @@
                 cParameterFromUser, topK, frequency, topKIsSelected, languageDetector, wayList);
 
-        trainByUser.executeTraining();
+        System.out.println("trainByUser executing..");
+        trainByUser.addPropertyChangeListener(new PropertyChangeListener() {
+                            
+            @Override 
+            public void propertyChange(PropertyChangeEvent evt) {
+                if("progress".equals(evt.getPropertyName())) {
+                    int progress = (Integer) evt.getNewValue();
+                    System.out.println("progress++ from property change listener, progress: " + progress);
+                    setProgress(progress);
+                    
+                }
+            }                                                 
+        }); 
+        
+        
+        
+        
+        
+        trainByUser.doInBackground();
+        setProgress(100);
         return null;
     }
     
     private void extractHistory() {
-        wayList.clear();
+        if(wayList != null){
+            wayList.clear();
+        }
+        
         produceTimeIntervals(days);
         HistoryParser historyParser = new HistoryParser(username);
@@ -83,19 +108,33 @@
     
     private void extractByArea() {
-        wayList.clear();
-        OSMParser osmParser = null;
-        try {
-            osmParser = new OSMParser(inputFilePath);
-            
-        } catch (FactoryException ex) {
-            Logger.getLogger(TrainWorker.class.getName()).log(Level.SEVERE, null, ex);
-        } 
+        System.out.println("Extracting by Area..");
+
+        if(wayList != null){
+            wayList.clear();
+        }
+        //System.out.println("wayList cleared.");
+        
+        OSMParser osmParser = new OSMParser(inputFilePath);
+        osmParser.parseDocument();
+
+        //System.out.println("OSMParser done.");
         
         List<OSMWay> completeWayList = osmParser.getWayList();
+        System.out.println("completeWayList size: " + completeWayList.size());
+        System.out.println("populating wayList with edits from username: " + username);
         for(OSMWay way : completeWayList){
+            //System.out.println("current way user: " + way.getUser());
             if(way.getUser().equals(username)){
+                System.out.println("found user edit!");
                 wayList.add(way);
             }            
         } 
+        System.out.println("weeding wayList by user done.");
+        if(wayList.isEmpty()){
+            System.out.println("User has not edited this Area. Try \"By time\" option.");
+        }
+        else{
+            System.out.println("User has edited " + wayList.size() + " OSM entities in this area.");
+        }
     }   
     
@@ -142,3 +181,12 @@
         } while(cal.getTime().before(currentDate));
     }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        //this.firePropertyChange("progress", userTrainProgress, userTrainProgress+10);
+//        if(userTrainProgress <100){
+//            setProgress(userTrainProgress+10);
+//        }
+        
+    }
 }
Index: applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/parsers/OSMParser.java
===================================================================
--- applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/parsers/OSMParser.java	(revision 31402)
+++ applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/parsers/OSMParser.java	(revision 31441)
@@ -48,5 +48,5 @@
     private static final CoordinateReferenceSystem targetCRS = DefaultGeocentricCRS.CARTESIAN;
     private final GeometryFactory geometryFactory = new GeometryFactory();
-    private final MathTransform transform;
+    private static MathTransform transform = null;
     private final List<OSMNode> nodeList; //will be populated with nodes 
     private final List<OSMRelation> relationList;
@@ -61,5 +61,6 @@
     private boolean inRelation = false; //becomes true when the parser is in a relarion node
     
-    public OSMParser(String osmXmlFileName) throws FactoryException {
+    public OSMParser(String osmXmlFileName)  {
+        //System.out.println("creating osmParser..");
         this.osmXmlFileName = osmXmlFileName;       
         nodeList = new ArrayList<>();
@@ -67,5 +68,10 @@
         relationList = new ArrayList<>();
         nodesWithIDs = new HashMap<>(); 
-        transform = CRS.findMathTransform(sourceCRS, targetCRS, true);
+        try {
+            transform = CRS.findMathTransform(sourceCRS, targetCRS, true);
+        } catch (FactoryException ex) {
+            Logger.getLogger(OSMParser.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        //System.out.println("osmParser created!");
     }
 
@@ -117,5 +123,13 @@
             wayTmp = new OSMWay();
             wayTmp.setID(attributes.getValue("id"));
-            wayTmp.setUser(attributes.getValue("user"));
+            
+            if(attributes.getValue("user") != null){
+                wayTmp.setUser(attributes.getValue("user"));
+            }
+            else{
+                wayTmp.setUser("undefined");
+            }
+            //System.out.println("way user: " + attributes.getValue("user"));
+                    
             inWay = true;
             inNode = false;
Index: applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/parsers/Ontology.java
===================================================================
--- applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/parsers/Ontology.java	(revision 31402)
+++ applications/editors/josm/plugins/OSMRecPlugin/src/org/openstreetmap/josm/plugins/parsers/Ontology.java	(revision 31441)
@@ -50,7 +50,7 @@
         ontologyModel = ModelFactory.createOntologyModel();                
         
-        //org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.ERROR); 
+        org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.ERROR); 
         ontologyModel.read(owlFile, null);    //Hide RDFDefaultErrorHandler from terminal to keep clear output.
-        //org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.INFO);
+        org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.INFO);
    
         listHierarchy = ontologyModel.listHierarchyRootClasses().toList();
@@ -65,6 +65,6 @@
             if (obj.hasSubClass()) {
 
-                for (Iterator i = obj.listSubClasses(true); i.hasNext();) {
-                    OntClass currentClass = (OntClass) i.next();
+                for (Iterator<OntClass> i = obj.listSubClasses(true); i.hasNext();) {
+                    OntClass currentClass = i.next();
                     
                     List<OntClass> superClasses = currentClass.listSuperClasses().toList();                    
