Index: applications/editors/josm/plugins/czechaddress/build.xml
===================================================================
--- applications/editors/josm/plugins/czechaddress/build.xml	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/build.xml	(revision 15558)
@@ -26,24 +26,64 @@
         <!-- compile the plugin -->
         <javac srcdir="src"
-               sourcepath=""
                classpath="${josm.jar}"
                destdir="${plugin.build.dir}"
-               debug="true">
+               debug="true"/>
 
-            <include name="**/Status*.java"/>
-            <include name="**/StringUtils.java"/>
-            <include name="**/NotNull*.java"/>
-            <include name="**/addressdatabase/*.java"/>
-            <include name="**/proposal*/*.java"/>
-            <include name="**/intelligence/Reasoner*.java"/>
-            <include name="**/intelligence/Match.java"/>
-        </javac>
+        <!-- create the manifest -->
+        <manifest file="${plugin.build.dir}/${plugin.basepackage.dir}/MANIFEST.MF">
+            <attribute name="Author" value="Radomír Černoch"/>
+            <attribute name="Plugin-Description" value="Creating and handling address nodes and buildings within Czech Republic."/>
+            <attribute name="Plugin-Mainversion" value="1607"/>
+            <attribute name="Plugin-Version" value="0.1.2"/>
+            <attribute name="Plugin-Class" value="${plugin.basepackage}.CzechAddressPlugin"/>
+        </manifest>
 
+        <!-- include the images -->
+        <copy todir="${plugin.build.dir}/images">
+            <fileset dir="images"/>
+        </copy>
     </target>
 
+    <target name="dist"
+            depends="compile"
+            description="Create the .jar file for distribution">
+        <mkdir dir="${plugin.dist.dir}"/>
+        <jar destfile="${plugin.jar}"
+             basedir="${plugin.build.dir}"
+             manifest="${plugin.build.dir}/${plugin.basepackage.dir}/MANIFEST.MF"/>
+    </target>
+
+    <target name="doc" description="Create Javadoc API documentation">
+        <ant antfile="build.xml" target="doc" dir="${josm.base}"/>
+        <mkdir dir="${plugin.javadoc.dir}"/>
+        <javadoc sourcepath="src"
+                 packagenames="*"
+                 destdir="${plugin.javadoc.dir}"
+                 use="true"
+                 charset="UTF-8">
+            <doctitle><![CDATA[Czech Address JOSM plugin]]></doctitle>
+            <bottom><![CDATA[<i>Licenced under GPLv3. Bugreports should be sent to
+                    <a href='mailto:radomir.cernoch@gmail.com'>Radomír Černoch</a></i>]]>
+            </bottom>
+            <!--<tag name="todo" scope="all" description="To do:"/>-->
+            <link href="http://java.sun.com/j2se/1.5.0/docs/api/"/>
+            <link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/>
+            <!--<link href="file://${user.home}/devel/core/doc"/>-->
+        </javadoc>
+    </target>
+
+    <target name="install" depends="dist">
+        <property environment="env"/>
+        <condition property="josm.plugins.dir"
+                   value="${env.APPDATA}/JOSM/plugins"
+                   else="${user.home}/.josm/plugins">
+            <and><os family="windows"/></and>
+        </condition>
+        <copy file="${plugin.jar}" todir="${josm.plugins.dir}"/>
+    </target>
 
     <!-- Before running "run" target, please "ant dist" the JOSM. -->
     <target name="run" depends="compile">
-        <java classname="org.openstreetmap.josm.plugins.czechaddress.intelligence.Reasoner">
+        <java classname="JOSM" fork="true">
             <jvmarg value="-Xmx1024m"/>
             <jvmarg value="-Xdebug"/>
@@ -57,9 +97,6 @@
                 <pathelement path="${java.class.path}"/>
             </classpath>
+        <arg value="/home/radek/Desktop/Hustopeče.osm"/>
         </java>
-        <exec executable="xsltproc" output="log.html">
-            <arg value="log.xsl"/>
-            <arg value="log.xml"/>
-        </exec>
     </target>
 
Index: applications/editors/josm/plugins/czechaddress/log.xsl
===================================================================
--- applications/editors/josm/plugins/czechaddress/log.xsl	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/log.xsl	(revision 15558)
@@ -18,6 +18,6 @@
         <xsl:choose>
             <xsl:when test="level = 'FINEST'">
-                <td><font color='#AAAAAA'><xsl:value-of select="level"/></font></td>
-                <td><xsl:value-of select="message"/></td>
+                <td><font color='#AAAAAA'><i><xsl:value-of select="level"/></i></font></td>
+		<td><i><xsl:value-of select="message"/></i></td>
             </xsl:when>
             <xsl:when test="level = 'FINER'">
@@ -26,6 +26,6 @@
             </xsl:when>
             <xsl:when test="level = 'FINE'">
-                <td><font color='#444444'><xsl:value-of select="level"/></font></td>
-                <td><xsl:value-of select="message"/></td>
+                <td><font color='#444444'><b><xsl:value-of select="level"/></b></font></td>
+                <td><b><xsl:value-of select="message"/></b></td>
             </xsl:when>
             <xsl:when test="level = 'INFO'">
Index: applications/editors/josm/plugins/czechaddress/nbproject/project.xml
===================================================================
--- applications/editors/josm/plugins/czechaddress/nbproject/project.xml	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/nbproject/project.xml	(revision 15558)
@@ -79,5 +79,5 @@
             <compilation-unit>
                 <package-root>src</package-root>
-                <classpath mode="compile">../../core/build:../../core/src:tests/junit-4.5.jar</classpath>
+                <classpath mode="compile">../../core/build:../../core/src</classpath>
                 <built-to>build</built-to>
                 <javadoc-built-to>doc</javadoc-built-to>
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/CzechAddressPlugin.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/CzechAddressPlugin.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/CzechAddressPlugin.java	(revision 15558)
@@ -2,17 +2,20 @@
 
 import java.awt.event.KeyEvent;
-import org.openstreetmap.josm.plugins.czechaddress.actions.PointManipulatorAction;
-import org.openstreetmap.josm.plugins.czechaddress.gui.LocationSelector;
-import org.openstreetmap.josm.plugins.czechaddress.actions.GroupManipulatorAction;
-import org.openstreetmap.josm.plugins.czechaddress.gui.ConflictResolver;
+import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashSet;
 import java.util.List;
-import javax.swing.AbstractButton;
+import java.util.Set;
+import java.util.logging.FileHandler;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.Logger;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
 
-import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Database;
-import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.ElementWithStreets;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.IconToggleButton;
 import org.openstreetmap.josm.gui.MainMenu;
@@ -20,5 +23,8 @@
 import org.openstreetmap.josm.plugins.Plugin;
 import org.openstreetmap.josm.plugins.czechaddress.actions.ConflictResolveAction;
-import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.AddressElement;
+import org.openstreetmap.josm.plugins.czechaddress.actions.GroupManipulatorAction;
+import org.openstreetmap.josm.plugins.czechaddress.actions.PointManipulatorAction;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Database;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.ElementWithStreets;
 import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.House;
 import org.openstreetmap.josm.plugins.czechaddress.parser.MvcrParser;
@@ -27,7 +33,7 @@
 import org.openstreetmap.josm.plugins.czechaddress.actions.ModifierAction;
 import org.openstreetmap.josm.plugins.czechaddress.actions.SplitAreaByEmptyWayAction;
-import org.openstreetmap.josm.plugins.czechaddress.gui.Inspector;
-import org.openstreetmap.josm.plugins.czechaddress.gui.Renamer;
+import org.openstreetmap.josm.plugins.czechaddress.gui.ConflictResolver;
 import org.openstreetmap.josm.plugins.czechaddress.gui.FactoryDialog;
+import org.openstreetmap.josm.plugins.czechaddress.gui.LocationSelector;
 import org.openstreetmap.josm.plugins.czechaddress.intelligence.Reasoner;
 import org.openstreetmap.josm.plugins.czechaddress.intelligence.SelectionMonitor;
@@ -41,41 +47,53 @@
 
 
-    JMenu czechMenu;
-    List<JMenuItem> menuItems = new ArrayList<JMenuItem>();
+    private JMenu czechMenu;
+    private List<JMenuItem> menuItems = new ArrayList<JMenuItem>();
+    private static Logger logger = Logger.getLogger(CzechAddressPlugin.class.getName());
 
-    List<AbstractButton> pluginButtons =
-            new ArrayList<AbstractButton>();
+    public void initLoggers() {
 
-    static public Reasoner reasoner = null;
-    static public Database database = null;
+        String filename = getPluginDir() + "-log.xml";
+        /*final Logger[] loggers = new Logger[]
+            {logger, Reasoner.logger, ConflictResolver.logger};*/
 
-    static public FactoryDialog     factoryDialog    = null;
-    static public ConflictResolver  conflictResolver = null;
+        try {
+            Handler fileHandler = new FileHandler(filename);
+            fileHandler.setLevel(Level.ALL);
+            for (Enumeration<String> e = LogManager.getLogManager().getLoggerNames();
+                    e.hasMoreElements();) {
+                String name = e.nextElement();
+                if (!name.startsWith(CzechAddressPlugin.class.getPackage().getName()))
+                    continue;
 
-    static public Renamer   renamer  = null;
-    static public Inspector inspector = null;
-
-
-    static private String pluginDir = null;
+                System.err.println(name);
+                Logger.getLogger(name).setLevel(Level.FINE);
+                Logger.getLogger(name).addHandler(fileHandler);
+            }
+            
+        } catch (IOException ex) {
+            logger.log(Level.SEVERE, "cannot create file", ex);
+        } catch (SecurityException ex) {
+            logger.log(Level.SEVERE, "permission denied", ex);
+        }
+    }
 
     public CzechAddressPlugin() {
 
-        pluginDir = getPluginDir();
         addStatusListener(this);
+        
+        Reasoner.getInstance();
+        ConflictResolver.getInstance();
+        SelectionMonitor.getInstance();
 
-        factoryDialog    = new FactoryDialog();
-        conflictResolver = new ConflictResolver();
-
+        initLoggers();
         
         MainMenu.add(Main.main.menu.toolsMenu, new SplitAreaByEmptyWayAction());
 
+        // Prepare for filling the database.
+        final MvcrParser parser = new MvcrParser();
+        parser.setTargetDatabase(Database.getInstance());
+        parser.setStorageDir(getPluginDir());
 
-        // Prepare for filling the database.
-        database = new Database();
-        final MvcrParser parser = new MvcrParser();
-        //parser.setFilter(null, null, null, "");
-        //parser.setFilter("HUSTOPEČE", "HUSTOPEČE", null, null);
-        parser.setTargetDatabase(database);
-        parser.setStorageDir(pluginDir);
+        parser.setFilter("HUSTOPEČE", "HUSTOPEČE", null, null);
 
         // Fill the database in separate thread.
@@ -102,23 +120,30 @@
             return;
         
-        newFrame.addToggleDialog(factoryDialog);
+        newFrame.addToggleDialog(FactoryDialog.getInstance());
         newFrame.addMapMode(new IconToggleButton(new FactoryAction(newFrame)));
     }
 
     static public void initReasoner() {
+        Reasoner reasoner = Reasoner.getInstance();
 
-        // Move houses from list of Houses to list of AddressElements.
-        List<House> houses   = location.getAllHouses();
-        ArrayList<AddressElement> pool
-                = new ArrayList<AddressElement>(houses.size());
-        for (House house : houses) pool.add(house);
-
-        // Update database according to the map
-        (new Renamer()).setVisible(true);
-        (new Inspector()).setVisible(true);
-
-        // And add them to the reasoner.
-        reasoner = new Reasoner(pool);
-        reasoner.addPrimitives(Main.ds.allPrimitives());
+        synchronized(reasoner) {
+            reasoner.reset();
+            reasoner.openTransaction();
+            //Reasoner.logger.setLevel(Level.OFF);
+            for (House house : location.getAllHouses())
+                reasoner.consider(house);
+            for (OsmPrimitive prim : Main.ds.allPrimitives()) {
+                boolean include = false;
+                for (String key : prim.keySet())
+                    if (key.startsWith("addr:")) {
+                        include = true;
+                        break;
+                    }
+                if (include)
+                    reasoner.consider(prim);
+            }
+            //Reasoner.logger.setLevel(Level.ALL);
+            reasoner.closeTransaction();
+        }
     }
 
@@ -127,5 +152,4 @@
         if (location == null)
             changeLocation();
-
         return location;
     }
@@ -139,22 +163,11 @@
         }
     }
-
-
     
-    static private List<StatusListener> listeners =
-                    new ArrayList<StatusListener>();
-
-    static public void addStatusListener(StatusListener l) {
-        if (!listeners.contains(l))
-            listeners.add(l);
-    }
-
-    static public void removeStatusListener(StatusListener l) {
-        listeners.remove(l);
-    }
-
+    static private Set<StatusListener> listeners = new HashSet<StatusListener>();
+    static public void addStatusListener(StatusListener l)    {listeners.add(l);}
+    static public void removeStatusListener(StatusListener l) {listeners.remove(l);}
     static public void broadcastStatusChange(int statusMessage) {
-        for (StatusListener l : listeners)
-            l.pluginStatusChanged(statusMessage);
+        for (StatusListener listener : listeners)
+            listener.pluginStatusChanged(statusMessage);
     }
 
@@ -174,12 +187,4 @@
             return;
         }
-
-
-        // SelectionMonitor cannot be used because of synchronization problems.
-        /*if (message == MESSAGE_REASONER_REASONED) {
-            System.out.println("ReasonerReasoned");
-            if (selectionMonitor == null)
-                selectionMonitor = new SelectionMonitor();
-        }*/
     }
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/PrimUtils.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/PrimUtils.java	(revision 15558)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/PrimUtils.java	(revision 15558)
@@ -0,0 +1,61 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.openstreetmap.josm.plugins.czechaddress;
+
+import java.util.Comparator;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
+
+/**
+ *
+ * @author Radomír Černoch, radomir.cernoch@gmail.com
+ */
+public class PrimUtils implements Comparator<OsmPrimitive> {
+
+    public static final String KEY_ADDR_CP      = "addr:alternatenumber";
+    public static final String KEY_ADDR_CO      = "addr:housenumber";
+    public static final String KEY_ADDR_STREET  = "addr:street";
+    public static final String KEY_ADDR_CITY    = "addr:city";
+    public static final String KEY_ADDR_COUNTRY = "addr:country";
+    public static final String KEY_IS_IN        = "is_in";
+    public static final String KEY_NAME         = "name";
+
+
+    private static final String[] keysToCompare = new String[]
+        {KEY_ADDR_COUNTRY, KEY_ADDR_CITY, KEY_IS_IN,
+         KEY_ADDR_STREET, KEY_ADDR_CO, KEY_ADDR_CP, KEY_NAME };
+
+    public int compare(OsmPrimitive o1, OsmPrimitive o2) {
+
+        for (String key : keysToCompare) {
+            if (o1.get(key) == null) continue;
+            if (o2.get(key) == null) continue;
+
+            int val = o1.get(key).compareTo(o2.get(key));
+            if (val != 0) return val;
+        }
+
+
+        return o1.toString().compareTo(o2.toString());
+
+        /*LatLon pos1 = null;
+        LatLon pos2 = null;
+        if (o1 instanceof Node) pos1 = ((Node) o1).coor;
+        if (o1 instanceof Way)  pos1 = ((Way)  o1).lastNode().coor;
+        if (o2 instanceof Node) pos1 = ((Node) o2).coor;
+        if (o2 instanceof Way)  pos1 = ((Way)  o2).lastNode().coor;
+
+        if (pos1 != null && pos2 != null) {
+            if (pos1.lat() < pos2.lat()) return -1;
+            if (pos1.lat() > pos2.lat()) return  1;
+            if (pos1.lon() < pos2.lon()) return -1;
+            if (pos1.lon() > pos2.lon()) return  1;
+        }*/
+    }
+
+}
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/StatusListener.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/StatusListener.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/StatusListener.java	(revision 15558)
@@ -38,26 +38,4 @@
 
     /**
-     * List of {@code matches} from the reasoner has changed.
-     *
-     * <p>The current reasoner can be obtained by
-     * {@link CzechAddressPlugin}{@code .getReasoner()}.</p>
-     *
-     * @see Reasoner
-     * @see Match
-     */
-    static final int MESSAGE_MATCHES_CHANGED = 2;
-
-    /**
-     * There is a new conflict spotted by the reasoner.
-     *
-     * <p>The current reasoner can be obtained by
-     * {@link CzechAddressPlugin}{@code .getReasoner()}.</p>
-     *
-     * @see Reasoner
-     * @see Match
-     */
-    static final int MESSAGE_CONFLICT_CHANGED  = 3;
-
-    /**
      * All parsers have finished their parsing.
      *
@@ -68,18 +46,5 @@
      * @see Database
      */
-    static final int MESSAGE_DATABASE_LOADED   = 4;
-
-    /**
-     * The reasoner has finished his reasoning.
-     *
-     * <p>First such message also signalizes, that there is a reasoner
-     * available.</p>
-     *
-     * <p>The current reasoner can be obtained by
-     * {@link CzechAddressPlugin}{@code .getReasoner()}.</p>
-     *
-     * @see Reasoner
-     */
-     static final int MESSAGE_REASONER_REASONED = 5;
+    static final int MESSAGE_DATABASE_LOADED   = 2;
 
     /**
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/StringUtils.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/StringUtils.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/StringUtils.java	(revision 15558)
@@ -12,5 +12,5 @@
  * @author Radomír Černoch, radomir.cernoch@gmail.com
  */
-public class StringUtils {
+public abstract class StringUtils {
 
     /**
@@ -55,5 +55,5 @@
      * s2="Náměstí Svobody".</p>
      */
-    public boolean matchAbbrev(String s1, String s2) {
+    public static boolean matchAbbrev(String s1, String s2) {
         String[] parts1 = s1.split(" +");
         String[] parts2 = s2.split(" +");
@@ -116,4 +116,3 @@
         return result;
     }
-
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/ConflictResolveAction.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/ConflictResolveAction.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/ConflictResolveAction.java	(revision 15558)
@@ -39,6 +39,5 @@
      */
     public void actionPerformed(ActionEvent e) {
-        if (CzechAddressPlugin.conflictResolver == null) return;
-        CzechAddressPlugin.conflictResolver.setVisible(true);
+        ConflictResolver.getInstance().setVisible(true);
     }
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/FactoryAction.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/FactoryAction.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/FactoryAction.java	(revision 15558)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.plugins.czechaddress.CzechAddressPlugin;
 import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.House;
+import org.openstreetmap.josm.plugins.czechaddress.intelligence.Reasoner;
 import org.openstreetmap.josm.plugins.czechaddress.proposal.ProposalContainer;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -53,12 +54,7 @@
         Main.map.mapView.addMouseListener(this);
 
-        if (CzechAddressPlugin.reasoner == null) {
-            exitMode();
-            return;
-        }
-
         // Switch to next unassigned house.
-        FactoryDialog d = CzechAddressPlugin.factoryDialog;
-        if (CzechAddressPlugin.reasoner.translate(d.getSelectedHouse()) != null)
+        FactoryDialog d = FactoryDialog.getInstance();
+        if (Reasoner.getInstance().translate(d.getSelectedHouse()) != null)
             d.selectNextUnmatchedHouseByCheckBox();
     }
@@ -86,5 +82,5 @@
 
         // Get the currently selected House in the FactoryDialog.
-        House house = CzechAddressPlugin.factoryDialog.getSelectedHouse();
+        House house = FactoryDialog.getInstance().getSelectedHouse();
         if (house == null)
             return; // TODO: Some meaningful messageBox would be useful.
@@ -97,10 +93,15 @@
         container.applyAll();
 
+        Reasoner r = Reasoner.getInstance();
+        synchronized(r) {
+            r.openTransaction();
+            r.doOverwrite(newNode, house);
+            r.closeTransaction();
+        }
+        FactoryDialog.getInstance().selectNextUnmatchedHouseByCheckBox();
+
         // And make the new node selected.
         Main.ds.addPrimitive(newNode);
         Main.ds.setSelected(newNode);
-
-        CzechAddressPlugin.reasoner.overwriteMatch(house, newNode);
-        CzechAddressPlugin.factoryDialog.selectNextUnmatchedHouseByCheckBox();
     }
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/AddressElement.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/AddressElement.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/AddressElement.java	(revision 15558)
@@ -16,16 +16,8 @@
  * @author Radomír Černoch radomir.cernoch@gmail.com
  */
-public abstract class AddressElement {
+public abstract class AddressElement implements Comparable<AddressElement> {
 
     protected String name;
     protected AddressElement parent = null;
-
-    protected static final String KEY_ADDR_CP      = "addr:alternatenumber";
-    protected static final String KEY_ADDR_CO      = "addr:housenumber";
-    protected static final String KEY_ADDR_STREET  = "addr:street";
-    protected static final String KEY_ADDR_CITY    = "addr:city";
-    protected static final String KEY_ADDR_COUNTRY = "addr:country";
-    protected static final String KEY_IS_IN        = "is_in";
-    protected static final String KEY_NAME         = "name";
 
     /**
@@ -199,5 +191,13 @@
                 elemValue.trim().toUpperCase())) ? 1 : -1;
     }
-    
+
+    public static int matchFieldAbbrev(String elemValue, String primValue) {
+
+        if (elemValue == null) return  0;
+        if (primValue == null) return -1;
+
+        return StringUtils.matchAbbrev(primValue, elemValue) ? 1 : -1;
+    }
+
     
     protected int[] getFieldMatchList(OsmPrimitive primitive) {
@@ -211,9 +211,4 @@
     }
 
-    public boolean isMatchable(OsmPrimitive prim) {
-        return false;
-    }
-
-    
     public int getMatchQuality(OsmPrimitive primitive) {
         
@@ -278,3 +273,14 @@
         return result;
     }
+
+    public int compareTo(AddressElement elem) {
+
+        ParentResolver r1 = new ParentResolver(this);
+        ParentResolver r2 = new ParentResolver(elem);
+
+        int retVal = r1.compareTo(r2);
+        if (retVal != 0) return retVal;
+
+        return getName().compareTo(((AddressElement) elem).getName());
+    }
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/Database.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/Database.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/Database.java	(revision 15558)
@@ -14,4 +14,13 @@
  */
 public class Database {
+
+    private Database() {}
+    private static Database singleton = null;
+    public  static Database getInstance() {
+        if (singleton == null)
+            singleton = new Database();
+
+        return singleton;
+    }
 
     /**
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/House.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/House.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/House.java	(revision 15558)
@@ -4,4 +4,6 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.plugins.czechaddress.NotNullList;
+import org.openstreetmap.josm.plugins.czechaddress.PrimUtils;
+import org.openstreetmap.josm.plugins.czechaddress.StringUtils;
 import org.openstreetmap.josm.plugins.czechaddress.proposal.Proposal;
 
@@ -139,10 +141,11 @@
                 
         // First field is the AlternateNubmer
-        result[0] = matchField(this.cp, prim.get(KEY_ADDR_CP));
+        result[0] = matchField(this.cp, prim.get(PrimUtils.KEY_ADDR_CP));
         
         // Second field is the Housenumber
         if (parent instanceof Street)
-            result[1] = Math.min( matchField(parent.getName(), prim.get(KEY_ADDR_STREET)),
-                                  matchField(this.co,          prim.get(KEY_ADDR_CO)) );
+            result[1] = Math.min(
+                matchFieldAbbrev(parent.getName(), prim.get(PrimUtils.KEY_ADDR_STREET)),
+                matchField(      this.co,          prim.get(PrimUtils.KEY_ADDR_CO)) );
         return result;
     }
@@ -160,40 +163,19 @@
         ParentResolver pr = new ParentResolver(this);
 
-        props.add(getStringFieldDiff(KEY_ADDR_CP, prim.get(KEY_ADDR_CP), getCP()));
-        props.add(getStringFieldDiff(KEY_ADDR_CO, prim.get(KEY_ADDR_CO), getCO()));
-
-        props.add(getStringFieldDiff(KEY_ADDR_COUNTRY,
-                            prim.get(KEY_ADDR_COUNTRY), "CZ"));
+        props.add(getStringFieldDiff(PrimUtils.KEY_ADDR_CP, prim.get(PrimUtils.KEY_ADDR_CP), getCP()));
+        props.add(getStringFieldDiff(PrimUtils.KEY_ADDR_CO, prim.get(PrimUtils.KEY_ADDR_CO), getCO()));
+
+        props.add(getStringFieldDiff(PrimUtils.KEY_ADDR_COUNTRY,
+                            prim.get(PrimUtils.KEY_ADDR_COUNTRY), "CZ"));
 
         if (pr.parentStreet != null)
-            props.add(getStringFieldDiff(KEY_ADDR_STREET,
-                                prim.get(KEY_ADDR_STREET),
+            props.add(getStringFieldDiff(PrimUtils.KEY_ADDR_STREET,
+                                prim.get(PrimUtils.KEY_ADDR_STREET),
                                 pr.parentStreet.getName()));
-        
-/*        if (pr.parentViToCi != null) {
-            String targetIsIn = "";
-
-            if ((pr.parentSuburb != null) &&
-                !(pr.parentViToCi.getName().equals(pr.parentSuburb.getName())))
-                targetIsIn += pr.parentSuburb.getName() + ", ";
-
-            targetIsIn += pr.parentViToCi.getName() + ", ";
-
-            if (pr.parentRegion != null)
-                targetIsIn += pr.parentRegion.getNuts3Name() + " kraj, ";
-
-            targetIsIn += "CZ";
-
-            props.add(getStringFieldDiff(KEY_ADDR_CITY,
-                                prim.get(KEY_ADDR_CITY),
-                                pr.parentViToCi.getName()));
-*/
-        
-        
+
         if (parent.parent != null) // For sure our parent is a ElemWithStreets
-            props.add(getStringFieldDiff(KEY_IS_IN,
-                                prim.get(KEY_IS_IN),
+            props.add(getStringFieldDiff(PrimUtils.KEY_IS_IN,
+                                prim.get(PrimUtils.KEY_IS_IN),
                                 parent.parent.getIsIn()));
-/*        }*/
 
         // If we have added any proposal so far, add the source info as well.
@@ -204,5 +186,5 @@
     }
 
-    public boolean isMatchable(OsmPrimitive prim) {
+    public static boolean isMatchable(OsmPrimitive prim) {
         
         for (String key : prim.keySet()) {
@@ -211,6 +193,25 @@
                 return true;
         }
-
         return false;
     }
+
+    @Override
+    public int compareTo(AddressElement o) {
+        // Most important criterion is the street
+        int val = super.compareTo(o);
+        if (val != 0) return val;
+        if (!(o instanceof House)) return val;
+
+        House house = (House) o;
+
+        // Second most important is the "CO"
+        if (co != null && house.co != null)
+            val = co.compareTo(house.co);
+        if (val != 0) return val;
+
+        // Third most important is the "CP"
+        if (cp != null && house.cp != null)
+            val = cp.compareTo(house.cp);
+        return val;
+    }
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/ParentResolver.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/ParentResolver.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/ParentResolver.java	(revision 15558)
@@ -10,5 +10,5 @@
  * @author Radomír Černoch, radomir.cernoch@gmail.com
  */
-public class ParentResolver {
+public class ParentResolver implements Comparable<ParentResolver> {
 
     public Street parentStreet = null;
@@ -39,3 +39,26 @@
         }
     }
+
+    public int compareTo(ParentResolver o) {
+        int val = 0;
+
+        if (parentRegion != null && o.parentRegion != null)
+            val = parentRegion.compareTo(o.parentRegion);
+        if (val != 0)
+            return val;
+
+        if (parentViToCi != null && o.parentViToCi != null)
+            val = parentViToCi.compareTo(o.parentViToCi);
+        if (val != 0)
+            return val;
+
+        if (parentSuburb != null && o.parentSuburb != null)
+            val = parentSuburb.compareTo(o.parentSuburb);
+        if (val != 0)
+            return val;
+
+        if (parentStreet != null && o.parentStreet != null)
+            val = parentStreet.compareTo(o.parentStreet);
+        return val;
+    }
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/ConflictResolver.form
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/ConflictResolver.form	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/ConflictResolver.form	(revision 15558)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
-<Form version="1.3" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+<Form version="1.3" maxVersion="1.3" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
   <Properties>
     <Property name="defaultCloseOperation" type="int" value="2"/>
@@ -18,5 +18,5 @@
     <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
     <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
-    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,36,0,0,2,13"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,93,0,0,2,-114"/>
   </AuxValues>
 
@@ -33,51 +33,53 @@
               <Group type="102" alignment="1" attributes="0">
                   <Group type="103" groupAlignment="0" attributes="0">
-                      <Component id="jLabel4" min="-2" max="-2" attributes="0"/>
-                      <Component id="jLabel5" min="-2" max="-2" attributes="0"/>
-                      <Component id="jLabel6" min="-2" max="-2" attributes="0"/>
+                      <Component id="candLabel" min="-2" max="-2" attributes="0"/>
+                      <Component id="mainLabel" min="-2" max="-2" attributes="0"/>
                   </Group>
-                  <EmptySpace min="-2" max="-2" attributes="0"/>
+                  <EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
                   <Group type="103" groupAlignment="0" attributes="0">
-                      <Group type="102" alignment="1" attributes="0">
-                          <Component id="candTextField" pref="232" max="32767" attributes="1"/>
-                          <EmptySpace max="-2" attributes="0"/>
-                          <Component id="candReassignButton" min="-2" max="-2" attributes="0"/>
-                      </Group>
-                      <Component id="bestTextField" alignment="0" pref="319" max="32767" attributes="1"/>
-                      <Component id="mainTextField" alignment="0" pref="319" max="32767" attributes="1"/>
+                      <Component id="candField" alignment="1" pref="430" max="32767" attributes="1"/>
+                      <Component id="mainField" alignment="0" pref="430" max="32767" attributes="1"/>
                   </Group>
-                  <EmptySpace min="-2" max="-2" attributes="0"/>
+                  <EmptySpace max="-2" attributes="0"/>
                   <Group type="103" groupAlignment="1" attributes="0">
+                      <Component id="candZoomButton" min="-2" max="-2" attributes="0"/>
                       <Component id="mainZoomButton" min="-2" max="-2" attributes="0"/>
-                      <Component id="bestZoomButton" min="-2" max="-2" attributes="0"/>
-                      <Component id="candZoomButton" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="mainPickButton" min="-2" max="-2" attributes="0"/>
+                      <Component id="candPickButton" alignment="0" min="-2" max="-2" attributes="0"/>
                   </Group>
               </Group>
-              <Component id="jTabbedPane1" alignment="0" pref="525" max="32767" attributes="1"/>
+              <Group type="102" alignment="1" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Component id="reassignButton" min="-2" max="-2" attributes="0"/>
+              </Group>
           </Group>
         </DimensionLayout>
         <DimensionLayout dim="1">
           <Group type="103" groupAlignment="0" attributes="0">
-              <Group type="102" alignment="1" attributes="0">
-                  <Component id="jTabbedPane1" pref="199" max="32767" attributes="0"/>
-                  <EmptySpace max="-2" attributes="0"/>
-                  <Group type="103" groupAlignment="3" attributes="0">
-                      <Component id="mainTextField" alignment="3" min="-2" max="-2" attributes="0"/>
-                      <Component id="mainZoomButton" alignment="3" min="-2" max="-2" attributes="0"/>
-                      <Component id="jLabel4" alignment="3" min="-2" max="-2" attributes="0"/>
+              <Group type="102" alignment="0" attributes="0">
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="103" alignment="0" groupAlignment="3" attributes="0">
+                          <Component id="mainField" alignment="3" min="-2" max="-2" attributes="0"/>
+                          <Component id="mainLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" attributes="0">
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="mainZoomButton" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="mainPickButton" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="candPickButton" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="candZoomButton" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="candField" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="candLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
                   </Group>
-                  <EmptySpace max="-2" attributes="0"/>
-                  <Group type="103" groupAlignment="3" attributes="0">
-                      <Component id="bestTextField" alignment="3" min="-2" max="-2" attributes="0"/>
-                      <Component id="bestZoomButton" alignment="3" min="-2" max="-2" attributes="0"/>
-                      <Component id="jLabel5" alignment="3" min="-2" max="-2" attributes="0"/>
-                  </Group>
-                  <EmptySpace max="-2" attributes="0"/>
-                  <Group type="103" groupAlignment="3" attributes="0">
-                      <Component id="candReassignButton" alignment="3" min="-2" max="-2" attributes="0"/>
-                      <Component id="candTextField" alignment="3" min="-2" max="-2" attributes="0"/>
-                      <Component id="candZoomButton" alignment="3" min="-2" max="-2" attributes="0"/>
-                      <Component id="jLabel6" alignment="3" min="-2" max="-2" attributes="0"/>
-                  </Group>
+                  <EmptySpace max="32767" attributes="0"/>
+                  <Component id="reassignButton" min="-2" max="-2" attributes="0"/>
               </Group>
           </Group>
@@ -88,4 +90,5 @@
           <Properties>
             <Property name="text" type="java.lang.String" value="     "/>
+            <Property name="enabled" type="boolean" value="false"/>
           </Properties>
           <Events>
@@ -93,97 +96,21 @@
           </Events>
         </Component>
-        <Component class="javax.swing.JButton" name="bestZoomButton">
+        <Component class="javax.swing.JLabel" name="mainLabel">
           <Properties>
-            <Property name="text" type="java.lang.String" value="     "/>
-          </Properties>
-          <Events>
-            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bestZoomButtonActionPerformed"/>
-          </Events>
-        </Component>
-        <Container class="javax.swing.JTabbedPane" name="jTabbedPane1">
-
-          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
-          <SubComponents>
-            <Container class="javax.swing.JScrollPane" name="jScrollPane1">
-              <AuxValues>
-                <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
-              </AuxValues>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
-                  <JTabbedPaneConstraints tabName="Dle datab&#xe1;ze">
-                    <Property name="tabTitle" type="java.lang.String" value="Dle datab&#xe1;ze"/>
-                  </JTabbedPaneConstraints>
-                </Constraint>
-              </Constraints>
-
-              <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
-              <SubComponents>
-                <Component class="javax.swing.JTree" name="elemConflictTree">
-                  <Events>
-                    <EventHandler event="valueChanged" listener="javax.swing.event.TreeSelectionListener" parameters="javax.swing.event.TreeSelectionEvent" handler="treeValueChanged"/>
-                  </Events>
-                </Component>
-              </SubComponents>
-            </Container>
-            <Container class="javax.swing.JScrollPane" name="jScrollPane2">
-              <AuxValues>
-                <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
-              </AuxValues>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
-                  <JTabbedPaneConstraints tabName="Dle mapy">
-                    <Property name="tabTitle" type="java.lang.String" value="Dle mapy"/>
-                  </JTabbedPaneConstraints>
-                </Constraint>
-              </Constraints>
-
-              <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
-              <SubComponents>
-                <Component class="javax.swing.JTree" name="primConflictTree">
-                  <Events>
-                    <EventHandler event="valueChanged" listener="javax.swing.event.TreeSelectionListener" parameters="javax.swing.event.TreeSelectionEvent" handler="treeValueChanged"/>
-                  </Events>
-                </Component>
-              </SubComponents>
-            </Container>
-          </SubComponents>
-        </Container>
-        <Component class="javax.swing.JLabel" name="jLabel4">
-          <Properties>
-            <Property name="text" type="java.lang.String" value="Objekt v konfliktu:"/>
+            <Property name="text" type="java.lang.String" value="Nejednozna&#x10d;n&#xfd; prvek:"/>
           </Properties>
         </Component>
-        <Component class="javax.swing.JTextField" name="mainTextField">
+        <Component class="javax.swing.JButton" name="reassignButton">
           <Properties>
-            <Property name="editable" type="boolean" value="false"/>
-          </Properties>
-        </Component>
-        <Component class="javax.swing.JTextField" name="bestTextField">
-          <Properties>
-            <Property name="editable" type="boolean" value="false"/>
-          </Properties>
-        </Component>
-        <Component class="javax.swing.JLabel" name="jLabel5">
-          <Properties>
-            <Property name="text" type="java.lang.String" value="Nejlep&#x161;&#xed; p&#x159;i&#x159;azen&#xed;:"/>
-          </Properties>
-        </Component>
-        <Component class="javax.swing.JTextField" name="candTextField">
-          <Properties>
-            <Property name="editable" type="boolean" value="false"/>
-          </Properties>
-        </Component>
-        <Component class="javax.swing.JButton" name="candReassignButton">
-          <Properties>
-            <Property name="text" type="java.lang.String" value="P&#x159;i&#x159;adit"/>
+            <Property name="text" type="java.lang.String" value="Ur&#x10d;it jako nejlep&#x161;&#xed; p&#x159;i&#x159;a&#x17e;en&#xed;"/>
             <Property name="enabled" type="boolean" value="false"/>
           </Properties>
           <Events>
-            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="candReassignButtonActionPerformed"/>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="reassignButtonActionPerformed"/>
           </Events>
         </Component>
-        <Component class="javax.swing.JLabel" name="jLabel6">
+        <Component class="javax.swing.JLabel" name="candLabel">
           <Properties>
-            <Property name="text" type="java.lang.String" value="Probl&#xe9;mov&#xfd; element:"/>
+            <Property name="text" type="java.lang.String" value="Kandid&#xe1;ti na p&#x159;i&#x159;azen&#xed;:"/>
           </Properties>
         </Component>
@@ -191,7 +118,50 @@
           <Properties>
             <Property name="text" type="java.lang.String" value="     "/>
+            <Property name="enabled" type="boolean" value="false"/>
           </Properties>
           <Events>
             <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="mainZoomButtonActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JComboBox" name="mainField">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="4">
+                <StringItem index="0" value="Item 1"/>
+                <StringItem index="1" value="Item 2"/>
+                <StringItem index="2" value="Item 3"/>
+                <StringItem index="3" value="Item 4"/>
+              </StringArray>
+            </Property>
+            <Property name="renderer" type="javax.swing.ListCellRenderer" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+              <Connection code="new UniversalListRenderer()" type="code"/>
+            </Property>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JComboBox" name="candField">
+          <Properties>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="1">
+                <StringItem index="0" value=" "/>
+              </StringArray>
+            </Property>
+            <Property name="renderer" type="javax.swing.ListCellRenderer" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+              <Connection code="new UniversalListRenderer()" type="code"/>
+            </Property>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JButton" name="candPickButton">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="     "/>
+            <Property name="enabled" type="boolean" value="false"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JButton" name="mainPickButton">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="     "/>
+            <Property name="enabled" type="boolean" value="false"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="mainPickButtonActionPerformed"/>
           </Events>
         </Component>
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/ConflictResolver.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/ConflictResolver.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/ConflictResolver.java	(revision 15558)
@@ -1,55 +1,74 @@
 package org.openstreetmap.josm.plugins.czechaddress.gui;
 
+import java.awt.Component;
+import java.awt.Font;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.openstreetmap.josm.plugins.czechaddress.*;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JList;
+import javax.swing.event.ListDataListener;
 import javax.swing.Icon;
-import javax.swing.tree.TreePath;
+import javax.swing.JButton;
+import javax.swing.event.ListDataEvent;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.plugins.czechaddress.MapUtils;
+import org.openstreetmap.josm.plugins.czechaddress.NotNullList;
+import org.openstreetmap.josm.plugins.czechaddress.PrimUtils;
 import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.AddressElement;
-import org.openstreetmap.josm.plugins.czechaddress.intelligence.Match;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.House;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Street;
 import org.openstreetmap.josm.plugins.czechaddress.intelligence.Reasoner;
+import org.openstreetmap.josm.plugins.czechaddress.intelligence.ReasonerListener;
+import org.openstreetmap.josm.plugins.czechaddress.gui.utils.UniversalListRenderer;
 import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
- * Dialog for displaying and handling conflicts.
+ * Dialog for displaying and handling getConflicts.
  *
  * @author Radomír Černoch, radomir.cernoch@gmail.com
  */
-public class ConflictResolver extends ExtendedDialog
-        implements StatusListener {
-
-    private Object selMainObj = null;
-    private Object selBestFit = null;
-    private Object selCandObj = null;
+public class ConflictResolver extends ExtendedDialog {
+
+    private static ConflictResolver singleton = null;
+    public static ConflictResolver getInstance() {
+        if (singleton == null)
+            singleton = new ConflictResolver();
+        return singleton;
+    }
+
+    public static Logger logger = Logger.getLogger(ConflictResolver.class.getName());
 
     /**
      * Creates new dialog, but does not display it, nor hook to messages.
      */
-    public ConflictResolver() {
-
-        super(Main.parent, "Řešení konfliktů",
-                       new String[] { }, true);
-
+    private ConflictResolver() {
+
+        super(Main.parent, "Řešení konfliktů", new String[] {}, true);
         initComponents();
 
-        elemConflictTree.setModel(new ElemTreeModel());
-        primConflictTree.setModel(new PrimTreeModel());
-
-        elemConflictTree.setCellRenderer(new UniversalTreeRenderer());
-        primConflictTree.setCellRenderer(new UniversalTreeRenderer());
+        mainField.setModel(conflictModel);
+//        conflictModel.addListDataListener(mainField);
+
+        Reasoner.getInstance().addListener(new ReasonerHook());
 
         // Create those lovely 'zoom' icons for professional look.
         Icon zoomIcon = ImageProvider.get("zoom.png");
         mainZoomButton.setIcon(zoomIcon); mainZoomButton.setText("");
-        bestZoomButton.setIcon(zoomIcon); bestZoomButton.setText("");
         candZoomButton.setIcon(zoomIcon); candZoomButton.setText("");
 
+        Icon cursorIcon = ImageProvider.get("cursor.png");
+        mainPickButton.setIcon(cursorIcon); mainPickButton.setText("");
+        candPickButton.setIcon(cursorIcon); candPickButton.setText("");
+
         // And finalize initializing the form.
-        setupDialog(mainPanel, new String[] { });
-        setAlwaysOnTop(false);
-
+        setupDialog(mainPanel, new String[] {});
         // TODO: Why does it always crash if the modality is set in constructor?
         setModal(false);
@@ -62,27 +81,23 @@
      */
     @SuppressWarnings("unchecked")
-    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
     private void initComponents() {
+
         mainPanel = new javax.swing.JPanel();
         candZoomButton = new javax.swing.JButton();
-        bestZoomButton = new javax.swing.JButton();
-        jTabbedPane1 = new javax.swing.JTabbedPane();
-        jScrollPane1 = new javax.swing.JScrollPane();
-        elemConflictTree = new javax.swing.JTree();
-        jScrollPane2 = new javax.swing.JScrollPane();
-        primConflictTree = new javax.swing.JTree();
-        jLabel4 = new javax.swing.JLabel();
-        mainTextField = new javax.swing.JTextField();
-        bestTextField = new javax.swing.JTextField();
-        jLabel5 = new javax.swing.JLabel();
-        candTextField = new javax.swing.JTextField();
-        candReassignButton = new javax.swing.JButton();
-        jLabel6 = new javax.swing.JLabel();
+        mainLabel = new javax.swing.JLabel();
+        reassignButton = new javax.swing.JButton();
+        candLabel = new javax.swing.JLabel();
         mainZoomButton = new javax.swing.JButton();
-
+        mainField = new javax.swing.JComboBox();
+        candField = new javax.swing.JComboBox();
+        candPickButton = new javax.swing.JButton();
+        mainPickButton = new javax.swing.JButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
         getContentPane().setLayout(new java.awt.GridLayout(1, 0));
 
-        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
         candZoomButton.setText("     ");
+        candZoomButton.setEnabled(false);
         candZoomButton.addActionListener(new java.awt.event.ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent evt) {
@@ -91,55 +106,38 @@
         });
 
-        bestZoomButton.setText("     ");
-        bestZoomButton.addActionListener(new java.awt.event.ActionListener() {
+        mainLabel.setText("Nejednoznačný prvek:");
+
+        reassignButton.setText("Určit jako nejlepší přiřažení");
+        reassignButton.setEnabled(false);
+        reassignButton.addActionListener(new java.awt.event.ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bestZoomButtonActionPerformed(evt);
+                reassignButtonActionPerformed(evt);
             }
         });
 
-        elemConflictTree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
-            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
-                treeValueChanged(evt);
-            }
-        });
-
-        jScrollPane1.setViewportView(elemConflictTree);
-
-        jTabbedPane1.addTab("Dle datab\u00e1ze", jScrollPane1);
-
-        primConflictTree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
-            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
-                treeValueChanged(evt);
-            }
-        });
-
-        jScrollPane2.setViewportView(primConflictTree);
-
-        jTabbedPane1.addTab("Dle mapy", jScrollPane2);
-
-        jLabel4.setText("Objekt v konfliktu:");
-
-        mainTextField.setEditable(false);
-
-        bestTextField.setEditable(false);
-
-        jLabel5.setText("Nejlep\u0161\u00ed p\u0159i\u0159azen\u00ed:");
-
-        candTextField.setEditable(false);
-
-        candReassignButton.setText("P\u0159i\u0159adit");
-        candReassignButton.setEnabled(false);
-        candReassignButton.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                candReassignButtonActionPerformed(evt);
-            }
-        });
-
-        jLabel6.setText("Probl\u00e9mov\u00fd element:");
+        candLabel.setText("Kandidáti na přiřazení:");
 
         mainZoomButton.setText("     ");
+        mainZoomButton.setEnabled(false);
         mainZoomButton.addActionListener(new java.awt.event.ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent evt) {
                 mainZoomButtonActionPerformed(evt);
+            }
+        });
+
+        mainField.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
+        mainField.setRenderer(new UniversalListRenderer());
+
+        candField.setModel(new javax.swing.DefaultComboBoxModel(new String[] { " " }));
+        candField.setRenderer(new UniversalListRenderer());
+
+        candPickButton.setText("     ");
+        candPickButton.setEnabled(false);
+
+        mainPickButton.setText("     ");
+        mainPickButton.setEnabled(false);
+        mainPickButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                mainPickButtonActionPerformed(evt);
             }
         });
@@ -151,43 +149,43 @@
             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
                 .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                    .addComponent(jLabel4)
-                    .addComponent(jLabel5)
-                    .addComponent(jLabel6))
+                    .addComponent(candLabel)
+                    .addComponent(mainLabel))
+                .addGap(6, 6, 6)
+                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(candField, javax.swing.GroupLayout.Alignment.TRAILING, 0, 430, Short.MAX_VALUE)
+                    .addComponent(mainField, 0, 430, Short.MAX_VALUE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addComponent(candZoomButton)
+                    .addComponent(mainZoomButton))
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                 .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
-                        .addComponent(candTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 232, Short.MAX_VALUE)
-                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                        .addComponent(candReassignButton))
-                    .addComponent(bestTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 319, Short.MAX_VALUE)
-                    .addComponent(mainTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 319, Short.MAX_VALUE))
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
-                    .addComponent(mainZoomButton)
-                    .addComponent(bestZoomButton)
-                    .addComponent(candZoomButton)))
-            .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 525, Short.MAX_VALUE)
+                    .addComponent(mainPickButton)
+                    .addComponent(candPickButton)))
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(reassignButton))
         );
         mainPanelLayout.setVerticalGroup(
             mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
-                .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 199, Short.MAX_VALUE)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(mainTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
-                    .addComponent(mainZoomButton)
-                    .addComponent(jLabel4))
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(bestTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
-                    .addComponent(bestZoomButton)
-                    .addComponent(jLabel5))
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(candReassignButton)
-                    .addComponent(candTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
-                    .addComponent(candZoomButton)
-                    .addComponent(jLabel6)))
+            .addGroup(mainPanelLayout.createSequentialGroup()
+                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                        .addComponent(mainField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addComponent(mainLabel))
+                    .addGroup(mainPanelLayout.createSequentialGroup()
+                        .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                            .addComponent(mainZoomButton)
+                            .addComponent(mainPickButton))
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                            .addComponent(candPickButton)
+                            .addComponent(candZoomButton)
+                            .addComponent(candField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                            .addComponent(candLabel))))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                .addComponent(reassignButton))
         );
+
         getContentPane().add(mainPanel);
 
@@ -195,128 +193,377 @@
     }// </editor-fold>//GEN-END:initComponents
 
-    private void treeValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_treeValueChanged
-        selMainObj = null;
-        selBestFit = null;
-        selCandObj = null;
-
-        Reasoner r = CzechAddressPlugin.getReasoner();
-        TreePath tp = evt.getPath();
-
-        if (tp.getPathCount() >= 2)
-            selMainObj = tp.getPathComponent(1);
-
-        if (selMainObj instanceof AddressElement)
-            selBestFit = r.translate((AddressElement) selMainObj);
-        else if (selMainObj instanceof OsmPrimitive)
-            selBestFit = r.translate((OsmPrimitive) selMainObj);
-
-        mainTextField.setText(AddressElement.getName(selMainObj));
-        bestTextField.setText(AddressElement.getName(selBestFit));
-
-        if (tp.getPathCount() >= 3)
-            selCandObj = tp.getPathComponent(2);
-
-        candTextField.setText(AddressElement.getName(selCandObj));
-
-        if (selCandObj != null) {
-            if (selBestFit == null)
-                bestTextField.setText(
-                       "žádný neexistuje, objekty v konfliktu jsou rovnocenné");
-
-            candReassignButton.setEnabled(true);
-        } else
-            candReassignButton.setEnabled(false);
-
-        mainZoomButton.setEnabled(selMainObj instanceof OsmPrimitive);
-        bestZoomButton.setEnabled(selBestFit instanceof OsmPrimitive);
-        candZoomButton.setEnabled(selCandObj instanceof OsmPrimitive);
-
-    }//GEN-LAST:event_treeValueChanged
-
     private void mainZoomButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mainZoomButtonActionPerformed
-        assert selMainObj instanceof OsmPrimitive;
-        MapUtils.zoomTo((OsmPrimitive) selMainObj);
+        zoomTo(mainField.getSelectedItem());
     }//GEN-LAST:event_mainZoomButtonActionPerformed
 
-    private void bestZoomButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bestZoomButtonActionPerformed
-        assert selBestFit instanceof OsmPrimitive;
-        MapUtils.zoomTo((OsmPrimitive) selBestFit);
-    }//GEN-LAST:event_bestZoomButtonActionPerformed
-
     private void candZoomButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_candZoomButtonActionPerformed
-        assert selCandObj instanceof OsmPrimitive;
-        MapUtils.zoomTo((OsmPrimitive) selCandObj);
+        zoomTo(candField.getSelectedItem());
     }//GEN-LAST:event_candZoomButtonActionPerformed
 
-    private void candReassignButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_candReassignButtonActionPerformed
-        Reasoner r = CzechAddressPlugin.getReasoner();
-
-        if (    (selMainObj instanceof OsmPrimitive)
-             && (selCandObj instanceof AddressElement)) {
-             
-             Match best = r.findMatch((AddressElement) selBestFit);
-             if (best != null) best.qualityChanged();
-
-             List<Match> competitors = r.conflicts((OsmPrimitive) selMainObj);
-             if (competitors != null) for (Match competitor : competitors)
-                 competitor.qualityChanged();
-
-             r.overwriteMatch((AddressElement) selCandObj, (OsmPrimitive) selMainObj);
-        }
-
-        else if ((selMainObj instanceof AddressElement)
-              && (selCandObj instanceof OsmPrimitive)) {
-
-            Match best = r.findMatch((OsmPrimitive) selBestFit);
-            if (best != null) best.qualityChanged();
-
-            List<Match> competitors = r.conflicts((AddressElement) selMainObj);
-            if (competitors != null) for (Match competitor : competitors)
-                 competitor.qualityChanged();
-
-            r.overwriteMatch((AddressElement) selMainObj, (OsmPrimitive) selCandObj);
-        }
-
+    private void zoomTo(Object item) {
+        if (item instanceof OsmPrimitive)
+            MapUtils.zoomTo((OsmPrimitive) item);
+
+        else if (item instanceof AddressElement) {
+            OsmPrimitive prim = Reasoner.getInstance().translate((AddressElement) item);
+            if (prim != null)
+                MapUtils.zoomTo(prim);
+        }
+    }
+
+    private void reassignButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reassignButtonActionPerformed
+
+        Reasoner r = Reasoner.getInstance();
+
+        synchronized (r) {
+            r.openTransaction();
+
+            if (conflictModel.getSelectedItem() instanceof OsmPrimitive) {
+                OsmPrimitive prim = (OsmPrimitive) conflictModel.getSelectedItem();
+
+                if (r.translate(prim) != null)
+                    r.unOverwrite(prim, r.translate(prim));
+                
+                ComboBoxModel model = candField.getModel();
+                for (int i = 0; i < model.getSize(); i++) {
+                    AddressElement elem = (AddressElement) model.getElementAt(i);
+                    r.unOverwrite(prim, elem);
+                    if (r.translate(elem) != null)
+                        r.unOverwrite(r.translate(elem), elem);
+                }
+                
+                r.doOverwrite(prim, (AddressElement) model.getSelectedItem());
+            }
+
+            if (conflictModel.getSelectedItem() instanceof AddressElement) {
+                AddressElement elem = (AddressElement) conflictModel.getSelectedItem();
+
+                if (r.translate(elem) != null)
+                    r.unOverwrite(r.translate(elem), elem);
+
+                ComboBoxModel model = candField.getModel();
+                for (int i = 0; i < model.getSize(); i++) {
+                    OsmPrimitive prim = (OsmPrimitive) model.getElementAt(i);
+                    r.unOverwrite(prim, elem);
+                    if (r.translate(prim) != null)
+                        r.unOverwrite(prim, r.translate(prim));
+                }
+
+                r.doOverwrite((OsmPrimitive) model.getSelectedItem(), elem);
+            }
+
+            r.closeTransaction();
+        }
+    }//GEN-LAST:event_reassignButtonActionPerformed
+
+    private void mainPickButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mainPickButtonActionPerformed
+        // TODO add your handling code here:
+    }//GEN-LAST:event_mainPickButtonActionPerformed
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JComboBox candField;
+    private javax.swing.JLabel candLabel;
+    private javax.swing.JButton candPickButton;
+    private javax.swing.JButton candZoomButton;
+    private javax.swing.JComboBox mainField;
+    private javax.swing.JLabel mainLabel;
+    private javax.swing.JPanel mainPanel;
+    private javax.swing.JButton mainPickButton;
+    private javax.swing.JButton mainZoomButton;
+    private javax.swing.JButton reassignButton;
+    // End of variables declaration//GEN-END:variables
+
+//==============================================================================
+
+    private class ReasonerHook implements ReasonerListener {
+
+        public void elementChanged(AddressElement elem) {
+            String delStr = Reasoner.getInstance().inConflict(elem) ? " in conflict" : " no conflict";
+            logger.log(Level.FINER, "hook: element changed", elem.getName() + delStr);
+
+            if (Reasoner.getInstance().inConflict(elem))
+                conflictModel.put(elem);
+            else
+                conflictModel.remove(elem);
+        }
+
+        public void primitiveChanged(OsmPrimitive prim) {
+            String delStr = Reasoner.getInstance().inConflict(prim) ? " in conflict" : " no conflict";
+            logger.log(Level.FINER, "hook: primitive changed", AddressElement.getName(prim) + delStr);
+
+            if (Reasoner.getInstance().inConflict(prim))
+                conflictModel.put(prim);
+            else
+                conflictModel.remove(prim);
+        }
+
+        public void resonerReseted() {
+        }
+    }
+
+//==============================================================================
+
+    private ConflictsModel conflictModel = new ConflictsModel();
+    private class ConflictsModel implements ComboBoxModel {
+
+        ArrayList<AddressElement> elements = new ArrayList<AddressElement>();
+        ArrayList<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
+        Set<ListDataListener> listeners = new HashSet<ListDataListener>();
+
+        Object selected = null;
+
+        public void put(AddressElement elem) {
+            int index = Collections.binarySearch(elements, elem);
+            if (index < 0) {
+                logger.log(Level.FINE, "conflicts: adding element",
+                                        "[" + String.valueOf(-index-1) + "]=„"
+                                        + elem.getName() + "“");
+                elements.add(-index-1, elem);
+
+                ListDataEvent evt = new ListDataEvent(this,
+                        ListDataEvent.INTERVAL_ADDED,
+                        -index-1, -index-1);
+                for (ListDataListener listener : listeners)
+                    listener.intervalAdded(evt);
+
+                if (mainField.getSelectedItem() == null)
+                    mainField.setSelectedIndex(-index-1);
+            }
+        }
+
+        public void put(OsmPrimitive prim) {
+            int index = Collections.binarySearch(primitives, prim, new PrimUtils());
+            if (index < 0) {
+                logger.log(Level.FINE, "conflicts: adding primitive",
+                                        "[" + String.valueOf(-index-1) + "]=„"
+                                        + AddressElement.getName(prim) + "“");
+                primitives.add(-index-1, prim);
+                
+                ListDataEvent evt = new ListDataEvent(this,
+                        ListDataEvent.INTERVAL_ADDED,
+                        -index-1 + elements.size(), -index-1 + elements.size());
+                for (ListDataListener listener : listeners)
+                    listener.intervalAdded(evt);
+                
+                if (mainField.getSelectedItem() == null)
+                    mainField.setSelectedIndex(-index-1);
+            }
+        }
+
+        public void remove(AddressElement elem) {
+            int index = Collections.binarySearch(elements, elem);
+            //index = primitives.indexOf(elem);
+            if (index >= 0) {
+                logger.log(Level.FINE, "conflicts: removing element",
+                                        "[" + String.valueOf(index) + "]=„"
+                                        + elem.getName() + "“");
+                elements.remove(index);
+                
+                if (selected == elem)
+                    setSelectedItem(null);
+
+                ListDataEvent evt = new ListDataEvent(this,
+                        ListDataEvent.INTERVAL_REMOVED,
+                        index, index);
+                for (ListDataListener listener : listeners)
+                    listener.intervalRemoved(evt);
+            }
+        }
+
+        public void remove(OsmPrimitive prim) {
+            int index = Collections.binarySearch(primitives, prim);
+            index = primitives.indexOf(prim);
+            if (index >= 0) {
+                logger.log(Level.FINE, "conflicts: removing primitive",
+                                        "[" + String.valueOf(index) + "]=„"
+                                        + AddressElement.getName(prim) + "“");
+                primitives.remove(index);
+
+                if (selected == prim)
+                    setSelectedItem(null);
+                
+                ListDataEvent evt = new ListDataEvent(this,
+                        ListDataEvent.INTERVAL_REMOVED,
+                        index + elements.size(), index + elements.size());
+                for (ListDataListener listener : listeners)
+                    listener.intervalRemoved(evt);
+            }
+        }
+
+        public void clear() {
+            logger.log(Level.FINE, "conflicts: clearing");
+
+            ListDataEvent evt = new ListDataEvent(this,
+                    ListDataEvent.CONTENTS_CHANGED,
+                    0, elements.size() + primitives.size() - 1);
+
+            elements.clear();
+            primitives.clear();
+            
+            for (ListDataListener listener : listeners)
+                listener.contentsChanged(evt);
+        }
+        
+        public void setSelectedItem(Object anItem) {
+
+            if (anItem == null && getSize() > 0) {
+                mainField.setSelectedIndex(0);
+                return;
+            }
+            selected = anItem;
+            updateZoomButtons(selected, mainZoomButton);
+            updatePickButtons(selected, mainPickButton);
+            updateCandidatesModel(anItem);
+        }
+
+        public Object getSelectedItem() {
+            return selected;
+        }
+
+        public int getSize() {
+            return primitives.size() + elements.size();
+        }
+
+        public Object getElementAt(int index) {
+            if (index< elements.size())
+                return elements.get(index);
+            
+            index -= elements.size();
+
+            if (index< primitives.size())
+                return primitives.get(index);
+            
+            return null;
+        }
+
+        public void addListDataListener(ListDataListener l) {
+            listeners.add(l);
+        }
+
+        public void removeListDataListener(ListDataListener l) {
+            listeners.remove(l);
+        }
+    }
+
+    private void updateCandidatesModel(Object selected) {
+        
+        if (selected instanceof AddressElement) {
+            AddressElement selElem = (AddressElement) selected;
+            List<OsmPrimitive> conflPrims = new NotNullList<OsmPrimitive>();
+            conflPrims.addAll(Reasoner.getInstance().getCandidates(selElem));
+            Collections.sort(conflPrims, new PrimUtils());
+            candField.setModel(new CandidatesModel<OsmPrimitive>(conflPrims));
+
+        } else if (selected instanceof OsmPrimitive) {
+            OsmPrimitive selElem = (OsmPrimitive) selected;
+            List<AddressElement> conflElems = new NotNullList<AddressElement>();
+            conflElems.addAll(Reasoner.getInstance().getCandidates(selElem));
+            Collections.sort(conflElems);
+            candField.setModel(new CandidatesModel<AddressElement>(conflElems));
+
+        } else {
+            candField.setModel(new DefaultComboBoxModel());
+            candZoomButton.setEnabled(false);
+            reassignButton.setEnabled(false);
+        }
+
+        candZoomButton.setEnabled(false);
+        candPickButton.setEnabled(false);
+        reassignButton.setEnabled(false);
+        if (candField.getModel().getSize() > 0)
+            candField.setSelectedIndex(0);
         else
-            assert false;
-    }//GEN-LAST:event_candReassignButtonActionPerformed
-
-    // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JTextField bestTextField;
-    private javax.swing.JButton bestZoomButton;
-    private javax.swing.JButton candReassignButton;
-    private javax.swing.JTextField candTextField;
-    private javax.swing.JButton candZoomButton;
-    private javax.swing.JTree elemConflictTree;
-    private javax.swing.JLabel jLabel4;
-    private javax.swing.JLabel jLabel5;
-    private javax.swing.JLabel jLabel6;
-    private javax.swing.JScrollPane jScrollPane1;
-    private javax.swing.JScrollPane jScrollPane2;
-    private javax.swing.JTabbedPane jTabbedPane1;
-    private javax.swing.JPanel mainPanel;
-    private javax.swing.JTextField mainTextField;
-    private javax.swing.JButton mainZoomButton;
-    private javax.swing.JTree primConflictTree;
-    // End of variables declaration//GEN-END:variables
-
-    public void pluginStatusChanged(int message) {
-        
-        if (message == MESSAGE_CONFLICT_CHANGED) {
-            setVisible(true);
-
-            ((HalfCookedTreeModel) elemConflictTree.getModel()).notifyAllListeners();
-            ((HalfCookedTreeModel) primConflictTree.getModel()).notifyAllListeners();
-
-            /* TODO: For some reason the previous call does not repaint.
-             *       Lines below fix it for now.*/
-            elemConflictTree.setModel(new ElemTreeModel());
-            primConflictTree.setModel(new PrimTreeModel());
-        }
-    }
-
-
-//==============================================================================
-
+            candField.setSelectedIndex(-1);
+    }
+
+    private void updateZoomButtons(Object selected, JButton button) {
+        if (selected instanceof OsmPrimitive) {
+            button.setEnabled(true);
+        } else if (selected instanceof AddressElement) {
+            button.setEnabled(Reasoner.getInstance().translate(
+                        (AddressElement) selected) != null);
+        } else {
+            button.setEnabled(false);
+        }
+    }
+
+    private void updatePickButtons(Object selected, JButton button) {
+        button.setEnabled(selected instanceof House || selected instanceof Street);
+    }
+
+    private class CandidatesModel<E> implements ComboBoxModel {
+
+        Set<ListDataListener> listeners = new HashSet<ListDataListener>();
+        List<? extends E> primitives;
+        Object selected = null;
+
+        public CandidatesModel(List<? extends E> data) {
+            primitives = data;
+        }
+
+        public void setSelectedItem(Object anItem) {
+            selected = anItem;
+            updateZoomButtons(selected, candZoomButton);
+            updatePickButtons(selected, candPickButton);
+
+            if (conflictModel.getSelectedItem() instanceof AddressElement) {
+                reassignButton.setEnabled( selected !=
+                        Reasoner.getInstance().getStrictlyBest(
+                            (AddressElement) conflictModel.getSelectedItem()));
+
+                reassignButton.setEnabled(true);
+            } else if (conflictModel.getSelectedItem() instanceof OsmPrimitive) {
+                reassignButton.setEnabled( selected !=
+                        Reasoner.getInstance().getStrictlyBest(
+                            (OsmPrimitive) conflictModel.getSelectedItem()));
+                reassignButton.setEnabled(true);
+            } else
+                reassignButton.setEnabled(false);
+
+
+        }
+
+        public Object getSelectedItem() {
+            return selected;
+        }
+
+        public int getSize() {
+            return primitives.size();
+        }
+
+        public Object getElementAt(int index) {
+            if (index < primitives.size())
+                return primitives.get(index);
+            return null;
+        }
+
+        public void addListDataListener(ListDataListener l) {
+            listeners.add(l);
+        }
+
+        public void removeListDataListener(ListDataListener l) {
+            listeners.remove(l);
+        }
+    }
+
+    private class CandidatesRenderer extends UniversalListRenderer {
+
+        @Override
+        public Component getListCellRendererComponent(JList list, Object value,
+                        int index, boolean isSelected, boolean cellHasFocus) {
+            Component c = super.getListCellRendererComponent(list, value, index,
+                            isSelected, cellHasFocus);
+
+            if (   (value instanceof AddressElement &&
+                    Reasoner.getInstance().translate((AddressElement) value) != null)
+                || (value instanceof OsmPrimitive &&
+                    Reasoner.getInstance().translate((OsmPrimitive) value) != null) )
+                setFont(getFont().deriveFont(Font.BOLD));
+                
+            return c;
+        }
+    }
+
+/*
     private class ElemTreeModel extends HalfCookedTreeModel {
 
@@ -333,5 +580,5 @@
 
                 if (parent instanceof AddressElement)
-                    return r.conflicts((AddressElement) parent).get(index).prim;
+                    return r.getConflicts((AddressElement) parent).get(index).prim;
 
             } catch (Exception e) {  }
@@ -347,5 +594,5 @@
 
                 if (parent instanceof AddressElement)
-                    return r.conflicts((AddressElement) parent).size();
+                    return r.getConflicts((AddressElement) parent).size();
                 
             } catch (Exception exp) { }
@@ -361,5 +608,5 @@
 
                 if (parent instanceof AddressElement)
-                    return r.conflicts((AddressElement) parent).indexOf(child);
+                    return r.getConflicts((AddressElement) parent).indexOf(child);
                 
             } catch (Exception exp) { }
@@ -417,4 +664,4 @@
             return -1;
         }
-    }
+    }*/
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/FactoryDialog.form
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/FactoryDialog.form	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/FactoryDialog.form	(revision 15558)
@@ -25,10 +25,8 @@
         <DimensionLayout dim="0">
           <Group type="103" groupAlignment="0" attributes="0">
-              <Group type="102" attributes="0">
-                  <Component id="streetComboBox" pref="92" max="32767" attributes="0"/>
+              <Group type="102" alignment="1" attributes="0">
+                  <Component id="streetComboBox" pref="199" max="32767" attributes="0"/>
                   <EmptySpace max="-2" attributes="0"/>
                   <Component id="relocateButton" min="-2" max="-2" attributes="0"/>
-                  <EmptySpace max="-2" attributes="0"/>
-                  <Component id="ensureConsistencyButton" min="-2" max="-2" attributes="0"/>
               </Group>
               <Group type="102" alignment="0" attributes="0">
@@ -45,5 +43,4 @@
                       <Component id="streetComboBox" alignment="3" min="-2" max="-2" attributes="0"/>
                       <Component id="relocateButton" alignment="3" min="-2" max="-2" attributes="0"/>
-                      <Component id="ensureConsistencyButton" alignment="3" min="-2" max="-2" attributes="0"/>
                   </Group>
                   <EmptySpace max="-2" attributes="0"/>
@@ -105,19 +102,4 @@
           </Properties>
         </Component>
-        <Component class="javax.swing.JButton" name="ensureConsistencyButton">
-          <Properties>
-            <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
-              <Connection code="ImageProvider.get(&quot;actions&quot;, &quot;refresh-small.png&quot;)" type="code"/>
-            </Property>
-            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
-              <Connection code="&quot;&quot;" type="code"/>
-            </Property>
-            <Property name="toolTipText" type="java.lang.String" value="Provede nov&#xe9; p&#x159;i&#x159;azen&#xed; prvk&#x16f; mapy na elementy datab&#xe1;ze.&#xa;Touto volbou se zru&#x161;&#xed; v&#x161;echny manu&#xe1;ln&#x11b; vy&#x159;e&#x161;en&#xe9; konflikty."/>
-            <Property name="enabled" type="boolean" value="false"/>
-          </Properties>
-          <Events>
-            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="ensureConsistencyButtonActionPerformed"/>
-          </Events>
-        </Component>
       </SubComponents>
     </Container>
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/FactoryDialog.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/FactoryDialog.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/FactoryDialog.java	(revision 15558)
@@ -9,4 +9,5 @@
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import javax.swing.DefaultListCellRenderer;
@@ -26,4 +27,5 @@
 import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Street;
 import org.openstreetmap.josm.plugins.czechaddress.intelligence.Reasoner;
+import org.openstreetmap.josm.plugins.czechaddress.intelligence.ReasonerListener;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -35,10 +37,18 @@
  */
 public class FactoryDialog extends ToggleDialog
-        implements SelectionChangedListener, StatusListener {
-
-    HouseListModel  houseModel  = new HouseListModel();
-    StreetListModel streetModel = new StreetListModel();
+        implements SelectionChangedListener, StatusListener, ReasonerListener {
+
+
+    private static FactoryDialog singleton = null;
+    public  static FactoryDialog getInstance() {
+        if (singleton == null)
+            singleton = new FactoryDialog();
+        return singleton;
+    }
+
+    private HouseListModel  houseModel  = new HouseListModel();
+    private StreetListModel streetModel = new StreetListModel();
     
-    public FactoryDialog() {
+    private FactoryDialog() {
 
         super( "Továrna na adresy",
@@ -88,5 +98,5 @@
         }
         
-        if (message == MESSAGE_REASONER_REASONED) {
+/*      if (message == MESSAGE_REASONER_REASONED) {
             ensureConsistencyButton.setEnabled(true);
         }
@@ -95,5 +105,5 @@
             houseModel.notifyAllListeners();
             return;
-        }
+        }*/
     }
 
@@ -106,5 +116,5 @@
 
     public boolean existsAvailableHouse() {
-        Reasoner r = CzechAddressPlugin.reasoner;
+        Reasoner r = Reasoner.getInstance();
 
         int i = houseList.getSelectedIndex();
@@ -126,5 +136,4 @@
 
     public void selectNextUnmatchedHouse() {
-
         int index = houseList.getSelectedIndex();
 
@@ -132,5 +141,5 @@
         Object current;
         while ( (current = houseModel.getElementAt(index)) != null
-              && CzechAddressPlugin.reasoner.translate((House) current) != null)
+              && Reasoner.getInstance().translate((House) current) != null)
             index++;
 
@@ -225,6 +234,7 @@
      */
     @SuppressWarnings("unchecked")
-    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
     private void initComponents() {
+
         mainPanel = new javax.swing.JPanel();
         jScrollPane1 = new javax.swing.JScrollPane();
@@ -233,5 +243,4 @@
         relocateButton = new javax.swing.JButton();
         streetComboBox = new javax.swing.JComboBox();
-        ensureConsistencyButton = new javax.swing.JButton();
 
         setLayout(new java.awt.GridLayout(1, 0));
@@ -250,9 +259,8 @@
             }
         });
-
         jScrollPane1.setViewportView(houseList);
 
         keepOddityCheckBox.setSelected(true);
-        keepOddityCheckBox.setText("Zachov\u00e1vat sudost / lichost");
+        keepOddityCheckBox.setText("Zachovávat sudost / lichost");
         keepOddityCheckBox.setEnabled(false);
 
@@ -269,26 +277,14 @@
         streetComboBox.setFocusable(false);
 
-        ensureConsistencyButton.setIcon(ImageProvider.get("actions", "refresh-small.png"));
-        ensureConsistencyButton.setText("");
-        ensureConsistencyButton.setToolTipText("Provede nov\u00e9 p\u0159i\u0159azen\u00ed prvk\u016f mapy na elementy datab\u00e1ze.\nTouto volbou se zru\u0161\u00ed v\u0161echny manu\u00e1ln\u011b vy\u0159e\u0161en\u00e9 konflikty.");
-        ensureConsistencyButton.setEnabled(false);
-        ensureConsistencyButton.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                ensureConsistencyButtonActionPerformed(evt);
-            }
-        });
-
         javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
         mainPanel.setLayout(mainPanelLayout);
         mainPanelLayout.setHorizontalGroup(
             mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
+                .addComponent(streetComboBox, 0, 199, Short.MAX_VALUE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(relocateButton))
             .addGroup(mainPanelLayout.createSequentialGroup()
-                .addComponent(streetComboBox, 0, 50, Short.MAX_VALUE)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(relocateButton)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(ensureConsistencyButton))
-            .addGroup(mainPanelLayout.createSequentialGroup()
-                .addComponent(keepOddityCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, 282, Short.MAX_VALUE)
+                .addComponent(keepOddityCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, 278, Short.MAX_VALUE)
                 .addContainerGap())
             .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 290, Short.MAX_VALUE)
@@ -299,6 +295,5 @@
                 .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                     .addComponent(streetComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
-                    .addComponent(relocateButton)
-                    .addComponent(ensureConsistencyButton))
+                    .addComponent(relocateButton))
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 125, Short.MAX_VALUE)
@@ -306,6 +301,6 @@
                 .addComponent(keepOddityCheckBox))
         );
+
         add(mainPanel);
-
     }// </editor-fold>//GEN-END:initComponents
 
@@ -316,5 +311,5 @@
     private void houseListClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_houseListClicked
         if (evt.getClickCount() == 2 && evt.getButton() == MouseEvent.BUTTON1) {
-            Reasoner r = CzechAddressPlugin.reasoner;
+            Reasoner r = Reasoner.getInstance();
 
             if (r.translate(getSelectedHouse()) != null) {
@@ -324,23 +319,18 @@
 
             // TODO: The following code does not work... for some reason.
-            /*List<Match> conflicts = r.getConflictsForElement(getSelectegetConflicts if (conflicts != null) {
+/*            List<Match> getConflicts = r.getConflictsForElement(getSelectegetConflicts if (getConflicts != null) {
                 List<OsmPrimitive> toZoom
-                        = new ArrayList<OsmPrimitive>(conflicts.size());
-                for (Match conflict : conflicts)
+                        = new ArrayList<OsmPrimitive>(getConflicts.size());
+                for (Match conflict : getConflicts)
                     toZoom.add(conflict.prim);
 
                 MapUtils.zoomToMany(toZoom);
                 return;
-            }*/
+*/
         }
     }//GEN-LAST:event_houseListClicked
 
-    private void ensureConsistencyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ensureConsistencyButtonActionPerformed
-        CzechAddressPlugin.reasoner.ensureConsistency();
-}//GEN-LAST:event_ensureConsistencyButtonActionPerformed
-
 
     // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JButton ensureConsistencyButton;
     private javax.swing.JList houseList;
     private javax.swing.JScrollPane jScrollPane1;
@@ -351,4 +341,14 @@
     // End of variables declaration//GEN-END:variables
 
+    public void elementChanged(AddressElement elem) {
+        houseModel.notifyAllListeners();
+    }
+
+    public void primitiveChanged(OsmPrimitive prim) {}
+
+    public void resonerReseted() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
     private class StreetListRenderer extends DefaultListCellRenderer {
 
@@ -367,10 +367,7 @@
                 setText(((Street) value).getName());
                 
-            } else {
+            } else if (value instanceof ElementWithHouses) {
                 setFont(boldFont);
-                if (value instanceof ElementWithStreets) setText("[domy bez ulice]");
-                if (value instanceof AllStreetProvider)  setText("[všechny domy]");
-                if (value instanceof FreeStreetProvider) setText("[nepřiřazené domy]");
-
+                setText("[" + ((ElementWithHouses) value).getName() + "]");
             }
 
@@ -395,5 +392,5 @@
             if (boldFont == null) boldFont = getFont().deriveFont(Font.BOLD);
 
-            Reasoner r = CzechAddressPlugin.reasoner;
+            Reasoner r = Reasoner.getInstance();
 
             if (value instanceof House) {
@@ -403,7 +400,8 @@
                 setFont(plainFont);
 
-                if ( r.conflicts(house) != null)
+                if (r.inConflict(house))
                     setIcon(envelopeExclIcon);
-                else if ( r.translate(house) == null) {
+
+                else if (r.translate(house) == null) {
                     setIcon(envelopeStarIcon);
                     setFont(boldFont);
@@ -418,5 +416,5 @@
     private class AllStreetProvider extends ElementWithHouses {
         public AllStreetProvider() {
-            super("Všechny domy");
+            super("všechny domy");
         }
 
@@ -428,9 +426,9 @@
 
     private class FreeStreetProvider extends ElementWithHouses
-                                     implements StatusListener {
+                                     implements ReasonerListener {
 
         public FreeStreetProvider() {
-            super("Nepřiřazené domy");
-            CzechAddressPlugin.addStatusListener(this);
+            super("nepřiřazené domy");
+            Reasoner.getInstance().addListener(this);
             rebuild();
         }
@@ -441,19 +439,30 @@
         }
 
-        public void pluginStatusChanged(int message) {
-            if (message == StatusListener.MESSAGE_MATCHES_CHANGED)
-                rebuild();
-        }
 
         public void rebuild() {
-            Reasoner r = CzechAddressPlugin.reasoner;
-            if (r == null) return;
-
             houses.clear();
-            for (AddressElement house : r.getElementPool())
-                if (r.translate(house) == null)
-                    if (house instanceof House)
-                        houses.add((House) house);
-        }
+            for (AddressElement house : Reasoner.getInstance().getUnassignedElements())
+                if (house instanceof House)
+                    houses.add((House) house);
+
+            Collections.sort(houses);
+        }
+
+        public void resonerReseted() { houses.clear(); }
+        public void primitiveChanged(OsmPrimitive prim) {}
+        public void elementChanged(AddressElement elem) {
+            if (!(elem instanceof House))
+                return;
+            House house = (House) elem;
+            
+            if (Reasoner.getInstance().translate(house) != null)
+                houses.remove(house);
+            else if (!houses.contains(house)) {
+                houses.add(house);
+                Collections.sort(houses);
+            }
+        }
+
+
     }
 
@@ -532,5 +541,6 @@
                     = (ElementWithHouses) streetComboBox.getSelectedItem();
 
-            if ((index < 0) || (index >= selected.getHouses().size())) return null;
+            if ((index < 0) || (index >= selected.getHouses().size()))
+                return null;
             return selected.getHouses().get(index);
         }
@@ -540,4 +550,3 @@
         }
     }
-
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/GroupManipulatorDialog.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/GroupManipulatorDialog.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/GroupManipulatorDialog.java	(revision 15558)
@@ -67,5 +67,5 @@
 
     public void pluginStatusChanged(int message) {
-        if (message == StatusListener.MESSAGE_MATCHES_CHANGED) {
+        /*if (message == StatusListener.MESSAGE_MATCHES_CHANGED) {
             int retval = (new ExtendedDialog(Main.parent, "Změna umístění",
                     "Došlo ke změně v přiřazení databáze.\n" +
@@ -76,5 +76,5 @@
             if (retval == 1)
                 recreateProposals();
-        }
+        }*/
     }
 
@@ -93,8 +93,8 @@
 
     public void recreateProposals() {
-        locationTextField.setText(CzechAddressPlugin.getLocation().toString());
+/*        locationTextField.setText(CzechAddressPlugin.getLocation().toString());
         
         Reasoner r = CzechAddressPlugin.getReasoner();
-        proposalTree.setModel(r.getProposals());
+        proposalTree.setModel(r.getProposals());*/
     }
 
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/Inspector.form
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/Inspector.form	(revision 15558)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/Inspector.form	(revision 15558)
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
+    <Property name="columns" type="int" value="0"/>
+    <Property name="rows" type="int" value="1"/>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="mainPanel">
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Component id="jScrollPane1" min="-2" pref="400" max="-2" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Component id="jScrollPane1" min="-2" pref="300" max="-2" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+          <AuxValues>
+            <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+          </AuxValues>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JTree" name="tree">
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/Inspector.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/Inspector.java	(revision 15558)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/Inspector.java	(revision 15558)
@@ -0,0 +1,174 @@
+package org.openstreetmap.josm.plugins.czechaddress.gui;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.plugins.czechaddress.CzechAddressPlugin;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Database;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.House;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Region;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Street;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Suburb;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.ViToCi;
+
+public class Inspector extends ExtendedDialog {
+
+    /** Creates new form Inspector */
+    public Inspector() {
+        super(Main.parent, "Inspektor databáze", new String[] {}, true);
+        initComponents();
+
+        //tree.setModel(new Model());
+        tree.setCellRenderer(new UniversalTreeRenderer());
+
+        // And finalize initializing the form.
+        setupDialog(mainPanel, new String[] {});
+    }
+
+    /*private class Model extends HalfCookedTreeModel {
+
+        @Override
+        public Object getRoot() {
+            return CzechAddressPlugin.database;
+        }
+
+        public Object getChild(Object parent, int index) {
+
+            if (parent instanceof House)
+                return null;
+
+            if (parent instanceof Street)
+                return ((Street) parent).getHouses().get(index);
+
+            if (parent instanceof Suburb) {
+                Suburb suburb = (Suburb) parent;
+
+                if (index< suburb.getHouses().size())
+                    return suburb.getHouses().get(index);
+                else
+                    index -= suburb.getHouses().size();
+
+                if (index< suburb.getStreets().size())
+                    return suburb.getStreets().get(index);
+                else
+                    return null;
+            }
+
+            if (parent instanceof ViToCi) {
+                ViToCi vitoci = (ViToCi) parent;
+
+                if (index< vitoci.getHouses().size())
+                    return vitoci.getHouses().get(index);
+                else
+                    index -= vitoci.getHouses().size();
+
+                if (index< vitoci.getStreets().size())
+                    return vitoci.getStreets().get(index);
+                else
+                    index -= vitoci.getStreets().size();
+
+                if (index< vitoci.getSuburbs().size())
+                    return vitoci.getSuburbs().get(index);
+                else
+                    return null;
+            }
+
+            if (parent instanceof Region) {
+                Region region = (Region) parent;
+
+                if (index< region.getHouses().size())
+                    return region.getHouses().get(index);
+                else
+                    index -= region.getHouses().size();
+
+                if (index< region.getStreets().size())
+                    return region.getStreets().get(index);
+                else
+                    index -= region.getStreets().size();
+
+                if (index< region.getViToCis().size())
+                    return region.getViToCis().get(index);
+                else
+                    return null;
+            }
+
+            if (parent instanceof Database)
+                return ((Database) parent).regions.get(index);
+
+            return null;
+        }
+
+        public int getChildCount(Object parent) {
+
+            if (parent instanceof House)
+                return 0;
+
+            if (parent instanceof Street)
+                return ((Street) parent).getHouses().size();
+
+            if (parent instanceof Suburb)
+                return ((Suburb) parent).getHouses().size() +
+                       ((Suburb) parent).getStreets().size();
+
+            if (parent instanceof ViToCi)
+                return ((ViToCi) parent).getHouses().size() +
+                       ((ViToCi) parent).getStreets().size() +
+                       ((ViToCi) parent).getSuburbs().size();
+
+            if (parent instanceof Region)
+                return ((Region) parent).getHouses().size() +
+                       ((Region) parent).getStreets().size() +
+                       ((Region) parent).getViToCis().size();
+
+            if (parent instanceof Database)
+                return ((Database) parent).regions.size();
+
+            return 0;
+        }
+
+        public int getIndexOfChild(Object parent, Object child) {
+            return 0;
+        }
+        
+    }*/
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        mainPanel = new javax.swing.JPanel();
+        jScrollPane1 = new javax.swing.JScrollPane();
+        tree = new javax.swing.JTree();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        getContentPane().setLayout(new java.awt.GridLayout());
+
+        jScrollPane1.setViewportView(tree);
+
+        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
+        mainPanel.setLayout(mainPanelLayout);
+        mainPanelLayout.setHorizontalGroup(
+            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 400, javax.swing.GroupLayout.PREFERRED_SIZE)
+        );
+        mainPanelLayout.setVerticalGroup(
+            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)
+        );
+
+        getContentPane().add(mainPanel);
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JScrollPane jScrollPane1;
+    private javax.swing.JPanel mainPanel;
+    private javax.swing.JTree tree;
+    // End of variables declaration//GEN-END:variables
+
+}
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/LocationSelector.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/LocationSelector.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/LocationSelector.java	(revision 15558)
@@ -24,4 +24,5 @@
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Database;
 
 /**
@@ -58,5 +59,5 @@
 
         oblastComboBox.setModel(new DefaultComboBoxModel(
-                CzechAddressPlugin.getDatabase().regions.toArray()));
+                Database.getInstance().regions.toArray()));
 
         autodetectLocation();
@@ -140,5 +141,5 @@
                                  + "\t " + bestFit.get("name"));
             
-            for (Region oblast : CzechAddressPlugin.getDatabase().regions) {
+            for (Region oblast : Database.getInstance().regions) {
                 for (ViToCi obec : oblast.getViToCis()) {
                     if (!bestFit.get("place").equals("suburb")) {
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/PointManipulatorDialog.form
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/PointManipulatorDialog.form	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/PointManipulatorDialog.form	(revision 15558)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
-<Form version="1.3" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+<Form version="1.3" maxVersion="1.3" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
   <NonVisualComponents>
     <Component class="javax.swing.JLabel" name="jLabel4">
@@ -44,11 +44,11 @@
                   <Group type="103" groupAlignment="0" attributes="0">
                       <Group type="102" alignment="1" attributes="0">
-                          <Component id="locationEdit" pref="215" max="32767" attributes="0"/>
+                          <Component id="locationEdit" pref="228" max="32767" attributes="0"/>
                           <EmptySpace max="-2" attributes="0"/>
                           <Component id="changeLocationButton" min="-2" max="-2" attributes="0"/>
                       </Group>
-                      <Component id="alternateNumberEdit" alignment="0" pref="299" max="32767" attributes="0"/>
+                      <Component id="alternateNumberEdit" alignment="0" pref="293" max="32767" attributes="0"/>
                       <Group type="102" alignment="1" attributes="0">
-                          <Component id="matchesComboBox" pref="174" max="32767" attributes="0"/>
+                          <Component id="matchesComboBox" pref="186" max="32767" attributes="0"/>
                           <EmptySpace max="-2" attributes="0"/>
                           <Component id="ensureConsistencyButton" min="-2" max="-2" attributes="0"/>
@@ -78,5 +78,5 @@
                       <Component id="ensureConsistencyButton" alignment="3" min="-2" max="-2" attributes="0"/>
                   </Group>
-                  <EmptySpace pref="186" max="32767" attributes="0"/>
+                  <EmptySpace pref="176" max="32767" attributes="0"/>
               </Group>
               <Group type="102" alignment="0" attributes="0">
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/PointManipulatorDialog.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/PointManipulatorDialog.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/PointManipulatorDialog.java	(revision 15558)
@@ -91,5 +91,5 @@
     protected void buttonAction(ActionEvent evt) {
         super.buttonAction(evt);
-        if (getValue() == 1) {
+/*        if (getValue() == 1) {
             
             if (updateMatchesTimer.isRunning()) {
@@ -108,5 +108,5 @@
                 r.overwriteMatch(m.elem, m.prim);
             }
-        }
+        }*/
 
         CzechAddressPlugin.removeStatusListener(this);
@@ -125,5 +125,5 @@
     public void updateMatches() {
         
-        if (proposalContainer.getTarget().deleted) {
+/*        if (proposalContainer.getTarget().deleted) {
             setVisible(false);
         }
@@ -156,5 +156,5 @@
         fakeHouse.setParent(CzechAddressPlugin.getLocation());
         proposalContainer.setProposals(
-                fakeHouse.getDiff(proposalContainer.getTarget()));
+                fakeHouse.getDiff(proposalContainer.getTarget()));*/
     }
 
@@ -162,5 +162,5 @@
 
         // If location changes, we block the dialog until reasoning is done.
-        if (message == MESSAGE_LOCATION_CHANGED) {
+/*        if (message == MESSAGE_LOCATION_CHANGED) {
             updateLocation();
             mainPanel.setEnabled(false);
@@ -170,5 +170,5 @@
             updateMatches();
             mainPanel.setEnabled(true);
-        }
+        }*/
     }
 
@@ -326,5 +326,5 @@
 
     private void ensureConsistencyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ensureConsistencyButtonActionPerformed
-        CzechAddressPlugin.getReasoner().ensureConsistency();
+//        CzechAddressPlugin.getReasoner().ensureConsistency();
     }//GEN-LAST:event_ensureConsistencyButtonActionPerformed
 
@@ -358,5 +358,5 @@
             Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
 
-            Reasoner r = CzechAddressPlugin.getReasoner();
+/*            Reasoner r = CzechAddressPlugin.getReasoner();
             setIcon(null);
 
@@ -373,5 +373,5 @@
                         setIcon(envelopeNormIcon);
                 }
-            }
+            }*/
 
             return c;
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/UniversalTreeRenderer.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/UniversalTreeRenderer.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/UniversalTreeRenderer.java	(revision 15558)
@@ -2,20 +2,9 @@
 
 import java.awt.Component;
-import javax.swing.ImageIcon;
 import javax.swing.JTree;
 import javax.swing.tree.DefaultTreeCellRenderer;
-import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.plugins.czechaddress.CzechAddressPlugin;
 import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.AddressElement;
-import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.House;
-import org.openstreetmap.josm.plugins.czechaddress.intelligence.Reasoner;
-import org.openstreetmap.josm.plugins.czechaddress.proposal.AddKeyValueProposal;
-import org.openstreetmap.josm.plugins.czechaddress.proposal.KeyValueChangeProposal;
-import org.openstreetmap.josm.plugins.czechaddress.proposal.ProposalContainer;
-import org.openstreetmap.josm.plugins.czechaddress.proposal.RemoveKeyProposal;
-import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.plugins.czechaddress.gui.utils.UniversalRenderer;
 
 /**
@@ -26,16 +15,4 @@
  */
 public class UniversalTreeRenderer extends DefaultTreeCellRenderer {
-    static ImageIcon iconAdd    = ImageProvider.get("actions", "add.png");
-    static ImageIcon iconEdit   = ImageProvider.get("actions", "edit.png");
-    static ImageIcon iconRemove = ImageProvider.get("actions", "remove.png");
-
-    static ImageIcon nodeIcon      = ImageProvider.get("Mf_node.png");
-    static ImageIcon wayIcon       = ImageProvider.get("Mf_way.png");
-    static ImageIcon closedWayIcon = ImageProvider.get("Mf_closedway.png");
-    static ImageIcon relationIcon  = ImageProvider.get("Mf_relation.png");
-    
-    static ImageIcon envelopeNormIcon = ImageProvider.get("envelope-closed-small.png");
-    static ImageIcon envelopeStarIcon = ImageProvider.get("envelope-closed-star-small.png");
-    static ImageIcon envelopeExclIcon = ImageProvider.get("envelope-closed-exclamation-small.png");
 
     @Override
@@ -47,43 +24,7 @@
                 expanded, leaf, row, hasFocus);
 
-        /*if (plainFont == null) plainFont = getFont().deriveFont(Font.PLAIN);
-        if ( boldFont == null)  boldFont = getFont().deriveFont(Font.BOLD);*/
-        Reasoner r = CzechAddressPlugin.getReasoner();
+        setIcon(UniversalRenderer.getIcon(value));
+        setText(UniversalRenderer.getText(value));
 
-
-        if (value instanceof ProposalContainer) {
-            value = ((ProposalContainer) value).getTarget();
-        }
-
-        if ((value instanceof AddressElement) || (value instanceof OsmPrimitive)) {
-            setText(AddressElement.getName(value));
-        }
-
-             if (value instanceof AddKeyValueProposal)    setIcon(iconAdd);
-        else if (value instanceof KeyValueChangeProposal) setIcon(iconEdit);
-        else if (value instanceof RemoveKeyProposal)      setIcon(iconRemove);
-
-
-        if (value instanceof House && r != null) {
-            House house = (House) value;
-
-            setIcon(envelopeNormIcon);
-            if ( r.conflicts(house) != null )
-                setIcon(envelopeExclIcon);
-            else if ( r.translate(house) == null)
-                setIcon(envelopeStarIcon);
-    
-        } else if (value instanceof Node) {
-            setIcon(nodeIcon);
-        } else if (value instanceof Relation) {
-            setIcon(relationIcon);
-        } else if (value instanceof Way) {
-            if (((Way) value).isClosed()) {
-                setIcon(closedWayIcon);
-            } else {
-                setIcon(wayIcon);
-            }
-        }
-        
         return c;
     }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/utils/UniversalListRenderer.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/utils/UniversalListRenderer.java	(revision 15558)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/utils/UniversalListRenderer.java	(revision 15558)
@@ -0,0 +1,29 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.openstreetmap.josm.plugins.czechaddress.gui.utils;
+
+import java.awt.Component;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.JList;
+
+/**
+ *
+ * @author Radomír Černoch, radomir.cernoch@gmail.com
+ */
+public class UniversalListRenderer extends DefaultListCellRenderer {
+
+    @Override
+    public Component getListCellRendererComponent(JList list, Object value,
+                          int index, boolean isSelected, boolean cellHasFocus) {
+        
+        Component c = super.getListCellRendererComponent(list, value, index,
+                                                      isSelected, cellHasFocus);
+        setIcon(UniversalRenderer.getIcon(value));
+        setText(UniversalRenderer.getText(value));
+
+        return c;
+    }
+}
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/utils/UniversalRenderer.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/utils/UniversalRenderer.java	(revision 15558)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/utils/UniversalRenderer.java	(revision 15558)
@@ -0,0 +1,86 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.openstreetmap.josm.plugins.czechaddress.gui.utils;
+
+import javax.swing.ImageIcon;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.AddressElement;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.House;
+import org.openstreetmap.josm.plugins.czechaddress.intelligence.Reasoner;
+import org.openstreetmap.josm.plugins.czechaddress.proposal.AddKeyValueProposal;
+import org.openstreetmap.josm.plugins.czechaddress.proposal.KeyValueChangeProposal;
+import org.openstreetmap.josm.plugins.czechaddress.proposal.ProposalContainer;
+import org.openstreetmap.josm.plugins.czechaddress.proposal.RemoveKeyProposal;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ *
+ * @author Radomír Černoch, radomir.cernoch@gmail.com
+ */
+public abstract class UniversalRenderer {
+    private static final ImageIcon iconAdd    = ImageProvider.get("actions", "add.png");
+    private static final ImageIcon iconEdit   = ImageProvider.get("actions", "edit.png");
+    private static final ImageIcon iconRemove = ImageProvider.get("actions", "remove.png");
+
+    private static final ImageIcon nodeIcon      = ImageProvider.get("data/node.png");
+    private static final ImageIcon wayIcon       = ImageProvider.get("data/way.png");
+//  private static final ImageIcon closedWayIcon = ImageProvider.get("Mf_closedway.png");
+    private static final ImageIcon relationIcon  = ImageProvider.get("data/relation.png");
+
+    private static final ImageIcon envelopeNormIcon = ImageProvider.get("envelope-closed-small.png");
+    private static final ImageIcon envelopeStarIcon = ImageProvider.get("envelope-closed-star-small.png");
+    private static final ImageIcon envelopeExclIcon = ImageProvider.get("envelope-closed-exclamation-small.png");
+
+    public static ImageIcon getIcon(Object value) {
+        
+             if (value instanceof AddKeyValueProposal)    return iconAdd;
+        else if (value instanceof KeyValueChangeProposal) return iconEdit;
+        else if (value instanceof RemoveKeyProposal)      return iconRemove;
+
+        if (value instanceof House) {
+            House house = (House) value;
+
+            if (Reasoner.getInstance().inConflict(house))
+                return envelopeExclIcon;
+
+            if (Reasoner.getInstance().translate(house) == null)
+                return envelopeStarIcon;
+
+            return envelopeNormIcon;
+
+        } else if (value instanceof Node)
+            return nodeIcon;
+
+        else if (value instanceof Relation)
+            return relationIcon;
+
+        else if (value instanceof Way)
+//          return ((Way) value).isClosed() ? closedWayIcon : wayIcon;
+            return wayIcon;
+
+        return null;
+    }
+
+    public static String getText(Object value) {
+        if (value instanceof ProposalContainer)
+            value = ((ProposalContainer) value).getTarget();
+
+        if (value instanceof AddressElement)
+            return ((AddressElement) value).getName();
+                
+        if (value instanceof OsmPrimitive)
+            return AddressElement.getName(value);
+
+        if (value == null)
+            return "";
+        
+        return value.toString();
+    }
+
+}
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/Capitalizator.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/Capitalizator.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/Capitalizator.java	(revision 15558)
@@ -1,5 +1,4 @@
 package org.openstreetmap.josm.plugins.czechaddress.intelligence;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -13,8 +12,5 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import javax.swing.event.TableModelListener;
-import javax.swing.table.TableModel;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.plugins.czechaddress.NotNullList;
 import org.openstreetmap.josm.plugins.czechaddress.StringUtils;
 import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.AddressElement;
@@ -63,5 +59,4 @@
         private AddressElement elem;
         private List<OsmPrimitive> prims;
-        private StringUtils strUtils = new StringUtils();
 
         public StreetMatcher(AddressElement elem, List<OsmPrimitive> prims) {
@@ -81,5 +76,5 @@
                     return prim;
                 
-                if (strUtils.matchAbbrev(prim.get("name"), elem.getName()))
+                if (StringUtils.matchAbbrev(prim.get("name"), elem.getName()))
                     candidate = prim;
             }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/Reasoner.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/Reasoner.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/Reasoner.java	(revision 15558)
@@ -5,8 +5,7 @@
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.FileHandler;
-import java.util.logging.Handler;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.crypto.Mac;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -35,6 +34,5 @@
 public class Reasoner {
 
-    /* A list of {@link OsmPrimitive}s, for which there was no suitable match. */
-    //private List<OsmPrimitive> notMatchable = new ArrayList<OsmPrimitive>();
+    /* A list of {@link OsmPrimitive}s, for which there was no suitable match.*/
 
     private     Map<OsmPrimitive, AddressElement> primBestIndex
@@ -50,11 +48,6 @@
     private Set<OsmPrimitive>   primToUpdate = new HashSet<OsmPrimitive>();
     private Set<AddressElement> elemToUpdate = new HashSet<AddressElement>();
-//  private Map<Object,Integer> statusBefore = new HashMap<Object,Integer>();
-
-    public Logger logger = Logger.getLogger("Reasoner");
-
-    public static final int STATUS_UNKNOWN = 0;
-    public static final int STATUS_CONFLICT = 1;
-    public static final int STATUS_MATCH = 2;
+
+    public static Logger logger = Logger.getLogger(Reasoner.class.getName());
 
     private Reasoner() {}
@@ -74,10 +67,51 @@
         primBestIndex.clear();
         primBestIndex.clear();
-    }
-
-    private AddressElement getBest(OsmPrimitive prim) {
+
+        for (ReasonerListener listener : listeners)
+            listener.resonerReseted();
+    }
+    
+    public Set<AddressElement> getCandidates(OsmPrimitive prim) {
+
+        int best = Match.MATCH_NOMATCH;
+        for (AddressElement elem : primMatchIndex.get(prim).keySet()) {
+            int cand = primMatchIndex.get(prim).get(elem);
+            if (best < cand)
+                best = cand;
+        }
+
+        Set<AddressElement> result = new HashSet<AddressElement>();
+
+        for (AddressElement elem : primMatchIndex.get(prim).keySet()) {
+            int cand = primMatchIndex.get(prim).get(elem);
+            if (best == cand)
+                result.add(elem);
+        }
+        return result;
+    }
+
+    public Set<OsmPrimitive> getCandidates(AddressElement elem) {
+
+        int best = Match.MATCH_NOMATCH;
+        for (OsmPrimitive prim : elemMatchIndex.get(elem).keySet()) {
+            int cand = elemMatchIndex.get(elem).get(prim);
+            if (best < cand)
+                best = cand;
+        }
+
+        Set<OsmPrimitive> result = new HashSet<OsmPrimitive>();
+        
+        for (OsmPrimitive prim : elemMatchIndex.get(elem).keySet()) {
+            int cand = elemMatchIndex.get(elem).get(prim);
+            if (best == cand)
+                result.add(prim);
+        }
+        return result;
+    }
+
+    public AddressElement getStrictlyBest(OsmPrimitive prim) {
 
         Map<AddressElement, Integer> matches = primMatchIndex.get(prim);
-        if (matches == null) return null;
+        //if (matches == null) return null;
 
         AddressElement bestE = null;
@@ -97,8 +131,8 @@
     }
 
-    private OsmPrimitive getBest(AddressElement prim) {
+    public OsmPrimitive getStrictlyBest(AddressElement prim) {
 
         Map<OsmPrimitive, Integer> matches = elemMatchIndex.get(prim);
-        if (matches == null) return null;
+        //if (matches == null) return null;
 
         OsmPrimitive bestE = null;
@@ -125,53 +159,58 @@
     public void closeTransaction() {
 
-        Set<Object> changes = new HashSet<Object>();
+        Set<AddressElement> elemChanges = new HashSet<AddressElement>();
+        Set<OsmPrimitive>   primChanges = new HashSet<OsmPrimitive>();
 
         for (OsmPrimitive prim : primToUpdate) {
-            AddressElement bestMatch = getBest(prim);
+            AddressElement bestMatch = getStrictlyBest(prim);
 
             if (primBestIndex.get(prim) != bestMatch) {
                 if (bestMatch == null) {
-                    logger.log(Level.INFO, "primitive has no longer best match",
+                    logger.log(Level.FINE, "primitive has no longer best match",
                             AddressElement.getName(prim));
                     primBestIndex.remove(prim);
                 } else {
-                    logger.log(Level.INFO, "primitive has a new best match",
+                    logger.log(Level.FINE, "primitive has a new best match",
                             "prim=„" + AddressElement.getName(prim) + "“ → " +
                             "elem=„" + bestMatch + "“");
+                    elemChanges.add(primBestIndex.get(prim));
                     primBestIndex.put(prim, bestMatch);
                 }
-                changes.add(prim);
             }
         }
-        primToUpdate.clear();
 
 
         for (AddressElement elem : elemToUpdate) {
-            OsmPrimitive bestMatch = getBest(elem);
+            OsmPrimitive bestMatch = getStrictlyBest(elem);
 
             if (elemBestIndex.get(elem) != bestMatch) {
                 if (bestMatch == null) {
-                    logger.log(Level.INFO, "element has no longer best match", elem);
+                    logger.log(Level.FINE, "element has no longer best match", elem);
                     elemBestIndex.remove(elem);
                 } else {
-                    logger.log(Level.INFO, "element has a new best match",
+                    logger.log(Level.FINE, "element has a new best match",
                             "elem=„" + elem + "“ → " +
                             "prim=„" + AddressElement.getName(bestMatch) + "“");
+                    primChanges.add(elemBestIndex.get(elem));
                     elemBestIndex.put(elem, bestMatch);
                 }
-                changes.add(elem);
             }
         }
+
+        elemToUpdate.addAll(elemChanges);
+        primToUpdate.addAll(primChanges);
+
+        for (ReasonerListener listener : listeners) {
+            for (AddressElement elem : elemToUpdate)
+                if (elem != null)
+                    listener.elementChanged(elem);
+            
+            for (OsmPrimitive prim : primToUpdate)
+                if (prim != null)
+                    listener.primitiveChanged(prim);
+        }
+        
+        primToUpdate.clear();
         elemToUpdate.clear();
-
-        for (Object change : changes) {
-            if (change instanceof OsmPrimitive)
-                for (ReasonerListener listener : listeners)
-                    listener.primitiveChanged((OsmPrimitive) change);
-
-            if (change instanceof AddressElement)
-                for (ReasonerListener listener : listeners)
-                    listener.elementChanged((AddressElement) change);
-        }
     }
 
@@ -184,5 +223,5 @@
 
         if (oldQ != newQ) {
-            logger.log(Level.INFO, "reconsidering match",
+            logger.log(Level.FINE, "reconsidering match",
                     "q=" + String.valueOf(oldQ) + "→" + String.valueOf(newQ) + "; " +
                     "elem=„" + elem + "“; " +
@@ -192,13 +231,16 @@
             primToUpdate.add(prim);
             elemToUpdate.add(elem);
+
+            primToUpdate.addAll(elemMatchIndex.get(elem).keySet());
+            elemToUpdate.addAll(primMatchIndex.get(prim).keySet());
         }
     }
 
     public void consider(OsmPrimitive prim) {
-        logger.log(Level.FINE, "considering primitive", AddressElement.getName(prim));
+        logger.log(Level.FINER, "considering primitive", AddressElement.getName(prim));
 
         Map<AddressElement, Integer> matches = primMatchIndex.get(prim);
         if (matches == null) {
-            logger.log(Level.INFO, "new primitive detected", AddressElement.getName(prim));
+            logger.log(Level.FINE, "new primitive detected", AddressElement.getName(prim));
             matches = new HashMap<AddressElement, Integer>();
             primMatchIndex.put(prim, matches);
@@ -210,9 +252,9 @@
 
     public void consider(AddressElement elem) {
-        logger.log(Level.FINE, "considering element", elem);
+        logger.log(Level.FINER, "considering element", elem);
 
         Map<OsmPrimitive, Integer> matches = elemMatchIndex.get(elem);
         if (matches == null) {
-            logger.log(Level.INFO, "new element detected", elem);
+            logger.log(Level.FINE, "new element detected", elem);
             matches = new HashMap<OsmPrimitive, Integer>();
             elemMatchIndex.put(elem, matches);
@@ -223,23 +265,7 @@
     }
 
-    /*private int getStatus(OsmPrimitive prim) {
-        if (primMatchIndex.get(prim) == null)   return STATUS_UNKNOWN;
-        if (primMatchIndex.get(prim).size()==0) return STATUS_UNKNOWN;
-        if (translate(prim) != null)            return STATUS_MATCH;
-        return STATUS_CONFLICT;
-    }
-
-    private int getStatus(AddressElement elem) {
-        if (elemMatchIndex.get(elem) == null)   return STATUS_UNKNOWN;
-        if (elemMatchIndex.get(elem).size()==0) return STATUS_UNKNOWN;
-        if (translate(elem) != null)            return STATUS_MATCH;
-        return STATUS_CONFLICT;
-    }*/
-
     public int getQ(OsmPrimitive prim, AddressElement elem) {
-        if (primMatchIndex.get(prim) == null) return 0;
-        if (elemMatchIndex.get(elem) == null) return 0;
-
-        assert primMatchIndex.get(prim).get(elem) == elemMatchIndex.get(elem).get(prim);
+        assert primMatchIndex.get(prim).get(elem)
+            == elemMatchIndex.get(elem).get(prim);
 
         if (primMatchIndex.get(prim).get(elem) == null)
@@ -254,10 +280,4 @@
             primMatchIndex.get(prim).remove(elem);
             elemMatchIndex.get(elem).remove(prim);
-
-            if (primMatchIndex.get(prim).size() == 0)
-                primMatchIndex.put(prim, null);
-            if (elemMatchIndex.get(elem).size() == 0)
-                elemMatchIndex.put(elem, null);
-
         } else {
             primMatchIndex.get(prim).put(elem, qVal);
@@ -267,4 +287,6 @@
 
     public AddressElement translate(OsmPrimitive prim) {
+        if (prim == null) return null;
+
         AddressElement elem = primBestIndex.get(prim);
         if (elemBestIndex.get(elem) == prim)
@@ -274,4 +296,6 @@
 
     public OsmPrimitive translate(AddressElement elem) {
+        if (elem == null) return null;
+
         OsmPrimitive prim = elemBestIndex.get(elem);
         if (primBestIndex.get(prim) == elem)
@@ -280,9 +304,7 @@
     }
 
-    public Set<AddressElement> conflicts(OsmPrimitive prim) {
-
-        Set<AddressElement> result = new HashSet<AddressElement>();
-        result.addAll(primMatchIndex.get(prim).keySet());
-        
+    public Set<AddressElement> getConflicts(OsmPrimitive prim) {
+
+        Set<AddressElement> result = getCandidates(prim);
         AddressElement match = translate(prim);
         if (match != null)
@@ -292,9 +314,7 @@
     }
 
-    public Set<OsmPrimitive> conflicts(AddressElement elem) {
-
-        Set<OsmPrimitive> result = new HashSet<OsmPrimitive>();
-        result.addAll(elemMatchIndex.get(elem).keySet());
-
+    public Set<OsmPrimitive> getConflicts(AddressElement elem) {
+
+        Set<OsmPrimitive> result = getCandidates(elem);
         OsmPrimitive match = translate(elem);
         if (match != null)
@@ -304,18 +324,18 @@
     }
 
+    public void addListener(ReasonerListener listener) {
+        listeners.add(listener);
+    }
+
+    public void removeListener(ReasonerListener listener) {
+        listeners.remove(listener);
+    }
+
     public static void main(String[] args) {
         try {
 
-            Reasoner r = new Reasoner();
-
-            Handler  h = new FileHandler("log.xml");
-
-            r.logger.addHandler(h);
-            r.logger.setLevel(Level.ALL);
+            Reasoner r = Reasoner.getInstance();
+            Reasoner.logger.setLevel(Level.ALL);
             
-            Match.logger.addHandler(h);
-            Match.logger.setLevel(Level.ALL);
-
-
             Street s1 = new Street("Jarní");
             Street s2 = new Street("Letní");
@@ -341,5 +361,5 @@
             r.closeTransaction();
             assert r.translate(n1) == h4;
-            assert r.conflicts(n1).size() == 0;
+            assert r.getConflicts(n1).size() == 0;
 
 
@@ -351,6 +371,6 @@
             r.closeTransaction();
             assert r.translate(n2) == null;
-            assert r.conflicts(n2).contains(h1);
-            assert r.conflicts(n2).contains(i4);
+            assert r.getConflicts(n2).contains(h1);
+            assert r.getConflicts(n2).contains(i4);
 
             n2.put("addr:street", "Letní");
@@ -360,5 +380,4 @@
             r.closeTransaction();
             assert r.translate(n2) == i4;
-            assert r.conflicts(n2).contains(h1);
 
 
@@ -367,5 +386,4 @@
             r.consider(n2);
             r.closeTransaction();
-
             assert r.translate(n2) == null;
             
@@ -375,3 +393,47 @@
         }
     }
+
+    public void doOverwrite(OsmPrimitive prim, AddressElement elem) {
+        logger.log(Level.FINER, "overwriting match",
+                    "elem=„" + elem + "“; " +
+                    "prim=„" + AddressElement.getName(prim) + "“");
+
+        consider(prim);
+        consider(elem);
+        putQ(prim, elem, Match.MATCH_OVERWRITE);
+
+        primToUpdate.add(prim);
+        elemToUpdate.add(elem);
+    }
+
+    public void unOverwrite(OsmPrimitive prim, AddressElement elem) {
+        logger.log(Level.FINER, "unoverwriting match",
+                    "elem=„" + elem + "“; " +
+                    "prim=„" + AddressElement.getName(prim) + "“");
+
+        consider(prim);
+        consider(elem);
+        putQ(prim, elem, Match.evalQ(prim, elem, Match.MATCH_NOMATCH));
+
+        primToUpdate.add(prim);
+        elemToUpdate.add(elem);
+    }
+
+    public boolean inConflict(OsmPrimitive prim) {
+        return primMatchIndex.get(prim).size() > 0
+            && translate(translate(prim)) != prim;
+    }
+
+    public boolean inConflict(AddressElement elem) {
+        return elemMatchIndex.get(elem).size() > 0
+            && translate(translate(elem)) != elem;
+    }
+
+    public Set<AddressElement> getUnassignedElements() {
+        Set<AddressElement> result = new HashSet<AddressElement>();
+        for (AddressElement elem : elemMatchIndex.keySet())
+            if (elemMatchIndex.get(elem).size() == 0)
+                result.add(elem);
+        return result;
+    }
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/ReasonerListener.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/ReasonerListener.java	(revision 15558)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/ReasonerListener.java	(revision 15558)
@@ -0,0 +1,16 @@
+package org.openstreetmap.josm.plugins.czechaddress.intelligence;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.AddressElement;
+
+/**
+ *
+ * @author Radomír Černoch, radomir.cernoch@gmail.com
+ */
+public interface ReasonerListener {
+
+    public void elementChanged(AddressElement elem);
+    public void primitiveChanged(OsmPrimitive prim);
+    public void resonerReseted();
+
+}
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/SelectionMonitor.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/SelectionMonitor.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/SelectionMonitor.java	(revision 15558)
@@ -5,10 +5,9 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.plugins.czechaddress.CzechAddressPlugin;
 import org.openstreetmap.josm.plugins.czechaddress.NotNullList;
 
 /**
  * Listenes to the current selection for reasoning
- * 
+ *
  * <p>Currently JOSM has no way of giving notice about a changed or deleted
  * node. This class tries to overcome this at the cost of computational
@@ -19,15 +18,28 @@
 public class SelectionMonitor implements SelectionChangedListener {
 
-    NotNullList<OsmPrimitive> lastSelection = new NotNullList<OsmPrimitive>();
+    Collection<OsmPrimitive> lastSelection = new NotNullList<OsmPrimitive>();
 
-    public SelectionMonitor() {
-        DataSet.selListeners.add(this);
+    private SelectionMonitor() {}
+    private static SelectionMonitor singleton = null;
+    public  static SelectionMonitor getInstance() {
+        if (singleton == null) {
+            singleton = new SelectionMonitor();
+            DataSet.selListeners.add(singleton);
+        }
+        return singleton;
     }
 
-    public void selectionChanged(
-                            Collection<? extends OsmPrimitive> newSelection) {
-        Reasoner r = CzechAddressPlugin.getReasoner();
+    public void selectionChanged(Collection<? extends OsmPrimitive>
+                                                                 newSelection) {
+        Reasoner r = Reasoner.getInstance();
 
-        r.addPrimitives(lastSelection);
+        synchronized(r) {
+            r.openTransaction();
+            for (OsmPrimitive selectedPrim :newSelection)
+                r.consider(selectedPrim);
+            for (OsmPrimitive selectedPrim :lastSelection)
+                r.consider(selectedPrim);
+            r.closeTransaction();
+        }
 
         lastSelection.clear();
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/parser/DatabaseParser.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/parser/DatabaseParser.java	(revision 15462)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/parser/DatabaseParser.java	(revision 15558)
@@ -103,5 +103,5 @@
             if (con.getResponseCode() != 200)
                 throw new DatabaseLoadException(
-                        "Požadavek na server MVČR selhal, číslo chyby: " + String.valueOf( con.getResponseCode() ));
+                        "Požadavek na server selhal, číslo chyby: " + String.valueOf( con.getResponseCode() ));
 
             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(getDatabasePath()));
