Index: applications/editors/josm/plugins/czechaddress/build.xml
===================================================================
--- applications/editors/josm/plugins/czechaddress/build.xml	(revision 15194)
+++ applications/editors/josm/plugins/czechaddress/build.xml	(revision 15201)
@@ -97,4 +97,5 @@
                 <pathelement path="${java.class.path}"/>
             </classpath>
+        <arg value="/home/radek/Desktop/Hustopeče.osm"/>
         </java>
     </target>
Index: applications/editors/josm/plugins/czechaddress/nbproject/project.xml
===================================================================
--- applications/editors/josm/plugins/czechaddress/nbproject/project.xml	(revision 15194)
+++ applications/editors/josm/plugins/czechaddress/nbproject/project.xml	(revision 15201)
@@ -5,45 +5,4 @@
         <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
             <name>czechaddress</name>
-            <folders>
-                <source-folder>
-                    <label>src</label>
-                    <type>java</type>
-                    <location>src</location>
-                </source-folder>
-            </folders>
-            <ide-actions>
-                <action name="build">
-                    <target>dist</target>
-                </action>
-                <action name="clean">
-                    <target>clean</target>
-                </action>
-                <action name="javadoc">
-                    <target>doc</target>
-                </action>
-                <action name="run">
-                    <target>run</target>
-                </action>
-                <action name="rebuild">
-                    <target>clean</target>
-                    <target>dist</target>
-                </action>
-            </ide-actions>
-            <view>
-                <items>
-                    <source-folder style="packages">
-                        <label>src</label>
-                        <location>src</location>
-                    </source-folder>
-                </items>
-                <context-menu>
-                    <ide-action name="build"/>
-                    <ide-action name="clean"/>
-                    <ide-action name="javadoc"/>
-                    <ide-action name="run"/>
-                    <ide-action name="rebuild"/>
-                </context-menu>
-            </view>
-            <subprojects/>
         </general-data>
         <general-data xmlns="http://www.netbeans.org/ns/freeform-project/2">
@@ -61,4 +20,10 @@
                     <type>java</type>
                     <location>src</location>
+                    <encoding>UTF-8</encoding>
+                </source-folder>
+                <source-folder>
+                    <label>tests</label>
+                    <type>java</type>
+                    <location>tests</location>
                     <encoding>UTF-8</encoding>
                 </source-folder>
@@ -86,9 +51,4 @@
                 </action>
             </ide-actions>
-            <export>
-                <type>folder</type>
-                <location>dist</location>
-                <build-target>compile</build-target>
-            </export>
             <view>
                 <items>
@@ -96,4 +56,8 @@
                         <label>src</label>
                         <location>src</location>
+                    </source-folder>
+                    <source-folder style="packages">
+                        <label>tests</label>
+                        <location>tests</location>
                     </source-folder>
                     <source-file>
@@ -115,6 +79,11 @@
             <compilation-unit>
                 <package-root>src</package-root>
-                <classpath mode="compile">../../core/build:../../core/src</classpath>
+                <classpath mode="compile">../../core/build:../../core/src:tests/junit-4.5.jar</classpath>
                 <javadoc-built-to>doc</javadoc-built-to>
+                <source-level>1.5</source-level>
+            </compilation-unit>
+            <compilation-unit>
+                <package-root>tests</package-root>
+                <unit-tests/>
                 <source-level>1.5</source-level>
             </compilation-unit>
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 15194)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/CzechAddressPlugin.java	(revision 15201)
@@ -24,4 +24,6 @@
 import org.openstreetmap.josm.plugins.czechaddress.parser.MvcrParser;
 import org.openstreetmap.josm.plugins.czechaddress.actions.FactoryAction;
+import org.openstreetmap.josm.plugins.czechaddress.actions.HelpAction;
+import org.openstreetmap.josm.plugins.czechaddress.actions.ModifierAction;
 import org.openstreetmap.josm.plugins.czechaddress.actions.SplitAreaByEmptyWayAction;
 import org.openstreetmap.josm.plugins.czechaddress.gui.FactoryDialog;
@@ -68,5 +70,5 @@
         final MvcrParser parser = new MvcrParser();
         //parser.setFilter(null, null, null, "");
-        //parser.setFilter("BRNO", "BRNO", null, null);
+        parser.setFilter("HUSTOPEČE", "HUSTOPEČE", null, null);
         parser.setTargetDatabase(mainDatabase);
         parser.setStorageDir(pluginDir);
@@ -112,10 +114,17 @@
 
         // Move houses from list of Houses to list of AddressElements.
-        List<House> tmp1 = location.getAllHouses();
-        ArrayList<AddressElement> tmp2 = new ArrayList<AddressElement>(tmp1.size());
-        for (House h : tmp1) tmp2.add(h);
+        List<House> houses   = location.getAllHouses();
+        ArrayList<AddressElement> pool
+                = new ArrayList<AddressElement>(houses.size());
+        for (House house : houses) pool.add(house);
+
+
+        /*Capitalizator cap = new Capitalizator(Main.ds.allPrimitives(),
+                                              location.getStreets());
+        for (Street s : cap.getClassifiedItems())
+            System.out.println(s.toString() + " --> " + cap.translate(s).getName());*/
 
         // And add them to the reasoner.
-        mainReasoner = new Reasoner(tmp2);
+        mainReasoner = new Reasoner(pool);
         mainReasoner.addPrimitives(Main.ds.allPrimitives());
     }
@@ -186,4 +195,6 @@
             menuItems.add(MainMenu.add(czechMenu, new GroupManipulatorAction()));
             menuItems.add(MainMenu.add(czechMenu, new ConflictResolveAction()));
+            menuItems.add(MainMenu.add(czechMenu, new ModifierAction()));
+            menuItems.add(MainMenu.add(czechMenu, new HelpAction()));
             return;
         }
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 15194)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/StringUtils.java	(revision 15201)
@@ -1,3 +1,5 @@
 package org.openstreetmap.josm.plugins.czechaddress;
+
+import org.openstreetmap.josm.data.coor.LatLon;
 
 /**
@@ -30,3 +32,54 @@
     }
 
+    public static String coordinateToString(double coor) {
+        double degrees = Math.floor(coor);
+        double minutes = Math.floor( 60*(coor-degrees) );
+        double seconds = 60*60*(coor-degrees-minutes/60);
+
+        return String.valueOf(Math.round(    degrees))     + "°" +
+               String.valueOf(Math.round(    minutes))     + "'" +
+               String.valueOf(Math.round(100*seconds)/100.0) + "\"";
+    }
+
+    public static String latLonToString(LatLon position) {
+        assert position != null;
+        //if (position == null) return "";
+
+        return "(lat: " + coordinateToString(position.lat())
+             + " lon: " + coordinateToString(position.lon()) + ")";
+    }
+
+    /**
+     * String matcher with abbreviations
+     *
+     * <p>Returns {@code true} even if s1="Nám. Svobody" and
+     * s2="Náměstí Svobody".</p>
+     */
+    public boolean matchAbbrev(String s1, String s2) {
+        String[] parts1 = s1.split(" +");
+        String[] parts2 = s2.split(" +");
+
+        if (parts1.length != parts2.length)
+            return false;
+
+        for (int i=0; i<parts1.length; i++) {
+            String part1 = parts1[i];
+            String part2 = parts2[i];
+
+            if (part1.charAt(part1.length()-1) == '.')
+                part1 = part1.substring(0, part1.length()-1);
+
+            if (part2.charAt(part2.length()-1) == '.')
+                part2 = part2.substring(0, part2.length()-1);
+
+            int minLen = Math.min(part1.length(), part2.length());
+            part1 = part1.substring(0, minLen).toUpperCase();
+            part2 = part2.substring(0, minLen).toUpperCase();
+
+            if (!part1.equals(part2))
+                return false;
+        }
+        return true;
+    }
+
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/HelpAction.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/HelpAction.java	(revision 15201)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/HelpAction.java	(revision 15201)
@@ -0,0 +1,29 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.openstreetmap.josm.plugins.czechaddress.actions;
+
+import java.awt.event.ActionEvent;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.tools.OpenBrowser;
+
+/**
+ * Action which shows the help page in browser.
+ *
+ * @author Radomír Černoch, radomir.cernoch@gmail.com
+ */
+public class HelpAction extends JosmAction {
+
+    public HelpAction() {
+        super("Nápověda",
+               "help.png",
+               "Otevře nápovědu k pluginu CzechAddress",
+               null, false);
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        OpenBrowser.displayUrl("http://wiki.openstreetmap.org/wiki/Cz:JOSM/Plugins/CzechAddress");
+    }
+}
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/ModifierAction.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/ModifierAction.java	(revision 15201)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/actions/ModifierAction.java	(revision 15201)
@@ -0,0 +1,35 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.openstreetmap.josm.plugins.czechaddress.actions;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.plugins.czechaddress.gui.DatabaseModifier;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ *
+ * @author Radomír Černoch, radomir.cernoch@gmail.com
+ */
+public class ModifierAction extends JosmAction {
+
+//    DatabaseModifier modifier = null;
+
+    public ModifierAction() {
+        super("Upravit databázi",
+              null,//"envelope-closed-big.png",
+              "Upravit jména elemntů dle mapy",
+              Shortcut.registerShortcut("address:assignaddress",
+                        "Adresy: Přiřadit adresy",
+                        KeyEvent.VK_P, Shortcut.GROUP_DIRECT, Shortcut.SHIFT_DEFAULT),
+              true);
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        (new DatabaseModifier()).setVisible(true);
+    }
+}
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 15194)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/AddressElement.java	(revision 15201)
@@ -5,4 +5,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.plugins.czechaddress.StringUtils;
 import org.openstreetmap.josm.plugins.czechaddress.intelligence.Match;
 import org.openstreetmap.josm.plugins.czechaddress.proposal.Proposal;
@@ -275,4 +276,30 @@
         
         return 0; // <-- just to make compilers happy. We cannot get here.
-    }    
+    }
+
+
+
+    public String getIsIn() {
+        return getIsIn(null);
+    }
+
+    protected String getIsInName() {
+        return getName();
+    }
+
+    private String getIsIn(String childString) {
+
+        String result = "";
+
+        if (getIsInName() != null  &&  !getIsInName().equals(childString)) {
+            result += getIsInName() + ", ";
+        }
+
+        if (parent != null)
+            result += parent.getIsIn(getIsInName());
+        else
+            result += "CZ";
+        
+        return result;
+    }
 }
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 15194)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/House.java	(revision 15201)
@@ -171,5 +171,5 @@
                                 pr.parentStreet.getName()));
         
-        if (pr.parentViToCi != null) {
+/*        if (pr.parentViToCi != null) {
             String targetIsIn = "";
 
@@ -188,9 +188,12 @@
                                 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),
-                                targetIsIn));
-        }
+                                parent.parent.getIsIn()));
+/*        }*/
 
         // If we have added any proposal so far, add the source info as well.
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/Region.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/Region.java	(revision 15194)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/Region.java	(revision 15201)
@@ -95,3 +95,15 @@
         return thisString;
     }
+
+    @Override
+    protected String getIsInName() {
+
+        if (nuts3name != null)
+            return nuts3name + " kraj";
+
+        if (nuts4name != null)
+            return nuts3name + " okres";
+
+        return null;
+    }
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/Street.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/Street.java	(revision 15194)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/Street.java	(revision 15201)
@@ -1,3 +1,5 @@
 package org.openstreetmap.josm.plugins.czechaddress.addressdatabase;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 
 /**
@@ -24,7 +26,6 @@
     }
 
-
-
-    /*int[] getFieldMatchList(OsmPrimitive primitive) {
+    @Override
+    protected int[] getFieldMatchList(OsmPrimitive primitive) {
         int[] result = {0};
         
@@ -33,6 +34,15 @@
         
         result[0] = matchField(name, primitive.get("name"));
-        
+
+        if (primitive.get("name") != null) {
+            String[] parts1 = primitive.get("name").split("\\.* +");
+            String[] parts2 =                  name.split("\\.* +");
+            for (String p : parts1)
+                System.out.println("X: " + p);
+            for (String p : parts2)
+                System.out.println("Y: " + p);
+        }
+
         return result;
-    }*/
+    }
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/StringUtils.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/StringUtils.java	(revision 15194)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/addressdatabase/StringUtils.java	(revision 15201)
@@ -14,20 +14,4 @@
 public class StringUtils {
 
-    public static String coordinateToString(double coor) {
-        double degrees = Math.floor(coor);
-        double minutes = Math.floor( 60*(coor-degrees) );
-        double seconds = 60*60*(coor-degrees-minutes/60);
-        
-        return String.valueOf(Math.round(    degrees))     + "°" +
-               String.valueOf(Math.round(    minutes))     + "'" +
-               String.valueOf(Math.round(100*seconds)/100.0) + "\"";
-    }
-
-    public static String latLonToString(LatLon position) {
-        if (position == null) return "";
-
-        return "(lat: " + coordinateToString(position.lat())
-             + " lon: " + coordinateToString(position.lon()) + ")";
-    }
 
 }
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/DatabaseModifier.form
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/DatabaseModifier.form	(revision 15201)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/DatabaseModifier.form	(revision 15201)
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.5" 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"/>
+    <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,58,0,0,1,-36"/>
+  </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="tabbedPane" alignment="0" pref="476" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Component id="tabbedPane" min="-2" pref="289" max="-2" attributes="0"/>
+                  <EmptySpace pref="25" max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Container class="javax.swing.JTabbedPane" name="tabbedPane">
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
+          <SubComponents>
+            <Container class="javax.swing.JScrollPane" name="streetScrollPane">
+              <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="Ulice">
+                    <Property name="tabTitle" type="java.lang.String" value="Ulice"/>
+                  </JTabbedPaneConstraints>
+                </Constraint>
+              </Constraints>
+
+              <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+              <SubComponents>
+                <Component class="javax.swing.JTable" name="streetTable">
+                  <Properties>
+                    <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
+                      <Table columnCount="2" rowCount="4">
+                        <Column editable="false" title="P&#x16f;vodn&#xed; n&#xe1;zev" type="java.lang.Object"/>
+                        <Column editable="true" title="N&#xe1;vrh z mapy" type="java.lang.String"/>
+                      </Table>
+                    </Property>
+                    <Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor">
+                      <TableColumnModel selectionModel="2">
+                        <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
+                          <Title/>
+                          <Editor/>
+                          <Renderer/>
+                        </Column>
+                        <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="false">
+                          <Title/>
+                          <Editor/>
+                          <Renderer/>
+                        </Column>
+                      </TableColumnModel>
+                    </Property>
+                    <Property name="columnSelectionAllowed" type="boolean" value="true"/>
+                    <Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor">
+                      <TableHeader reorderingAllowed="true" resizingAllowed="true"/>
+                    </Property>
+                  </Properties>
+                </Component>
+              </SubComponents>
+            </Container>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>
Index: applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/DatabaseModifier.java
===================================================================
--- applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/DatabaseModifier.java	(revision 15201)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/gui/DatabaseModifier.java	(revision 15201)
@@ -0,0 +1,223 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * DatabaseModifier.java
+ *
+ * Created on 24.5.2009, 18:03:35
+ */
+
+package org.openstreetmap.josm.plugins.czechaddress.gui;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.JTable;
+import javax.swing.event.TableModelListener;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.TableModel;
+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.AddressElement;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Street;
+import org.openstreetmap.josm.plugins.czechaddress.intelligence.Capitalizator;
+
+/**
+ *
+ * @author radek
+ */
+public class DatabaseModifier extends ExtendedDialog {
+
+    StreetModel<Street> streetModel = new StreetModel<Street>();
+
+    /** Creates new form DatabaseModifier */
+    public DatabaseModifier() {
+
+        super(Main.parent, "Upravit databázi",
+                                      new String[] { "OK", "Zrušit"}, true);
+        initComponents();
+
+        Capitalizator cap = new Capitalizator(
+                                Main.ds.allPrimitives(),
+                                CzechAddressPlugin.getLocation().getStreets());
+
+        for (Street capStreet : cap.getCapitalised()) {
+            assert cap.translate(capStreet).get("name") != null : capStreet;
+
+            String elemName = capStreet.getName();
+            String primName = cap.translate(capStreet).get("name");
+
+            if (!elemName.equals(primName)) {
+                streetModel.elems.add(capStreet);
+                streetModel.names.add(primName);
+            }
+        }
+
+        streetTable.setModel(streetModel);
+        streetTable.setDefaultRenderer( Street.class,
+                                        new StreetRenderer());
+
+        // And finalize initializing the form.
+        setupDialog(mainPanel, new String[] { "ok.png", "cancel.png" });
+        setAlwaysOnTop(false);
+
+        // TODO: Why does it always crash if the modality is set in constructor?
+        setModal(false);
+    }
+
+    @Override
+    protected void buttonAction(ActionEvent evt) {
+        super.buttonAction(evt);
+        setVisible(false);
+    }
+
+    /** 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();
+        tabbedPane = new javax.swing.JTabbedPane();
+        streetScrollPane = new javax.swing.JScrollPane();
+        streetTable = new javax.swing.JTable();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        getContentPane().setLayout(new java.awt.GridLayout(1, 0));
+
+        streetTable.setModel(new javax.swing.table.DefaultTableModel(
+            new Object [][] {
+                {null, null},
+                {null, null},
+                {null, null},
+                {null, null}
+            },
+            new String [] {
+                "Původní název", "Návrh z mapy"
+            }
+        ) {
+            Class[] types = new Class [] {
+                java.lang.Object.class, java.lang.String.class
+            };
+            boolean[] canEdit = new boolean [] {
+                false, true
+            };
+
+            public Class getColumnClass(int columnIndex) {
+                return types [columnIndex];
+            }
+
+            public boolean isCellEditable(int rowIndex, int columnIndex) {
+                return canEdit [columnIndex];
+            }
+        });
+        streetTable.setColumnSelectionAllowed(true);
+        streetScrollPane.setViewportView(streetTable);
+        streetTable.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);
+        streetTable.getColumnModel().getColumn(1).setResizable(false);
+
+        tabbedPane.addTab("Ulice", streetScrollPane);
+
+        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
+        mainPanel.setLayout(mainPanelLayout);
+        mainPanelLayout.setHorizontalGroup(
+            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 476, Short.MAX_VALUE)
+        );
+        mainPanelLayout.setVerticalGroup(
+            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(mainPanelLayout.createSequentialGroup()
+                .addComponent(tabbedPane, javax.swing.GroupLayout.PREFERRED_SIZE, 289, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(25, Short.MAX_VALUE))
+        );
+
+        getContentPane().add(mainPanel);
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JPanel mainPanel;
+    private javax.swing.JScrollPane streetScrollPane;
+    private javax.swing.JTable streetTable;
+    private javax.swing.JTabbedPane tabbedPane;
+    // End of variables declaration//GEN-END:variables
+
+    private class StreetRenderer extends DefaultTableCellRenderer {
+
+        @Override
+        public Component getTableCellRendererComponent(JTable table,
+                Object value, boolean isSelected, boolean hasFocus,
+                int row, int column) {
+            Component c =  super.getTableCellRendererComponent(table, value,
+                    isSelected, hasFocus, row, column);
+
+            System.out.println("Tady som! " + value);
+
+            if (value instanceof AddressElement)
+                setText(((AddressElement) value).getName() );
+
+            return c;
+        }
+    }
+
+    private class StreetModel<Element> implements TableModel {
+
+        List<Element> elems = new ArrayList<Element>();
+        List<String>  names = new ArrayList<String>();
+
+        public int getRowCount() {
+            assert elems.size() == names.size();
+            return elems.size();
+        }
+
+        public int getColumnCount() {
+            return 2;
+        }
+
+        public String getColumnName(int columnIndex) {
+            if (columnIndex == 0) return "Původní název";
+            if (columnIndex == 1) return "Navržený název";
+            assert false : columnIndex;
+            return null;
+        }
+
+        public Class<?> getColumnClass(int columnIndex) {
+            if (columnIndex == 0) return AddressElement.class;
+            if (columnIndex == 1) return String.class;
+            assert false : columnIndex;
+            return null;
+        }
+
+        public boolean isCellEditable(int rowIndex, int columnIndex) {
+            return columnIndex == 1;
+        }
+
+        public Object getValueAt(int rowIndex, int columnIndex) {
+            if (columnIndex == 0) return elems.get(rowIndex);
+            if (columnIndex == 1) return names.get(rowIndex);
+            assert false : columnIndex;
+            return null;
+        }
+
+        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
+            assert columnIndex == 1;
+            names.set(rowIndex, (String) aValue);
+        }
+
+        public void addTableModelListener(TableModelListener l) {
+            
+        }
+
+        public void removeTableModelListener(TableModelListener l) {
+            
+        }
+    }
+}
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 15201)
+++ applications/editors/josm/plugins/czechaddress/src/org/openstreetmap/josm/plugins/czechaddress/intelligence/Capitalizator.java	(revision 15201)
@@ -0,0 +1,98 @@
+package org.openstreetmap.josm.plugins.czechaddress.intelligence;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+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;
+import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Street;
+
+/**
+ * Updates the names in the database according the map.
+ * 
+ * @author Radomír Černoch, radomir.cernoch@gmail.com
+ */
+public class Capitalizator {
+
+    Map<Street, OsmPrimitive> map;
+    Logger logger =  Logger.getLogger(Capitalizator.class.getName());
+
+    public Capitalizator(List<OsmPrimitive> prims, List<Street> elems) {
+
+        int expResults = elems.size()/2;
+
+        map  = new HashMap<Street, OsmPrimitive>(expResults);
+        ExecutorService serv = Executors.newCachedThreadPool();
+        Map<Street, Future<OsmPrimitive>> results
+                = new HashMap<Street, Future<OsmPrimitive>>(expResults);
+
+        for (Street elem : elems)
+             results.put(elem, serv.submit(new StreetMatcher(elem, prims)));
+
+        for (Street elem : results.keySet()) {
+            try {
+                
+                OsmPrimitive match = results.get(elem).get();
+                if (match == null) continue;
+
+                map.put(elem, match);
+                
+            } catch (InterruptedException ex) {
+                logger.log(Level.SEVERE, "Thread interrupted during matching", ex);
+            } catch (ExecutionException ex) {
+                logger.log(Level.SEVERE, "Unknown error during matching", ex);
+            }
+        }
+    }
+
+    private class StreetMatcher implements Callable {
+
+        private AddressElement elem;
+        private List<OsmPrimitive> prims;
+        private StringUtils strUtils = new StringUtils();
+
+        public StreetMatcher(AddressElement elem, List<OsmPrimitive> prims) {
+            this.elem = elem;
+            this.prims = prims;
+        }
+
+        public OsmPrimitive call() throws Exception {
+
+            OsmPrimitive candidate = null;
+            for (OsmPrimitive prim : prims) {
+
+                if (prim.get("name") == null)
+                    continue;
+
+                if (prim.get("name").equals(elem.getName()))
+                    return prim;
+                
+                if (strUtils.matchAbbrev(prim.get("name"), elem.getName()))
+                    candidate = prim;
+            }
+
+            return candidate;
+        }
+    }
+
+    public OsmPrimitive translate(Street elem) {
+        return map.get(elem);
+    }
+
+    public Set<Street> getCapitalised() {
+        return map.keySet();
+    }
+}
